**學習率 learning_rate:表示了每次引數更新的幅度大小。**學習率過大,會導致待優化的引數在最小值附近波動,不收斂;學習率過小,會導致待優化的引數收斂緩慢。
在訓練過程中,引數的更新向著損失函式梯度下降的方向。
引數的更新公式為:
假設損失函式為
梯度是損失函式loss的導數為2w+2。如引數初值為5,學習率為0.2,則引數和損失函式更新如下:
1次 引數w:5 5 - 0.2 * ( 2 * 5 +2 ) = 2.6
2次 引數w: 2.6 2.6 - 0.2 * (2 * 2.6 + 2) = 1.16
3次 引數w:1.16 1.16 - 0.2 * (2 * 2.6 + 2) = 0.296
4次 引數w:0.296
該損失函式的影象為:
由圖可知,損失函式loss的最小值會在(-1,0)處得到,此時損失函式的導數為0,得到最終引數w = -1。**如下:
#coding:utf-8
#設損失函式 loss=
(w+1)^
2,令w初值是常數5。反向傳播就是求最優w,即求最小loss對應的w值
import tensorflow as tf
#定義待優化引數w初值為5
w = tf.
variable
(tf.
constant(5
,dtype=tf.float32)
)#定義損失函式loss
loss = tf.
square
(w +1)
#定義反向傳播方法
train_step = tf.train.
gradientdescentoptimizer
(0.2).
minimize
(loss)
#生成會話,訓練40輪
with tf.
session
() as sess:
init_op = tf.
global_variables_initializer()
sess.
run(init_op)
for i in range(40
):sess.
run(train_step)
w_val = sess.
run(w)
loss_val = sess.
run(loss)
print "after %s steps: w is %f, loss is %f."
%(i, w_val,loss_val)
執行結果如下
由結果可知,隨著損失函式值的減小,w無限趨近於-1,模型計算推測出最優引數w = -1。
學習率的設定
學習率過大,會導致待優化的引數在最小值附近波動,不收斂;學習率過小,會導致待優化的引數收斂緩慢。
例如:1)對於上例的損失函式,則將上述**中學習率修改為1,其餘內容不變。實驗結果如下:
由運算結果可知,損失函式loss值並沒有收斂,而是在5到-7之間波動。
2)對於上例的損失函式。則將上述**中學習率修改為0.0001,其餘內容不變。實驗結果如下:
由執行結果可知,損失函式loss值緩慢下降,w值也在小幅度變化,收斂緩慢。
指數衰減學習率:學習率隨著訓練輪數變化而動態更新
學習率計算公式如下:
用tensorflow的函式表示為:
global_step = tf.variable(0,trainable=false)
learning_rate = tf.train.exponential_decay(learning_rate_base,global_step,learning_rate_step,learning_rate_decay,staircase=true/false)
其中,learning_rate_base為學習率初始值,learning_rate_decay為學習率衰減率,global_step記錄了當前訓練輪數,為不可訓練型引數。學習率learning_rate更新頻率為輸入資料集總樣本除以每次餵入樣本數。若staircase設定為true時,表示global_step/learning rate step取整數,學習率階梯型衰減;若staircase設定為false時,學習率會是一條平滑下降的曲線。
例如:在本例中,模型訓練過程不設定固定的學習率,使用指數衰減學習率進行訓練。其中,學習率初值設定為0.1,學習率衰減率設定為0.99,batch_size設定為1。
**如下:
#coding:utf-8
#設損失函式 loss=
(w+1)^
2,令w初值是常數10。反向傳播就是求最優w,即求最小loss對應的w值。
#使用指數衰減的學習率,在迭代初期得到較高的下降速度,可以在較小的訓練輪數下取得更有收斂度
import tensorflow as tf
learning_rate_base =
0.1 #最初學習率
learning_rate_decay =
0.99 #學習率衰減率
learning_rate_step =
1 #餵入多少輪batch_size後,更新一次學習率,一般設為:總樣本數/batch_size
#執行了幾輪batch_size的計數器,初值給0,設為不被訓練
global_step = tf.
variable(0
,trainable=flase)
#定義指數下降學習率
learning_rate = tf.train.
exponential_decay
(learning_rate_base,global_step,learning_rate_step,learning_rate_decay,staircase=true)
#定義待優化引數,初值給10
w = tf.
variable
(tf.
constant(5
,dtype=tf.float32)
)#定義損失函式loss
loss = tf.
square
(w+1
)#定義反向傳播方法
train_step = tf.train.
gradientdescentoptimizer
(learning_rate)
.minimize
(loss,global_step=global_step)
#生成會話,訓練40輪
wit tf.
session
() as sess:
init_op = tf.
global_variable_initialzier()
sess.
run(init_op)
for i in range(40
):sess.
run(train_step)
learning_rate_val = sess.
run(learning_rate)
global_step_val = sess.
run(global_step)
w_val = sess.
run(w)
loss_val = sess.
run(loss)
print "after %s steps: global_step is %f, w is %f,learning rate is %f, loss is %f"
%(i,global_step_val,w_val,learning_rate_val,loss_val)
神經網路優化 學習率
本文將介紹通過指數衰減的方法設定梯度下降演算法中的學習率,通過指數衰減學習率既可以讓模型的前期快速接近較優解,又可以保證模型在訓練後期不會有太大的波動,從而更加接近區域性最優。在神經網路中需要設定學習率來控制引數更新的速度,如果幅度過大,那麼有可能導致引數在極優值的兩側來回移動,如果學習率過小,雖然...
神經網路優化
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input data 載入資料集 mnist input data.read data sets mnist data one hot true 每個批次的...
神經網路優化(一)
使用反向傳播演算法和梯度下降演算法調整神經 網路中引數的取值。神經網路的優化過程分為兩個階段 1.1第一階段 先通過前向傳播演算法計算得到 值,並將 值和真實值做對比得出兩者之間的差距。1.2第二階段 通過反向傳播演算法計算損失函式對每乙個引數的梯度,再根據梯度和學習率使用梯度下降演算法更新每乙個引...