1. 神經網路中自適應的梯度下降優化演算法(二)
Adagrad演算法可以針對不同的參數自適應的採用不同的更新頻率,對低頻出現的特徵採用低的更新率,對高頻出現的特徵採用高的更新率,因此,對於稀疏的數據它表現的很好,很好的提升了SGD的魯棒性,在Google的通過Youtube視頻識別貓的神經網路訓練中有很好的表現。
梯度更新規則:
g(t,i)表示在t時刻目標函數對θ(i)的偏導數。SGD的每個參數的更新過程如下:
Adagrad的每個參數更新過程如下:
G(t)是一個對角矩陣,對角線上的每個元素是t時刻前所有θ(i)的梯度的平方和。ε通常取值在1e-8量級,它的存在是為了避免除數為0。一個有趣的現象是,如果沒有平方根操作,演算法的表現就非常糟糕。
Adagrad的主要缺點是,它的分母是平方梯度的累積,它的值會一直增加,最終導致學習率衰減到非常小,從而使得學習演算法無法進行下去。
TensorFlow實現:
tf.train.AdagradOptimizer(learning_rate, initial_accumulator_value=0.1, use_locking=False, name='Adagrad')
Adadelta演算法主要解決Adagrad的缺陷,它不再累加過去所有的梯度,而是僅累積過去固定個數的梯度。
Adadelta不是採用平方梯度的簡單累加,而是採用 歷史 平方梯度的衰減的平均。
γ通常等於0.9
分母相當於梯度的均方根(root mean squared, RMS),即將所有值平方求和,求其均值,再開平方,就得到均方根值。
梯度更新規則:
將學習率η設置為
,我們就不需要提前設定學習率。
RMSprop是Geoff Hinton提出的一種自適應學習率的方法,它與Adadelta方法都是為了解決Adagrad學習率急劇下降問題的。它與Adadelta方法是一致的。
梯度更新規則
超參數設定值:
Hinton建議設定γ=0.9, 學習率η=0.001。
TensorFlow實現:
tf.train.RMSPropOptimizer.__init__(learning_rate, decay, momentum=0.0, epsilon=1e-10, use_locking=False, name='RMSProp')
Adam也是對不同的參數自適應設置不同的學習率。它對 歷史 梯度和 歷史 平方梯度同時採用指數梯度衰減(exponentially decaying average)。
梯度更新規則
Adam作者觀察到,如果m(t)和v(t)初始化為零向量,並且衰減率很小時(比如β1和β2都非常接近於1時),在開始的迭代中,m(t)和v(t)總是向零偏移,所以需要做偏移校正。
然後用校正後的值進行梯度更新:
Adam作者建議β1=0.9,β2=0.999,ε=10^{-8}
,在實踐中,Adam比其它演算法的效果要好。
TensorFlow實現:
tf.train.AdamOptimizer(learning_rate=0.001, beta1=0.9, beta2=0.999, epsilon=1e-08, use_locking=False, name='Adam')
Adam更新規則中的梯度縮放與 歷史 梯度的L2范數成反比。
我們可以把這個規則泛化到Lp范數。
當p值增大的時候,Lp的值往往會變得不穩定,所以在實踐中L1和L2使用的比較普遍。但是Adamax作者發現L∞可以收斂到一個穩定值。
然後我們可以採用u(t)代替
來更新Adam中的梯度。
同時u(t)不需要做零偏校正。默認取值建議:
2. 如何理解近端梯度演算法
L1正則化是一種常用的獲取稀疏解的手段,同時L1范數也是L0范數的鬆弛范數。求解L1正則化問題最常用的手段就是通過加速近端梯度演算法來實現的。
考慮一個這樣的問題:
minx f(x)+λg(x)
x∈Rn,f(x)∈R,這里f(x)是一個二階可微的凸函數,g(x)是一個凸函數(或許不可導),如上面L1的正則化||x||。
此時,只需要f(x)滿足利普希茨(Lipschitz)連續條件,即對於定義域內所有向量x,y,存在常數M使得||f'(y)-f'(x)||<=M·||y-x||,那麼這個模型就可以通過近端梯度演算法來進行求解了。
ps:下面涉及很多數學知識,不想了解數學的朋友請跳到結論處,個人理解,所以也不能保證推理很嚴謹,如有問題,請一定幫忙我告訴我。
利普希茨連續條件的幾何意義可以認為是函數在定義域內任何點的梯度都不超過M(梯度有上限),也就是說不會存在梯度為正負無窮大的情況。
因而,我們有下圖所示的推算:
我們可以用f(y) = f(x)+f'(x)(y-x)+M/2*||y-x||2來近似的表示f(y),也可以認為是高維下的泰勒分解,取到二次項。
我們換一種寫法,f(xk+1) = f(xk)+f'(xk)(xk+1-xk)+M/2*||xk+1-xk||2,也就是說可以直接迭代求minx f(x),就是牛頓法辣。
再換一種寫法,f(xk+1)=(M/2)(xk+1-(xk+(1/M)f'(xk)))2+CONST,其中CONST是一個與xk+1無關的常數,也就是說,此時我們可以直接寫出這個條件下xk+1的最優取值就是xk+1=xk+(1/M)f'(xk)。令z=xk+(1/M)f'(xk)。
回到原問題,minx f(x)+λg(x),此時問題變為了求解minx (M/2)||x-z||2+λg(x)。
實際上在求解這個問題的過程中,x的每一個維度上的值是互不影響的,可以看成n個獨立的一維優化問題進行求解,最後組合成一個向量就行。
如果g(x)=||x||1,就是L1正則化,那麼最後的結論可以通過收縮運算元來表示。
即xk+1=shrink(z,λ/M)。具體來說,就是Z向量的每一個維度向原點方向移動λ/M的距離(收縮,很形象),對於xk+1的第i個維度xi=sgn(zi)*max(|zi|-λ/M,0),其中sgn()為符號函數,正數為1,負數為-1。
一直迭代直到xk收斂吧。
3. 極限機學習和梯度學習演算法的區別
梯度下降法是一個最優化演算法,通常也稱為最速下降法。最速下降法是求解無約束優化問題最簡單和最古老的方法之一,雖然現在已經不具有實用性,但是許多有效演算法都是以它為基礎進行改進和修正而得到的。最速下降法是用負梯度方向為搜索方向的,最速下降法越接近目標值,步長越小,前進越慢。
梯度下降法(gradient descent)是一個最優化演算法,通常也稱為最速下降法。
常用於機器學習和人工智慧當中用來遞歸性地逼近最小偏差模型。
顧名思義,梯度下降下法的計算過程就是沿遞度下降的方向求解極小值(也可以沿遞度上升方向求解極大值)。
其迭代公式為
,其中
代表梯度負方向,
表示梯度方向上的搜索步長。梯度方向我們可以通過對函數求導得到,步長的確定比較麻煩,太大了的話可能會發散,太小收斂速度又太慢。一般確定步長的方法是由線性搜索演算法來確定,即把下一個點的坐標ak+1看做是的函數,然後求滿足f(ak+1)的最小值的 即可。
因為一般情況下,梯度向量為0的話說明是到了一個極值點,此時梯度的幅值也為0.而採用梯度下降演算法進行最優化求解時,演算法迭代的終止條件是梯度向量的幅值接近0即可,可以設置個非常小的常數閾值。
4. 梯度下降法原理和步驟
一、梯度法思想
梯度法思想的三要素:出發點、下降方向、下降步長。
機器學習中常用的權重更新表達式為
:,這里的λ就是學習率,本文從這個式子出發來把機器學習中的各種「梯度」下降法闡釋清楚。
機器學習目標函數,一般都是凸函數,什麼叫凸函數?限於篇幅,我們不做很深的展開,在這兒我們做一個形象的比喻,凸函數求解問題,可以把目標損失函數想像成一口鍋,來找到這個鍋的鍋底。非常直觀的想法就是,我們沿著初始某個點的函數的梯度方嚮往下走(即梯度下降)。在這兒,我們再作個形象的類比,如果把這個走法類比為力,那麼完整的三要素就是步長(走多少)、方向、出發點,這樣形象的比喻,讓我們對梯度問題的解決豁然開朗,出發點很重要,是初始化時重點要考慮的,而方向、步長就是關鍵。事實上不同梯度的不同就在於這兩點的不同!
梯度方向是
,步長設為常數Δ,這時就會發現,如果用在梯度較大的時候,離最優解比較遠,W的更新比較快;然而到了梯度較小的時候,也就是較靠近最優解的時候,W的更新竟然也保持著跟原來一樣的速率,這樣會導致W很容易更新過度反而遠離了最優解,進而出現在最優解附近來回震盪。所以,既然在遠離最優解的時候梯度大,在靠近最優解的時候梯度小,我們讓步長隨著這個律動,於是我我們就用λ|W|來代替Δ,最後得到了我們熟悉的式子:
所以說這時的λ是隨著坡度的陡緩而變化的,別看它是個常數。
二、全量梯度下降法(Batch gradient descent)
全量梯度下降法每次學習都使用整個訓練集,因此每次更新都會朝著正確的方向進行,最後能夠保證收斂於極值點,凸函數收斂於全局極值點,非凸函數可能會收斂於局部極值點,缺陷就是學習時間太長,消耗大量內存。
第二、隨機梯度下降法(Stochastic Gradient Descent)
SGD一輪迭代只用一條隨機選取的數據,盡管SGD的迭代次數比BGD大很多,但一次學習時間非常快。
SGD的缺點在於每次更新可能並不會按照正確的方向進行,參數更新具有高方差,從而導致損失函數劇烈波動。不過,如果目標函數有盆地區域,SGD會使優化的方向從當前的局部極小值點跳到另一個更好的局部極小值點,這樣對於非凸函數,可能最終收斂於一個較好的局部極值點,甚至全局極值點。
缺點是,出現損失函數波動,並且無法判斷是否收斂。
5. 隨機梯度下降演算法和梯度下降演算法的區別
梯度下降演算法是一個比較廣的概念,
意思是:
你優化一個函數/分類器時,如何減少它的誤差?不妨選擇梯度下降方向,該方向很可能是走向最優點的方向。
然後加上一個隨機,表示:
既然你知道
方向是:梯度方向了,那麼走多長呢?
答案是:隨機。所以,梯度下降演算法包括
隨機梯度下降演算法。
6. 機器學習中的降維演算法和梯度下降法
機器學習中有很多演算法都是十分經典的,比如說降維演算法以及梯度下降法,這些方法都能夠幫助大家解決很多問題,因此學習機器學習一定要掌握這些演算法,而且這些演算法都是比較受大家歡迎的。在這篇文章中我們就給大家重點介紹一下降維演算法和梯度下降法。
降維演算法
首先,來說一說降維演算法,降維演算法是一種無監督學習演算法,其主要特徵是將數據從高維降低到低維層次。在這里,維度其實表示的是數據的特徵量的大小,當特徵量大的話,那麼就給計算機帶來了很大的壓力,所以我們可以通過降維計算,把維度高的特徵量降到維度低的特徵量,比如說從4維的數據壓縮到2維。類似這樣將數據從高維降低到低維有兩個好處,第一就是利於表示,第二就是在計算上也能帶來加速。
當然,有很多降維過程中減少的維度屬於肉眼可視的層次,同時壓縮也不會帶來信息的損失。但是如果肉眼不可視,或者沒有冗餘的特徵,這怎麼辦呢?其實這樣的方式降維演算法也能工作,不過這樣會帶來一些信息的損失。不過,降維演算法可以從數學上證明,從高維壓縮到的低維中最大程度地保留了數據的信息。所以說,降維演算法還是有很多好處的。
那麼降維演算法的主要作用是什麼呢?具體就是壓縮數據與提升機器學習其他演算法的效率。通過降維演算法,可以將具有幾千個特徵的數據壓縮至若干個特徵。另外,降維演算法的另一個好處是數據的可視化。這個優點一直別廣泛應用。
梯度下降法
下面我們給大家介紹一下梯度下降法,所謂梯度下降法就是一個最優化演算法,通常也稱為最速下降法。最速下降法是求解無約束優化問題最簡單和最古老的方法之一,雖然現在已經不具有實用性,但是許多有效演算法都是以它為基礎進行改進和修正而得到的。最速下降法是用負梯度方向為搜索方向的,最速下降法越接近目標值,步長越小,前進越慢。好比將函數比作一座山,我們站在某個山坡上,往四周看,從哪個方向向下走一小步,能夠下降的最快;當然解決問題的方法有很多,梯度下降只是其中一個,還有很多種方法。
在這篇文章中我們給大家介紹了關於機器演算法中的降維演算法以及梯度下降法,這兩種方法是機器學習中十分常用的演算法,降維演算法和梯度下降法都是十分實用的,大家在進行學習機器學習的時候一定要好好學習這兩種演算法,希望這篇文章能夠幫助大家理解這兩種演算法。
7. 梯度上升演算法與梯度下降演算法求解回歸系數怎麼理解
函數的梯度是指它在這一點處增長最快的方向,顯然負梯度方向就是下降最快的方向。
梯度下降方向就是和負梯度方向的夾角小於90度的方向,也就是和負梯度方向的內積小於0,沿著梯度下降方向移動,函數的值會減小。
因此最小化一個函數的通常做法是:從某一點出發,找到該點的梯度下降方向)沿著這個方向移動一定的距離。不斷迭代,直到滿足終止准則。
目前幾乎所有的機器學習求解演算法都是基於梯度下降的,例如OWLQN、SGD、Async-SGD等
8. 梯度下降法是什麼
梯度下降法,是一種基於搜索的最優化方法,它其實不是一個機器學習演算法,但是在機器學習領域,許多演算法都是以梯度下降法為基礎的,它的主要作用是尋找目標函數的最優解。
在求解損失函數的最小值時,可以通過梯度下降法來一步步的迭代求解,得到最小化的損失函數和模型參數值。反過來,如果我們需要求解損失函數的最大值,這時就需要用梯度上升法來迭代了。在機器學習中,基於基本的梯度下降法發展了兩種梯度下降方法,分別為隨機梯度下降法和批量梯度下降法。
常用的梯度下降法有3種不同的形式:
(1)批量梯度下降法,簡稱 BGD,使用所有樣本,比較耗時;
(2)隨機梯度下降法,簡稱 SGD,隨機選擇一個樣本,簡單高效;
(3)小批量梯度下降法,簡稱 MBGD,使用少量的樣本,這是一個折中的辦法。