亚洲av成人精品日韩一区,97久久久精品综合88久久,玩弄japan白嫩少妇hd,亚洲av片不卡无码久久,玩弄人妻少妇500系列

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

深度學(xué)習(xí)中多種優(yōu)化算法

深度學(xué)習(xí)自然語言處理 ? 來源:Python遇見機器學(xué)習(xí) ? 2020-08-28 09:52 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

本文旨在優(yōu)化一維函數(shù),實際上模型參數(shù)有數(shù)百萬維以上,差距很大,因此本文最好作為輔助法的理解,而非對算法優(yōu)劣的判斷依據(jù)。 在深度學(xué)習(xí)中,有很多種優(yōu)化算法,這些算法需要在極高維度(通常參數(shù)有數(shù)百萬個以上)也即數(shù)百萬維的空間進行梯度下降,從最開始的初始點開始,尋找最優(yōu)化的參數(shù),通常這一過程可能會遇到多種的情況,諸如: 1、提前遇到局部最小值從而卡住,再也找不到全局最小值了。 2、遇到極為平坦的地方:“平原”,在這里梯度極小,經(jīng)過多次迭代也無法離開。同理,鞍點也是一樣的,在鞍點處,各方向的梯度極小,盡管沿著某一個方向稍微走一下就能離開。 3、“懸崖”,某個方向上參數(shù)的梯度可能突然變得奇大無比,在這個地方,梯度可能會造成難以預(yù)估的后果,可能讓已經(jīng)收斂的參數(shù)突然跑到極遠(yuǎn)地方去。 為了可視化&更好的理解這些優(yōu)化算法,我首先拼出了一個很變態(tài)的一維函數(shù): 其導(dǎo)數(shù)具有很簡單的形式: 具體長得像:

具有懸崖和大量的局部最小值,足以模擬較為復(fù)雜的優(yōu)化情況了。
算法1:純粹的梯度下降法 該算法很簡單,表述如下:

首先給出學(xué)習(xí)率lr,初始x while True: x = x - lr*df/dx 根據(jù)學(xué)習(xí)率的不同,可以看到不同的效果。學(xué)習(xí)率過小,卡在局部極小值,學(xué)習(xí)率過大,壓根不收斂。

梯度下降法

算法2:梯度下降法+動量 算法在純粹的梯度下降法之上,外加了梯度,從而記錄下了歷史的梯度情況,從而減輕了卡在局部最小值的危險,在梯度=0的地方仍然會有一定的v剩余,從而在最小值附近搖擺。

首先給出學(xué)習(xí)率lr,動量參數(shù)m 初始速度v=0,初始x while True: v = m * v - lr * df/dx x += v 下面可以看圖:

梯度下降+動量, lr=0.05

梯度下降+動量, lr=0.01

梯度下降+動量, lr=0.002 從中我們可以看出: 1、lr越小越穩(wěn)定,太大了很難收斂到最小值上,但是太小的話收斂就太慢了。 2、動量參數(shù)不能太小,0.9以上表現(xiàn)比較好,但是又不能太大,太大了無法停留在最小值處。

算法3:AdaGrad算法 AdaGrad算法的思想是累計歷史上出現(xiàn)過的梯度(平方),用積累的梯度平方的總和的平方根,去逐元素地縮小現(xiàn)在的梯度。某種意義上是在自行縮小學(xué)習(xí)率,學(xué)習(xí)率的縮小與過去出現(xiàn)過的梯度有關(guān)。 缺點是:剛開始參數(shù)的梯度一般很大,但是算法在一開始就強力地縮小了梯度的大小,也稱學(xué)習(xí)率的過早過量減少。 算法描述:

給出學(xué)習(xí)率lr,delta=1e-7累計梯度r=0,初始xwhile True: g = df/dx r = r + g*g x = x - lr / (delta+ sqrt(r)) * g

效果并不是很好......

算法4:RMSProp AdaGrad算法在前期可能會有很大的梯度,自始至終都保留了下來,這會使得后期的學(xué)習(xí)率過小。RMSProp在這個基礎(chǔ)之上,加入了平方梯度的衰減項,只能記錄最近一段時間的梯度,在找到碗狀區(qū)域時能夠快速收斂。 算法描述:

