2015-05-31 4 views
0

Может кто-нибудь объяснить мне, что смысл за этими двумя строками кода отсюда: https://github.com/Newmu/Theano-Tutorials/blob/master/4_modern_net.pyTheano умножения на ноль

acc = theano.shared(p.get_value() * 0.) 
    acc_new = rho * acc + (1 - rho) * g ** 2 

Является ли это ошибкой? Почему мы создаем экземпляр acc с нулем и затем умножаем его на rho в следующей строке? Похоже, что он ничего не добьется и останется нулевым. Будет ли какая-либо разница, если мы заменим «rho * acc» просто «acc»?

Полнофункциональный приводится ниже:

def RMSprop(cost, params, lr=0.001, rho=0.9, epsilon=1e-6): 
    grads = T.grad(cost=cost, wrt=params) 
    updates = [] 
    for p, g in zip(params, grads): 
     acc = theano.shared(p.get_value() * 0.) 
     acc_new = rho * acc + (1 - rho) * g ** 2 
     gradient_scaling = T.sqrt(acc_new + epsilon) 
     g = g/gradient_scaling 
     updates.append((acc, acc_new)) 
     updates.append((p, p - lr * g)) 
    return updates 

ответ

5

Это просто способ сказать Theano «создать общую переменную и инициализировать ее значение равно нулю в той же форме, как р

Этот RMSprop метод символический метод. На самом деле он не вычисляет обновления параметров RmsProp, а только сообщает Theano, как следует обновлять параметры, когда будет выполнена конечная функция Anano.

Если смотреть дальше the tutorial code you linked to вы увидите символическое выполнение графика для обновления параметров построены RMSprop посредством вызова на линии 67. Эти обновления затем компилируется в функцию Theano называется train в Python на линии 69 и функция поезда выполняется много раз на линии 74 внутри циклов for строк 72 и 73. Функция Python RMSprop будет вызываться только один раз, независимо от того, сколько раз функция train вызывается внутри циклов for на линиях 72 и 73.

В рамках RMSprop мы сообщаем Теано, что для каждого параметра p нам нужна новая переменная Anano, у которой начальное значение Значение имеет ту же форму, что и p, и равно 0. на всем протяжении. Затем мы продолжим рассказывать Theano, как он должен обновлять эту новую переменную (без названия для Anano, но с именем acc в Python) и как обновить параметр p. Эти команды не изменяют ни p, ни acc, они просто говорят Теано, как p и acc следует обновлять позже, как только функция была скомпилирована (строка 69) каждый раз, когда она выполняется (строка 74).

Функция исполнения по линии 74 будет не вызов функции RMSprop Python, они выполняют скомпилированную версию RMSprop. Внутри скомпилированной версии инициализации не будет, поскольку это уже произошло в версии RMSprop на Python. В каждом случае train выполнение линии acc_new = rho * acc + (1 - rho) * g ** 2 будет использовать значение acc не его начальное значение.

Смежные вопросы