【数式編】(順伝播)のまとめ、あと(損失関数)
いままでに求めた順伝播の式をまとめておきます。
隠れ層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
の中身を意識する必要はありますが、
ずいぶんスッキリと表すことができたのではないでしょうか。
【数式編】(逆伝播)2つめの隠れ層の重みとバイアスを更新する 2-(2)
前回のおさらい
前回求めた の更新式は以下の通りです。
今回はその他の重み とバイアス の更新部分の式(勾配)を求めていきます。
それぞれの更新式
それぞれの更新式を並べてみます。
・・・(1)
・・・(2)
・・・(3)
それぞれで の部分は同じことがわかります。
なので、それ以外の部分だけ求めましょう。
(1)の部分
なので
(2)の部分
同様に、
(3)の部分
総まとめ
すべて求まったので、それぞれの の部分をまとめておきましょう。
一見複雑ですが、よく見比べてみると規則性があることがわかるかと思います。