給出學(xué)習(xí)率lr,delta=1e-6,衰減速率p累計梯度r=0,初始xwhile True: g = df/dx r = p*r + (1-p)*g*g x = x - lr / (delta+ sqrt(r)) * g

RMSProp,p=0.99

RMSProp,p=0.9

RMSProp,p=0.8 衰減速率情況復(fù)雜,建議自行調(diào)參.......

算法5:Adam算法 Adam算法和之前類似,也是自適應(yīng)減少學(xué)習(xí)率的算法,不同的是它更新了一階矩和二階矩,用一階矩有點像有動量的梯度下降,而用二階矩來降低學(xué)習(xí)率。 此外還使用了類似于s = s / (1-p1^t)這樣的公式,這樣的公式在t較為小的時候會成倍增加s,從而讓梯度更大,參數(shù)跑的更快,迅速接近期望點。而后續(xù)t比較大的時候,s = s / (1-p1^t)基本等效于s=s,沒什么用。 算法如下:

給出學(xué)習(xí)率lr,delta=1e-8,衰減速率p1=0.9,p2=0.999 累計梯度r=0,初始x ,一階矩s=0,二階矩r=0時間t = 0while True: t += 1 g = df/dx s = p1*s + (1-p1) *g r = p2*r +(1-p2)*g*g s = s / (1-p1^t) r = r / (1-p2^t) x = x - lr / (delta+ sqrt(r)) * s

Adam算法,鬼一樣的表現(xiàn) 是的,你沒有看錯,這玩意壓根不收斂......表現(xiàn)極差。 在算法中仔細(xì)研究后才發(fā)現(xiàn),是在t很小的前幾步的時候,p2=0.999太大了,導(dǎo)致r = r / (1-p2^t) 中,1-p2^t接近0,r迅速爆炸,百步之內(nèi)到了inf。后來修改p2=0.9后效果就好得多了。

