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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

算法函数_关于损失函数和优化算法,看这一篇就够了

發布時間:2024/9/15 编程问答 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 算法函数_关于损失函数和优化算法,看这一篇就够了 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在進行神經網絡訓練時,很多同學都不太注重損失函數圖和損失函數的優化算法的理解,造成的結果就是:看起來效果不錯,但是不知道訓練的參數是否合理,也不知道有沒有進一步優化的空間,也不知道初始點的選擇是否恰當。本篇文章著重介紹神經網絡損失函數最小化過程中使用的優化算法,前面先對梯度下降法進行介紹,后面介紹梯度下降法中使用的幾種優化算法,中間穿插著自變量的更新軌跡和損失函數圖像的講解,以期同學們對損失函數相關的知識有清晰明確的認識,這是學好神經網絡的基礎。

梯度下降法

梯度下降法是最原始的對模型的參數向量進行更新的方法,它的目標函數是訓練數據集中有關各個樣本的損失函數的平均。設

是有關索引為 的訓練數據樣本的損失函數, 是訓練數據樣本數, 是模型的參數向量,那么目標函數定義為

目標函數在

處的梯度為:

模型的參數向量更新:

例如,對于目標函數

,使用上述迭代方法更新自變量的軌跡如下(學習率為0.1,迭代了20次):

可以看到自變量的迭代軌跡與等高線是垂直的,說明迭代一直朝著梯度的反方向進行(直達目的地)。但是梯度下降法每次更新模型參數需要對所有樣本計算梯度,所以每次自變量迭代的計算開銷為

.因此,當訓練數據樣本數很大時,梯度下降每次迭代的計算開銷很高。

隨機梯度下降法

為了減少計算的開銷,采用了隨機梯度下降(SGD)方法。在隨機梯度下降的每次迭代中,我們隨機均勻采樣的一個樣本索引

,并計算梯度 來迭代 :

我們的目標是把所有樣本的損失降到一個極小值,但是這種方式只能把一個樣本的損失給降低,那么這樣能達到我們的目標嗎?可以證明:經過很多次的迭代之后隨機梯度下降能達到梯度下降相同的效果,也就是說隨機梯度

是對梯度 的無偏估計。同樣是對于目標函數 ,采用隨機梯度下降更新自變量的軌跡如下(學習率為0.1,迭代了20次):

可以看到自變量的迭代軌跡與等高線不是垂直的,說明迭代沒有完全按照梯度下降的方向走,但是最后也到達了跟梯度下降方法同樣的終點,再次證明了我們上述說的“經過很多次的迭代之后隨機梯度下降能達到梯度下降相同的效果”。但是此時可能存在損失函數圖像是以下形狀:

出現這種損失函數在某個值附近波動,說明學習率太大了,以至于在這個值附近跳來跳去,無法繼續朝著梯度的反方向達到極小值點,通常需要降低學習率。

小批量隨機梯度下降法

除了梯度下降和隨機梯度下降,我們還能每次處理一批樣本,當這一批樣本的數量等于整個訓練集時,就成了梯度下降;當這一批樣本的數量為一個樣本時,就成了隨機梯度下降。

小批量隨機梯度下降對自變量的迭代如下:

對于目標函數

,采用隨機梯度下降更新自變量的軌跡如下(學習率為0.1,迭代了20次):(注意這里把 的系數變為了0.1,剛才 的系數都是1,也就是說這里在兩個方向上,方向導數差了一個數量級):

可以看到小批量隨機梯度下降也大體是朝著等高線垂直的方向前進。但是注意:在前幾次的迭代過程中垂直方向上每一步的跨度都超過了水平方向上的跨度,這是因為兩個方向的方向導數差別太大導致的,這種情況如果我們更新參數的時候在各個方向還是使用相同的學習率就會帶來不好的結果:具體來說就是當學習率設置的大的時候方向導數比較大的那個維度容易發散,這樣就找不到極小值了。當學習率設置的比較小的時候方向導數比較小的那個維度移動較慢,可能訓練已經結束了,還沒達到極小值點(在實際的訓練中經常發生這樣的事情,因為高維空間的函數及其復雜,可能存在大片平坦區域,很久也走不出去)。針對這種情況,出現了兩種優化方法:動量法和AdaGrad算法。下面分別介紹。

動量法

動量法的思想很簡單,就是要把之前時間步的梯度考慮進來,比如在某一個維度上,前面好幾個時間步的梯度都是同一個符號,說明在這個方向上一直在下坡,還沒有跳過極小值點,那么就需要加速,一次跳的更遠一些,這樣接近極小值更快一些。再比如在另一個維度上,前面好幾個時間步的梯度的正負符號不一致,那么說明在這個區域內,這個維度在極小值附近跳來跳去,也就是說當前的(學習率*梯度)太大了,以至于不能更靠近極小值。這兩種情況都可以通過一個辦法解決,那就是把最近幾個時間步的學習率*梯度考慮進來,如果最近幾個時間步的都為同一個符號,那么它們相加就會變大,更新的就快;如果最近幾個時間步的為不同的符號,那么它們相加就會相互抵消,就會變小,就更容易靠近極小值點。動量法的更新方法如下:

