【数式編】(逆伝播)のまとめ 1
逆伝播についてはそれぞれの重みとバイアスの (勾配)の部分を載せます。
重みやバイアスは、 (勾配)に学習率を掛け、現在の重みやバイアスの値から引くことで更新していきます。
出力層
出力層についても共通部分を で表すことにしましょう。
ユニットo11
ユニットo12
ユニットo13
隠れ層2層め
ユニットh21
ユニットh22
ユニットh23
ユニットh24
【数式編】(順伝播)のまとめ、あと(損失関数)
いままでに求めた順伝播の式をまとめておきます。
隠れ層1層め
ユニットh11
ユニットh12
ユニットh13
隠れ層2層め
ユニットh21
ユニットh22
ユニットh23
ユニットh24
出力層
ユニットo11
ユニットo12
ユニットo13
損失関数(クロスエントロピーエラー)
【数式編】(逆伝播)1つめの隠れ層の重みとバイアスを更新する 3-(3)
ユニットh12 の重みとバイアスの更新式
もう一度、前回までで求めた更新式を見てみましょう。
(再掲)
よく見ると、
という構造になっていることがわかります。
それを踏まえると以下のようになると思います。
今回の共通部は としましょう。
ユニットh13 の重みとバイアスの更新式
同じパターンなので以下のようになります。
共通部は とします。
これで必要な計算式がすべて求まりました。
【数式編】(逆伝播)1つめの隠れ層の重みとバイアスを更新する 3-(2)
ユニットh11 の残りの重みとバイアスの更新式
では、残りの の更新式についてみていきましょう。
・まずは の更新式
前回求めた の更新式と見比べると、 の部分が共通していることがわかると思います。
(再掲)
なので、 の部分だけ計算すればいいですね。
なので、
よって
・ の更新式
これも とほとんど同じです。
なので、
よって
・ の更新式
同様に、
よって
・ の更新式
よって
総まとめ
それぞれの重みとバイアスの更新部分の式(勾配)をまとめておきます。
前回同様に共通部分を としましょう。
これで ユニットh11 の重みとバイアスに関する更新式を求めることができました。
【数式編】(逆伝播)1つめの隠れ層の重みとバイアスを更新する 3-(1)
隠れ層1層めの重みの更新式
さて、いよいよ隠れ層1層めの重みとバイアスの更新式についてみていきましょう。
今回は、隠れ層1層めの1つめのユニット ユニットh11 の重み についてみていきます。
隠れ層1層めともなると、その出力が影響を及ぼした値はかなりの数になります。
具体的には1層めと2層めの関連する部分と2層め以降のすべての値となり、かなり複雑になります。
ただし、安心してください。
前回までの2層めの更新式で、 にかかる更新式はすでに求めています。
なので、実質的には、1層めと2層めの関連する部分の更新式を求めればよいことになります。
では、実際の更新式を見ていきましょう。
の更新式
の更新式は以下のようにあらわすことができます。
さて、上記の式の中で、 は前回までですでに求めています。
(再掲)
ただし
なので、残りの部分を求めていきましょう。
それぞれのかたまりの3つめの項
ここは全部共通で となっています。
なので、
まとめ
これで必要なパーツが揃ったのでまとめてみましょう。
一見複雑ですが、ここに至るまでにほとんどの部分が求められていますので、それほど計算量は多くなかったのではないでしょうか。
【VBA】FizzBuzzをクラスを使って書いてみる【GAS】
最近GAS(Google Apps Script)の勉強を始めたので、
某所のお題であったFizzBuzz問題をVBAとGASでクラスを使って(GASというかJavaScriptではクラスという言い方はしないらしい…)書いてみました。
VBAはコンストラクタ(Class_Initialize())で引数をとれないのががが。。
GASは this キーワードがちょっと煩わしい感じ。。
あと、いまひとつ中かっこ後のセミコロンの要不要がわかってません。
【VBA】
'[クラスモジュール - classFizzBuzz] Option Explicit Dim mMin As Long Dim mMax As Long Dim mNum As Long Private Sub Class_Initialize() mMin = 1 mMax = 100 mNum = 1 End Sub Public Sub Constructor(ByRef min As Long, ByRef max As Long) mMin = min mMax = max mNum = min End Sub Public Function hasNext() As Boolean mNum = mNum + 1 hasNext = (mNum <= mMax) End Function Public Function getFizzBuzz() As String Dim res As String res = "" If mNum Mod 3 = 0 Then res = "Fizz" End If If mNum Mod 5 = 0 Then res = res & "Buzz" End If If res = "" Then res = CStr(mNum) End If getFizzBuzz = res End Function
'[標準モジュール] Option Explicit Public Sub myFunction() Dim fizzBuzz As classFizzBuzz Set fizzBuzz = New classFizzBuzz Call fizzBuzz.Constructor(1, 100) Do Debug.Print fizzBuzz.getFizzBuzz Loop While fizzBuzz.hasNext Set fizzBuzz = Nothing End Sub
【GAS】
var FizzBuzz = function(min, max) { this.min = min; this.max = max; this.num = min; this.hasNext = function() { this.num++; return (this.num <= max); }; this.getFizzBuzz = function() { var res = ''; if (this.num % 3 == 0) { res = 'Fizz'; } if (this.num % 5 == 0) { res += 'Buzz'; } if (res == '') { res = this.num; } return res; }; }; function myFunction() { var fizzBuzz = new FizzBuzz(1, 100); do { Logger.log(fizzBuzz.getFizzBuzz()); } while (fizzBuzz.hasNext()); }
【数式編】(逆伝播)2つめの隠れ層の重みとバイアスを更新する 2-(3)
おさらい
前回までで ユニットh21 と ユニットh22 についての必要な更新式が求まりました。
以下に再掲してみます。
・ユニットh21
・ユニットh22
見比べてみると以下のことがわかると思います。
- かっこの部分はユニットごとに共通
- 最後に掛け合わされている z は対象の重みの位置ごとに共通
以上を踏まえると、残りのユニットの更新式については以下のようになります。
残りのユニットの更新式
・ユニットh23
・ユニットh24
もう一歩進めて…
さて、これで隠れ層2層めのすべてのユニットのすべての重みとバイアスの更新部分(勾配)の式がわかりました。
ただ、前述したように、かっこの中身はユニットごとに共通です。
なので、ここでもう一歩進めて、共通部分を別の表記(別の文字)(デルタ)で置き換えてみましょう。
そうすることで、実はこの後で求める隠れ層1層めの更新式を(比較的)スッキリ表すことができるようになります。
・ユニットh21
・ユニットh22
・ユニットh23
・ユニットh24
の中身を意識する必要はありますが、
ずいぶんスッキリと表すことができたのではないでしょうか。