26. import chainerimport chainer, chainer.functions as F, numpy as np
W = chainer.Variable(np.array(...))
b = chainer.Variable(np.array(...))
x = np.array(...)
y = np.array(...)
a = F.matmul(W, x)
y_hat = a + b
ell = F.mean_squared_error(y, y_hat)
print(ell.data) # => ロス値を出力
例:線形回帰
26
matmul + MSE
入力の準備(あとで grad を取り出
す場合はあらかじめ Variable にし
ておく)
順伝播の計算
27. 例:線形回帰
27
matmul + MSE
a = F.matmul(W, x)
y_hat = a + b
ell = F.mean_squared_error(y, y_hat)
ell.backward() # ロスの勾配を計算
print(W.grad) # => W に対する勾配を出力
print(b.grad) # => b に対する勾配を出力
28. ニューラルネットのコンポーネント化: Link/Chain/ChainList
Link: 順伝播のコード片と、それに紐づくパラメータをまとめたもの
– ニューラルネットのオブジェクト指向プログラミング
Chain, ChainList: 順伝播のコード片と、そこで使われる Link をまとめたもの
– コンポーネントを階層化するもの
– これら自身も Link なので、入れ子にできる
– 子 Link を名前で管理するのが Chain, インデックス番号で管理するのが ChainList
これらには、ニューラルネットを扱う上での便利な機能もついている
Link 階層内のすべてのパラメータを集めてくる
Serializer を使ったパラメータのセーブ・ロード (npz, HDF5 に対応)
階層内のすべての Link を指定した GPU のメモリに送る
28
29. 例:全結合層
29
import chainer, chainer.functions as F
import numpy as np
class Linear(chainer.Link):
def __init__(self, n_in, n_out):
super().__init__(W=(n_in, n_out), b=n_out)
chainer.init_weight(self.W.data, None)
chainer.init_weight(self.b.data, 0)
def __call__(self, x):
xW = F.matmul(x, self.W)
return xW + F.broadcast_to(self.b, xW.data.shape)
matmul
Linear
+
※ ほぼおなじ機能が chainer.links.Linear として提供されているので、
普通はそれを使う
30. 例:多層パーセプトロン
30
import chainer, chainer.functions as F, chainer.links as L
import numpy as np
class MLP(chainer.Chain):
def __init__(self):
super().__init__(
l1=L.Linear(100, 10),
l2=L.Linear(10, 1),
)
def __call__(self, x):
h = F.tanh(self.l1(x))
return self.l2(h)
Wx+b
Linear
Linear
MLP
tanh Linear