chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

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

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

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

梯度下降是門手藝活

新機器視覺 ? 來源:新機器視覺 ? 2023-03-13 10:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

導(dǎo)讀

梯度下降法作為大家耳熟能詳?shù)膬?yōu)化算法,極易理解。但雖然和的一些方法比起來在尋找優(yōu)化方向上比較輕松,可是這個步長卻需要點技巧。本文作者通過簡單的函數(shù)舉例說明梯度下降中容易出現(xiàn)的問題。

本文收錄在無痛的機器學(xué)習(xí)第一季(https://zhuanlan.zhihu.com/p/22464594)。

機器學(xué)習(xí)所涉及的內(nèi)容實在是太多了,于是我決定挑個軟柿子捏起,從最基礎(chǔ)的一個優(yōu)化算法開始聊起。這個算法就是梯度下降法,英文Gradient Descent。

什么是梯度下降法

作為大眾耳熟能詳?shù)膬?yōu)化算法,梯度下降法受到的關(guān)注不要太多。梯度下降法極易理解,但凡學(xué)過一點數(shù)學(xué)的童鞋都知道,梯度方向表示了函數(shù)增長速度最快的方向,那么和它相反的方向就是函數(shù)減少速度最快的方向了。對于機器學(xué)習(xí)模型優(yōu)化的問題,當我們需要求解最小值的時候,朝著梯度下降的方向走,就能找到最優(yōu)值了。

那么具體來說梯度下降的算法怎么實現(xiàn)呢?我們先來一個最簡單的梯度下降算法,最簡單的梯度下降算法由兩個函數(shù),三個變量組成:

函數(shù)1:待求的函數(shù)

函數(shù)2:待求函數(shù)的導(dǎo)數(shù)

變量1:當前找到的變量,這個變量是“我們認為”當前找到的最好的變量,可以是函數(shù)達到最優(yōu)值(這里是最小值)。

變量2:梯度,對于絕大多數(shù)的函數(shù)來說,這個就是函數(shù)的負導(dǎo)數(shù)。

變量3:步長,也就是沿著梯度下降方向行進的步長。也是這篇文章的主角。

我們可以用python寫出一個最簡單的梯度下降算法:


						
def gd(x_start, step, g):   # gd代表了Gradient Descent
    x = x_start
    for i in range(20):
        grad = g(x)
        x -= grad * step
        print '[ Epoch {0} ] grad = {1}, x = {2}'.format(i, grad, x)
        if abs(grad) < 1e-6:
            break;
    return x
關(guān)于python的語法在此不再贅述了,看不懂得童鞋自己想辦法去補課吧。

優(yōu)雅的步長

好了,算法搞定了,雖然有點粗糙,但是對于一些問題它是可以用的。我們用一個簡單到爆的例子來嘗試一下:


						
def f(x):
    return x * x - 2 * x + 1


def g(x):
    return 2 * x - 2


這個函數(shù)f(x)就是大家在中學(xué)喜聞樂見的,大家一眼就可以看出,最小值是x=1,這是函數(shù)值為0。為了防止大家對這個函數(shù)沒有感覺(真不應(yīng)該沒感覺啊……)我們首先把圖畫出來看一下:


						
import numpy as np
import matplotlib.pyplot as plt
x = np.linspace(-5,7,100)
y = f(x)
plt.plot(x,y)
然后我們就看到了:
f4dc5690-c141-11ed-bfe3-dac502259ad0.png

一個很簡單的拋物線的函數(shù)有木有?x=1是最小點有木有?

來讓我用梯度下降法計算一下:


						
gd(5,0.1,g)
于是我們得到了下面的輸出:

