【数式編】(逆伝播)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)の部分
総まとめ
すべて求まったので、それぞれの の部分をまとめておきましょう。
一見複雑ですが、よく見比べてみると規則性があることがわかるかと思います。
【数式編】(逆伝播)2つめの隠れ層の重みとバイアスを更新する 2-(1)
重みの更新式
大まかなところは1つめのユニットと変わりません。
今回は2つめのユニット(ユニットh22)なので、 が になっていることに注意してください。
連鎖率(チェインルール)
ユニットh21 と同様の考え方で、 を求める式を立ててみます。
(再掲)ユニットh21 の の式
見比べてみると、ユニットh21 と ユニットh22 で、それぞれのかたまりの第1項め、第2項めが共通していることがわかります。
では、順番にみていきましょう。
1つめのかたまり
まずは1つめのかたまりについて見ていきましょう。
の部分です。
左から第1項め、第2項め、第3項め、第4項めとします。
・第1項めと第2項めについて
ここは ユニットh21 と同じです。
・第3項めについて
第3項めは です。
よって
・第4項めについて
ユニットh21 と同様に、
・まとめ1
ひととおり必要な部品が揃ったのでつなげてみましょう。
2つめのかたまり
2つめのかたまりはこの部分です。
・第1項めと第2項めについて
ここも ユニットh21 と同じです。
・第3項めについて
第3項めは です。
よって
・第4項めについて
ここは1つめのかたまりと同じです。
・まとめ2
ひととおり必要な部品が揃ったのでつなげてみましょう。
3つめのかたまり
最後のかたまりです。
・第1項めと第2項めについて
ここも ユニットh21 と同じです。
・第3項めについて
なので
・第4項めについて
第4項めはまったく同じです。
・まとめ3
ひととおり必要な部品が揃ったのでつなげてみます。
まとめると…
すべてのネタが揃ったのでまとめてみましょう。
残りの部分
あとは だけです。
これは簡単ですね。 も隠れ層2層めの順伝播で求めています。
よって
まとめ: の更新式
以上から、
と求めることができました。
【数式編】(逆伝播)2つめの隠れ層の重みとバイアスを更新する 1-(2)
前回のおさらい
前回求めた の更新式は以下の通りです。
今回はその他の重み とバイアス の更新部分の式(勾配)を求めていきます。
まずは2つめの重み について
については以下の式を求めます。
ただ、 の式と見比べると、 の部分は同じことがわかります。
そこで、 についてのみ考えると、
なので、
となります。
以上から、
と導けました。
3つめの重み
パターンがわかったので同じようにして、 についてのみ考えると、
なので、
よって
バイアス
バイアスも同様に についてのみ考えましょう。
なので、
よって
(再掲)
すべて求まったので、それぞれの の部分を再掲しておきましょう。
一見複雑ですが、よく見るとほぼほぼ共通していることがわかります。
(かっこの中身が一緒です)