---這裏記錄下一些關於牛頓法來做爲優化器的我的筆記 :)函數
關於牛頓法,先不說其中的概念,來簡單看一個例子? 不用計算器,如何手動開一個值的平方根,好比計算{sqrt(a) | a=4 } ? 不用程序和代碼如何求?優化
----比較簡單有木有,直接上用公式來套就行了.spa
xt = ( xt-1 + ( a / xt-1 ) ) / 2blog
咱們看 sqrt(4) 這個值的區間在1<=sqrt(4)<=4裏,寫成這種形式吧[1,4],咱們令x0 = 1,程序
x = ( 1 + (4/1))/2 = 5/2 =2.5im
x = (2.5 + (4/2.5))/2 = 2.05db
x = (2.05 + ( 4 /2.05 ))/2 = 2.0006 img
.....co
因而咱們就求出x的近似值爲2oss
那麼這個公式是如何得來的呢?
這個公式實際上是依據牛頓法得來的?牛頓法長成什麼樣子呢?
就是長成這個樣子,咱們發現這個樣子和咱們的SGD仍是很像的,這二者的區別記錄在後面吧~。
而牛頓迭代法,這個公式其實就是泰勒級數展開的前幾項 f(x),並使得f(x) =0,求解後的結果,而泰勒級數是採用無限項的來等價表示一個函數,好比:
,那牛頓法採用的是泰勒級數的前幾項 -- 有限的項,來近似表示一個函數f(x).
那麼如何上面這個公式是如何經過牛頓法獲得的呢?
上面的題,咱們將其轉換車更加通用的一些,好比改成如何求解sqrt(a)?
------這又等價於sqrt(a)=x 轉換成--> x^2 = a , (a 屬於實數域), 進一步轉換成--->f(x) = x^2 -a =0
咱們知道 f(x) = x^2 - a =0 ,由於只要求某一個點的值,因此咱們只須要知道這個點的切線就能夠了, 由此咱們依據泰勒級數定義,對其進行一階展開,能夠知道 f(x) ~g(x) = f(x0) + f ' (x0)*(x - x0),咱們令g(x)=0
因而咱們就獲得了 x = x0 - f(x0) / f '(x0);
而後咱們再次化解這個公式:
x = x0 - (x0^2 - a / 2x0 ) = (x0^2 + a) /2x0 = (x0 + a/x0)/2
這樣咱們就獲得了最開始的那個公式了。
可是咱們在用牛頓法做爲優化器的時候,是要求極小值的啊? 那麼如何快速的求出極小值呢?
咱們知道一階導,爲曲線切線方向,二階導爲切線的切線方向回想一下SGD法,SGD只是在一階導上,進行權值更新,基本上就是處於求切線方向,前進一個步長,而後再矯正,再求當前點的切線,再矯正:
這種方式就會出現綠線的狀況,那麼牛頓法就給出另外一種思路: 咱們再沿着切線方向走的時候,沒必要按照固定的步長走動,咱們能夠依據切線的變化率來動態調整行走的步子,因而就有了這個公式:
當二階導趨近於0的時候,說明一階導有極小值,那麼此時就應該讓它接近這個極小值,而loss函數爲凸函數 ,f’(x)趨近極小值的時候,f(x)就也就能夠快速的接近極小值,而不出現大幅度搖擺,就出現了紅色那條線.
通常來講,對於那種高階多項式採用牛頓法效果會比SGD好些.