Stimulator

機械学習とか好きな技術話とかエンジニア的な話とかを書く

Deep LearningとConvolutional Neural Network

- はじめに -

前回機械学習ライブラリであるCaffeの導入記事を書いた。今回はその中に入ってるDeep Learningの一種、Convolutional Neural Network(CNN:畳み込みニューラルネットワーク)の紹介。

CNNは今話題の多層ニューラルネットDeep Learningの一種であり、画像認識等の分野に大きな成果をもたらしています。

まあCNNすごい。本当、画像認識系だと一強といった感じ。
実装経験もあるのでよしなに書いてみようという記事。


追記:2018-10-24
この記事は2014年終盤、Deep Learningに関連するネット記事も数個しかなく、各論文でもCNNに関する理解が分かれていたような時期に、大学生であった筆者が書いた記事です。概念の理解の助けになるよう残していますが、正しくない箇所も後々多く出てくるかと思います。考慮の上、お読み頂ければと思います。


- ニューラルネットとは -

Deep Learningは、脳の神経回路網を模したニューラルネットワークを多層にしたものである。
ニューラルネットワークもとい機械学習の目的は回帰や分類、次元削減等である。


f:id:vaaaaaanquish:20150125220403p:plain:h300:w400


データから読み取れる「複雑な関数」を得る事ができれば、例えば今流行りの「分類で言うとこれは人だ」とか「今あるデータの傾向から未来を予測」のような事ができる。

その仕組みは死ぬほど大雑把に言うと、"関数の足し算"である。
フーリエ変換で音をsin波の組み合わせで表現できるように、複雑な関数を複数のニューロンが持つ活性化関数を用いて表現する。


f:id:vaaaaaanquish:20150125220611p:plain:h100:w200


ニューラルネットを構成する「ニューロン(Neuron)」は、1つ1つがある関数(活性化関数)を持つ。
それぞれのニューロンが持つ活性化関数は"パラメータ"が少しずつ違い、同じ形ではない。
重みを持ったノードでニューロン同士つなぎ合わせる事で、複雑な関数を表現する事ができる。


f:id:vaaaaaanquish:20150125220632p:plain:h300:w500



- 多層ニューラルネットワーク -

ニューラルネットは、多層にする事で「表現力を上げる」事ができる。
ニューラルネットが出来る事に次元削減がある。言葉の通り問題の次元を減らす事が可能である。

以下の図のように、二次元にデータが分布していた時、そのデータの特徴を得る事が出来れば、その特徴は一次元の分布としても見ることができる。語弊覚悟で言うと特徴抽出、次元削減とも言える。


f:id:vaaaaaanquish:20150125221815p:plain


これは二次元以上にも同じ事が言える。機械学習における次元とは問題の条件であったりするので、10000次元等の複雑な問題を簡単な視点にする事が出来る。


次元削減を複数回行って簡単化し、最後は分類や回帰の問題を解く。これが多層ニューラルネットワークである。

- Deep Learning -

多層ニューラルネットの考え方は、ニューラルネットの元始となるパーセプトロンが出て来た当初から存在していた。多層ニューラルネットは理論上どんな関数でも表現でき、今回のテーマのCNNも、日本人研究者である福島邦彦先生が1982年にネオコグニトロン*1として発表されたものが元になっている。

では何故その昔から存在する多層ニューラルネットワークが今話題なのか。
その理由として以下の3つ、ハードウェアと学習技術、次元削減がある。

  • ハードウェア性能の向上

前述の通り、ニューロンには活性化関数があり、それぞれのニューロン毎にパラメータが違う。
ニューラルネットは「学習」と呼ばれる作業によって、そのパラメータを調整し、関数の表現に至る。
学習は、データを入力しニューラルネットの出力から得た誤差を後ろ向きに伝搬しパラメータを微調整、次のデータを入力し出力から得た誤差を…という微調整作業の繰り返しである。誤差逆伝播*2


f:id:vaaaaaanquish:20150126052041p:plain

この"繰り返し計算する"作業というのはコンピュータの最も得意とする分野である。しかし、コンピュータにも限界がある。ニューラルネットの規模を大きくすれば精度を見込めるが、その反面で大きなニューラルネット、多層に繋げたニューラルネットの学習を処理できるマシンがなかった。それらの計算は、微分計算等が含まれ非常に複雑だったことも計算量増加に繋がっている。
ハードウェアの登場はとても大きいと言える。

  • "学習"技術の向上

