Hiroshi TAKEMOTO (take@pwv.co.jp)
PRMLの5章多層パーセプトロンを使った関数近似の例題、図5.3
をSageを使って試してみます。
|
|
ニューラルネットワークでは、
を繰り返しながら重みwを更新し、関数を近似します。
フィードフォワード処理では、隠れ層の活性$a_j$は $$ a_j = \sum_{i=1}^{D} w_{ji}^{(1)} + w_{j0}^{(1)} $$ で計算され、活性化関数h{.}で変換され $$ z_j = h_1(a_j) $$ となります。 同様に、出力ユニットの活性は、 $$ a_k = \sum_{j=1}^{M} w_{kj}^{(2)} + w_{k0}^{(2)} $$ となり、出力ユニット活性化関数h2{.}で変換さ $$ y_k = h_2(a_k) $$ となります。
入力パターンnに対する誤差を、式(5.44) $$ E_n = \frac{1}{2} \sum_{k} (y_nk - t_nk)^2 $$ を最小にするように重みwの偏微分は、式(5.50) $$ \frac{\partial E_n}{\partial w_{ji}} = \frac{\partial E_n}{\partial a_j} \frac{\partial a_j}{\partial w_{ji}} $$ は、誤差$\delta$を使って式(5.51) $$ \delta_j \equiv \frac{\partial E_n}{\partial a_j} $$ とすると、式(5.53)の変数をzからxに変更して、 $$ \frac{\partial E_n}{\partial w_{ji}} = \delta_j x_i $$ 出力ユニットの誤差、式(5.54) $$ \delta_k = y_k - t_k $$ から、式(5.55) $$ \delta_j \equiv \frac{\partial E_n}{\partial a_j} = \sum_{k} \frac{\partial E_n}{\partial a_k} \frac{\partial a_k}{\partial a_j} $$ となり、式(5.56) $$ \delta_j = h_1' (a_j) \sum_{k} w_{kj} \delta_k $$ という逆伝搬(バックプロパゲート処理)で求められます。
重みの更新は、 $$ w^{(\tau+1)} = w^{(\tau)} - \eta \nabla E_n(w^{(\tau)}) $$ となります。
sageのベクトル計算を使うことで、フィードフォワード処理、バックプロパゲート処理がほぼ上記の式の通りに 記述することができます。
|
|
|
以下の関数
を近似した結果を以下に示します。
ニューラルネットワークのような単純なアルゴリズムでも良く近似できるものだと関心しました。
|
|
|
|