相比以前,多了一步

的計算,并且 的更新不再是減 了,而是減 ,但是看這個式子其實體現不出上面描述的思想,我們把這個式子變形一下可得:

例如:

=0.9,那么上式就是

其實就是,本來應該減

的,現在把最近的10個 分別乘以它們的權值之后相加,通過這樣就把最近10個時間步的 考慮了進來,實現了上述描述的思想。

同樣是上述目標函數,這里我們把學習率設置的和剛才一樣,但是使用動量法并設置動量超參數為

=0.5,自變量更新的軌跡如下:

可以看到動量法在豎直方向上的移動更加平滑。

AdaGrad算法

還是要解決剛才的問題,動量法是把最近的(學習率*梯度)考慮了進來,另一種想法就是針對每一維我們設置不同的學習率不就行了嗎,如果某個維度的導數比較大,我們就設置比較小的學習率,如果某個維度的方向導數比較小,我們就設置稍微大一點的學習率,這正是AdaGrad算法算法的思路。

AdaGrad算法的更新方法如下(時間步0時,

的每個元素初始化為0):

其中

是學習率, 是為了維持數值穩定性而添加的常數,如 .這個式子看起來不太容易,我們把這個式子變形一下可得:

上式為了好看把

去掉了,從上述可以清楚的看出AdaGrad是如何針對每一個維度設置學習率的,它僅僅是把當前時間步之前的所有梯度按元素平方然后累加開方求倒數。所以如果某一維梯度比較大,那么相加開方之后這一維仍然比較大,求倒數之后就變得很小,也就是學習率很小。而且需要注意到,在每一個時間步,上式的分母都在累加,所以每個時間步學習率都在降低,所以,當學習率在迭代早期降得較快且當前解依然不佳時,AdaGrad算法在迭代后期由于學習率過小,可能較難找到一個有用的解。

還是使用目標函數

及學習率0.4,使用AdaGrad法自變量更新的軌跡如下:

損失函數的變化圖形大致如下所示:

可以看到由于前期學習率下降太快,導致后期的迭代變得特別慢,20輪迭代之后,自變量仍未達到極小值點。由于在實際的機器學習過程中,損失函數都是高維函數,函數將變得非常復雜,學習率下降太快會導致不管訓練了多久可能都出不了某個區域的情況。

RMSProp算法

針對上面這個問題,提出了RMSProp算法。RMSProp算法綜合了動量法和AdaGrad算法的思想,它既想用過去的時間步的梯度來更新當前

向量,又不想學習率下降的太快導致后期找不到有效解。因此RMSProp算法采用的方法是:

像剛才一樣,我們還是做一個變形:

相當于給每個

加了個權重。然后計算方法照AdaGrad算法這樣進行。

還是使用目標函數

及學習率0.4,使用RMSProp算法對自變量更新的軌跡如下( =0.9):

損失函數的變化圖形大致如下所示:

可以看到,RMSProp算法可以更快逼近最優解,并且像動量法一樣在豎直方向上的移動更加平滑,也克服了AdaGrad法迭代較慢的現象。

Adam算法

Adam算法在RMSProp算法基礎上對小批量隨機梯度也做了指數加權移動平均,可以看做是RMSProp算法與動量法的結合,也就是RMSProp算法的增強和優化版本。

Adam算法使用了動量變量

和RMSProp算法中的 ,并在時間步0將它們中每個元素初始化為0,Adam算法更新自變量的過程如下:

另外還有一點,就是上面的

還可以寫成 這個公式其實就是t個向量相加,每一個向量是一個系數 乘以梯度向量 ,舉個例子,比如t=2時, ,大家會發現系數相加0.3+0.6不等于1,實際上上面的t個系數相加: ,但是讓各權值相加為1才能更好的把歷史梯度考慮進來,所以我們讓上述系數除以一個 ,從而使過去各時間步小批量隨機梯度權值之和為1,對應剛才的那個例子,就相當于

所以Adam算法真正的公式如下:

Adam算法是應用最廣泛、效果最好的優化算法之一,近年來又提出了很多優化算法,但核心思想都是為了解決梯度下降過程中存在的上述幾個問題。把這幾個算法理解清楚,就理解了整個梯度下降的過程,對于后續研究其它優化算法也打下了堅實的基礎。

總結

以上是生活随笔為你收集整理的算法函数_关于损失函数和优化算法,看这一篇就够了的全部內容,希望文章能夠幫你解決所遇到的問題。

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