はじめに
前回の続きです。 yaju3d.hatenablog.jp
幾つかの人工知能関連の本やWebサイトを見ても、数式やプログラムのソースリストは記載されていても、数学が苦手な自分が理解できるようになるまでの説明が無い、そんな中でも下記3つの本(Kindle)がまだ理解できそうな感じで参考になりそうである。
基礎的な知識から、やっと実際の計算方法に入っていきます。
勾配降下法
関数 について、その最小値を与える と の値を勾配降下法で求めてみます。
ちなみに、正解はです。
最初に勾配を求めておきましょう。
前回記事の偏微分で説明したように、関数 を偏微分すると指数を係数にした 、 となります。
①勾配式
それでは、ステップを追って計算を進めます。
1.初期設定
初期位置と学習係数 を適当に与えます。
今回は初期位置を(3.00,2.00)、学習係数 とします。
No | 位 | 置 | 勾 | 配 | 変位ベ | クトル | 関数値 |
---|---|---|---|---|---|---|---|
i | |||||||
0 | 3.00 | 2.00 |
2.変位ベクトルを算出
現在位置 に対して、勾配式から算出し、勾配降下法の基本式から変位ベクトル を求めます。
前回記事の勾配降下法に適用で、2変数関数 の勾配降下法の基本式は次のように表しました。
基本式
これに①勾配式を当てはめたのが次の式となります。「」は掛け算の意味です。
②変位ベクトル
No | 位 | 置 | 勾 | 配 | 変位ベ | クトル | 関数値 |
---|---|---|---|---|---|---|---|
i | |||||||
0 | 3.00 | 2.00 | 6.00 | 4.00 | -0.60 | -0.40 | 13.00 |
各計算結果の求め方
勾配
変位ベクトル
関数値
3.位置を更新
勾配降下法に従って、現在位置 から移動先 の点を次の式から求めます。
②移動先
No | 位 | 置 | 勾 | 配 | 変位ベ | クトル | 関数値 |
---|---|---|---|---|---|---|---|
i | |||||||
0 | 3.00 | 2.00 | 6.00 | 4.00 | -0.60 | -0.40 | 13.00 |
1 | 2.40 | 1.60 |
移動先
4.2と3の繰り返し
2と3の繰り返し(6~27は省略)、30回繰り返したときの座標 の値です。
正解の と一致します。
No | 位 | 置 | 勾 | 配 | 変位ベ | クトル | 関数値 |
---|---|---|---|---|---|---|---|
i | |||||||
0 | 3.00 | 2.00 | 6.00 | 4.00 | -0.60 | -0.40 | 13.00 |
1 | 2.40 | 1.60 | 4.80 | 3.20 | -0.48 | -0.32 | 8.32 |
2 | 1.92 | 1.28 | 3.84 | 2.56 | -0.38 | -0.26 | 5.32 |
3 | 1.54 | 1.02 | 3.07 | 2.05 | -0.31 | -0.20 | 3.41 |
4 | 1.23 | 0.82 | 2.46 | 1.64 | -0.25 | -0.16 | 2.18 |
5 | 0.96 | 0.66 | 1.97 | 1.31 | -0.20 | -0.13 | 1.40 |
28 | 0.01 | 0.00 | 0.01 | 0.01 | 0.00 | 0.00 | 0.00 |
29 | 0.00 | 0.00 | 0.01 | 0.01 | 0.00 | 0.00 | 0.00 |
30 | 0.00 | 0.00 | 0.01 | 0.00 | 0.00 | 0.00 | 0.00 |
※Excel計算で小数誤差により微妙に値が違います。
バイアスについて
バイアス(bias)とは、一般に真値からの偏り、つまり系統的な誤差を指す。
切片(せっぺん)
ニューラルネットワークのパラメーターは重みとバイアスがセットとなります。
バイアスがイメージしやすいものとして、回帰直線があります。
回帰直線は次のような1次式で表現されます。
回帰方程式
a を回帰係数(傾き)、bを切片の呼びます。切片が無いと必ず原点を通すことになってしまいます。
傾きが求まったところで切片で上下位置の調整をします。この切片がバイアスのことになります。
閾値(しきいち)
左図が本物の神経細胞(ニューロン) で、右図が形式ニューロンです。
簡単に説明すると、入力が2つあり各入力に対して重みが掛け算され、その値が閾値を超えれば出力は「1」、そうでなければ出力は「0」となります。 たとえば、入力が(1,0)、重みが(0.5, 0.7)だとすると、1×0.5 + 0×0.7 = 0.5 を計算して閾値と比較します。
閾値未満だと出力無し(発火なし)、閾値を超えると出力有り(発火あり)となります。
出力信号無し
出力信号有り
ここで はニューロン固有の閾値です。
を左に移行させた発火の式は次のように表現することができます。
発火の式
※ は活性化関数となります。
活性化関数にシグモイド曲線を使った場合の閾値 は生物的にはニューロンの個性を表現する値です。
が大きければ興奮しにくく(すなわち鈍感)、小さければ興奮しやすい(すなわち敏感)という感受性を表します。
発火の式 にて、 だけマイナス記号が付いているのは数学的に美しくありません。美しさが欠けることは数学が嫌うところです。また、マイナスは計算ミスを誘発しやすいという欠点を持ちます。そこで、 を と置き換えたのが次の式となります。
こうすれば式として美しく、計算ミスも起こりにくくなります。
この をバイアス(bias)と呼びます。
バイアスの式表現
数式では b とするよりは として、次の式にします。
一般的に書き直すと、重みをではなく として、 をバイアスとした場合、入力値 とすると と で次元が違うと扱いにくいので、最初の要素に をセットする。
それを と定義して、 の最初の要素に を置くほうがより数学上では綺麗となる。
を転置したものと を掛けたものを計算すると次の式になります。
更にこれを書き直すと 、 と簡易的な表現の式となる。
やる夫で学ぶ機械学習 - 多項式回帰と重回帰 - · けんごのお屋敷
リンゴとミカン
リンゴとミカンを例題に勾配降下法を計算していきます。上記と違うのは、訓練データがあることです。
以前の記事を参考にします。
yaju3d.hatenablog.jp
前提
1層の全結合ニューラルネットワークを用いて、勾配降下法による重みの更新例を示します。
入力層ユニット数は2、出力層はユニット数が1のシンプルなネットワークです。損失関数は二乗誤差を用います。
No | 入力 | データ | 教師データ |
---|---|---|---|
i | |||
1 | 1 | 3 | 190 |
2 | 3 | 1 | 330 |
3 | 5 | 7 | 660 |
上表はトレーニングデータセットです。サンプル数は3で、1番目のサンプルを見ると、、が与えられたときの教師データ (正解)になっています。
勾配の計算式
出力層の出力値 は、入力層の出力値 を用いて、次のような一次多項式で表すことができます。
パラメーター
これにトレーニングデータセットを当てはめると、次のような連結方程式が出来上がります。
この連結方程式は行列とベクトルを用いて次のように表すことが出来ます。
w X Y 重み 入力データ 出力データ(推測値)
今回はバイアスbは 0 とするので除外しました。そうしないリンゴとミカンの金額(重み)を求めたいのにバイアスを含む3つ値が求まってしまいます。
w X Y 重み 入力データ 出力データ(推測値)
誤差を含めた式と行列を表現すると下記のようなります。
入力データを 、重み(パラメーター)を 、出力データ(推測値) としています。 と を用いると、出力データ は次の式で表すことができます。
また、教師データは、 を用いて次のように表します。
損失関数には二乗誤差を使用します。誤差は次のような式で表すことができます。
勾配は、誤差 を重み で微分すると、勾配を次のような式になります。
: の転置行列、:誤差信号
今回、を誤差信号と呼び、記号 (デルタ)で表します。
勾配は、誤差信号 と、入力データ から求めることができます。入力データはすでにわかっている値なので、誤差信号の値を求めれば、勾配を求めることができ、そして勾配がわかれば、式 で重みを を更新することができます。:学習係数
初期値の設定
初めに、重み と学習係数に適当な初期値を設定します。ここでは学習係数は 0.02 とし、重みの初期値を10円と20円から、バイアスは 0 にして次のように設定します。
重みの更新
①~③の手順で重みの更新を行います。
①現在の重みで推測値を求める
入力データと現在の重みから、推測値を求めます。
推測値
ここで、全体の誤差をいったん計算してみます。損失関数には二乗誤差を使用するので、全体の誤差は次のように計算します。
現在の値
教師データ
推測値
全体の誤差
②勾配を計算する
現在の重みに対する勾配を計算します。
入力データを転置行列にするのは、行列の掛け算の定義で「行列Aの列数(横の個数)と、行列Bの行数(縦の個数)が等しくないと掛け算できない」ためです。
行列A() 1行3列 と 行列B() 3行2列 にして掛け算させます。行列の積
現在の値
教師データ
推測値
入力データ 勾配
③重みを更新する
②で求めた勾配を用いて、現在の重みを更新します。学習係数は 0.02 としています。
現在の値
現在の重み
勾配
更新後の重み
これで重みが更新されました。ここで、更新後の重みを使って推測値を求め、全体の誤差を再び計算してみます。
現在の値
教師データ
推測値
全体の誤差
全体の誤差は 101108.64 となり、重みの誤差前の 156850 より小さくなっていることが分かります。
更新の繰り返し
以上の①~③の計算で、全サンプル(今回は2サンプル)の更新が1回終わりました。これで1エポックを終了したことになります。
更新後の重みを用いて、①~③をもう一度繰り返せば、2エポックが終了となります。
最後に
計算の繰り返しはコンピューターの得意なところです。
次回はこの計算が本当に合っているのか、Pythonを使って実証してみたいと思います。