26
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Chainerの基本オブジェクトについて〜Variable編〜

Last updated at Posted at 2016-10-24

#本記事について
この記事では,現在深層学習について勉強中の私が

新納浩幸 Chainerによる実践深層学習 オーム社

を読んで学んだChainerの基本オブジェクトについてまとめています.

間違った解釈を載せている場合もありますので,おかしな点に気づかれた方はご指摘していただけると幸いです.

#Chainerについて
ChainerはPFI/PFN(株式会社Preferred Infrastructure/株式会社Preferred Networks)が開発する深層学習のフレームワークです.
深層学習を実装する上で必要な計算を行うライブラリを豊富に備えています.
特徴をまとめると,
-Python(2.7以上)から利用することができる
-あらゆるニューラルネットワークの構造に対応
-動的な計算グラフ構築による直感的なコード
-GPUの強力なサポート
です.
特に,Linux環境下であれば(基本Linux上での動作を想定している)pip一発でインストールができます.

pip install chainer

#基本オブジェクト
Chainerはニューラルネットワークを実装する上で必要なコンポーネントをオブジェクトとして提供します.
基本的なものとして
-Variable
-functions
-links
-Chain
-optimazers
があります.
今回はVariableについて説明します.

#Variables
Variableはニューラルネットワークにおけるノードに対応するオブジェクトです.例としては下の図指しているy2です.
38364563-eef6-259b-93f8-6d0531dad801.png

使用する際は

import numpy as np
import chainer
from chainer import Variable

と記述してください.numpyも配列操作に必要なため,chainerを使用する際は基本importします.

例えば,ノードx1,x2,x3は次のように宣言します.(以下から対話モード)
ノードの実体は配列です.

>>> x1 = Variable(np.array([1], dtype=np.float32))
>>> x2 = Variable(np.array([2], dtype=np.float32))
>>> x3 = Variable(np.array([3], dtype=np.float32))

Chainerでは実数はnp.float32,整数はnp.int32に固定しなければいけません.

z = 2(x_1 - 2x_2 -1) + (x_2x_3 - 1) + 1

この式をVariableで表すと

>>> z = (x1 -2**x2 -1)**2 + (x2*x3 -1) + 1

となります.zの中身はdataという属性から参照できます.式の通り,dataは順
伝搬させた結果です.

variable.png

>>> z.data
array([42.], dtype=float32)

また,backwardメソッドを使うことで逆伝搬の計算を行うことができます.

>>> z.backward()

ニューラルネットワークでは,重みの更新をするために誤差逆伝搬法という手法を用います.(細かい説明についてはリンク先を参照)その際,誤差関数の傾きが重要なパラメータとなるのですが,backwardメソッドを使ったノードに対して,その前のノードのgradという属性に微分値がセットされます.

>>> x1.grad
array([-8.], dtype=float32)
>>> x2.grad
array([46.], dtype=float32)
>>> x3.grad
array([20.], dtype=float32)

実際,それぞれの変数で微分してみると,(Markdownのmathにてflalignが効かない・・・)

\frac{δz}{δx_1} = 2(x_1 - 2x_2 - 1) \\
\frac{δz}{δx_2} = -4(x_1 - 2x_2 -1) + 2x_3(x_2x_3 -1) \\
\frac{δz}{δx_3} = 2x_2(x_2x_3 - 1)

そして,

x_1 = 1\\
x_2 = 2\\
x_3 = 3

を代入すると

\frac{δz}{δx_1} = 2\times(1 - 2\times2 - 1) = -8\\
\frac{δz}{δx_2} = -4\times(1 - 2\times2 - 1) + 2\times3(2\times3 - 1) = 46\\
\frac{δz}{δx_3} = 2\times2\times(2\times3 - 1) = 20

となることが確認できます.
微分計算をあっという間にすることができました.

#終わりに
今回はVariableオブジェクトについて書きました.
自分でも書いてて曖昧な部分があるのでご指摘していただけると幸いです.
次回はfunctionsオブジェクトについて書きます.

#参考
新納浩幸 Chainerによる実践深層学習 オーム社

Chainerのソースを解析。順伝播と逆伝播の仕組み
http://ailaby.com/chainer_foward_backward/

ニューラルネットワークとは
http://qiita.com/moroku0519/items/3188382ad85a8654cc42

26
22
0

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
26
22

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?