[ Epoch 0 ] grad = 8, x = 4.2
[ Epoch 1 ] grad = 6.4, x = 3.56
[ Epoch 2 ] grad = 5.12, x = 3.048
[ Epoch 3 ] grad = 4.096, x = 2.6384
[ Epoch 4 ] grad = 3.2768, x = 2.31072
[ Epoch 5 ] grad = 2.62144, x = 2.048576
[ Epoch 6 ] grad = 2.097152, x = 1.8388608
[ Epoch 7 ] grad = 1.6777216, x = 1.67108864
[ Epoch 8 ] grad = 1.34217728, x = 1.536870912
[ Epoch 9 ] grad = 1.073741824, x = 1.4294967296
[ Epoch 10 ] grad = 0.8589934592, x = 1.34359738368
[ Epoch 11 ] grad = 0.68719476736, x = 1.27487790694
[ Epoch 12 ] grad = 0.549755813888, x = 1.21990232556
[ Epoch 13 ] grad = 0.43980465111, x = 1.17592186044
[ Epoch 14 ] grad = 0.351843720888, x = 1.14073748836
[ Epoch 15 ] grad = 0.281474976711, x = 1.11258999068
[ Epoch 16 ] grad = 0.225179981369, x = 1.09007199255
[ Epoch 17 ] grad = 0.180143985095, x = 1.07205759404
[ Epoch 18 ] grad = 0.144115188076, x = 1.05764607523
[ Epoch 19 ] grad = 0.115292150461, x = 1.04611686018

可以看到,經(jīng)過20輪迭代,我們從初始值x=5不斷地逼近x=1,雖然沒有完全等于,但是在后面的迭代中它會不斷地逼近的。

好像我們已經(jīng)解決了這個問題,感覺有點輕松啊。高興之余,突然回過神來,那個步長我設(shè)的好像有點隨意啊,迭代了20輪還沒有完全收斂,是不是我太保守了,設(shè)得有點小?俗話說的好,人有多大膽,地有多大產(chǎn)。咱們設(shè)個大點的數(shù)字,讓它一步到位?。ê肋~的表情)


						
gd(5,100,g)
這回設(shè)得夠大了,來看看結(jié)果:

[ Epoch 0 ] grad = 8, x = -795
[ Epoch 1 ] grad = -1592, x = 158405
[ Epoch 2 ] grad = 316808, x = -31522395
[ Epoch 3 ] grad = -63044792, x = 6272956805
[ Epoch 4 ] grad = 12545913608, x = -1248318403995
[ Epoch 5 ] grad = -2496636807992, x = 248415362395205
[ Epoch 6 ] grad = 496830724790408, x = -49434657116645595
[ Epoch 7 ] grad = -98869314233291192, x = 9837496766212473605
[ Epoch 8 ] grad = 19674993532424947208, x = -1957661856476282247195
[ Epoch 9 ] grad = -3915323712952564494392, x = 389574709438780167192005
[ Epoch 10 ] grad = 779149418877560334384008, x = -77525367178317253271208795
[ Epoch 11 ] grad = -155050734356634506542417592, x = 15427548068485133400970550405
[ Epoch 12 ] grad = 30855096136970266801941100808, x = -3070082065628541546793139530395
[ Epoch 13 ] grad = -6140164131257083093586279060792, x = 610946331060079767811834766548805
[ Epoch 14 ] grad = 1221892662120159535623669533097608, x = -121578319880955873794555118543211995
[ Epoch 15 ] grad = -243156639761911747589110237086423992, x = 24194085656310218885116468590099187205
[ Epoch 16 ] grad = 48388171312620437770232937180198374408, x = -4814623045605733558138177249429738253595
[ Epoch 17 ] grad = -9629246091211467116276354498859476507192, x = 958109986075540978069497272636517912465605
[ Epoch 18 ] grad = 1916219972151081956138994545273035824931208, x = -190663887229032654635829957254667064580655195
[ Epoch 19 ] grad = -381327774458065309271659914509334129161310392, x = 37942113558577498272530161493678745851550384005

我去,這是什么結(jié)果!不但沒有收斂,反而數(shù)字越來越大!這是要把python的數(shù)字撐爆的節(jié)奏?。。▽嶋H上python的數(shù)字沒這么容易撐爆的……)

需要冷靜一下……為什么會出現(xiàn)這樣的情況?不是說好了是梯度下降么?怎么還會升上去?這個問題就要回到梯度這個概念本身來。

實際上梯度指的是在當前變量處的梯度,對于這一點來說,它的梯度方向是這個方向,我們也可以利用泰勒公式證明在一定的范圍內(nèi),沿著這個梯度方向走函數(shù)值是會下降的。但是,從函數(shù)中也可以看出,如果一步邁得太大,會跳出函數(shù)值下降的范圍,反而會使函數(shù)值越變越大,造成悲劇。

