[PYTHON] Legen Sie in Chainer v2 Aktualisierungsregeln für jeden Parameter fest

Einführung

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.

Was ist ein Parameter?

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.

Sie können die Aktualisierung von Parametern beenden oder die Lernrate ändern, indem Sie enable oder hyperparam bearbeiten.

Wenn die Aktualisierungsregel generiert wird

Die UpdateRule-Instanz jedes Parameters wird erstellt, wenn Sie setup () der chainer.Optimizer-Instanz aufrufen.

Beispiel

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

Beenden Sie die Aktualisierung der Parameter

Die Parameteraktualisierung kann für jeden Parameter oder jede Verknüpfung gestoppt werden.

In Parametereinheiten angeben

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

In Link-Einheiten angeben

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()

Ändern Sie die Hyperparameter

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

Hook-Funktion hinzufügen

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))

Ausprobieren

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]

Recommended Posts

Legen Sie in Chainer v2 Aktualisierungsregeln für jeden Parameter fest
So stellen Sie die Ausgabeauflösung für jeden Keyframe in Blender ein
[Veraltet] Chainer v1.24.0 Anfänger-Tutorial