LoginSignup
6

More than 5 years have passed since last update.

Chainerを用いた簡単なニューラルネットワーク実装〜最適化アルゴリズムの設定〜

Posted at

前回から深層学習のフレームワークである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

やっていることの流れとしては,
1. コンストラクタにて線形の定義
2. fwdにてノードからノードへ発火するかどうかの判定
3. callにて出力と教師データとの誤差

Irisニューラルネット_4.png

入力層から中間層の変換を

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の実装方法~ オーム社

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6