日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Lesson13【加餐】 损失函数的随机创建现象详解

發布時間:2025/4/5 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Lesson13【加餐】 损失函数的随机创建现象详解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

【Lesson 13 加餐】損失函數的隨機創建現象詳解

??接下來,我們通過手動創建一個實例,來觀察在小批梯度下降過程中,損失函數是如何根據數據數據變化而變化的,這里既是作為本節內容的一個補充,同時也是指出一個常見的誤區、以及解決一個常見的問題。

  • 誤區:損失函數從始至終都不變,梯度下降迭代過程就是“從山頂走到山腳”,一步步找到最小值;
  • 問題:為何迭代過程中損失函數下降,但模型評估指標卻出現波動。

我們通過手動實例進行說明。首先創建一組數據如下:

xy
12
35
64
83

我們使用y=wxy=wxy=wx方程對其進行擬合,并以SSE作為損失函數。假設我們使用小批量梯度下降,每次帶入兩條數據進行損失函數計算,第一次帶入前兩條數據、第二次帶入后兩條數據,則第一輪epoch的第一次迭代過程中損失函數如下:
SSE(1)=(2?1?w)2+(5?3?w)2=w2?4w+4+9w2?30w+25=10w2?34w+29\begin{aligned} S S E_{(1)} &=(2-1 * w)^{2}+(5-3 * w)^{2} \\ &=w^{2}-4 w+4+9 w^{2}-30 w+25 \\ &=10 w^{2}-34 w+29 \end{aligned} SSE(1)??=(2?1?w)2+(5?3?w)2=w2?4w+4+9w2?30w+25=10w2?34w+29?據此可以算得當前梯度公式如下:
grad?(1)=?SSE(1)?(w)=20w?34\begin{aligned} \operatorname{grad}_{(1)} &=\frac{\partial S S E_{(1)}}{\partial(w)} \\ &=20 w-34 \end{aligned} grad(1)??=?(w)?SSE(1)??=20w?34?然后再進行迭代。然而再第一輪epoch的第二次迭代時,由于我們帶入了另外兩條數據,此時的損失函數就有所不同了:SSE(2)=(4?6?w)2+(3?8?w)2=36w2?48w+16+64w2?48w+9=100w2?96w+25\begin{aligned} S S E_{(2)} &=(4-6 * w)^{2}+(3-8 * w)^{2} \\ &=36 w^{2}-48 w+16+64 w^{2}-48 w+9 \\ &=100 w^{2}-96 w+25 \end{aligned} SSE(2)??=(4?6?w)2+(3?8?w)2=36w2?48w+16+64w2?48w+9=100w2?96w+25?對應的梯度計算公式也會有所不同
grad?(2)=?SSE(1)?(w)=200w?96\begin{aligned} \operatorname{grad}_{(2)} &=\frac{\partial S S E_{(1)}}{\partial(w)} \\ &=200 w-96 \end{aligned} grad(2)??=?(w)?SSE(1)??=200w?96?而此時如果我們以SSE作為模型評估指標,則模型評估指標其實是每一個“小批”數據對應損失函數之和:
SSE=(2?1?w)2+(5?3?w)2+(4?6w)2+(3?8w)2=SSE(1)+SSE(2)=110w2?100w+54\begin{aligned} S S E &=(2-1 * w)^{2}+(5-3 * w)^{2}+(4-6 w)^{2}+(3-8 w)^{2} \\ &=S S E_{(1)}+S S E_{(2)} \\ &=110 w^{2}-100 w+54 \end{aligned} SSE?=(2?1?w)2+(5?3?w)2+(4?6w)2+(3?8w)2=SSE(1)?+SSE(2)?=110w2?100w+54?迭代過程我們要求每一次迭代損失函數都降低,但通過觀察上述過程不難發現,第一輪epoch迭代第一次時,SSE1SSE_1SSE1?能夠順利降低,但SSE2SSE_2SSE2?SSESSESSE并不一定,同理,第一輪epoch迭代第二次時,SSE2SSE_2SSE2?能夠順利降低,但SSE1SSE_1SSE1?SSESSESSE并不一定。雖然我們相信數據整體特性應該保持一致,大概率來說其中一個損失函數減少,其他損失函數也會減少,但畢竟方程不同,這其中確實也存在著一定的不確定性。我們可以通過以下代碼進行實驗。