Adam算法,神級表現(xiàn) 最后還是Adam效果最好了 :),盡管學(xué)習(xí)率還是需要相當(dāng)?shù)恼{(diào)參。

算法6:牛頓法 牛頓法是二階近似方法的一種,其原理類似于將某函數(shù)展開到二次方(二次型)項: 如果幸運的話,這個展開式是一個開口向上的曲面,一步就走到這個曲面的最低點:

初始x while True: g = df(x) # 一階導(dǎo)數(shù) gg = ddf(x) # 二階導(dǎo)數(shù) x = x - g/gg # 走到曲面的最低點

可憐的牛頓法,靜態(tài)圖 圖片如上,看了真可憐........其實牛頓法要求的是H矩陣正定(一維情況下是二階導(dǎo)數(shù)大于零),在多維中,這樣的情況難以滿足,大量出現(xiàn)的極小值,懸崖,鞍點都會造成影響,導(dǎo)致無法順利進行下去,為了更好地進行牛頓法,我們需要正則化它。

算法7:牛頓法+正則化 牛頓法加上正則化可以避免卡在極小值處,其方法也很簡單:更新公式改成如下即可。 一維的算法如下:

初始x ,正則化強度alphawhile True: g = df(x) # 一階導(dǎo)數(shù) gg = ddf(x) # 二階導(dǎo)數(shù) x = x - g/(gg+alpha) # 走到曲面的最低點 效果圖:

牛頓法+正則化 看了真可憐.........二次方法真心在非凸情況很糟糕。此外算法涉及H矩陣的逆,這需要O(n^3)的計算量,非深度學(xué)習(xí)可用。 參考文獻 [1]Ian Goodfellow,深度學(xué)習(xí)Deep Learning,人民郵電出版社,170-190 代碼

#coding:utf-8from __future__ import print_functionimport numpy as npimport matplotlib.pyplot as plt def f(x): return (0.15*x)**2 + np.cos(x) + np.sin(3*x)/3 + np.cos(5*x)/5 + np.sin(7*x)/7 def df(x): return (9/200)*x - np.sin(x) -np.sin(5*x) + np.cos(3*x) + np.cos(7*x) points_x = np.linspace(-20, 20, 1000)points_y = f(points_x) # 純粹的梯度下降法,GDfor i in range(10): # 繪制原來的函數(shù) plt.plot(points_x, points_y, c="b", alpha=0.5, linestyle="-") # 算法開始 lr = pow(2,-i)*16 x = -20.0 GD_x, GD_y = [], [] for it in range(1000): GD_x.append(x), GD_y.append(f(x)) dx = df(x) x = x - lr * dx plt.xlim(-20, 20) plt.ylim(-2, 10) plt.plot(GD_x, GD_y, c="r", linestyle="-") plt.title("Gradient descent,lr=%f"%(lr)) plt.savefig("Gradient descent,lr=%f"%(lr) + ".png") plt.clf() # 動量 + 梯度下降法for i in range(10): # 繪制原來的函數(shù) plt.plot(points_x, points_y, c="b", alpha=0.5, linestyle="-") # 算法開始 lr = 0.002 m = 1 - pow(0.5,i) x = -20 v = 1.0 GDM_x, GDM_y = [], [] for it in range(1000): GDM_x.append(x), GDM_y.append(f(x)) v = m * v - lr * df(x) x = x + v plt.xlim(-20, 20) plt.ylim(-2, 10) plt.plot(GDM_x, GDM_y, c="r", linestyle="-") plt.scatter(GDM_x[-1],GDM_y[-1],90,marker = "x",color="g") plt.title("Gradient descent + momentum,lr=%f,m=%f"%(lr,m)) plt.savefig("Gradient descent + momentum,lr=%f,m=%f"%(lr,m) + ".png") plt.clf() # AdaGradfor i in range(15): # 繪制原來的函數(shù) plt.plot(points_x, points_y, c="b", alpha=0.5, linestyle="-") # 算法開始 lr = pow(1.5,-i)*32 delta = 1e-7 x = -20 r = 0 AdaGrad_x, AdaGrad_y = [], [] for it in range(1000): AdaGrad_x.append(x), AdaGrad_y.append(f(x)) g = df(x) r = r + g*g # 積累平方梯度 x = x - lr /(delta + np.sqrt(r)) * g plt.xlim(-20, 20) plt.ylim(-2, 10) plt.plot(AdaGrad_x, AdaGrad_y, c="r", linestyle="-") plt.scatter(AdaGrad_x[-1],AdaGrad_y[-1],90,marker = "x",color="g") plt.title("AdaGrad,lr=%f"%(lr)) plt.savefig("AdaGrad,lr=%f"%(lr) + ".png") plt.clf() # RMSPropfor i in range(15): # 繪制原來的函數(shù) plt.plot(points_x, points_y, c="b", alpha=0.5, linestyle="-") # 算法開始 lr = pow(1.5,-i)*32 delta = 1e-6 rou = 0.8 x = -20 r = 0 RMSProp_x, RMSProp_y = [], [] for it in range(1000): RMSProp_x.append(x), RMSProp_y.append(f(x)) g = df(x) r = rou * r + (1-rou)*g*g # 積累平方梯度 x = x - lr /(delta + np.sqrt(r)) * g plt.xlim(-20, 20) plt.ylim(-2, 10) plt.plot(RMSProp_x, RMSProp_y, c="r", linestyle="-") plt.scatter(RMSProp_x[-1],RMSProp_y[-1],90,marker = "x",color="g") plt.title("RMSProp,lr=%f,rou=%f"%(lr,rou)) plt.savefig("RMSProp,lr=%f,rou=%f"%(lr,rou) + ".png") plt.clf() # Adamfor i in range(48): # 繪制原來的函數(shù) plt.plot(points_x, points_y, c="b", alpha=0.5, linestyle="-") # 算法開始 lr = pow(1.2,-i)*2 rou1,rou2 = 0.9,0.9 # 原來的算法中rou2=0.999,但是效果很差 delta = 1e-8 x = -20 s,r = 0,0 t = 0 Adam_x, Adam_y = [], [] for it in range(1000): Adam_x.append(x), Adam_y.append(f(x)) t += 1 g = df(x) s = rou1 * s + (1 - rou1)*g r = rou2 * r + (1 - rou2)*g*g # 積累平方梯度 s = s/(1-pow(rou1,t)) r = r/(1-pow(rou2,t)) x = x - lr /(delta + np.sqrt(r)) * s plt.xlim(-20, 20) plt.ylim(-2, 10) plt.plot(Adam_x, Adam_y, c="r", linestyle="-") plt.scatter(Adam_x[-1],Adam_y[-1],90,marker = "x",color="g") plt.title("Adam,lr=%f"%(lr)) plt.savefig("Adam,lr=%f"%(lr) + ".png") plt.clf() # 牛頓法for i in range(72): # 繪制原來的函數(shù) plt.plot(points_x, points_y, c="b", alpha=0.5, linestyle="-") # 算法開始 alpha= pow(1.2,-i)*20 x = -20.0 Newton_x, Newton_y = [], [] for it in range(1000): Newton_x.append(x), Newton_y.append(f(x)) g = df(x) gg = ddf(x) x = x - g/(gg+alpha) plt.xlim(-20, 20) plt.ylim(-2, 10) plt.plot(Newton_x, Newton_y, c="r", linestyle="-") plt.scatter(Newton_x[-1],Newton_y[-1],90,marker = "x",color="g") plt.title("Newton,alpha=%f"%(alpha)) plt.savefig("Newton,alpha=%f"%(alpha) + ".png") plt.clf()

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4709

    瀏覽量

    95358
  • 可視化
    +關(guān)注

    關(guān)注

    1

    文章

    1262

    瀏覽量

    21852
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5561

    瀏覽量

    122793

原文標(biāo)題:深度學(xué)習(xí)中7種最優(yōu)化算法的可視化與理解

文章出處:【微信號:zenRRan,微信公眾號:深度學(xué)習(xí)自然語言處理】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    目前主流的深度學(xué)習(xí)算法模型和應(yīng)用案例

    深度學(xué)習(xí)在科學(xué)計算獲得了廣泛的普及,其算法被廣泛用于解決復(fù)雜問題的行業(yè)。所有深度學(xué)習(xí)
    的頭像 發(fā)表于 01-03 10:28 ?2921次閱讀
    目前主流的<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>算法</b>模型和應(yīng)用案例

    深度模型優(yōu)化學(xué)習(xí)課件下載

    深度模型優(yōu)化學(xué)習(xí)課件下載
    發(fā)表于 04-07 16:21 ?3次下載
    <b class='flag-5'>深度</b>模型<b class='flag-5'>中</b>的<b class='flag-5'>優(yōu)化</b>與<b class='flag-5'>學(xué)習(xí)</b>課件下載

    深度學(xué)習(xí)算法進行優(yōu)化的處理器——NPU

    NPU(Neural-network Processing Unit,嵌入式神經(jīng)網(wǎng)絡(luò)處理器)是針對深度學(xué)習(xí)*算法進行優(yōu)化的處理器。它能像人類神經(jīng)網(wǎng)絡(luò)一樣快速、高效地處理大量數(shù)據(jù),因此它
    發(fā)表于 10-17 10:53 ?2861次閱讀

    什么是深度學(xué)習(xí)優(yōu)化算法

    先大致講一下什么是深度學(xué)習(xí)優(yōu)化算法吧,我們可以把模型比作函數(shù),一種很復(fù)雜的函數(shù):h(f(g(k(x)))),函數(shù)有參數(shù),這些參數(shù)是未知的,
    的頭像 發(fā)表于 02-13 15:31 ?1998次閱讀
    什么是<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>中</b><b class='flag-5'>優(yōu)化</b><b class='flag-5'>算法</b>

    PyTorch教程-12.1. 優(yōu)化深度學(xué)習(xí)

    12.1. 優(yōu)化深度學(xué)習(xí)? Colab [火炬]在 Colab 打開筆記本 Colab [mxnet] Open the notebook in Colab Colab
    的頭像 發(fā)表于 06-05 15:44 ?805次閱讀
    PyTorch教程-12.1. <b class='flag-5'>優(yōu)化</b>和<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b>

    從淺層到深層神經(jīng)網(wǎng)絡(luò):概覽深度學(xué)習(xí)優(yōu)化算法

    優(yōu)化算法一直以來是機器學(xué)習(xí)能根據(jù)數(shù)據(jù)學(xué)到知識的核心技術(shù)。而好的優(yōu)化算法可以大大提高學(xué)習(xí)速度,加快
    的頭像 發(fā)表于 06-15 11:20 ?1026次閱讀
    從淺層到深層神經(jīng)網(wǎng)絡(luò):概覽<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>優(yōu)化</b><b class='flag-5'>算法</b>

    深度學(xué)習(xí)算法簡介 深度學(xué)習(xí)算法是什么 深度學(xué)習(xí)算法有哪些

    深度學(xué)習(xí)算法簡介 深度學(xué)習(xí)算法是什么?深度
    的頭像 發(fā)表于 08-17 16:02 ?9863次閱讀

    深度學(xué)習(xí)算法工程師是做什么

    深度學(xué)習(xí)算法工程師是做什么 深度學(xué)習(xí)算法工程師是一種高級技術(shù)人才,是數(shù)據(jù)科學(xué)
    的頭像 發(fā)表于 08-17 16:03 ?1701次閱讀

    什么是深度學(xué)習(xí)算法?深度學(xué)習(xí)算法的應(yīng)用

    。 在深度學(xué)習(xí),使用了一些快速的算法,比如卷積神經(jīng)網(wǎng)絡(luò)以及深度神經(jīng)網(wǎng)絡(luò),這些算法在大量數(shù)據(jù)處理
    的頭像 發(fā)表于 08-17 16:03 ?2650次閱讀

    深度學(xué)習(xí)算法的選擇建議

    深度學(xué)習(xí)算法的選擇建議 隨著深度學(xué)習(xí)技術(shù)的普及,越來越多的開發(fā)者將它應(yīng)用于各種領(lǐng)域,包括圖像識別、自然語言處理、聲音識別等等。對于剛開始
    的頭像 發(fā)表于 08-17 16:11 ?1020次閱讀

    深度學(xué)習(xí)算法庫框架學(xué)習(xí)

    深度學(xué)習(xí)算法庫框架的相關(guān)知識點以及它們之間的比較。 1. Tensorflow Tensorflow是Google家的深度學(xué)習(xí)框架,已經(jīng)成為
    的頭像 發(fā)表于 08-17 16:11 ?1044次閱讀

    深度學(xué)習(xí)框架和深度學(xué)習(xí)算法教程

    基于神經(jīng)網(wǎng)絡(luò)的機器學(xué)習(xí)方法。 深度學(xué)習(xí)算法可以分為兩大類:監(jiān)督學(xué)習(xí)和無監(jiān)督學(xué)習(xí)。監(jiān)督
    的頭像 發(fā)表于 08-17 16:11 ?1463次閱讀

    深度學(xué)習(xí)編譯工具鏈的核心——圖優(yōu)化

    等,需要調(diào)整優(yōu)化網(wǎng)絡(luò)中使用的算子或算子組合,這就是深度學(xué)習(xí)編譯工具鏈的核心——圖優(yōu)化。圖優(yōu)化
    的頭像 發(fā)表于 05-16 14:24 ?1743次閱讀
    <b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b>編譯工具鏈<b class='flag-5'>中</b>的核心——圖<b class='flag-5'>優(yōu)化</b>

    深度學(xué)習(xí)算法在嵌入式平臺上的部署

    隨著人工智能技術(shù)的飛速發(fā)展,深度學(xué)習(xí)算法在各個領(lǐng)域的應(yīng)用日益廣泛。然而,將深度學(xué)習(xí)算法部署到資源
    的頭像 發(fā)表于 07-15 10:03 ?3191次閱讀

    NPU在深度學(xué)習(xí)的應(yīng)用

    設(shè)計的硬件加速器,它在深度學(xué)習(xí)的應(yīng)用日益廣泛。 1. NPU的基本概念 NPU是一種專門針對深度學(xué)習(xí)
    的頭像 發(fā)表于 11-14 15:17 ?1903次閱讀