本文將介紹優化訓練神經網路模型的一些常用方法,並給出使用tensorflow 實現深度學習的最佳實踐樣例**。為了更好的介紹優化神經網路訓練過程,我們將首先介紹優化神經網路的演算法——梯度下降演算法。然後在後面的部分中,我們將圍繞該演算法中的一些元素來優化模型訓練過程。
梯度下降演算法
梯度下降演算法主要用於優化單個引數的取值,而反向傳播演算法給出了乙個高效的方式在所有引數上使用梯度下降演算法,從而使神經網路模型在訓練資料上的損失函式盡可能小。反向傳播演算法是訓練神經網路的核心演算法,它可以根據定義好的損失函式優化神經網路中引數的取值,從而使神經網路模型在訓練資料集上的損失函式達到乙個較小值。神經網路模型中引數的優化過程直接決定了模型的質量,是使用神經網路時非常重要的一步。假設用θ 表示神經網路中的引數,j(θ) 表示在給定的引數取值下,訓練資料上損失函式的大小,那麼整個優化過程可以抽象為尋找乙個引數θ,使得j(θ) 最小。因為目前沒有乙個通用的方法可以對任意損失函式直接求解最佳的引數取值,所以在實踐中,梯度下降演算法是最常用的神經網路優化方法。梯度下降演算法會迭代式更新引數θ,不斷沿著梯度的反方向讓引數朝著總損失更小的方向更新。圖1 展示了梯度下降演算法的原理。
圖1 梯度下降演算法思想示意圖
圖1 中x 軸表示引數θ 的取值,y 軸表示損失函式j(θ) 的值。圖1 的曲線表示了在引數θ 取不同值時,對應損失函式j(θ) 的大小。假設當前的引數和損失值對應圖1 中小圓點的位置,那麼梯度下降演算法會將引數向x軸左側移動,從而使得小圓點朝著箭頭的方向移動。引數的梯度可以通過求偏導的方式計算,對於引數θ,其梯度為∂/∂θ j(θ)。有了梯度,還需要定義乙個學習率η(learning rate)來定義每次引數更新的幅度。從直觀上理解,可以認為學習率定義的就是每次引數移動的幅度。通過引數的梯度和學習率,引數更新的公式見下頁。下面給出了乙個具體的例子來說明梯度下降演算法是如何工作的。
假設要通過梯度下降演算法來優化引數x,使得損失函式j(x)=x2 的值盡量小。梯度下降演算法的第一步需要隨機產生乙個引數x 的初始值,然後再通過梯度和學習率來更新引數x 的取值。在這個樣例中,引數x 的梯度為=( ∂ j(x))/ ∂ x=2x,那麼使用梯度下降演算法每次對引數x 的更新公式為x_(n+1)=x_n-η_n。假設引數的初始值為5,學習率為0.3,那麼這個優化過程可以總結為表1。
從表1 中可以看出,經過5 次迭代之後,引數x 的值變成了0.0512,這個和引數最優值0 已經比較接近了。雖然這裡給出的是乙個非常簡單的樣例,但是神經網路的優化過程也是可以類推的。神經網路的優化過程可以分為兩個階段,第乙個階段先通過前向傳播演算法計算得到**值,並將**值和真實值做對比得出兩者之間的差距。然後在第二個階段通過反向傳播演算法計算損失函式對每乙個引數的梯度,再根據梯度和學習率使用梯度下降演算法更新每乙個引數。本書將略去反向傳播演算法具體的實現方法和
數學證明,有興趣的讀者可以參考**learning representations by backpropagating errors。
因為梯度下降演算法要在全部訓練資料上最小化損失,所以損失函式j(θ) 是在所有訓練資料上的損失和。這樣在每一輪迭代中都需要計算在全部訓練資料上的損失函式。在海量訓練資料下,要計算所有訓練資料的損失函式是非常消耗時間的。為了加速訓練過程,可以使用隨機梯度下降的演算法(stochastic gradient descent)。這個演算法優化的不是在全部訓練資料上的損失函式,而是在每一輪迭代中,隨機優化某一條訓練資料上的損失函式。這樣每一輪引數更新的速度就大大加快了。因為隨機梯度下降演算法每次優化的只是某一條資料上的損失函式,所以它的問題也非常明顯:在某一條資料上損失函式更小並不代表在全部資料上損失函式更小,於是使用隨機梯度下降優化得到的神經網路甚至可能無法達到區域性最優。為了綜合梯度下降演算法和隨機梯度下降演算法的優缺點,在實際應用中一般採用這兩個演算法的折中——每次計算一小部分訓練資料的損失函式。這一小部分資料被稱之為乙個batch。通過矩陣運算,每次在乙個batch上優化神經網路的引數並不會比單個資料慢太多。另一方面,每次使用乙個batch 可以大大減小收斂所需要的迭代次數,同時可以使收斂到的結果更加接近梯度下降的效果。
Tensorflow實戰 張量
import tensorflow as tf tf.constant 是乙個計算,這個計算的結果為乙個張量,儲存在變數a中。a tf.constant 1.0,2.0 name a b tf.constant 2.0,3.0 name b result tf.add a,b,name add pr...
TensorFlow實戰系列11 卷積層網路結構
圖 4 中顯示了卷積層神經網路結構中最重要的部分,這個部分被稱之為過濾器 filter 或者核心 kernel 因為 tensorflow 文件中將這個結構稱之為過濾器 filter 所以我們將統稱這個結構為過濾器。如圖 4 所示,過濾器可以將當前層神經網路上的乙個子節點 矩陣轉化為下一層神經網路上...
tensorflow實戰 反向傳播
windows10 anaconda3 64位 batch size 8 每次訓練的資料量 seed 23455 隨機種子 rng np.random.randomstate seed x rng.rand 32,2 產生32行2列的隨機矩陣 y int x0 x1 1 for x0,x1 in x...