6. パラメータの学習アルゴリズム(最急降下法)
学習は以下の2操作の繰り返し
• 勾配(⽬的関数 L をパラメータ w に関する微分、∇wL)の計算
• w を勾配⽅向に少し動かす
initialize w
until convergence:
get data (x, y)
w ← w - η ∇w L(x, y; w)
η:学習率
← この更新式にはバリエーションがある
ニューラルネットは誤差逆伝播により勾配を効率的に計算できる
6
14. 計算グラフ構築のパラダイム:Define-and-Run vs. Define-by-Run
f g
x f g
計算グラフ構築
データフィード
x yf
x = chainer.Variable(...)
y = f(x)
z = g(x)
zg
データフィード
= 計算グラフ構築
Define-and-Run Define-by-Run
誤解を恐れず⾔えば
• Define-and-Run = NNのコンパイラ
• Define-by-Run = NNのインタープリタ
14
15. 疑似コードでの⽐較
15
# 構築と評価が同時
for xi, yi in data:
x = Variable(xi)
y = Variable(yi)
z = x + 2 * y
Define-by-RunDefine-and-Run
# 構築
x = Variable(‘x’)
y = Variable(‘y’)
z = x + 2 * y
# 評価
for xi, yi in data:
eval(z, x=xi, y=yi))
16. 命令的なフレームワークでは柔軟な計算グラフ構築が可能
• ネットワーク構築にPythonの制御構⽂
を利⽤できる
• if / for / while etc…
• 応⽤
• 訓練・テストで層を取り替える
• For⽂を⽤いてRNNを構築
• 訓練データごとに異なる計算グラフ
def forward(x, t, train=True):
h = F.relu(model.l1(x))
y = model.l2(h)
if train:
loss = F.softmax_cross_entropy(y, t)
return loss
else:
prob = F.softmax(y)
acc = F.accuracy(prob, t)
return acc
…… y sce
lo
ss
…… y sm
pr
ob
acc
ac
c
訓練
テスト
…
…
…
…
16
19. Linkオブジェクト
• パラメータ付き関数
• Linkの持つパラメータは
• Optimizer(後述)の最適化の対象
• シリアライザでsave/loadができる
• 多くのLinkには対応するパラメータなしの
Functionが存在する
• 例:LinearLinkとLinearFunction
• 内部で対応するFunctionを利⽤している
LinearFunction
x W b
y
LinearLink
W b
x
y
LinearFunction
19
20. model
Chainオブジェクト
• Linkをまとめるオブジェクト
• Chain⾃⾝がLinkを継承しているので、Linkを階層的に扱える
• Chainを継承したモジュールは再利⽤をしやすくなる
model = Chain(embed=L.EmbedID(10000, 100),
layer1=L.Linear(100, 100),
layer2=L.Linear(100, 10000))
x = Variable(...)
h = F.relu(model.layer1(model.embed(x)))
y = model.layer2(h)
20
layer1
W b
layer2
W b
embed
W