Help us understand the problem. What is going on with this article?

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

More than 3 years have passed since last update.

本記事について

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

新納浩幸 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

hatt0519
Android開発しています。
mixi
全ての人に心地よいつながりを
http://mixi.co.jp
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away