オートエンコーダにおける次元圧縮

単純パーセプトロンとは、
入力層のノード数をm,出力層のノード数をnとすると、
あるm次元の(0,1)格子上の点の集合(Mとする)を、n本の線(超平面)で切り分けることによりクラスタリングする手法
線形分離不可能な例では使えない。

三層パーセプトロンとは、単純パーセプトロンが二つ積み重なったもの
中間層のノード数をkとすると、
Mを、k本の線(超平面)で切り分けた後に、
それをk次元空間に配置し、再びm本の線で切り分けてクラスタリングする。
(クラスタを配置しなおして再度クラスタリングすることによって、線形分離不可能な例でもうまくクラスタリングできる。)


オートエンコーダがうまく機能するには、
Mを、k本の線で切り分けた結果、集合Mの点がいずれも異なるクラスタに属していることが必要。
これがオートエンコーダで何次元まで圧縮できるかの一つの必要条件

M =pとすると、log_2pが最低限必要な次元数(情報量っぽい)

(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は後者をとっている。

オートエンコーダ

google論文で使われている学習手法
教師なし学習で、パーセプトロンと同じく3層からなるグラフ

入力層と出力層はノードの数が等しく、
入力層への入力を出力層で再現できるように重みを更新していく。
更新方法は、誤差逆伝播法などの勾配法を用いる??

中間層のノードの数を入力層よりも少なくしておけば、次元圧縮機としての役割を果たすことができる。



deep learningは、オートエンコーダを深くつなげあわせたものである。(9層)

deep learning(google)

google論文に書かれていた3つのポイント

1. local receptive fields
局所的な特徴抽出を積み重ねる

2. L2 pooling
偏差???をとることにより、少しのずれを無視して、大きく特徴をとらえることができる。

3. local contrast normalization
正規化←何を基準に??
一般に画像認識での正規化では、位置と大きさを正規化するらしい(wikipedia)

ホップフィールド・ネットワーク

ニューラルネットワークの一つ

パーセプトロンは階層構造になっており、階層間にしかエッジが存在しないが、
ホップフィールド・ネットワークは階層構造をとらず、完全単純グラフである。

各ノードは0または1を出力する。
ノード間には、各エッジには重みが割り当てられている。

ノードiとノードjを結ぶエッジの重みを w_{ij}とする。
また、各ノードには閾値が存在し -\theta_iとおく。

時刻tにおける、ノードiの出力を x_i(t)とおくとき、
時刻tにおけるネットワークのエネルギーが定義され、
 E(t) = -\frac{1}{2}\sum_{i\neq j}w_{ij}x_i(t)x_j(t)-\sum_{i}\theta_i(t)x_i(t)

時刻tにおけるノードの出力の更新を以下のように行う

ランダムに一つノードを選択、(x_i)
選択したノードへの入力を計算し、(\sum_{j}w_{ij}x_j(t))
入力が閾値より大きければノードの出力を1に、
入力が閾値と等しければノードの出力をそのままに、
入力が閾値より小さければノードの出力を0にする。

この一連の流れが終われば、時刻をt+1に進める。


時刻の経過とともに、ネットワークのエネルギーは単調減少する。

問題点:エネルギーの極小値しか求められない!
→→ホップフィールド・ネットワークに確率要素を入れたボルツマンマシン


巡回セールスマン問題が解ける!?

学習の評価

機械学習において、どのように学習が進んでいくかをみるために、
教師あり学習(多層パーセプトロン)である問題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")

*1:0,0),0) ((1,0),1) ((0,1),1) ((1,1),0) を与え、中間層の層の数は8、学習率0.1、初期行列として各成分をrunif関数を用いてつくった行列とした。 達成度の指標について、入力iを入れたときの教師信号との誤差(出力と教師信号とのユークリッド距離/2)を返す関数E(i)としたとき、[tex:E((0,0

*2:0,1

*3:1,0

*4:1,1