【Chainer基礎4】Optimizersってなに?分かりやすく5分で解説

【Chainer基礎4】Optimizersってなに?分かりやすく5分で解説

免許を取得して早10年、取った瞬間都会に出てきてもはやペーパードライバーかすらも怪しいですが、友人の車に乗る際は「助手席で朗らかに笑っている」という仏的仕事を営んでいます。アイーンです。

 

今日は「Chainer基礎編」最後の刺客、Optimizers(オプティマイザー)を勉強していきましょう。これが出来ればもはや一人で深層学習のコードを組むことが出来るようになるはず。気合い入れていきましょう。

 

Optimizersとは?

Linksが持つデータは重みwとバイアスbというパラメータでしたね。

Optimizersは、Linksが出力結果とパラメータを基に計算した微分値を使って、正解との誤差を修正(重みとバイアスを更新)してくれる最後の要です。

パラメータ更新の事を「最適化」といいます。

また、最適化に使われるアルゴリズムもタップリ準備され

SGD(確率的降下勾配法)Adam、RMSPropなどの最適化アルゴリズムが一行で使えます。ハイ、自分でも何言ってるのかまだ理解できません。

とりあえずスゲーって言っとけば分かってるっぽいよね。
あとで勉強するから許してね。

下準備

さぁ今までもひとつづつ増えてきたimportですが、今回増えたのは3行目です。

from chainer import Variable , Chain , optimizers

なんでお前だけ小文字で始まんの?統一しろよ。

まぁ、これで使えるので覚えておいてください。

 

class Chain(Chain):

    def __init__(self):

        super( ).__init__(

            l1 = L.Linear( 1 , 2 ),

            l2 = L.Linear( 2 , 1 ),

        )

 

   def __call__(self , x):

        h = F.sigmoid(self , x)

        from self.l2(h)

まずはChainクラスを作りましょう。

入力1つに出力2つのl1と入力2つに出力1つのl2を作ります。

これが中間層2つのニューラルネットワークです。

こんなかんじ。

また、下の__call__メソッドでは、クラスを呼び出しただけで、シグモイド関数が入力値を変換してくれるようにしてあります。

 

次に、Optimizersを使います。(今日のポイント)

OptimizersはChainインスタンスに設定します。

そのためにまずは、Chainインスタンスを作りましょう。

model = Chain()

次に最適化アルゴリズムを選択したoptimizerオブジェクトを作ります。

optimizer = optimizers.SGD()

最後に、最適化(パラメータの更新をしたい)対象のChainインスタンスをsetup()で設定します。

optimizer.setup(model)

これでmodel(Chainインスタンス)を最適化対象に設定しました。

 

さぁ、テスト用の入力値と正解を設定しましょう。

x = Variable(np.array([[1]], dtype=np.float32))

t = Variable(np.array([[1]], dtype=np.float32))

xに入力値tに正解値を設定します。

入力xにより出力されるyが、正解tに近づくようにoptimizerによってwとbが変更されるわけです。

 

model.cleargrads()

これは、modelを作った際に入力されてるgrad(勾配…微分値)を初期化してます。

y = model(x)

そしてyにシグモイド関数によって修正されたxの値をぶち込むわけですね。

 

さ、ここから誤差の設定です。

loss = F.mean_squared_error(y,t)

ここでは、正解との誤差を二乗誤差で求めます

二乗誤差は、「2乗しとけばマイナスの数値は取り除ける」という理由でytを個別に二乗するへりくつ的処理です。

本当はほかにも理由がありますが、そのうちに。

loss.backward()

これで、損失関数(正解とどれだけ誤差があるか)を求めます。

 

さぁそれでは準備が整いました。

optimizersの効果を見てみましょう。

 

model.l1.W.dataprintすると

一度目の重みwの値を見ることが出来ます。

-0.95687375

-1.1613294

こんな結果になりました。

それでは、optimizerを発動してみます。

optimizer.update()

これにより、optimizerによって重みとバイアスに修正を掛けます

再度重みを見てみると

-0.95806617

ー1.159078

お、数値がすこ~し変わりましたね。

ど~ですか!これがoptimizerの効果です!

・・・ショボいって言ったヤツは眼球をくりぬきます。(ボソッ)

 

・・・ど~ですか!スゴイですね~!

これでChainerがなにをやっているのかおおよそ掴めたのではないでしょうか。

 

これで貴方の肩書は「オプティマイザー○○」です。

日曜朝9:00より、放送開始。

ご期待ください。

 

次回は全ての総括として「最低限の深層学習」を実際にやってみましょう。

それでは。