簡體   English   中英

如何有效地更新Theano中共享變量的值?

[英]How to update a value of a shared variable in Theano efficiently?

我嘗試在Theano中實現非負矩陣分解。 更詳細地講,我嘗試找到兩個矩陣LR ,使它們的乘積L x R代表給定矩陣M盡可能准確。

為了找到LR矩陣,我使用了反向傳播。 在某些時候,我注意到LR中的值可以為負(當然,沒有什么可以阻止back prop這樣做的)。 我試圖通過在反向傳播步驟之后添加以下行來糾正此行為:

self.L.set_value(T.abs_(self.L).eval())
self.R.set_value(T.abs_(self.R).eval())

之后,我的程序變得更加慢。

難道我做錯了什么? 我是否以錯誤的方式更新了張量的值? 有沒有辦法更快地做到這一點?

添加

根據評論中的要求,我提供了更多代碼。 這就是我在__init__定義函數的方式。

self.L = theano.shared(value=np.random.rand(n_rows, n_hids), name='L', borrow=True)
self.R = theano.shared(value=np.random.rand(n_hids, n_cols), name='R', borrow=True)
Y = theano.dot(self.L, self.R)

diff = X - Y
D = T.pow(diff, 2)
E = T.sum(D)
gr_L = T.grad(cost=E, wrt=self.L)
gr_R = T.grad(cost=E, wrt=self.R)

self.l_rate = theano.shared(value=0.000001)
L_ups = self.L - self.l_rate*gr_L
R_ups = self.R - self.l_rate*gr_R

updates = [(self.L, L_ups), (self.R, R_ups)]
self.backprop = theano.function([X], E, updates=updates)

然后在我的train函數中,我有以下代碼:

for i in range(self.n_iter):
    costs = self.backprop(X, F)

    self.L.set_value(T.abs_(self.L).eval())
    self.R.set_value(T.abs_(self.R).eval())

稍微說abs_ ,我使用abs_函數,但是使用將負值替換為零的函數實際上更有意義。

您可以這樣強制L和R的符號更新值始終為正:

self.l_rate = theano.shared(value=0.000001)
L_ups = self.L - self.l_rate*gr_L
R_ups = self.R - self.l_rate*gr_R

# This force R and L to always be updated to a positive value
L_ups_abs = T.abs_(L_ups)
R_ups_abs = T.abs_(R_ups)

# Use the update L_ups_abs instead of L_ups (same with R_ups)
updates = [(self.L, L_ups_abs), (self.R, R_ups_abs)]
self.backprop = theano.function([X], E, updates=updates)

並刪除線

self.L.set_value(T.abs_(self.L).eval())
self.R.set_value(T.abs_(self.R).eval())

從你的訓練循環

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM