1.優化算法
爲了說明梯度下降法、隨機梯度下降法、批量梯度下降法三者區別,我們通過一組數據來擬合
梯度下降(gradient descent):在梯度下降中,對於
隨機梯度下降(stochastic gradient descent):可以看到多了隨機兩個字,隨機也就是說我用樣本集合中的一個樣本來近似我所有的樣本,來調整
小批量梯度下降(mini-batch gradient descent):其實批量的梯度下降就是一種折中的方法,他用了一些小樣本來近似全部的,用minibatch size個樣本,這樣比隨機的要準不少了吧,而且批量的話還可以反映樣本的一個分佈情況的。此外,還有批量梯度下降,它是計算全部訓練集樣本梯度的平均,然後更新梯度。對於大規模數據集來說,比如ILSVRC,可以包含幾百萬個樣本,若採用批量梯度下降的話,需要計算幾百萬次梯度計算,然後計算平均,才能更新一次參數,無論從時間效率還是內存佔用來說都是不可取的,一種常用的做法將訓練數據分批(batch)進行訓練,稱爲小批量梯度下降。比如對於卷積神經網絡來說,每次在訓練集中選擇包含256個樣本的一批數據,然後使用這批數據計算梯度,完成參數更新。
損失函數在minibatch上的梯度是其在整個訓練集上的估計,質量隨着minibatch size的增加而提高。此外,在batch上計算更有效,數據並行計算。
在神經網絡訓練過程中,很少使用隨機梯度下降,因爲小批量梯度下降可以利用矩陣和向量計算進行加速。通常我們講隨機梯度下降(SGD)時,也可以指代小批量梯度下降。
#Python3
import random
# matrix_A 訓練集
matrix_A = [[1,4], [2,5], [5,1], [4,2]]
Matrix_y = [19,26,19,20]
theta = [2,5]
#學習速率
leraing_rate = 0.005
minibatch=3;
loss = 50
iters = 1
Eps = 0.0001
#隨機梯度下降
while loss>Eps and iters <1000 :
loss = 0
i = random.randint(0, 3)
h = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1]
theta[0] = theta[0] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][0]
theta[1] = theta[1] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][1]
Error = 0
Error = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] - Matrix_y[i]
Error = Error*Error
loss = loss +Error
iters = iters +1
print ('theta=',theta)
print ('iters=',iters)
#梯度下降
while loss>Eps and iters <1000 :
loss = 0
for i in range(4):
h = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1]
theta[0] = theta[0] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][0]
theta[1] = theta[1] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][1]
for i in range(4):
Error = 0
Error = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] - Matrix_y[i]
Error = Error*Error
loss = loss +Error
iters = iters +1
print ('theta=',theta)
print ('iters=',iters)
#小批量梯度下降
while loss>Eps and iters <1000 :
loss = 0
sampleindex = random.sample([0,1,2,3],minibatch)
for i in sampleindex :
h = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1]
theta[0] = theta[0] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][0]
theta[1] = theta[1] + leraing_rate*(Matrix_y[i]-h)*matrix_A[i][1]
for i in sampleindex :
Error = 0
Error = theta[0]*matrix_A[i][0] + theta[1]*matrix_A[i][1] - Matrix_y[i]
Error = Error*Error
loss = loss +Error
iters = iters +1
print ('theta=',theta)
print ('iters=',iters)
2.加速訓練
2.1 Batch Normalization
網絡訓練過程中參數不斷改變導致後續每一層輸入的分佈也發生變化,而學習的過程又要使每一層適應輸入的分佈,因此我們不得不降低學習率、小心地初始化,這種現象稱之爲 internal covariate shift.爲了解決這個問題,Sergey Ioffe和Christian Szegedy在2015年提出了一個方法——Batch Normalization.
首先我們來說說Batch Normalization的好處:
(1)可以利用更高的學習速率(learning rate),
(2)不用小心翼翼初始化權重參數
(3)可以在網絡中去掉Dropout,減少
(4)不需要使用使用Local Response Normalization(局部響應歸一化是2012的Alexnet網絡中使用)
(5)把訓練數據(shuffle)打亂得更徹底(防止每批訓練的時候,某一個樣本都經常被挑選到,還可以提高1%的精度)
(6)最顯著的好處就是加速了算法收斂速度,作者用實驗證明了這一點,如下圖:
算法本質:在網絡的每一層輸入的時候,又插入了一個歸一化層,也就是先做一個歸一化處理,然後再進入網絡的下一層。該歸一化層,是一個可學習、有參數的網絡層,不同我們一前學到的數據歸一化方法。
2.2Batch Normalization算法原理
對於每層的輸入:d-維向量
這裏的期望和方差都是在每個minibatch數據集合上計算的,這樣的標準化可以加速算法收斂,但特徵沒有去相關。
這裏的參數
m = K.mean(X, axis=-1, keepdims=True)#計算均值
std = K.std(X, axis=-1, keepdims=True)#計算標準差
X_normed = (X - m) / (std + self.epsilon)#歸一化
out = self.gamma * X_normed + self.beta#重構變換
關於在實戰中使用Batch Normalization可以詳細閱讀文獻《Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift》
3.損失函數
在監督學習問題中,用損失函數(loss function)或代價函數(cost funtion)來度量預測錯誤的程度,即模型
機器學習中常見的損失函數如下:
(1)0-1損失函數(0-1 loss function)
(2)平方損失函數(quadratic loss fuction)
(3)絕對損失函數(absolute loss function)
(4)對數損失函數(logarithmic loss function),或稱對數似然損失函數
Note:損失函數是度量模型一次預測的好壞,而風險函數度量平均意義下模型預測的好壞。
損失函數值越小,模型就越好,由於模型輸入,輸出
上式是理論上模型
由大數定律我們可以知道,當樣本容量趨於無窮大時,經驗風險
Note:模型
3.1 logistic迴歸
logistic迴歸模型,對於給定的訓練數據集
設
則極大似然函數爲:
其對數似然函數爲:
對
3.2 Softmax迴歸模型
Softmax迴歸模型是logistic迴歸模型在多分類問題上的推廣,在多分類問題中,類標籤
在 softmax迴歸中,我們解決的是多分類問題(相對於 logistic 迴歸解決的二分類問題),類標
對於給定的測試輸入
其中
爲了方便起見,我們同樣使用符號
損失函數
值得注意的是,上述公式是logistic迴歸代價函數的推廣。logistic迴歸代價函數可以改爲:
可以看到,Softmax代價函數與logistic 代價函數在形式上非常類似,只是在Softmax損失函數中對類標記的
到目前爲止,我們可以看到該目標函數是softmax迴歸的風險函數,爲防止模型過擬合,可以在該目標函數上再加一個正則化項(或權重衰減),得到結構風險函數,並將其作爲目標函數進行優化。
3.3Softmax迴歸與Logistic 迴歸的關係
當類別數
利用softmax迴歸參數冗餘的特點,我們令
因此,用
4.信息論中的香農熵、KL散度、交叉熵
4.1 信息量與香農熵
信息論的基本思想是一個不太可能的事件居然發生了,要比一個非常可能的事件發生,能提供更多的信息。我們想要通過這種基本思想來量化信息。特別地:
• 非常可能發生的事件信息量要比較少,並且極端情況下,確保能夠發生的事件應該沒有信息量。
• 較不可能發生的事件具有更高的信息量。
• 獨立事件應具有增量的信息。例如,投擲的硬幣兩次正面朝上傳遞的信息量,應該是投擲一次硬幣正面朝上的信息量的兩倍。
爲了滿足上述三個性質,我們定義一個事件
自信息只處理單個的輸出。我們可以用 香農熵(Shannonentropy)來對整個概率分佈中的不確定性總量進行量化:
香弄熵也稱信息熵,香農用信息熵的概念來描述信源的不確定度。在機器學習中用來描述隨機變量的不確定性,熵越大,變量的取值越不確定,反之就越確定。
4.2 KL散度
如果我們對於同一個隨機變量 x 有兩個單獨的概率分佈
KL 散度有很多有用的性質,最重要的是它是非負的。 KL 散度爲0 當且僅當
4.3交叉熵(cross-entropy)
一個和 KL 散度密切聯繫的量是 交叉熵(cross-entropy)
特別的,在logistic regression,二分類問題中,
當
當
而預測的概率:
因此交叉熵如下:
這個結果與通過最大似然估計方法求出來的結果一致,見sec3。
從上面可以看出對於分類問題的交叉熵函數,其給定一個樣本
這裏