2017-10-09 146 views
1

以下模型:Adagrad隱含變量

import tensorflow as tf 
import numpy as np 

BATCH_SIZE = 3 
VECTOR_SIZE = 1 
LEARNING_RATE = 0.1 

x = tf.placeholder(tf.float32, [BATCH_SIZE, VECTOR_SIZE], 
        name='input_placeholder') 
y = tf.placeholder(tf.float32, [BATCH_SIZE, VECTOR_SIZE], 
        name='labels_placeholder') 

W = tf.get_variable('W', [VECTOR_SIZE, BATCH_SIZE]) 
b = tf.get_variable('b', [VECTOR_SIZE], initializer=tf.constant_initializer(0.0)) 

y_hat = tf.matmul(W, x) + b 
predict = tf.add(tf.matmul(W, x), b, name='predict') 
total_loss = tf.reduce_mean(y-y_hat, name='total_loss') 
train_step = tf.train.AdagradOptimizer(LEARNING_RATE).minimize(total_loss) 
X = np.ones([BATCH_SIZE, VECTOR_SIZE]) 
Y = np.ones([BATCH_SIZE, VECTOR_SIZE]) 
all_saver = tf.train.Saver() 

擁有的變量以下列表:

for el in tf.get_collection(tf.GraphKeys.GLOBAL_VARIABLES): 
    print(el) 


<tf.Variable 'W:0' shape=(1, 3) dtype=float32_ref> 
<tf.Variable 'b:0' shape=(1,) dtype=float32_ref> 
<tf.Variable 'W/Adagrad:0' shape=(1, 3) dtype=float32_ref> 
<tf.Variable 'b/Adagrad:0' shape=(1,) dtype=float32_ref> 

張量W:0b:0是顯而易見的,但在那裏W/Adagrad:0b/Adagrad:0來了,從沒有完全清楚。我也沒有在張力板上看到它們: enter image description here

回答

1

這些變量是在您撥打AdagradOptimizer的那一刻定義的。所有優化者都使用一定數量的變量來存儲他們在工作中需要的值。

對於所關注Adagrad,讓我想起了一個標準的梯度下降更新步驟是什麼樣子:

theta(t+1) = theta(t) - eta * grad_theta(t) 

其中theta是一個通用的參數(如您的Wb),eta是一個不斷學習的速度和grad_theta是你的損失函數wrt的梯度theta迭代t

通常,人們使用特定的調度學習率eta,因爲他們需要在學習的初始階段較大eta,而在最後階段(小eta當你非常接近最低的,你想避免在它周圍擺動)。 Adagrad嘗試使用以下想法自動完成:「我將梯度的平方根存儲到迭代t,並且我按比例縮放eta」。換句話說,考慮到:

adagrad_theta(t) = sum(grad_theta(tau)) for tau=1,.., t 

Adagrad ID下面的更新規則:

theta(t+1) = theta(t) - eta * grad_theta(t)/(sqrt(adagrad_theta(t)+ eps)) 

正如你所看到的,學習率重新調整w.r.t.值爲adagrad_theta。這裏,eps是用於避免被零除的小常數(例如1e-12)。此更新規則的另一個特點是,您更新參數的次數越多,在以下步驟中您將執行的操作越少。

W/Adagrad:0b/Adagrad:0無非是adagrad_theta爲你的變量Wb,分別多。在那裏,這些變量的梯度總和得到積累。

Tensorboard知道他們是特定的變量(與模型無關,但與優化策略有關),然後不附加到您的實際圖形。但是,您仍然可以在屏幕右上方看到它們。如果您想在當前圖表中看到它們,只需點擊它們,並在您的右上角可以選擇將它們附加到您的圖表上。

+1

謝謝你的解釋。我明白爲什麼Tensorflow需要存儲'W'和'b',但是存儲Hessian有什麼意義? – user1700890

+0

我在那個答案中是通用的。 Adagrad是相當簡單的優化算法。我編輯答案並嘗試解釋你 –