2015-05-31 35 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?看起來它不會達到任何目的,並保持爲零。如果我們用「acc」替換「rho * 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「創建一個共享變量和初始化它的值爲零相同的形狀爲p」。

這個RMSprop方法是符號方法。它實際上並不計算RmsProp參數更新,它只是告訴Theano如何在最終的Theano函數執行時計算參數更新。

如果你還看不起the tutorial code you linked to你會看到的參數更新的符號執行圖形由RMSprop通過調用構造線67.這些更新,然後編譯成Python中叫train上線69和Theano功能在第72行和第73行的for循環內第74行執行許多次列車函數。Python函數RMSprop將只被調用一次,而不管在第72行和第73行的for循環中調用train函數多少次。

RMSprop之內,我們告訴Theano,對於每個參數p,我們需要一個新的Theano變量,它的初始值值的形狀與p相同,且始終爲0。然後,我們繼續告訴Theano它應該如何更新這個新變量(就Theano而言,未命名但在Python中命名爲acc)以及如何更新參數p本身。這些命令不會改變pacc,它們只是告訴Theano如何在以後更新pacc,一旦該函數每次執行(行74)時已編譯(第69行)。

74行的函數的執行將不會電話RMSprop Python函數,它們執行的RMSprop編譯版本。在編譯後的版本中不會進行初始化,因爲已經發生在Python版本的RMSprop中。每行train執行行acc_new = rho * acc + (1 - rho) * g ** 2將使用當前acc而不是其初始值。