如何避免這種悲劇發(fā)生呢?簡單的方法就是將步長減少,像我們前面那樣設(shè)得小點。另外,還有一些Line-search的方法可以避免這樣的事情發(fā)生,這些方法以后有機會在慢慢聊。

現(xiàn)在,我們要鎮(zhèn)定一下,看樣子我們只能通過修改步長來完成這個問題了。這時候我們可以開一個腦洞:既然小步長會讓優(yōu)化問題收斂,大步長會讓優(yōu)化問題發(fā)散,那么有沒有一個步長會讓優(yōu)化問題原地打轉(zhuǎn)呢?

我們還是從x=5出發(fā),假設(shè)經(jīng)過一輪迭代,我們求出了另一個x值,再用這個值迭代,x值又回到了5。我們用中學(xué)的數(shù)學(xué)能力建一個方程出來:

x=5, g(x)=8, 新的值x'=5 - 8 * step
g(x')=2 * (5-8*step) - 2,回到過去:x' - g(x') * step = x = 5
合并公式求解得,step=1

也就是說step=1時,求解會原地打轉(zhuǎn),趕緊試一下:


						
gd(5,1,g)

[ Epoch 0 ] grad = 8, x = -3
[ Epoch 1 ] grad = -8, x = 5
[ Epoch 2 ] grad = 8, x = -3
[ Epoch 3 ] grad = -8, x = 5
[ Epoch 4 ] grad = 8, x = -3
[ Epoch 5 ] grad = -8, x = 5
[ Epoch 6 ] grad = 8, x = -3
[ Epoch 7 ] grad = -8, x = 5
[ Epoch 8 ] grad = 8, x = -3
[ Epoch 9 ] grad = -8, x = 5
[ Epoch 10 ] grad = 8, x = -3
[ Epoch 11 ] grad = -8, x = 5
[ Epoch 12 ] grad = 8, x = -3
[ Epoch 13 ] grad = -8, x = 5
[ Epoch 14 ] grad = 8, x = -3
[ Epoch 15 ] grad = -8, x = 5
[ Epoch 16 ] grad = 8, x = -3
[ Epoch 17 ] grad = -8, x = 5
[ Epoch 18 ] grad = 8, x = -3
[ Epoch 19 ] grad = -8, x = 5

果然不出我們所料,打轉(zhuǎn)了……

好了,現(xiàn)在我們基本明白了,當步長大于1會出現(xiàn)求解發(fā)散,而小于1則不會,那么對于別的初始值,這個規(guī)則適用么?


						
gd(4,1,g)

[ Epoch 0 ] grad = 6, x = -2
[ Epoch 1 ] grad = -6, x = 4
[ Epoch 2 ] grad = 6, x = -2
[ Epoch 3 ] grad = -6, x = 4
[ Epoch 4 ] grad = 6, x = -2
[ Epoch 5 ] grad = -6, x = 4
[ Epoch 6 ] grad = 6, x = -2
[ Epoch 7 ] grad = -6, x = 4
[ Epoch 8 ] grad = 6, x = -2
[ Epoch 9 ] grad = -6, x = 4
[ Epoch 10 ] grad = 6, x = -2
[ Epoch 11 ] grad = -6, x = 4
[ Epoch 12 ] grad = 6, x = -2
[ Epoch 13 ] grad = -6, x = 4
[ Epoch 14 ] grad = 6, x = -2
[ Epoch 15 ] grad = -6, x = 4
[ Epoch 16 ] grad = 6, x = -2
[ Epoch 17 ] grad = -6, x = 4
[ Epoch 18 ] grad = 6, x = -2
[ Epoch 19 ] grad = -6, x = 4

果然試用,這樣一來,我們可以“認為”,對于這個優(yōu)化問題,采用梯度下降法,對于固定步長的算法,步長不能超過1,不然問題會發(fā)散!

好了,下面我們換一個函數(shù):,對于這個問題,它的安全閾值是多少呢?不羅嗦了,是0.25:


						
def f2(x):
    return 4 * x * x - 4 * x + 1
def g2(x):
    return 8 * x - 4
gd(5,0.25,g2)

[ Epoch 0 ] grad = 36, x = -4.0
[ Epoch 1 ] grad = -36.0, x = 5.0
[ Epoch 2 ] grad = 36.0, x = -4.0
[ Epoch 3 ] grad = -36.0, x = 5.0
[ Epoch 4 ] grad = 36.0, x = -4.0
[ Epoch 5 ] grad = -36.0, x = 5.0
[ Epoch 6 ] grad = 36.0, x = -4.0
[ Epoch 7 ] grad = -36.0, x = 5.0
[ Epoch 8 ] grad = 36.0, x = -4.0
[ Epoch 9 ] grad = -36.0, x = 5.0
[ Epoch 10 ] grad = 36.0, x = -4.0
[ Epoch 11 ] grad = -36.0, x = 5.0
[ Epoch 12 ] grad = 36.0, x = -4.0
[ Epoch 13 ] grad = -36.0, x = 5.0
[ Epoch 14 ] grad = 36.0, x = -4.0
[ Epoch 15 ] grad = -36.0, x = 5.0
[ Epoch 16 ] grad = 36.0, x = -4.0
[ Epoch 17 ] grad = -36.0, x = 5.0
[ Epoch 18 ] grad = 36.0, x = -4.0
[ Epoch 19 ] grad = -36.0, x = 5.0

好了,這個故事講完了。為什么要講這個故事呢?

這個故事說明了梯度下降法簡單中的不簡單(劃重點啊),雖然和的一些方法比起來在尋找優(yōu)化方向上比較輕松,可是這個步長真心需要點技巧,即使這樣一個一維的優(yōu)化問題都有這些問題,對于現(xiàn)在大火的深度學(xué)習(xí),CNN優(yōu)化(沒錯,說得就是你),一個base_lr基礎(chǔ)學(xué)習(xí)率+gamma學(xué)習(xí)衰減率真的可以輕松跳過像上面這樣的坑么?說實話還是需要一定的嘗試才能找到感覺。

最后多說一句,對于上面的一元二次函數(shù),有沒有發(fā)現(xiàn)步長閾值和二階導(dǎo)數(shù)的關(guān)系呢?

審核編輯 :李倩


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

    關(guān)注

    3

    文章

    4379

    瀏覽量

    64833
  • 梯度
    +關(guān)注

    關(guān)注

    0

    文章

    30

    瀏覽量

    10494
  • 機器學(xué)習(xí)
    +關(guān)注

    關(guān)注

    66

    文章

    8501

    瀏覽量

    134580

原文標題:梯度下降是門手藝活

文章出處:【微信號:vision263com,微信公眾號:新機器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

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

掃碼添加小助手

加入工程師交流群

    評論

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

    分享一個自己寫的機器學(xué)習(xí)線性回歸梯度下降算法

    單變量線性回歸算法,利用Batch梯度梯度下降算法迭代計算得到誤差最小的代價函數(shù)theta0,theta1。調(diào)節(jié)學(xué)習(xí)率a可以觀察擬合得到的函數(shù)和代價函數(shù)誤差收斂情況。
    發(fā)表于 10-02 21:48

    機器學(xué)習(xí)新手必學(xué)的三種優(yōu)化算法(牛頓法、梯度下降法、最速下降法)

    法、梯度下降法、最速下降法)進行了介紹和比較,并結(jié)合算法的數(shù)學(xué)原理和實際案例給出了優(yōu)化算法選擇的一些建議。閱讀本文的基礎(chǔ)準備線性代數(shù)多變量微積分對凸函數(shù)的基本知識我們都知道,機器學(xué)習(xí)中最重要的內(nèi)容之一
    發(fā)表于 05-07 08:30

    如何更新權(quán)重實現(xiàn)梯度下降

    實現(xiàn)梯度下降
    發(fā)表于 07-15 10:09

    機器學(xué)習(xí):隨機梯度下降和批量梯度下降算法介紹

    隨機梯度下降(Stochastic gradient descent) 批量梯度下降(Batch gradient descent) 梯度
    發(fā)表于 11-28 04:00 ?9277次閱讀
    機器學(xué)習(xí):隨機<b class='flag-5'>梯度</b><b class='flag-5'>下降</b>和批量<b class='flag-5'>梯度</b><b class='flag-5'>下降</b>算法介紹

    一文看懂常用的梯度下降算法

    編輯:祝鑫泉 一 概述 梯度下降算法( Gradient Descent Optimization )是神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練最常用的優(yōu)化算法。對于深度學(xué)習(xí)模型,基本都是采用梯度下降算法來進
    發(fā)表于 12-04 18:17 ?1996次閱讀

    機器學(xué)習(xí)中梯度下降法的過程

    梯度下降法是一個用于尋找最小化成本函數(shù)的參數(shù)值的最優(yōu)化算法。當我們無法通過分析計算(比如線性代數(shù)運算)求得函數(shù)的最優(yōu)解時,我們可以利用梯度下降法來求解該問題。
    發(fā)表于 04-26 16:44 ?3566次閱讀

    梯度下降算法及其變種:批量梯度下降,小批量梯度下降和隨機梯度下降

    現(xiàn)在我們來討論梯度下降算法的三個變種,它們之間的主要區(qū)別在于每個學(xué)習(xí)步驟中計算梯度時使用的數(shù)據(jù)量,是對每個參數(shù)更新(學(xué)習(xí)步驟)時的梯度準確性與時間復(fù)雜度的折衷考慮。
    的頭像 發(fā)表于 05-03 15:55 ?2.3w次閱讀

    機器學(xué)習(xí)優(yōu)化算法中梯度下降,牛頓法和擬牛頓法的優(yōu)缺點詳細介紹

    梯度下降法實現(xiàn)簡單,當目標函數(shù)是凸函數(shù)時,梯度下降法的解是全局解。一般情況下,其解不保證是全局最優(yōu)解,梯度
    的頭像 發(fā)表于 08-04 11:40 ?5.2w次閱讀

    簡單的梯度下降算法,你真的懂了嗎?

    梯度下降算法的公式非常簡單,”沿著梯度的反方向(坡度最陡)“是我們?nèi)粘=?jīng)驗得到的,其本質(zhì)的原因到底是什么呢?為什么局部下降最快的方向就是梯度
    發(fā)表于 09-19 00:17 ?989次閱讀

    基于分布式編碼的同步隨機梯度下降算法

    基于數(shù)據(jù)并行化的異步隨機梯度下降(ASGD)算法由于需要在分布式計算節(jié)點之間頻繁交換梯度數(shù)據(jù),從而影響算法執(zhí)行效率。提出基于分布式編碼的同步隨機梯度
    發(fā)表于 04-27 13:56 ?2次下載
    基于分布式編碼的同步隨機<b class='flag-5'>梯度</b><b class='flag-5'>下降</b>算法

    各種梯度下降法是如何工作的

    導(dǎo)讀一圖勝千言,什么?還是動畫,那就更棒啦!本文用了大量的資源來解釋各種梯度下降法(gradient descents),想給大家直觀地介紹一下這些方法是如何工作的。
    的頭像 發(fā)表于 08-17 11:50 ?1461次閱讀

    梯度下降法在機器學(xué)習(xí)中的應(yīng)用

    梯度下降法沿著梯度的反方向進行搜索,利用了函數(shù)的一階導(dǎo)數(shù)信息。
    的頭像 發(fā)表于 05-18 09:20 ?2077次閱讀
    <b class='flag-5'>梯度</b><b class='flag-5'>下降</b>法在機器學(xué)習(xí)中的應(yīng)用

    PyTorch教程12.4之隨機梯度下降

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程12.4之隨機梯度下降.pdf》資料免費下載
    發(fā)表于 06-05 14:58 ?0次下載
    PyTorch教程12.4之隨機<b class='flag-5'>梯度</b><b class='flag-5'>下降</b>

    PyTorch教程12.5之小批量隨機梯度下降

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程12.5之小批量隨機梯度下降.pdf》資料免費下載
    發(fā)表于 06-05 15:00 ?0次下載
    PyTorch教程12.5之小批量隨機<b class='flag-5'>梯度</b><b class='flag-5'>下降</b>

    PyTorch教程-12.4。隨機梯度下降

    12.4。隨機梯度下降? Colab [火炬]在 Colab 中打開筆記本 Colab [mxnet] Open the notebook in Colab Colab [jax
    的頭像 發(fā)表于 06-05 15:44 ?675次閱讀
    PyTorch教程-12.4。隨機<b class='flag-5'>梯度</b><b class='flag-5'>下降</b>