Rについて
をベースに学んでいく。
今回はニューラルネットワーク(PP.216-227)を扱う。
18. ニューラルネットワーク
神経回路を構成する神経細胞(ニューロン)が多数並列に接続されたシステムを数理的にモデル化したものをニューラルネットワークという。
18.1 ニューラルネットワークの基礎
ニューラルネットワークに関する研究は1943年のマカロックとピッツのものにさかのぼる。
神経細胞(ニューロン)は細胞体、軸索、樹状突起およびシナプスにより構成されている。細胞体は他の細胞から送られた信号を処理し、特定の条件を満たすと次のニューロンに信号を送る。軸索はニューロンが出力した信号を次のニューロンに贈る経路であり、樹状突起は信号を受け取り細胞体に転送する経路である。
ニューロンとニューロンはシナプスという接触点を通じて結び付けられ、信号の転送を行なう。軸索から流れる電気信号を神経インパルスという。このようなニューロンが多数並列に接続されたシステムを数理的にモデル化したものがニューラルネットワークである。
は樹状突起による入力信号で、はそれぞれの入力信号に対応するシナプスの結合の重みである。加算部ではそれぞれの入力値に重みを掛けた加重和を求め、出力部は出力信号を生成する。形式ニューロンでの入力と出力との関係は、
もしくは
で表す。
はじめの段階では結合の重みはランダムな値が与えられ、得られた結果について何らかの方法で評価を行い、結果が目標値に近づくように重みを変える計算を繰り返し、徐々により良い値に置き換えられる。ニューラルネットワークが最も得意なのは、パターン認識・分類およびノイズが混在するデータの処理である。
18.1.1 モデルの分類
- 階層型ネットワーク
階層型ネットワークは最も多く使われるニューラルネットワークのモデルである。入力層と中間層、出力層からなる。中間層は1つとは限らない。
- 非階層型ネットワーク
階層型でないネットワークモデルを非階層型ネットワークと呼ぶ。
18.1.2 単一中間層ニューラルネットワーク
単一中間層ニューラルネットワークは
で定式化できる。
結合の重みは以下のアルゴリズムで得られる。
(1) | 入力データをニューラルネットワークに与え、最初の段階では結合の重みとしてをランダムに与えて出力を求める。 | |
(2) | 出力結果と学習用データを比較し、新しい結合の重みを計算する。ここでは定数、は出力結果と学習データとの差に関する関数、はニューロンの出力結果である。 | |
(3) | 最適な会が得られるまで(2)を繰り返す。 |
18.2 パッケージと事例
中間層ありのニューラルネットワークのパッケージにがある。
library("nnet") data(iris) even_n <- c(1:150)[c(1:150)%%2==0] iris_train <- iris[even_n,] iris_test <- iris[-even_n,] iris_nnet <- nnet(formula = formula(Species~.), size = 3, decay = 0.1, data = iris_train) iris_nnet_p <- predict(object = iris_nnet, iris_test[,-5], type = "class") table(iris_test[,5],iris_nnet_p)
18.3 深層学習
深層学習のアルゴリズムは、従来のニューラルネットワークに比べ、中間層を多く用いる点が相違する。深層学習の基本的な考え方は、層を増やしつつも計算量が爆発的に増大するのを避けながら精度を上げる工夫を重ねるというものである。
ニューラルネットワークには様々なアルゴリズムがあるが、分野によって得手不得手が相違する。画像認識や音声認識には畳み込みニューラルネットワークが有効で、時系列データには再帰型ニューラルネットワークが有効になりがちである。
################ ### 深層学習 ### ################ library("kernlab") # spamを取得するため library("h2o") data(spam) h2o.init() spam_hex <- as.h2o(spam) tr <- h2o.deeplearning(x = 1:57, y = 58, training_frame = spam_hex, hidden = c(30,20,10), epochs = 100, nfolds = 3) tr