前回から深層学習のフレームワークであるChainerを使って実際にニューラルネットワークを構築する記事を書いています.
今回は
1.データの準備
2.モデルの記述
3.最適化アルゴリズムの設定
4.学習
5.結果の出力
のうち
3.最適化アルゴリズムの設定
について書いていきます.
また,そのまま
4. 学習についても書いてしまいます.
#最適なパラメータの算出
前回書いたIrisモデルは以下のコードでした.
class IrisChain(Chain):
def __init__():
super(IrisChain, self).__init__(
l1 = L.Linear(4, 6),
l2 = L.Linear(6, 3),
)
def __call__(self, x, y):
return F.mean_squared_error(self.fwd(x), y)
def fwd(self, x):
h1 = F.sigmoid(self.l1(x))
h2 = self.l2(h1)
return h2
やっていることの流れとしては,
- コンストラクタにて線形の定義
- fwdにてノードからノードへ発火するかどうかの判定
- callにて出力と教師データとの誤差
入力層から中間層の変換を
v = w_1x + b_1 ...(1)
中間層から出力層の変換を
y = w_2v + b_2 ...(2)
と表すことができますが,最終的に求めたいのはこのパラメータ,wとbです.
今回はこちらでも扱った確率的勾配降下法(SGD)の最適化アルゴリズムを使います.
そして,学習です.
学習の繰り返し回数は今回は10000回とします.
>>> model = IrisChain()
>>> optimizer = optimizers.SGD()
>>> optimizer.setup(model)
>>> for i range(10000):
... x = Variable(xtrain)
... y = Variable(ytrain)
... model = zerograds()
... loss = model(x, y)
... loss.backward()
... optimizer.update()
下4行の
model = zerograds()
loss = model(x, y)
loss.backward()
optimizer.update()
はこちら誤差伝搬の様子です.ほぼお約束のパターンです.
これで適切なパラメータwとbが求められ,分類器が出来上がります.
では,次回この分類器をためしてみます.
#参考
山下隆義
イラストでわかるディープラーニング 講談社
新納浩幸
Chainerによる実践深層学習~複雑なNNの実装方法~ オーム社