前言
之前已經(jīng)提到了代價函數(shù)盒蟆,它是衡量我們目前的預(yù)測函數(shù)h的好壞程度的,可是不能光讓它在那壞著师骗,我們需要讓我們的代價函數(shù)變好起來历等,這就需要我們的梯度下降算法登場了(gradient descent)。
怎么下降
首先優(yōu)化代價函數(shù)的方法肯定不止這一種辟癌,但是這一種比較常見而且也是很通俗易懂的寒屯,所以一般入門都會提到這個算法。還記得我們的代價函數(shù)長什么樣子嗎黍少。
可以看到如果只看每一項(把求和符號和前面的除2m去掉)寡夹,它就是一個二次函數(shù)(關(guān)于θ的),高中時候就知道二次函數(shù)是一個拋物線的形式厂置。這里假設(shè)它是個開口朝上的二次函數(shù)菩掏,我們在經(jīng)過初始化后的θ帶進去后值比較靠上方的位置如下
我們知道這個函數(shù)的值代表著我們的輸出結(jié)果離我們的目標(biāo)值的差距,所以如果像上面的圖一樣我們的點對應(yīng)的y值很大昵济,我們需要讓我們的點盡可能的下降到最低點智绸。這里有兩個辦法,我們知道這種拋物線的最低點我們可以直接計算獲得访忿,這種方法這里暫時不說瞧栗,所說它就是一條公式,但是要推導(dǎo)出來可沒那么容易(這里的公式可不是高中那種就一個輸入X的公式海铆,而是輸入很多的更為復(fù)雜的)迹恐,直接套公式適用于訓(xùn)練集不算太大的情況下,因為數(shù)據(jù)多的時候計算量超大卧斟。
下面還是說回我們的主角殴边,我們需要一種辦法,每一步的計算量不大讓它的值慢慢下降到最低點珍语,就如一個人下山一樣每次只邁一小步锤岸,然后慢慢向下到山底。
很巧的是我們有一個東西可以反映出我們曲線在每一點的陡峭程度——導(dǎo)數(shù)廊酣,大學(xué)知識還沒忘都還記得能耻,在某一點的導(dǎo)數(shù)就是該函數(shù)在這一點的切線,曲線越接近垂直,導(dǎo)數(shù)在這一點的值就越大晓猛。這是一種很好的方法讓我們減小我們的θ值饿幅。
上圖中那個點的切線斜率是正的,并且比較大的戒职,那么讓我們的初始θ減去它自己在這一點的導(dǎo)數(shù)(也就是斜率)栗恩,現(xiàn)在我們的點便會下降一點,而且根據(jù)圖形可以看出洪燥,越往下降磕秤,切線的斜率越小,慢慢的就會接近最低點了捧韵。
如何計算
一定記住一點市咆,代價函數(shù)是關(guān)于θ的函數(shù)而不是x,預(yù)測函數(shù)h才是關(guān)于x的再来,在代價函數(shù)里x都是已知的量蒙兰。
其實不難發(fā)現(xiàn)上面介紹的梯度下降是在只考慮θ1的情況下,并沒有考慮之前公式里的θ0∶⑴瘢現(xiàn)在我們就只考慮θ1的情況下來看看該如何計算上述方法搜变。
這個式子有幾個地方需要注意,首先就是減號后面针炉,忽略掉α后這個式子就是代價函數(shù)對θ1的導(dǎo)數(shù)挠他。記住現(xiàn)在的h(x):
h(xi)=θ1*xi;
導(dǎo)數(shù)沒忘的計算出這個結(jié)果不是難事。
第二點就是剛才我們忽略掉的α篡帕,它被稱作學(xué)習(xí)率(learning rate)殖侵,就是讓導(dǎo)數(shù)乘上它,用來決定下降的幅度赂苗,如何選取它并沒有明確的規(guī)定愉耙,需要你在實際問題中去嘗試。太小的學(xué)習(xí)率會讓這個算法執(zhí)行很多遍才能到達(dá)理想的效果拌滋。但是太大的學(xué)習(xí)率則更為致命,它可能導(dǎo)致你這個函數(shù)最終發(fā)散猜谚,永遠(yuǎn)得不到你想要的結(jié)果败砂。
為什么還會發(fā)散呢,根據(jù)上圖魏铅,假設(shè)我們的初始點在a點昌犹,然后下降到b點再到c點,此時如果學(xué)習(xí)率太大览芳,下一次的下降有可能跨過了最低點而到了d點斜姥,至此我們的算法就走上了不歸路,此時點到了左邊,斜率變成負(fù)的了铸敏,根據(jù)上面的梯度下降的式子缚忧,減去一個負(fù)數(shù)就是加上它的絕對值,所以我們的點會越來越高杈笔,而且每次跨度會比上一次更大闪水。
綜上,過大的學(xué)習(xí)率會讓我們的點沖破天際蒙具,一去不復(fù)返球榆,所以選取學(xué)習(xí)率也是比較重要的。
最后還有一點禁筏,上面例子都是舉了開口朝上的函數(shù)以及初始點處的切線斜率為正的情況持钉。其它情況經(jīng)過驗證其實都是正確的,這里不一一列舉篱昔。
兩個參數(shù)呢
如果我們把θ0加上呢每强,其實跟上面沒什么兩樣,我們只不過是對兩個θ分別減去它們的導(dǎo)數(shù)旱爆,循環(huán)一定的次數(shù)舀射,只不過多變量求導(dǎo)我們給了它另外的名字,叫做偏導(dǎo)數(shù)怀伦,球θ0偏導(dǎo)的時候只要把θ1看作常量脆烟,然后正常對θ0求導(dǎo)就行了(不知道的只能去翻翻高數(shù)書了-。-).所以最終的梯度下降的數(shù)學(xué)算式如下:
可以看到θ1跟剛才一樣房待,θ0也很容易得出邢羔。
那么經(jīng)過循環(huán)執(zhí)行這一步驟,可能是100次桑孩,或者500次拜鹤,我們就可以得到我們想要的θ,這時我們的預(yù)測函數(shù)h表現(xiàn)那是very good的流椒。
結(jié)尾
至此單變量的線性回歸模型已經(jīng)大致講完了敏簿,具體實現(xiàn)的話,基本所有語言都能做宣虾,像matlab,python,java,octave之類的惯裕。不過現(xiàn)在的大趨勢是python,可以說它在這方面真的很火,而且又有封裝的很好的各種科學(xué)計算庫绣硝,像numpy之類的蜻势,所以實現(xiàn)上述過程并不困難。
不過還有一些技巧并沒有寫出來鹉胖,像上面的梯度下降握玛,我們真的要寫個for循環(huán)然后一遍一遍的執(zhí)行嗎够傍。
答案是否定的,有一種叫做向量化的辦法可以讓我們只需要一行代碼就可以執(zhí)行for循環(huán)做的所有工作挠铲。下面還會繼續(xù)介紹這種方法冕屯,簡潔才是王道對吧,況且速度也快了不止一點市殷。
當(dāng)然這是最最簡單的模型了愕撰,我們還有多變量的線性回歸,邏輯回歸醋寝,還有近幾年大火的神經(jīng)網(wǎng)絡(luò)以及各種其它模型......
人工智能的領(lǐng)域是十分廣闊的搞挣,沒有人精通人工智能的所有部分,有的從事深度網(wǎng)絡(luò)音羞,有的從事計算機視覺或是語音等等囱桨。
人類發(fā)展到現(xiàn)在真的是不可思議不是嗎。
當(dāng)然我也只是個入門的小菜嗅绰,接下來我也還會繼續(xù)學(xué)習(xí)舍肠,不斷充實自己,人的一生就是不斷學(xué)習(xí)的過程這話說的還真不錯窘面,學(xué)累了就去玩會吧(><)翠语。