обновляет аргумент в функциях theano

Что делает аргумент «обновления», когда он вызывается таким образом?

f_grad_shared = theano.function([x, mask, y], cost, updates=zgup + rg2up,
                                    name='adadelta_f_grad_shared')

Вся документация, которую я видел об аргументе «обновления» в функциях theano, говорит о парах формы (общие переменные, выражение, используемое для обновления общей переменной). Однако здесь есть только выражение, так как узнать, какая общая переменная обновлена?

Я предполагаю, что общая переменная каким-то образом неявна, но zgup и rg2up зависят от разных общих переменных:

zipped_grads = [theano.shared(p.get_value() * numpy_floatX(0.),
                              name='%s_grad' % k)
                for k, p in tparams.iteritems()]

running_grads2 = [theano.shared(p.get_value() * numpy_floatX(0.),
                                name='%s_rgrad2' % k)
                  for k, p in tparams.iteritems()]

zgup = [(zg, g) for zg, g in zip(zipped_grads, grads)]
rg2up = [(rg2, 0.95 * rg2 + 0.05 * (g ** 2))
         for rg2, g in zip(running_grads2, grads)]

Этот код взят из lstm.py в http://deeplearning.net/tutorial/lstm.html.

Спасибо


person nisace    schedule 22.07.2015    source источник


Ответы (1)


Правильно думать, что updates должен быть списком (или словарем) пар ключ-значение, где ключ является общей переменной, а значение представляет собой символическое выражение, описывающее, как обновить соответствующую общую переменную.

Эти две строки создают пары:

zgup = [(zg, g) for zg, g in zip(zipped_grads, grads)]
rg2up = [(rg2, 0.95 * rg2 + 0.05 * (g ** 2))
         for rg2, g in zip(running_grads2, grads)]

zipped_grads и running_grads2, созданные в предыдущих строках, представляют собой просто список общих переменных. Здесь эти общие переменные связаны с обновлениями с помощью функции Python zip, которая выдает список пар. На самом деле, первую из этих строк можно было бы заменить на

zgup = zip(zipped_grads, grads)

Этот код довольно сложен, потому что он реализует механизм обновления AdaDelta. Если вы хотите увидеть, как updates работает в более простых условиях, взгляните на базовое обновление стохастического градиентного спуска в Руководство Theano MLP.

updates = [
        (param, param - learning_rate * gparam)
        for param, gparam in zip(classifier.params, gparams)
    ]
person Daniel Renshaw    schedule 22.07.2015