Как применить Оптимизатор к переменной в Chainer?

Вот пример в Pytorch:

optimizer = optim.Adam([modifier_var], lr=0.0005)

А вот в Tensorflow:

self.train = self.optimizer.minimize(self.loss, var_list=[self.modifier])

Но оптимизаторы Chainer могут использовать только «Link», как я могу применить Optimizer к Variable в Chainer?


person ROBUST    schedule 16.10.2018    source источник


Ответы (2)


Короче говоря, нет возможности напрямую присвоить chainer.Variable (даже и chainer.Parameter) chainer.Optimizer.

Ниже приводится некоторое избыточное объяснение.

Во-первых, я переопределяю Variable и Parameter, чтобы избежать путаницы.

Variable — это (1) torch.Tensor в PyTorch v4, (2) torch.autograd.Variable в PyTorch v3 и (3) chainer.Variable в Chainer v4.
Variable — это объект, содержащий два тензора; .data и .grad. Это необходимое и достаточное условие, поэтому Variable не обязательно является обучаемым параметром, который является целью оптимизатора.

В обеих библиотеках есть еще один класс Parameter, который похож, но не совпадает с Variable. Parameter равно torch.autograd.Parameter в Pytorch и chainer.Parameter в Chainer.
Parameter должен быть обучаемым параметром и должен быть оптимизирован.

Следовательно, не должно быть необходимости регистрировать Variable (не Parameter) в Optimizer (хотя PyTorch позволяет регистрировать Variable в Optimizer: это просто для обратной совместимости).

Во-вторых, в PyTorch torch.nn.Optimizer напрямую оптимизирует Parameter, но в Chainer chainer.Optimizer НЕ оптимизирует Parameter: вместо этого chainer.UpdateRule оптимизирует. Optimizer просто регистрирует UpdateRules до Parameters в Link.

Поэтому вполне естественно, что chainer.Optimizer не получает Parameter в качестве своих аргументов, потому что это просто "доставщик" UpdateRule.

Если вы хотите прикрепить разные UpdateRule к каждому Parameter, вы должны напрямую создать экземпляр подкласса UpdateRule и присоединить его к Parameter.

person Yuki Hashimoto    schedule 17.10.2018

Ниже приведен пример изучения задачи регрессии по модели MyChain MLP с использованием оптимизатора Adam в Chainer.

from chainer import Chain, Variable

# Prepare your model (neural network) as `Link` or `Chain`
class MyChain(Chain):
    def __init__(self):
        super(MyChain, self).__init__(
            l1=L.Linear(None, 30),
            l2=L.Linear(None, 30),
            l3=L.Linear(None, 1)
        )

    def __call__(self, x):
        h = self.l1(x)
        h = self.l2(F.sigmoid(h))
        return self.l3(F.sigmoid(h))

model = MyChain()

# Then you can instantiate optimizer
optimizer = chainer.optimizers.Adam()

# Register model to optimizer (to indicate which parameter to update)
optimizer.setup(model)

# Calculate loss, and update parameter as follows.
def lossfun(x, y):
    loss = F.mean_squared_error(model(x), y)
    return loss

# this iteration is "training", to fit the model into desired function.
for i in range(300):
    optimizer.update(lossfun, x, y)

Таким образом, вам нужно setup model, после чего вы можете использовать функцию update для расчета убытка и обновления параметра model. Приведенный выше код взят из здесь

Кроме того, есть другой способ написать обучающий код с использованием модуля Trainer. Более подробное руководство по Chainer см. ниже.

person corochann    schedule 16.10.2018