# SSE1損失函數計算函數 def loss_sse1(x):loss1 = 10 * x * x - 34 * x + 29return loss1# SSE2損失函數計算函數 def loss_sse2(x):loss2 = 100 * x * x - 96 * x + 25return loss2# SSE損失函數計算函數 def loss_sse(x):loss = 110 * x * x - 100 * x + 54return loss# SSE1的梯度計算函數 def g1(x):grad1 = 20 * x - 34return grad1# SSE2的梯度計算函數 def g2(x):grad2 = 200 * x - 96return grad2# 定義核心參數 w = 0 # w的初始取值 lr = 0.01 # 模型學習率 num_epochs = 20 # 迭代輪數# 創建空列表容器 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)) # 每一輪迭代開始前計算整體SSEloss1_l.append(loss_sse1(w)) # 每一輪第一次迭代開始前計算SSE1w -= lr * g1(w) # 每一輪的第一次迭代w_l.append(w) # 每一輪第一次迭代后儲存wloss1_l.append(loss_sse1(w)) # 每一輪第一次迭代后計算SSE1loss2_l.append(loss_sse2(w)) # 每一輪第二次迭代開始前計算SSE2w -= lr * g2(w) # 每一輪第二次迭代w_l.append(w) # 每一輪第二次迭代后儲存wloss2_l.append(loss_sse2(w)) # 每一輪第二次迭代后計算SSE2loss_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都會出現波動,原因也是因為其他的損失函數計算出來的w不一定能有效幫助當前損失函數降低取值,當然整體SSE也是在波動中趨于穩定的。由此我們就能夠明白為何在模型訓練過程中,明明應該“整體向好”,但不管是損失函數還是模型指標,都可能出現波動的情況。

??當然,除了上面所說的,由于小批量梯度下降每次帶入的數據不同從而導致損失函數不同進而導致模型結果波動以外,還有一種可能也會導致模型結果波動,那就是目標函數和模型評估指標不一致。這種情況在分類問題中非常常見,常見的分類問題中損失函數是交叉熵損失函數,代表極大似然估計的概率值,而模型評估指標是準確率,代表最終預測準確的個數占比,而在實際建模過程中,確實有可能存在極大似然估計概率值增加但準確率不變甚至降低的情況(犧牲了某條數據的判別結果但換來了其他很多條數據的極大似然估計概率值大幅提升),從而導致訓練過程模型評估指標波動。

關于小批量梯度下降算法捕捉局部規律的討論:
??其實帶入部分數據還是帶入全部數據,其實都是相對的。在小批量梯度下降中,某一次迭代雖然是帶入了全部訓練數據集的一部分,但如果我們把這部分數據看成全部,就相當于是帶入了全部數據進行訓練。所有的訓練都是為了捕捉規律,因此我們可以把某一次迭代看成是模型在捕捉這一部分數據的“全部規律”,但由于這部分數據只是所有訓練數據的一部分,因此模型還只是捕捉了局部規律。從這個角度來說,小批量梯度下降是希望通過捕捉一個個“小批”數據的局部規律最終構成整個數據集的整體規律。

關于小批量梯度下降算法有效性的討論:
??而為何通過捕捉局部規律最后能夠更好的把握整體規律呢?從實際運算結果來看是因為小批量梯度下降能夠跨越局部最小值點,而根本原因則是對于某些“小批”數據來說,由于局部規律和整體規律存在差異性,整體的局部最小值點對于當前“小批”數據來說根本就不是局部最小值點(畢竟不同數據的損失函數不同),因此帶入該“小批”數據時候就有可能直接跨越該點,也就是說,小批量梯度下降無法跨越小批數據對應的損失函數的最小值點,但在下降的過程中卻有可能偶然幫助整體損失函數跨越最小值點,這就是借助隨機性解決問題的典型。

隨機性其實是把雙刃劍:
??當我們借助隨機性解決問題的時候,同樣也會面臨隨機性帶來的麻煩,由于一旦開始隨機,整個迭代過程都會變得不可控,此后我們只能通過各種方法將這個隨機過程盡可能按照我們的意愿執行,這也就是一系列的優化方法的由來。

總結

以上是生活随笔為你收集整理的Lesson13【加餐】 损失函数的随机创建现象详解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。