[ 機械学習 ] パラメータを最適化する技術 -勾配法

[ 機械学習 ] パラメータを最適化する技術 -勾配法

本記事では、損失関数の出力を最小化するための方法についてまとめます。

なぜ損失関数を最小化するのか(おさらい)

はじめに、なぜ損失関数を最小化しなければいけないのか、というお話から始めたいと思います。前の記事と内容が重複しますので、すでに読まれている方はここを読み飛ばしてくださって構いません。

損失関数とは何か

損失関数とは、機械学習モデルの出力 y と、正解 t の間にどれだけ隔たりがあるのか、ということを測る関数でした。
前回の記事では、次のような図を用いて説明を行いました。

モデル出力 y が 正解 t からかけ離れている時、損失関数の返却値は大きくなり、逆に y が優れた値であるならば損失関数の返却値は 0 に近づいていくのでしたね。

 

機械学習モデルの最適化と損失関数

機械学習モデルを作成するにあたって目標とするのは当然、モデルの出力 y が 正解 t に限りなく近い出力を行えるようにすることです。

ではその性能を測る基準はなんなのでしょうか。

その一つの答えとなるのが、損失関数です。
すなわち、モデルがどれだけ優れた出力を行えたか、ということを損失関数は測ることができるのです。

先に見たように、モデルの出力と正解データを損失関数に渡した時、関数の返却値が小さければ小さいほど、それは優れたモデルだということができるわけです。

ということで、損失関数の値を最小化することが、機械学習における重要な課題となります。

 

パラメータと損失関数

損失関数の返却値を左右するもの

では、損失関数の返却値を左右する要素はなんなのでしょう。

損失関数は、モデルの出力値と正解データを引数にとり、値を返すのでした。
登場人物を整理すると、次の通りです。

  1. モデルの出力値 y
  2. モデルに渡された入力 x に対応する、正解データ t
  3. y と t を受け取り処理する、内部アルゴリズム
  4. 返却される値 z

このうち、2 / 3 は変更不能です。
2 は正解データですから、言うまでもなく手を加えて調整することはできません。
3 はアルゴリズムですが、基本的には二乗和誤差や交差エントロピーといった既成の関数を使用しますので、この処理を変更すると言うことも考えません。

と言うことで消去法的に考えると、損失関数の返却値 z の値を左右するのは、1 の モデルの出力値 y と言うことになります。

ではさらに、出力 y を算出するモデルの中身を思い出してみます。
ニューラル・ネットワークは、次のような構造を持っていました。

ここでも登場人物を整理してみましょう。

  1. 入力 x
  2. バイアス b
  3. 重み w
  4. 活性化関数
  5. 出力 y

先ほどと同じ理由で、 1 / 4 は変更対象から外すことができます。
5 の出力は、既に損失関数に影響を与える変数として挙げたので除外するとします。

とすると、残ったのは 2のバイアスと、 3の重み、と言うことになります。

 

以上をまとめると、次のような結論が導き出されます。

「損失関数の値 z を決定するのはモデルの出力値 y であり、モデルの出力値 y は、モデル内のパラメータである バイアスb と 重み w によって決定される」

 

損失関数を最小化すると言うことは、すなわち、モデルのバイアスと重みを最適化すると言うことに同義なのです。

計算グラフと言う方法で、今まとめたことをイメージ化します。

繰り返しになりますが、損失の値は出力 y の値に左右されています。
そして出力 y は、重み w と バイアス b の値に左右されています。

したがって、重み w と バイアス b の値を最適化することが、損失を最小化することに繋がるのです。

 

重みとバイアスを最適化する

では、損失関数が最小になるようなバイアスと重みの組み合わせは、どのようにして求めれば良いのでしょうか。

問題を整理すると、ここでの目的は「損失関数の出力 t が最小になるような重み w とバイアス b を見つけたい」と言うことになります。

対象を重み w にだけ絞って考えてみましょう。
重み w が変動したと仮定すると、損失 t もまた変動します。
その時の損失 t の変動方向と変動幅は、「重み w に関する損失関数についての微分」を行うことで求めることができます。

 

例として簡単な図を使用します。
ここで重みを w 、損失関数を t = w**2 としてみましょう。(そんな損失関数はありませんが)
すると、w と t の関係は次のようなイメージを持ちます。

簡単な図ですね。
では、この関数において重み w が 5 という値をとった時、重みに関する微分を行ってその傾きを求めてみると、次のようになります。

この傾きの直線は、重み w が 5 の時の 損失 t の増加率を示しています。
図に傾きの数値は入れていませんが、重みが 5 の時には傾きは約10となっています。

 

もう少し例を追加しましょう。次は w が 2 の時と、-3 の時の傾きです。

 

重みが 2 の時には、5 の時よりも傾斜が緩やかになったことが分かります。
逆に重みが -3 になった時には、傾斜の方向が逆転しています。

 

ここで最初の目的を思い出してみましょう。今私たちは、「損失 t が最小になる時の重み w を探したい」のでした。
ここでは仮の損失関数として y = x**2 を設定していますので最小の損失 t (0) は w(0) の時に得られると目視で得られますが、これをプログラムに判断させたいわけです。(本来の問題はもっと複雑で、目視で判断できないので)

では、この図を見つめた時に何がわかるでしょうか。ポイントは、直線の向いている方向です。

 

…お分かりになったでしょうか。
そう、今オレンジで示されている傾きの直線、この傾きを下に降った先に、損失 t が最小になる地点(今回は w = 0 ) があるのです。

重みが 5 と 2 の時には直線が右肩上がりですので、左下方向へと w を変化させると損失 t は減少します。
逆に -3 の時には直線が左肩上がりになっていますので、右下方向へと w を変化させることで損失 t は減少しますね。

 

以上のことをまとめると、次のようなことが言えます。

「損失 t が最小になるような重み w を求めるためには、重み w に関する損失関数についての微分を行い、得られた傾きの逆方向へと重みを更新する」

 

今は重み w にのみ注目しましたが、同じことをバイアス b にも適用していきます。

このように、パラメータに関する微分を行って、その値を利用してパラメータを更新することで最適化を目指す手法のことを「勾配法」と呼びます。

重み w とバイアス b と言うパラメータを最適化するためには、勾配法を用いてパラメータを更新すれば良い、と言うのが今回の解となります。

 

まとめ

  1. 最適化されたモデルとは、モデルの出力 y と 正解データ t との乖離が少ないモデルのことを指す。
  2. モデルの出力 y と 正解データ t との乖離を数値化するのが「損失関数」である。損失が小さいほど、優れた出力であると言える。
  3. 損失の大小は、パラメータ(重み w と バイアス b)の値に左右される。
  4. したがって、損失を最小に抑えることを目標にパラメータを最適化して行かなければならない。
  5. パラメータに関する損失関数の微分を行うと、各パラメータ値における損失関数に対する傾き(勾配)が得られる。得られた勾配の逆方向へ進むようにパラメータを更新することで、より小さい損失を生み出すパラメータを作り出すことができる。
  6. これを勾配法と呼ぶ。

 

 

以上。

MachineLearningカテゴリの最新記事