オートエンコーダにおける次元圧縮
単純パーセプトロンとは、
入力層のノード数をm,出力層のノード数をnとすると、
あるm次元の(0,1)格子上の点の集合(Mとする)を、n本の線(超平面)で切り分けることによりクラスタリングする手法
線形分離不可能な例では使えない。
三層パーセプトロンとは、単純パーセプトロンが二つ積み重なったもの
中間層のノード数をkとすると、
Mを、k本の線(超平面)で切り分けた後に、
それをk次元空間に配置し、再びm本の線で切り分けてクラスタリングする。
(クラスタを配置しなおして再度クラスタリングすることによって、線形分離不可能な例でもうまくクラスタリングできる。)
オートエンコーダがうまく機能するには、
Mを、k本の線で切り分けた結果、集合Mの点がいずれも異なるクラスタに属していることが必要。
これがオートエンコーダで何次元まで圧縮できるかの一つの必要条件
M | =pとすると、が最低限必要な次元数(情報量っぽい) |
(k本の線でクラスタリングできても、それが線形結合+閾値関数でうまく再現できないとオートエンコーダとして働かないので、あくまで必要条件)
deep learningの歴史と定義
wikipediaの"deep learning"の記事をの最初の三項を読んだ
深層の人工ニューラルネットワークは、1980年のNeocognitronなど古くから存在した。
しかし、
1. vanishing gradient problem
2. 上記の理由やそもそものパラメータの多さによる学習の遅さ
などの問題点があり、下火になっていった。
vanishing gradient problemとは、
深層の人工ニューラルネットワークで、誤差逆伝播法で学習させていくとき、
パラメータ更新のための勾配情報が浅い層になるほど値が小さくなってしまう現象のこと。
vanishing gradient problemを克服するために、
誤差逆伝播法で教師あり学習をする前に、(fine-tuning)
少ない層の教師なし学習マシン(制限ボルツマンマシンやオートエンコーダなど)を何層も組み合わせてpre-trainingを行う手法が開発された。
これがdeep learning
以上の歴史を踏まえて、deep learningを定義すると
deep learningとは、
構造として、深層の人工ニューラルネットワークを用い、
学習手法として、教師なし学習のpre-trainingと教師あり学習のfine-tuningを組み合わせた手法をとる
機械学習のこと。
fine-tuningはネットワーク全体で行う場合と、ラべリングするための最終層のみで行う場合とがあり、
後者をとると、実質的にdeep learningは教師なし学習となる。
google論文におけるdeep learningは後者をとっている。
ホップフィールド・ネットワーク
ニューラルネットワークの一つ
パーセプトロンは階層構造になっており、階層間にしかエッジが存在しないが、
ホップフィールド・ネットワークは階層構造をとらず、完全単純グラフである。
各ノードは0または1を出力する。
ノード間には、各エッジには重みが割り当てられている。
ノードiとノードjを結ぶエッジの重みをとする。
また、各ノードには閾値が存在しとおく。
時刻tにおける、ノードiの出力をとおくとき、
時刻tにおけるネットワークのエネルギーが定義され、
時刻tにおけるノードの出力の更新を以下のように行う
ランダムに一つノードを選択、()
選択したノードへの入力を計算し、()
入力が閾値より大きければノードの出力を1に、
入力が閾値と等しければノードの出力をそのままに、
入力が閾値より小さければノードの出力を0にする。
この一連の流れが終われば、時刻をt+1に進める。
時刻の経過とともに、ネットワークのエネルギーは単調減少する。
問題点:エネルギーの極小値しか求められない!
→→ホップフィールド・ネットワークに確率要素を入れたボルツマンマシン
巡回セールスマン問題が解ける!?
迷路の難易度
「障害物密度に応じた迷路探索問題の難易度指標と実時間探索アルゴリズムの性能解析」
http://eprints.lib.hokudai.ac.jp/dspace/handle/2115/14559
学習の評価
機械学習において、どのように学習が進んでいくかをみるために、
教師あり学習(多層パーセプトロン)である問題aと、強化学習(Q学習)である問題bについて
学習の達成度について指標を入れ、横軸に学習回数、縦軸に達成度の指標をプロットした。
問題a
xorの分類器
訓練データとして
(入力,教師信号)=
*1+E*2+E*3+E*4]を達成度の指標とする。
問題b
L*Lの正方立方格子を考え、点(L,L)を除く任意の点をスタートとし、点(L,L)をゴールとする。(L=39)
エージェントは各格子点上で、x座標正、x座標負、y座標正、y座標負のいずれかを選択し、その方向に1進むように行動する。
このときエージェントがスタートからゴールまで、最短距離を動くようにQ学習を用いて学習させる。
割引率を0.9 学習率を0.1とした。
x=L上の点においてエージェントの選択(Q値の最大となる選択)がy座標正
y=L上の点においてエージェントの選択がx座標正
その他の点においてエージェントの選択がx座標正もしくはy座標正であれば、エージェントは最短距離を進む。
よって、それ以外の選択のQ値が最大になっている格子点の数を学習の達成度の指標とする。
以上のような問題設定をしたときの学習数と達成度の指標をプロットした図が以下である。
l1 <- 2 l2 <- 8 l3 <- 1 alpha <- 0.1 nm <- 50000 input_matrix <- matrix( c(0,0,1,0,0,1,1,1),2,4 ) output_matrix <- matrix(c(0,1,1,0) ,1,4) default12 <- runif(l1*l2) default23 <- runif(l2*l3) layer_vec <- c(l1,l2,l3) weight_mat12 <- matrix( default12 , l1 , l2 ) weight_mat23 <- matrix( default23 , l2 , l3 ) sigmoid <- function(x) { 1/(1+exp(-1*x)) } error_vec <- NULL perceptron <- function(input){ v1 <- input v2 <- v1 %*% weight_mat12 v2 <- sigmoid(v2) v3 <- v2 %*% weight_mat23 v3 <- sigmoid(v3) return(v3) } for(i in 1:nm) { rn <- sample(1:length(input_list),1) input <- input_matrix[,rn] output <- output_matrix[,rn] v1 <- input v2 <- v1 %*% weight_mat12 v2 <- sigmoid(v2) v3 <- v2 %*% weight_mat23 v3 <- sigmoid(v3) a3 <- (v3 - output) * v3 * (1-v3) a3 <- as.vector(a3) a2 <- as.vector(v2) delta_w23 <- t(t(a2)) %*% t(a3) delta_w23 <- -1 * alpha * delta_w23 a2 <- apply( t(a3*t(weight_mat23)) ,1 ,sum) * v2 * (1-v2) a2 <- as.vector(a2) a1 <- as.vector(v1) delta_w12 <- t(t(a1)) %*% t(a2) delta_w12 <- -1 * alpha * delta_w12 weight_mat12 <- weight_mat12 + delta_w12 weight_mat23 <- weight_mat23 + delta_w23 if(i%%10==0) { error_vec <- c(error_vec, sum( sqrt((apply(input_matrix,2,perceptron) - output_matrix)^2) )/2 ) } } plot(1:(i%/%10)*10,error_vec,type="l")