{これはコメントである}
{2013.08.09}
{逐次的な機械学習の概要を説明する疑似コード、著者を含む初心者向け備忘録}
{レコードごとに1回しか学習しないので、実用性は全くない(?)。バイアスやモメンタ
ム学習あたりはさくっと省略されている}
{Arctangent'(x) = (1 + Arctangent(x)) * (1 - Arctangent(x))とした。Sigmoidを使
う場合、Sigmoid'(x) = Sigmoid(x) * (1 - Sigmoid(x))であるはずだ。Sigmoidを
使うと負の値の出力はできない}
{入力データつまり入力ノードと教師データ。-1.0 < x1, x2, y < 1.0でなければなら
ない}
inputs: x1, x2, y;
{学習レート。弄るべし}
vars: r = 0.008;
{ところで、著者はシステムハンガリアンに否定的で、アプリケーションハンガリアンを支持している}
{中間層ノード}
vars: hV1, hV2;
{出力ノード}
vars: oV;
{重みを初期化する。疑似乱数としてロジスティック写像を用いている}
vars:
ihW1 = 0.5;
ihW2 = ihW1 * (1 - ihW1) * 3.99,
ihW3 = ihW2 * (1 - ihW2) * 3.99,
ihW4 = ihW3 * (1 - ihW3) * 3.99,
hoW1 = ihW4 * (1 - ihW4) * 3.99,
hoW2 = hoW1 * (1 - hoW1) * 3.99;
{中間ノードの値を計算する}
hV1 = Arctangent(x1 * ihW1[1] + x2 * ihW2[1]);
hV2 = Arctangent(x1 * ihW3[1] + x2 * ihW4[1]);
{出力ノードの値を計算する}
oV = Arctangent(hV1 * hoW1[1] + hV2 *hoW2[1]);
{中間から出力への重みを訂正する}
hoW1 = (1 + oV) * (1 - oV) * (y - oV) * r + hoW1[1];
hoW2 = (1 + oV) * (1 - oV) * (y - oV) * r + hoW2[1];
{入力から中間への重みを訂正する}
ihW1 = (1 + hV1) * (1 - hV1) * (y - hV1) * r + ihW1[1];
ihW2 = (1 + hV1) * (1 - hV1) * (y - hV1) * r + ihW2[1];
ihW3 = (1 + hV2) * (1 - hV2) * (y - hV2) * r + ihW3[1];
ihW4 = (1 + hV2) * (1 - hV2) * (y - hV2) * r + ihW4[1];
{2013.08.09}
{逐次的な機械学習の概要を説明する疑似コード、著者を含む初心者向け備忘録}
{レコードごとに1回しか学習しないので、実用性は全くない(?)。バイアスやモメンタ
ム学習あたりはさくっと省略されている}
{Arctangent'(x) = (1 + Arctangent(x)) * (1 - Arctangent(x))とした。Sigmoidを使
う場合、Sigmoid'(x) = Sigmoid(x) * (1 - Sigmoid(x))であるはずだ。Sigmoidを
使うと負の値の出力はできない}
{入力データつまり入力ノードと教師データ。-1.0 < x1, x2, y < 1.0でなければなら
ない}
inputs: x1, x2, y;
{学習レート。弄るべし}
vars: r = 0.008;
{ところで、著者はシステムハンガリアンに否定的で、アプリケーションハンガリアンを支持している}
{中間層ノード}
vars: hV1, hV2;
{出力ノード}
vars: oV;
{重みを初期化する。疑似乱数としてロジスティック写像を用いている}
vars:
ihW1 = 0.5;
ihW2 = ihW1 * (1 - ihW1) * 3.99,
ihW3 = ihW2 * (1 - ihW2) * 3.99,
ihW4 = ihW3 * (1 - ihW3) * 3.99,
hoW1 = ihW4 * (1 - ihW4) * 3.99,
hoW2 = hoW1 * (1 - hoW1) * 3.99;
{中間ノードの値を計算する}
hV1 = Arctangent(x1 * ihW1[1] + x2 * ihW2[1]);
hV2 = Arctangent(x1 * ihW3[1] + x2 * ihW4[1]);
{出力ノードの値を計算する}
oV = Arctangent(hV1 * hoW1[1] + hV2 *hoW2[1]);
{中間から出力への重みを訂正する}
hoW1 = (1 + oV) * (1 - oV) * (y - oV) * r + hoW1[1];
hoW2 = (1 + oV) * (1 - oV) * (y - oV) * r + hoW2[1];
{入力から中間への重みを訂正する}
ihW1 = (1 + hV1) * (1 - hV1) * (y - hV1) * r + ihW1[1];
ihW2 = (1 + hV1) * (1 - hV1) * (y - hV1) * r + ihW2[1];
ihW3 = (1 + hV2) * (1 - hV2) * (y - hV2) * r + ihW3[1];
ihW4 = (1 + hV2) * (1 - hV2) * (y - hV2) * r + ihW4[1];