Теано умножает на ноль

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

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

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

Полная функция приведена ниже:

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

person Sunny88    schedule 31.05.2015    source источник


Ответы (1)


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

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

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

Внутри RMSprop мы сообщаем Theano, что для каждого параметра p нам нужна новая переменная Theano, чье начальное значение имеет ту же форму, что и p, и всегда равно 0. Затем мы сообщаем Theano, как он должен обновлять как эту новую переменную (безымянную для Theano, но именуемую 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, а не его начальное значение.

person Daniel Renshaw    schedule 01.06.2015