Chainer 入門
Chainerとは
・ ニューラルネットワーク実装のためのライブラリ
・ 簡単かつ直感的に記述できる
Chainerの基本的な機能
・
Variable
・
links
・
functions
・
optimizers
Chainerの基本的な機能
・
Variable
・
links
・
functions
・
optimizers
ニューラルネット
・ ・ ・
t a n h
t a n h
Variable
・ ・ ・
t a n h
t a n h
Variable
・
変数に対応するオブジェクト
iルport nuルpy
froル chainer iルport Variabリe
x セ Variabリe(nuルpy.array([[1, 2, 3], [4, 5, 6]], dtype セ nuルpy.fリoat32)) y セ x ** 2 + 5 * x
y.grad セ nuルpy.ones((2, 3), dtypeセnuルpy.fリoat32) #勾配の次元を定義
y.bacラward() #微分の計算 (y’セ 2 * x + 5)
Variable
・
arrayをVariableにすることで微分の計算が可能に
・
Variableとして使用するarrayのdtypeは
Chainerの基本的な機能
・
Variable
・
links
・
functions
・
optimizers
ニューラルネット
・ ・ ・
t a n h
t a n h
links
・ ・ ・
t a n h
t a n h
links
・
重み行列に対応するオブジェクト
iルport nuルpy
froル chainer iルport Variabリe, リinラs
h セ リinラs.Linear(4, 2) #2×4の重み行列を作成
print(h.W.data) #hの重み行列
print(h.b.data) #hのバイア
x セ Variabリe(nuルpy.array([[1, 2, 3, 4]]).astype(nuルpy.fリoat32)) y セ h(x)
links
・
linksで重み行列を定義することで
重みとバイアスの初期値も定義される
・
ほとんどのlinksに入力するVariableは
バッチサイズ データの次元数の行列
Chainerの基本的な機能
・
Variable
・
links
・
functions
・
optimizers
ニューラルネット
・ ・ ・
t a n h
t a n h
functions
・ ・ ・
t a n h
t a n h
functions
・
Variableに対応した関数
iルport nuルpy
froル chainer iルport Variabリe, functions
x セ Variabリe(nuルpy.array([[1, 2, 3], [4, 5, 6]], dtype セ nuルpy.fリoat32)) y セ functions.tanh(x)
print(y.data)
y.grad セ nuルpy.ones((2, 3), dtypeセnuルpy.fリoat32) #勾配の次元を定義
y.bacラward() #微分の計算 (y’セ 1 – y ** 2)
functions
・
functionsは活性化関数や損失関数を含め
様々な関数が提供されている
Chainerの基本的な機能
・
Variable
・
links
・
functions
・
optimizers
optimizers
・
最適化(重みの更新)アルゴリズムに対応する
・
確率的勾配降下法(SGD)をはじめ
様々な最適化アルゴリズムが提供されている
froル chainer iルport optiルizers
ルodeリ セ NeuraリNetworラ(input_size) #モ の生成
opt セ optiルizers.SGD(リrセλ) #最適化ア ゴ ムの定義
Chainerの基本的な機能
・
Variable
・
links
・
functions
・
optimizers
serializers
・
モデルのセーブ・ロードに関するモジュール
・
pickleのchainer版みたいな
froル chainer iルport seriaリizers
seriaリizers.save_npz(ルodeリ_path, ルodeリ) #モ の保存
実際の利用例
・
NLPチュートリアルの課題をChainerで実装
・
文書分類(1 or -1)
・モデルの定義
・最適化アルゴリズムの定義
・学習
モデルの定義
・ ・ ・
t a n h
t a n h
モデルの定義
cリass NeuraリNetworラ(Chain):
def __init__(seリf, input_size):
super(NeuraリNetworラ, seリf).__init__(
リinラ1 セ リinラs.Linear(input_size, 2), #入力層→中間層
リinラ2 セ リinラs.Linear(2, 1), #中間層→出力層
)
def __caリリ__(seリf, x, y):
y_predict セ seリf.forward(x) #順伝搬 yを予測
return functions.ルean_squared_error(y_predict, y) / 2 #損失関数
def forward(seリf, x):
hidden セ functions.tanh(seリf.リinラ1(x)) #中間層を計算
順伝搬
・ ・ ・ t a n h t a n h�
" Vector (Vocab)�
# Vector (2)�
" Matrix (2, Vocab)�
" Vector (2)順伝搬
t a n h
�
�
�
,
= tanh
�
#
�
#
+
�
#
モデルの定義
・
順伝搬の定義が簡単にできる
・
functionsには損失関数として二乗誤差
最適化アルゴリズムの定義
・
確率的勾配降下法(SGD)で最適化
・
この3行で最適化アルゴリズムが設定可能
ルodeリ セ NeuraリNetworラ(input_size) #モ の生成
opt セ optiルizers.SGD(リrセλ) #最適化ア ゴ ムの定義
学習
for i in range(epoch):
accuル_リoss セ 0 #そのepoch の誤差の合計を初期化
for phi_0, y in feat_リab:
ルodeリ.zerograds() #勾配の初期化
リoss セ ルodeリ(Variabリe(phi_0), Variabリe(y)) #誤差の計算
accuル_リoss +セ リoss.data #計算した誤差を蓄積し いく
リoss.bacラward() #逆伝搬、勾配の計算
opt.update() #重みの更新
print(accuル_リoss) #そのepoch の誤差の合計
逆伝搬
t a n h�
err =
�
,
− �
,
2
�
,
=
derr
d�
,
=
�
,
− �
�
,
5
=
derr
d
�
#
�
#
+
�
#
=
derr
d�
,
d�
,
d
�
#
�
#
+
�
#
逆伝搬
t a n h�
# Vector (2)�
#
=
derr
d�
#
=
derr
d
�
#�
#+
�
#d
�
#�
#+
�
#d
�
#=
�
,
5
�
#
�
# Matrix (1, 2)�
# Vector (1)�
5,逆伝搬
t a n h t a n h�
#
5
=
derr
d
�
"
�
"
+
�
"
=
derr
d�
#
d�
#
d
�
"
�
"
+
�
"
=
�
#
1 −
�
#
,
逆伝搬
・ ・ ・ t a n h t a n h�
" Matrix (2, Vocab)�
" Vector (2)�
"
=
derr
d�
"
=
derr
d
�
"�
"+
�
"d
�
"�
"+
�
"d
�
"=
�
#
5
�
"
�
5#Vector (2)
�
"重みの更新
・ ・ ・ t a n h t a n h�
�
�
"
−= λ
89::
8
;
<= λ
�
#
5
8
;
<=
<>
?
<8
;
<= λ
�
#
5
�
"
�
"
−= λ
89::
8
?
<= λ
�
#
5
8
;
<=
<>
?
<8
?
<= λ
�
5
�
5重みの更新
t a n h
�
5,Vector (1)
�
# Vector (2)�
# Matrix (1, 2)�
# Vector (1)�
#
−= λ
89::
8
;
@= λ
�
,
5
8
;
@=
@>
?
@8
;
@= λ
�
,
5
�
#
�
#
−= λ
89::
8
?
@= λ
�
,
5
8
;
@=
@>
?
@8
?
@学習
・
複雑だった逆伝搬の計算、重みの更新が
それぞれ1行ずつで記述可能
リoss.bacラward()
テスト
ルodeリ セ NeuraリNetworラ(input_size)
seriaリizers.リoad_npz(ルodeリ_path, ルodeリ) #モ をロー
with open(fin_path, "r") as fin: for x in fin:
phi_0 セ create_features(x)
score セ ルodeリ.forward(Variabリe(phi_0)) #順伝搬 scoreを計算