12.ディープラーニングの中身を知ろう
――過去が現在に影響を与えるように、未来も現在に影響を与える。――
ディープラーニングの中身を知ろう
前回の記事の続きです。前回、パーセプトロンという最小単位のモデルをご紹介したので、今回はこれを並列多層化してディープニューラルネットワークに拡張しましょう。
なお、冒頭の枕言葉は、「神は死んだ!」でおなじみのニーチェです。過去が現在に影響を与えるのは当然ですが、「こういう未来の自分になりたい」という目標設定もまた現在の自分に影響を与えている、と言いたいのでしょう(たぶん)。とはいえ、別に私はニーチェが好きというわけではなく、この言葉を選んだのは今回の記事の内容と関係しています。
ハローキティのニーチェ 強く生きるために大切なこと (朝日文庫)
- 作者: 朝日文庫編集部
- 出版社/メーカー: 朝日新聞出版
- 発売日: 2014/08/07
- メディア: 文庫
- この商品を含むブログ (3件) を見る
多値分類とOne-Hotベクトル
前回は、ボルドー産ワインと山梨産ワインを判別するという分類問題を課題としました。これは分類問題の中でも最も単純な、いわゆる二値分類(Binary Classification)という問題です。今回考えたいのは、選択肢がもっとたくさんある場合、すなわち多値分類(Multi Classification)という問題です。
多値分類を行うということは、学習済みモデルの出力は、トスカーナ産、ボルドー産、山梨産といった3つ以上の産地を表現できなければいけません。そのためには、前回のような0または1の値をとる出力だけでは足りないことは明らかです。
そこで、多値分類の場合には分類すべき対象、すなわち産地の数だけニューロンを並列化して、以下のように番号を付けて表現します。
トスカーナ産:
ボルドー産:
山梨産:
この並列化された出力のことを、まとめてOne-Hotベクトルと呼びます。One-Hotベクトルは、ベクトルのいずれかの成分だけが1で、その他の成分は0になるベクトルを意味します。言い換えると、ベクトルの要素和は必ず1になります。
パーセプトロンの並列化
出力がOne-Hotベクトルのように並列化されるということは、入力から伸びる手の数も増えることを意味します。つまり、前回の記事でご紹介したパーセプトロンの計算イメージが、以下のように拡張されます。
これを数式で表すと、以下のようになります。
シグモイド関数の出力値は必ず0から1の間をとるので、一見すると多値分類のOne-Hotベクトルにも対応しているように見えます。しかしながら、この数式には大きな欠陥があります。というのも、たとえベクトルの要素それぞれが0から1の値をとるとしても、One-Hotベクトルの性質である「ベクトルの要素和が1になる」ことが保証されないからです。
そこで、多値分類の出力に適した活性化関数として、以下のようなソフトマックス関数(Softmax Function)を用いるのが一般的です。
ソフトマックス関数は、すべての重み付き線形結合に依存する多変数関数であり、出力する先の番号によって分子の値が異なります。そして、分母に指数関数の総和を用いているため、出力された要素の和をとると必ず1になることが保証されています。
こうして得られるソフトマックス関数の出力は、いわば機械が予測した確率を表していると解釈することができます。出力されたOne-Hotベクトルの各成分は、対象のワインがそれぞれの産地である確率を表すベクトルだと解釈して、最も確率が大きかった産地を機械の予測結果とすればよいのです*1。
パーセプトロンの多層化
多値分類で出力を3種類にするために、パーセプトロンは3つに並列化されて縦長になりました。そして、それによって入力の数出力の数=9個の重み係数が必要になりました。
もちろんこのモデルのまま学習を行うことも可能ですが、ディープニューラルネットワークのディープたるゆえんは、このパーセプトロンの縦列を今度は横方向に多層化し、重み係数の数を一気に増やして、表現力の幅を広げる点にあります*2。具体的には以下のようなイメージです。
特徴量が入ってくる入力層(Input Layer)と産地の分類を行う出力層(Output Layer)との間に、4列に並列化された2つの中間層を追加しています。中間層は隠れ層(Hidden Layer)と呼ばれ、隠れ層内にあるパーセプトロンを何列にするか、隠れ層を何層追加するか、といった事項は課題に応じて自由に決めることができます。今回は見栄えが良くなるようにこのくらいにしてみました。
隠れ層に存在するパーセプトロンのそれぞれに対しても、前回の記事で紹介したパーセプトロンの計算イメージが適用されます。例えば、隠れ層1のパーセプトロンの出力は、以下のように計算されます。
これらはΣ記号を使って簡便に書き表すことができます。
先ほど、多値分類の出力層ではOne-Hotベクトルの性質を保証するためにソフトマックス関数を用いるべきだと説明しました。しかし、出力層以外(隠れ層)の活性化関数に関しては特段制約はなく、任意の非線形関数を用いることができます。よって、隠れ層の活性化関数としては、とりあえずシグモイド関数を用いることとします。
続いて、隠れ層2のパーセプトロンの出力はどう計算されるでしょうか。隠れ層2から見れば、隠れ層1の出力が入力に当たります。よって、隠れ層2のパーセプトロンの出力は、以下のように計算されます。
これもΣ記号を使って簡便に書き表せます。
最後に、出力層のパーセプトロンの出力も計算しましょう。出力層から見れば、隠れ層2の出力が入力に当たります。また、活性化関数はシグモイド関数ではなくソフトマックス関数を用いて、以下のように計算できます。
これもΣ記号を使って簡便に書き表せます。
ものすごく冗長に見える式ですが、一つ一つの式自体は高校数学レベルなので、実はまったく難しくありません。このように、入力側の層から出力側の層に向かってパーセプトロンの出力を計算していくネットワーク構造を、順伝播型(Feedforward)ニューラルネットワークと呼びます。
逆誤差伝搬法(Backpropagation)
上述したとおり、順伝播型ニューラルネットワークは、以下のように出力を順次計算していくことで層から層へ出力を伝播させ、最終的なOne-Hotベクトルを出力します。
冗長だと逆に見通しが悪いので、Σ記号で書いたものをまとめました。前回の記事でもそうだったように、いったん出力が計算できれば、次のプロセスは誤差を表す損失関数を定義し、すべての重み係数について偏微分を求めることです。
損失関数は、多値分類でも以下の交差エントロピーが用いられます。
出力が3つ以上のOne-Hotベクトルになったことで、前回の記事と若干見た目が異なるように見えるかもしれませんが、ソフトマックス関数が要素和を1に保証しているため、本質的には前回と同じ統計量を表しています。
この損失関数の偏微分をすべての重み係数(全部で40個!)について計算すれば、それぞれについて勾配降下法の修正式を適用し、重み係数の学習を行うことができます。
ただ、少し大変なのは、上述のとおりディープニューラルネットワークでは1つの出力に関わりを持つ変数が多数存在するため、合成関数の微分公式を適用した場合にかなり多数の項が出てきてしまうことです。もちろん、一つ一つ丁寧に式を追っていけば難しくありません。
隠れ層2から出力層への重み係数の偏微分
それでは、腕試しにという重み係数の偏微分を計算してみましょう。合成関数の微分公式によれば、以下のようになります。
損失関数はOne-Hotベクトルの出力すべてに依存する多変数関数なので、についてΣ和を取っています。また、との関係を規定するソフトマックス関数もまたすべてに依存する多変数関数なので、についてΣ和を取っています。
ここで、第一項の交差エントロピーの偏微分は対数関数の微分公式から
であり、第二項のソフトマックス関数の偏微分は、
となることが簡単に導けます。これらを元の式に代入すると、
となります。さらに、One-Hotベクトルの要素和は1になるため、真実の正解ラベルに関する和は
と変形できます。これを利用すると元の式は、
という驚くほどシンプルな形に整理できます。実は、ここまでの計算はどこの重み係数で偏微分するかに依らず必ず同じ計算過程を辿るので、この式はたいへん重要なチェックポイントです。
さて、チェックポイントと言いつつ、実は今回の例では最も出力層側に近い重み係数の偏微分を求めているため、計算はここで終了します。前節「パーセプトロンの多層化」で示した計算式を見返してみると、が登場するのはだけだと分かります。
つまり、に関するΣ和のうち、の項だけが残り、その他の項は0になるので、最終的な結果は以下のようになります。
なんと、これは前回の記事で紹介したWidrow-Hoffの学習規則と全く同じ形です!多値分類問題でも、活性化関数と損失関数にソフトマックス関数と交差エントロピーを使うことで、二値分類のときと同じ形式に帰結します。これを任意のニューロン番号に一般化すれば、
数学的に美しい結果が導かれました。
隠れ層1から隠れ層2への重み係数の偏微分
それでは、次は一層分入力側に近づいた重み係数の偏微分を計算してみましょう。上述したとおり、どこの重み係数で偏微分するかに依らず、
このチェックポイントまでは全く同じ計算過程を辿ります。そして、今回は隠れ層1(h1)から隠れ層2(h2)への重み係数なので、計算はまだ終わりません。合成関数の微分公式を適用しましょう。
は隠れ層2の出力すべてに依存する多変数関数なので、についてΣ和を取っています。また、はシグモイド関数であり(ソフトマックス関数とは違って)、同じ番号のにしか依存しないため、新しい文字列でΣ和を取ったりはしません。
ここで、前節「パーセプトロンの多層化」で示した計算式を見返してみると、だったから、
また、前回の記事で紹介したシグモイド関数の微分の性質により、
これらを元の式に代入して、
とシンプルに整理できました。これが第二のチェックポイントになります。最後に残った偏微分項は、隠れ層2から出力層への重み係数のときと同じように、前節「パーセプトロンの多層化」で示した計算式を見返してみると、が登場するのはだけだと分かります。
つまり、に関するΣ和のうち、の項だけが残り、その他の項は0になるので、最終的な結果は以下のようになります。
これを任意のニューロン番号に一般化しつつ、和をとるインデックスを(と見間違えないために)に変えてやれば、
たいへんシンプルな結果が導けました。
入力層から隠れ層1への重み係数の偏微分
もうここまでくれば、後は同じことの繰り返しだとお気づきでしょうか。隠れ層1から隠れ層2への重み係数の偏微分で「第二のチェックポイント」とした式、
から出発して、の偏微分を合成関数の微分公式でΣ和に書き下せば、同様の議論で以下の結果を導けます。
ここでようやく冒頭の枕言葉の真意についてお話できます。以上のように、合成関数の微分公式による式展開は、順伝播型ニューラルネットワークで出力を計算する方向とは逆方向に進んでいきます。つまり、誤差を表す損失関数の偏微分は、出力側(未来)から入力側(過去)に向かって遡る形で計算されます。この計算規則のことを逆誤差伝搬法(Backpropagation)と呼びます。
逆誤差伝搬法は、単なる合成関数の微分公式の帰結ではありますが、現代のディープニューラルネットワークの学習規則の根幹をなす強力な計算規則です。そして、得られた式の形式から分かるように、これらの計算は二次のテンソルを使って演算すれば高速にコンピュータ処理することができます*3。
おわりに
ディープラーニングの説明は世の中に氾濫しているものの、大切なのはこうした原理をきちんと数式ベースで押さえることです。「なんだ、やっていることは最小二乗法に毛が生えたようなものじゃないか」という実体が見えてくると、それがSF映画に出てくるようなAIとは程遠いものだと容易に理解できるはずです。
ただし、だからといって甘く見てはいけません。この手法の凄さは、やっていること自体は恐ろしくシンプルなのに、表現できる幅はときに人知を軽々超えてしまうという点にあります。何しろ、プロがコンテストに出すようなモデルでは、今回紹介したような重み係数40個どころではなく、1億個を超える重み係数を学習しているのです*4。途方もない計算が中で行われ、出てきた答えは人間の想像を遥かに超えるポテンシャルを秘めています。
今日のところは以上です。稚文をお読みいただきありがとうございました。
*1:例えば、出力されたOne-Hotベクトルがだったとしたら、一番確率が高いのは3番なので、機械の予測結果は「山梨産」となります。
*2:例えば、統計学で最小二乗法という回帰分析の手法を習ったことがあると思いますが、に比べてとパラメータを増やした方が、より複雑なフィッティングが可能になります。一般に、最適化されるパラメータの数が増えるほど、入力から出力への因果がより複雑になり、豊かな表現が可能になります。
*3:Googleの提供している機械学習プラットフォーム「Tensorflow」やFacebookの開発した「Pytorch」はGPUプロセッサを使ってこのテンソル計算の高速処理を実現しており、従来とは比べものにならないほど高速に逆誤差伝搬法の偏微分計算を実行できる仕組みが整っています。
*4:腸内の乳酸菌並みですね。