記事は、連載「AIの原理」(全11回)の第2回です。

前回の記事はこちら


前回、ニューラルネットワークが、ニューロンという小さな判断係を何層にも重ねた仕組みであることを見ました。ニューロンは、受け取った情報に「重み」をかけ合わせて合計し、一つの出力を返します。

ここで、一つ触れずに残していた問題があります。その「重み」は、いったいどうやって決まるのでしょうか。実は、ネットワークができたばかりのとき、重みはでたらめな値から始まります。つまり、訓練が始まる前のネットワークは、猫の写真を見せても、ほとんど当てずっぽうにしか答えられません。この、でたらめな重みが、正しく判断できる重みへと近づいていく過程が「学習」です。今回は、この学習の仕組みを、損失関数、勾配降下法、誤差逆伝播という三つの言葉に沿って、数式を使わずにたどります。

損失関数とは何か

学習を一言でいえば、ネットワークの出力と、本来あるべき正解との「ずれ」を、できるだけ小さくしていく作業です。

このとき鍵になるのが、「ずれ」を一つの数字として表すという発想です。ネットワークに何かを判断させ、その答えが正解からどれくらい離れているかを、単一の数値に変換します。この数値を「損失」、それを計算する仕組みを「損失関数」と呼びます。損失は、アーチェリーで的の中心からどれだけ矢が外れたかを測るようなものだと考えてください。矢が的の中心に近いほど損失は小さく、大きく外れるほど損失は大きくなります。

学習が始まったばかりのネットワークは、重みがでたらめなので、損失も大きな値になります。学習とは、この損失という一つの数字を、繰り返し少しずつ小さくしていく作業にほかなりません。

膨大な数の重みをどう調整するかという問題

前回見たとおり、ニューロンを何層にも重ねると、原理的には複雑なパターンを表現できます。しかし、層を重ねるほど、調整すべき重みの数は膨大になります。この大量の重みを、どうやって効率よく、正しい方向に調整すればよいのか。この問いへの答えが十分に整うまでには、長い時間がかかりました。特に、これから説明する「誤差逆伝播」という手法が広く知られ、実際に大きな成果を出せるようになるまでの経緯は、連載「AIの歴史」第5回・第7回・第8回で詳しく扱っています。この記事では、その経緯を追うのではなく、結果として現在確立している仕組みそのものを見ていきます。

勾配降下法とは何か

損失という一つの数字を小さくしていく方法が、「勾配降下法」です。

よく使われる説明を借りると、こういうイメージです。損失の大きさを、山の標高だと考えてください。標高が高いほど損失が大きく、標高が低いほど損失が小さい。谷底が、損失が最も小さい理想の状態です。ネットワークは、深い霧に包まれた山の斜面に、ぽつんと置かれた状態から出発します。霧のせいで、谷底がどこにあるかは見えません。けれども、いま自分が立っている場所の傾き(どちらへ進めば下り坂か)だけは感じ取れます。そこで、最も急に下っている方向へ、少しだけ足を踏み出す。これを何度も繰り返せば、少しずつ谷底に近づいていきます。

ネットワークの学習も、これと同じ形をしています。それぞれの重みを少しだけ変化させたとき、損失が増えるのか減るのか、そしてどれくらいの勢いで変化するのかが分かれば、損失が最も効率よく減る方向に、重みをわずかに動かすことができます。これを、無数にある重みのすべてについて、少しずつ、何度も繰り返す。それが勾配降下法です。一度に大きく動かさないのは、大股で霧の中を歩くと、谷底を飛び越えてしまったり、思わぬ方向に転んでしまったりする危険があるのと同じ理由です。

誤差逆伝播とは何か

ここで、素朴な疑問が生じます。「どちらへ動けば損失が減るか」を知るには、ネットワークの奥深くにある、無数の重みの一つひとつについて、それぞれがどれくらい今回の間違いに関係していたのかを、突き止めなければなりません。出力層からずっと離れた、入力層に近い重みについてまで、これをどうやって効率よく計算するのでしょうか。

これに答えるのが「誤差逆伝播」という手法です。前回見たとおり、ネットワークは、入力層から出力層へ向けて、情報を一段ずつ加工しながら手渡していく、工程のような構造をしています。誤差逆伝播は、この工程を逆向きにたどります。

