神經網路優化 學習率

2021-10-02 16:36:21 字數 4270 閱讀 4994

**學習率 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第二階段 通過反向傳播演算法計算損失函式對每乙個引數的梯度,再根據梯度和學習率使用梯度下降演算法更新每乙個引...