- 誤區(qū):損失函數(shù)從始至終都不變炕置,梯度下降迭代過程就是“從山頂走到山腳”兆沙,一步步找到最小值欧芽;
- 問題:為何迭代過程中損失函數(shù)下降,但模型評估指標卻出現(xiàn)波動葛圃。
我們通過手動實例進行說明千扔。首先創(chuàng)建一組數(shù)據(jù)如下:
x | y |
---|---|
1 | 2 |
3 | 5 |
6 | 4 |
8 | 3 |
我們使用方程對其進行擬合,并以SSE作為損失函數(shù)库正。假設我們使用小批量梯度下降曲楚,每次帶入兩條數(shù)據(jù)進行損失函數(shù)計算,第一次帶入前兩條數(shù)據(jù)褥符、第二次帶入后兩條數(shù)據(jù)龙誊,則第一輪epoch的第一次迭代過程中損失函數(shù)如下:
據(jù)此可以算得當前梯度公式如下:
迭代過程我們要求每一次迭代損失函數(shù)都降低,但通過觀察上述過程不難發(fā)現(xiàn)喷楣,第一輪epoch迭代第一次時趟大,能夠順利降低,但和并不一定铣焊,同理逊朽,第一輪epoch迭代第二次時,能夠順利降低曲伊,但和并不一定叽讳。雖然我們相信數(shù)據(jù)整體特性應該保持一致,大概率來說其中一個損失函數(shù)減少坟募,其他損失函數(shù)也會減少岛蚤,但畢竟方程不同,這其中確實也存在著一定的不確定性懈糯。我們可以通過以下代碼進行實驗涤妒。
# SSE1損失函數(shù)計算函數(shù)
def loss_sse1(x):
loss1 = 10 * x * x - 34 * x + 29
return loss1
# SSE2損失函數(shù)計算函數(shù)
def loss_sse2(x):
loss2 = 100 * x * x - 96 * x + 25
return loss2
# SSE損失函數(shù)計算函數(shù)
def loss_sse(x):
loss = 110 * x * x - 100 * x + 54
return loss
# SSE1的梯度計算函數(shù)
def g1(x):
grad1 = 20 * x - 34
return grad1
# SSE2的梯度計算函數(shù)
def g2(x):
grad2 = 200 * x - 96
return grad2
# 定義核心參數(shù)
w = 0 # w的初始取值
lr = 0.01 # 模型學習率
num_epochs = 20 # 迭代輪數(shù)
# 創(chuàng)建空列表容器
w_l = [0] # w迭代過程取值
loss_l = [] # 整體SSE取值
loss1_l = [] # SSE1取值
loss2_l = [] # SSE2取值
for i in range(num_epochs):
loss_l.append(loss_sse(w)) # 每一輪迭代開始前計算整體SSE
loss1_l.append(loss_sse1(w)) # 每一輪第一次迭代開始前計算SSE1
w -= lr * g1(w) # 每一輪的第一次迭代
w_l.append(w) # 每一輪第一次迭代后儲存w
loss1_l.append(loss_sse1(w)) # 每一輪第一次迭代后計算SSE1
loss2_l.append(loss_sse2(w)) # 每一輪第二次迭代開始前計算SSE2
w -= lr * g2(w) # 每一輪第二次迭代
w_l.append(w) # 每一輪第二次迭代后儲存w
loss2_l.append(loss_sse2(w)) # 每一輪第二次迭代后計算SSE2
loss_l.append(loss_sse(w)) # 訓練完成后存儲最終w
# 繪圖部分
# 查看整體SSE變化情況
plt.subplot(311)
plt.plot(list(range(num_epochs+1)), loss_l)
# 查看SSE1變化情況
plt.subplot(312)
plt.plot(list(range(num_epochs*2)), loss1_l)
# 查看SSE2變化情況
plt.subplot(313)
plt.plot(list(range(num_epochs*2)), loss2_l)
??從上述結果能夠看出,每一輪的內部兩次迭代赚哗,對于SSE1和SSE2來說都是降低的届腐,但每一輪之間SSE1和SSE2都會出現(xiàn)波動铁坎,原因也是因為其他的損失函數(shù)計算出來的w不一定能有效幫助當前損失函數(shù)降低取值蜂奸,當然整體SSE也是在波動中趨于穩(wěn)定的犁苏。由此我們就能夠明白為何在模型訓練過程中,明明應該“整體向好”扩所,但不管是損失函數(shù)還是模型指標围详,都可能出現(xiàn)波動的情況。
??當然祖屏,除了上面所說的助赞,由于小批量梯度下降每次帶入的數(shù)據(jù)不同從而導致?lián)p失函數(shù)不同進而導致模型結果波動以外,還有一種可能也會導致模型結果波動袁勺,那就是目標函數(shù)和模型評估指標不一致雹食。這種情況在分類問題中非常常見,常見的分類問題中損失函數(shù)是交叉熵損失函數(shù)期丰,代表極大似然估計的概率值群叶,而模型評估指標是準確率,代表最終預測準確的個數(shù)占比钝荡,而在實際建模過程中街立,確實有可能存在極大似然估計概率值增加但準確率不變甚至降低的情況(犧牲了某條數(shù)據(jù)的判別結果但換來了其他很多條數(shù)據(jù)的極大似然估計概率值大幅提升),從而導致訓練過程模型評估指標波動埠通。
關于小批量梯度下降算法捕捉局部規(guī)律的討論:
??其實帶入部分數(shù)據(jù)還是帶入全部數(shù)據(jù)赎离,其實都是相對的。在小批量梯度下降中端辱,某一次迭代雖然是帶入了全部訓練數(shù)據(jù)集的一部分梁剔,但如果我們把這部分數(shù)據(jù)看成全部,就相當于是帶入了全部數(shù)據(jù)進行訓練舞蔽。所有的訓練都是為了捕捉規(guī)律荣病,因此我們可以把某一次迭代看成是模型在捕捉這一部分數(shù)據(jù)的“全部規(guī)律”,但由于這部分數(shù)據(jù)只是所有訓練數(shù)據(jù)的一部分喷鸽,因此模型還只是捕捉了局部規(guī)律众雷。從這個角度來說,小批量梯度下降是希望通過捕捉一個個“小批”數(shù)據(jù)的局部規(guī)律最終構成整個數(shù)據(jù)集的整體規(guī)律做祝。
關于小批量梯度下降算法有效性的討論:
??而為何通過捕捉局部規(guī)律最后能夠更好的把握整體規(guī)律呢砾省?從實際運算結果來看是因為小批量梯度下降能夠跨越局部最小值點,而根本原因則是對于某些“小批”數(shù)據(jù)來說混槐,由于局部規(guī)律和整體規(guī)律存在差異性编兄,整體的局部最小值點對于當前“小批”數(shù)據(jù)來說根本就不是局部最小值點(畢竟不同數(shù)據(jù)的損失函數(shù)不同),因此帶入該“小批”數(shù)據(jù)時候就有可能直接跨越該點声登,也就是說狠鸳,小批量梯度下降無法跨越小批數(shù)據(jù)對應的損失函數(shù)的最小值點揣苏,但在下降的過程中卻有可能偶然幫助整體損失函數(shù)跨越最小值點,這就是借助隨機性解決問題的典型件舵。
隨機性其實是把雙刃劍:
??當我們借助隨機性解決問題的時候卸察,同樣也會面臨隨機性帶來的麻煩,由于一旦開始隨機铅祸,整個迭代過程都會變得不可控坑质,此后我們只能通過各種方法將這個隨機過程盡可能按照我們的意愿執(zhí)行,這也就是一系列的優(yōu)化方法的由來临梗。