出力層で、最終的な答えと正解との「ずれ」が分かったとします。誤差逆伝播は、まず「出力層のすぐ手前の層が渡してきた情報が、もう少し違っていたら、この「ずれ」はどう変わっていたか」を計算します。そして、その情報をもとに、出力層自身の重みを少しだけ調整すると同時に、「あなたが渡してきた情報は、こう変わっていてほしかった」という修正の指示を、一段手前の層へ送り返します。受け取った層も、同じことをします。自分の重みを少しだけ調整し、さらに一段手前の層へ、次の修正の指示を送ります。これを、出力層から入力層まで、一段ずつ、リレーのようにさかのぼっていきます。

この方法の効率の良さは、隣り合う層とだけやり取りすればよいという点にあります。重みを一つずつ個別に、力任せに試行錯誤するのではなく、出力側から入力側まで一度さかのぼるだけで、すべての層のすべての重みについて、どちらへどれだけ動かせばよいかが、まとめて分かります。層がどれだけ深くても、この一段ずつのリレーという考え方そのものは変わりません。これが、誤差逆伝播が「効率的」と呼ばれる理由です。

損失関数・勾配降下法・誤差逆伝播の関係

ここまで見てきた三つの言葉は、それぞれ独立した技ではなく、一続きの作業の異なる段階を指しています。ネットワークに答えを出させ、その答えと正解との「ずれ」を損失として計算する。誤差逆伝播で、その損失に対して、それぞれの重みがどちらへどれだけ動けばよいかを、出力側から入力側へさかのぼって突き止める。そして勾配降下法で、その情報をもとに、すべての重みを少しずつ動かす。この一連の作業を、大量の例に対して、何度も何度も繰り返す。これが、ニューラルネットワークが「学習する」ときに、実際に起きていることです。

学習の「型」と「良し悪し」という次の課題

今回見た仕組みは、重みをどう動かせば損失が減るかという、いわば学習の「エンジン」の部分です。ただし、このエンジンをどんな材料(データ)で回すのかによって、学習にはいくつかの異なる型があります。また、損失をどこまでも小さくすることが、必ずしも良い結果に結びつくとは限りません。これらの点は、連載第3回で取り上げます。

なお、この「損失を計算し、逆向きにさかのぼり、重みを動かす」という一連の流れが、どのように発見され、どのような壁にぶつかりながら現在の形にたどり着いたかという歴史的な経緯は、連載「AIの歴史」第5回(最初のAIの冬)、第7回(誤差逆伝播)、第8回(深層学習の離陸)で、それぞれ詳しく扱っています。

勾配降下法はなぜうまく機能するのか

損失関数、勾配降下法、誤差逆伝播という三つの仕組みそのものは、確立された、よく理解された技術です。ただ、これらを組み合わせて実際に大規模なネットワークを訓練したとき、何が起きているのかのすべてが解明されているわけではありません。

現在の大きなネットワークが持つ「損失の地形」は、山や谷が無数に入り組んだ、非常に複雑なものになっていると考えられます。単純に考えれば、霧の中を手探りで下るこの方法は、途中の小さなくぼみで動けなくなってしまったり、遠回りを続けてしまったりしてもおかしくありません。

しかし実際には、多くの場合、かなりうまく谷底に近い場所へたどり着きます。なぜこれほど複雑な地形の中で、この単純な方法がここまでよく機能するのかについては、理論的な説明がいくつも提案されているものの、完全に一致した見解には至っていません。

次回は、ニューラルネットワークの学習の型、教師あり学習・教師なし学習・強化学習について解説します。

出典・参考文献

  • Nielsen, M. A. (2015). Neural Networks and Deep Learning. Determination Press. Chapter 1: “Using neural nets to recognize handwritten digits.”
    (http://neuralnetworksanddeeplearning.com/chap1.html)
  • Nielsen, M. A. (2015). Neural Networks and Deep Learning. Determination Press. Chapter 2: “How the backpropagation algorithm works.”
    (http://neuralnetworksanddeeplearning.com/chap2.html)