先ほど学習として挙げた誤差逆伝播法は、多層のニューラルネットでは難しいという問題があった。*3
多層ニューラルネットで誤差を伝搬していくと、出力に近い層では正しく調整できるが、入力に近い層では誤差が拡散してしまい上手く調整できなかった。


      f:id:vaaaaaanquish:20150126052152p:plain

後述するが、そこを上手く学習するための手法が多く提案され、その結果にDeep Learningがある。

  • 次元削減

前述したように、Deep Learningは次元削減を繰り返すで問題の特徴を捉える。この作業はその他の機械学習器を使う際、画像であればSIFTやHOGといった"別のアルゴリズム"を用いて行っていた。そして、問題に応じてこの特徴量設計が上手く噛み合わないと、いくら機械学習器自体の精度が高くても良い結果が出ない。それらはノウハウを用いて、ある意味手動で設計する必要があった。

Deep Learnigでは、その多層構造によって次元削減を行う事になる。これにより、特徴抽出の部分をニューラルネット構造1つで調整する事が可能であり、かつ得られる特徴量はその問題に適した形であるので、主題となる分類問題や回帰問題を上手く解決する事が出来る。


f:id:vaaaaaanquish:20150126052310p:plain


- Deep Learningにおける学習技術 -

学習手法では、データの取り方や誤差逆伝播法のアルゴリズム、活性化関数の工夫等様々な研究が出てきた。
中でもDrop outやpre-trainingがブレイクスルーのきっかけだと言える。

Drop outは学習する時に、一部のニューロンを無いものとする。Drop outすることで、誤差を拡散させずに上手く学習する事が出来るようになる(接続を無いものとするDrop Connect等もある)。

      f:id:vaaaaaanquish:20150126052855p:plain


Dropoutの実装と重みの正則化 - もちもちしている

  • pre-training

pre-training(事前学習)は、ある次元削減可能なニューラルネットモデルを事前に学習させておき、ある程度良い初期パラメータにしてから多層に繋げる手法である。pre-trainingによって、多層ニューラルネット全体を誤差逆伝播法で調整する際、良いパラメータから学習を始められるので、残念なパラメータに陥り抜け出せないという事が少なくなる。pre-trainingではRBMやAuto Encoder等のニューラルネットモデルが使われている。


f:id:vaaaaaanquish:20150126053048p:plain


研究が活発になり、RBMモデルを使ったDBM(Deep Boltzmann machines)やらCNN、DNN、RNN…技術の組み合わせや種類で様々なDeep Learningがあり、それらがごちゃごちゃになったネット記事が複数ある状況が今といった感じ。

- CNNにおける学習 -

CNNは前述のpre-trainingとは少し違った方法によって、その精度を確立する。

例として画像認識タスクを考える。
多層ニューラルネットワークの問題として勾配の更新が上手くできない問題(Vanishing gradient problem)を挙げたが、他に移動や歪みに対する柔軟性、汎用性に欠けるといった問題があった。ニューラルネットは、固定的な画像に対してはその画素入力から正しい応答を行うよう学習できる。しかし、ニューロン同士の接続が多さから、画素がズレるとその1つの入力の誤差が出力に影響を及ぼす事になる。それらのどちらの問題にも対応し、汎用性を高く考えられたのが、Convolutional Neural Network、CNNである。

- 局所受容野 -

画像のズレ等の入力が出力に影響し、そこから得られる誤差が学習の精度を下げているなら、その誤差が全てのニューロンに伝搬するのを止めてしまおうという考え方がある。多層ニューラルネットにおける層同士の接続を制限する"局所受容野"を用いる。

      f:id:vaaaaaanquish:20150126053545p:plain:h250:w300

図のように、層ごとに接続の制限を行う。中間層は左層の一部の局所的なデータを入力としている。局所的なデータを入力とするが、次の層(右層)でデータ全体を反映する事が可能となっている。さらに、逆向きに誤差の伝搬する際には、全てのニューロンに誤差が影響しない事が分かる。誤差の影響範囲を狭める事で、前述したVanishing gradient problemにも対応する形となる。局所受容野をオーバラップする(中間層-左層の接続でに関して被る部分がある)事で、データの欠損やズレがある場合でも、他ニューロンとの競合によって解決する事が出来る。

