UpdateRule wurde ab Version 2 in Chainer eingeführt. Es ist jetzt möglich, Aktualisierungsregeln für jeden Parameter festzulegen, indem Sie die UpdateRule-Instanz ausführen. Sie können beispielsweise die Lernrate ändern oder die Aktualisierung einiger Parameter unterdrücken.
Die Parameter in diesem Beitrag beziehen sich auf die Instanz "chainer.Parameter".
chainer.Parameter
ist eine Klasse, die chainer.Variable
erbt und zum Speichern der Parameter von chainer.Link
verwendet wird.
Zum Beispiel hat chainer.functions.Convolution2D
zwei Parameter, W
und b
.
UpdateRule
chainer.UpdateRule
ist eine Klasse, die definiert, wie Parameter aktualisiert werden.
Es gibt abgeleitete Klassen, die Aktualisierungsalgorithmen wie SGD unterstützen.
UpdateRule
hat die folgenden Attribute.
chainer.Hyperparameter
): Enthält Hyperparameter, die sich auf den Aktualisierungsalgorithmus beziehen.Sie können die Aktualisierung von Parametern beenden oder die Lernrate ändern, indem Sie enable oder hyperparam bearbeiten.
Die UpdateRule-Instanz jedes Parameters wird erstellt, wenn Sie setup ()
der chainer.Optimizer
-Instanz aufrufen.
Angenommen, Sie bauen das folgende neuronale Netzwerk auf.
class MLP(chainer.Chain):
def __init__(self):
super(MLP, self).__init__()
with self.init_scope():
self.l1 = L.Linear(2, 2)
self.l2 = L.Linear(2, 1)
def __call__(self, x):
h = self.l1(x)
h = self.l2(h)
return h
Die Parameteraktualisierung kann für jeden Parameter oder jede Verknüpfung gestoppt werden.
Um zu verhindern, dass bestimmte Parameter aktualisiert werden, können Sie "update_rule.enabled" auf "False" setzen. Beispiel:
net.l1.W.update_rule.enabled = False
Um zu verhindern, dass der Link aktualisiert wird, können Sie "disable_update ()" aufrufen.
Rufen Sie im Gegenteil enable_update
auf, um alle Parameter von Link zu aktualisieren.
Beispiel:
net.l1.disable_update()
Hyperparameter wie die Lernrate können durch Manipulieren der Attribute von "Hyperparam" geändert werden.
Beispiel:
net.l1.W.update_rule.hyperparam.lr = 1.0
Durch Aufrufen von "update_rule.add_hook" können Hook-Funktionen wie "chainer.optimizer.WeightDecay" für jeden Parameter festgelegt werden.
Beispiel:
net.l1.W.update_rule.add_hook(chainer.optimizer.WeightDecay(0.0001))
Erhöhen Sie beispielsweise die Lernrate einiger Parameter und beenden Sie die Aktualisierung anderer Parameter.
# -*- coding: utf-8 -*-
import numpy as np
import chainer
from chainer import functions as F
from chainer import links as L
from chainer import optimizers
class MLP(chainer.Chain):
def __init__(self):
super(MLP, self).__init__()
with self.init_scope():
self.l1 = L.Linear(2, 2)
self.l2 = L.Linear(2, 1)
def __call__(self, x):
h = self.l1(x)
h = self.l2(h)
return h
net = MLP()
optimizer = optimizers.SGD(lr=0.1)
#Der Anrufaufbau generiert eine Aktualisierungsregel
optimizer.setup(net)
net.l1.W.update_rule.hyperparam.lr = 10.0
net.l1.b.update_rule.enabled = False
x = np.asarray([[0, 0], [0, 1], [1, 0], [1, 1]], dtype=np.float32)
t = np.asarray([[0], [1], [1], [0]], dtype=np.int32)
y = net(x)
print('before')
print('l1.W')
print(net.l1.W.data)
print('l1.b')
print(net.l1.b.data)
print('l2.W')
print(net.l2.W.data)
print('l2.b')
print(net.l2.b.data)
loss = F.sigmoid_cross_entropy(y, t)
net.cleargrads()
loss.backward()
optimizer.update()
print('after')
print('l1.W')
print(net.l1.W.data)
print('l1.b')
print(net.l1.b.data)
print('l2.W')
print(net.l2.W.data)
print('l2.b')
print(net.l2.b.data)
Das Ausführungsergebnis ist wie folgt. Sie können sehen, dass das Ausmaß der Änderung in l1.W viel größer ist als das Ausmaß der Änderung in l2.W, und l1.b hat sich nicht geändert.
before
l1.W
[[ 0.0049778 -0.16282777]
[-0.92988533 0.2546134 ]]
l1.b
[ 0. 0.]
l2.W
[[-0.45893994 -1.21258962]]
l2.b
[ 0.]
after
l1.W
[[ 0.53748596 0.01032409]
[ 0.47708291 0.71210718]]
l1.b
[ 0. 0.]
l2.W
[[-0.45838338 -1.20276082]]
l2.b
[-0.01014706]