昨日は乱数生成器の実装を行った。
今日は強化学習用のニューラルネットワークの計算を行列で表現する。
強化学習用のニューラルネットワークの計算
説明を簡単にするために、ここでは次のようなニューラルネットワークを考える:
- 3層ニューラルネットワーク
- 入力は 、出力は
- 中間層のユニット数は
- 各ユニットの重みは 、バイアスは
- 活性化関数は
- 出力層のユニット数は1
- ユニットの重みは 、バイアスは
- 活性化関数は
行列で表現しない計算
まず、おさらいとして、行列で表現していない計算を書いておく:
- 入力 から、中間層の出力 を求める:
- 中間層の出力 から、出力層の出力 を求める:
- 出力層のデルタ を求める:
- 中間層のデルタ を求める:
- 各偏微分を求める:
行列で表現した計算
ここで、中間層の重みを で次のように表すことにする:
そして、表記をもう少しスマートにすると、上の計算は次のように書き直すことが出来る:
- 入力 から、中間層の出力 を求める:
- 中間層の出力 から、出力層の出力 を求める:
- 出力層のデルタ を求める:
- 中間層のデルタ を求める:
- 各偏微分を求める:
なお、表記法として、関数 の引数にベクトル(や行列)が来ている場合、各要素に関数 を適用したベクトル(や行列)を返すものとする。
また、 は行列(ベクトルを含む)のアダマール積(要素ごとの積)、 はベクトルの直積(外積)を表すものとする。
ここまでくれば、Swiftでの行列計算について調べてみた。(その4) - いものやま。で作ったクラスを使って計算が出来るようになる。
中間層や出力の次元が増えた場合
おまけとして、中間層が増えた場合や、出力の次元が増えた場合の計算も書いておく。
以下では、各層 の重みが 、バイアスが 、活性化関数が とする。
(第1層は入力層、第 層は出力層)
- 入力層の出力 を とする。
- 第 層 の出力 を求める:
- 出力 を とする。
- 出力層のデルタ を求める:
- 第 層 のデルタ を求める:
- 各偏微分 を求める:
今日はここまで!