さらに、"共有重み"(Tied Weight)と呼ばれるテクニックを用いる。図のように局所受容野のノードの重みを共有する。更新する際に用いる伝搬誤差はそれぞれの誤差の和となる。

      f:id:vaaaaaanquish:20150126054639p:plain

この局所受容野を複数用いる事で、画像に移動、歪みが発生しても、それぞれ移動不変性を持った局所受容野の結果から統合的にデータを用いる事となり、高精度の認識が可能となる。

画像認識におけるCNNでは、この局所受容野をフィルタやウィンドウと捉え、重みを持たせる。この重みフィルタ(≒共有重みを持つノード群)をシフトしていく事で層の出力を決定する形を取る。実装の際には、様々あるが、下図のようなフィルタ処理となる場合が多い。

f:id:vaaaaaanquish:20150126055121p:plain
この局所受容野による処理を複数行う。先程同様フィルタ処理として表現すると以下のような図となる。
f:id:vaaaaaanquish:20150126055246p:plain
フィルタをかけたものを特徴マップと呼ぶ。それらは共有重みを持つ局所受容野(フィルタ)によって複数生成される。多層にする場合は前層の"特徴マップ"から同じ座標に対してフィルタをかけ足し合わせる。これがCNNが"畳み込みニューラルネットワーク"と呼ばれる所以でもある。数式で表すと畳み込み演算である事がよく分かる(要出典)。
f:id:vaaaaaanquish:20150126055215p:plain

- プーリング -

局所受容野によって、画像の移動不変性や誤差拡散の抑制を得た。しかし、図を見ても分かるように、畳み込み処理によって特徴マップは増えていくことになる。特徴マップが局所受容野のスケール次第で小さくなるとは言えるが、マップが増える計算時間は大きい。さらに以下の図のように、局所受容野のフィルタを1ピクセルずつ移動させる実装であれば、特徴を検出できるのに対して、2ピクセルの移動であれば検出できない可能性がある。1ピクセル毎に移動し計算を行うと計算時間が増加してしまう。そこで、CNNでは、プーリングと呼ばれるテクニックを用いる。

プーリングは、画像で言うところの低画像化である。ニューラルネットの層の間に非線形な低画像化処理を挟み、少ないニューロンで次の層へ入力する。この処理によって、移動不変性を確実なものとするだけでなく、畳み込み演算における計算の削減を行う事が出来る。

f:id:vaaaaaanquish:20150126055504p:plain

プーリングには平均をとるaverage poolingや最大値をとるmax poolingがあり、CNNにおいてそれぞれの効果や使い方が数多く研究されている。

- Convolutional Neural Network -

CNNでは、局所受容野による畳み込み演算とプーリングを交互に繋げ、最後に主題に合わせて全接続の3層ニューラルネットSVMを接続する。

f:id:vaaaaaanquish:20150126055607p:plain

最後、誤差逆伝搬法を適応し全体の調整をする事で精度を出す。

上記したような手法によって、今までのニューラルネットの問題を解決し、高精度でしっかり学習が行える素晴らしいDeep Learningである。

- まとめ -

  • ニューラルネットの誤差拡散を防げるDeep Learning
  • 人が設計していた特徴抽出の部分もやってくれるDeep Learning
  • Dropout,pre-trainingすごい
  • CNNはpre-trainingを使わずに実現(おかげで早い)
  • CNNは局所受容野で誤差拡散を防ぎ移動不変性を得る
  • CNNはプーリングよるニューロン削減を行っても学習できる

 

- あとがき -

CNN、面白い程精度が出るので研究室で改造するのが暇潰しになる。
あと、特徴マップとかも出力してみると興奮する。畳み込みは理に適ってて好き。
研究者も多くなってきたので、今後発展しそうな予測から記事にした。

多分こんな感じの発表をゼミや勉強会でするとマサカリ以前に見向きもされないとか思いながら書いた。
CNNとかフィルタ処理として捉えすぎると線形な機械学習器である事を同時に説明しづらいし、ちゃんとニューラルネットから学習や関数における工夫、実装ノウハウ的な部分まで次は書きたい。

最近は転移学習で別の問題を解いてからやると良いとか(ほぼpre-trainingに感じる)、学習の更新がそもそもとか色々あって、結局どこに落ち着くのかとかも見てて面白い。