梯度降低法基本推導--機器學習最基本的起點


仍然是一篇入門文,用以補充之前文章中都有意略過的部分。
以前的系列中,咱們指望對數學並無特別喜愛的程序員,也能夠從事人工智能應用的開發。但走到比較深刻以後,基本的數學知識,仍是沒辦法躲過的。python

導言

全部的深度學習,始於一個最簡單的公式:
程序員


\[ y=ax+b \]
算法


若是不理解的,能夠去看一下 房價預測的例子。
簡單說:y是要預測的房價,x是房子的平米數。a是每平米的房價,b是基本費用。
這個公式每當有一個房子的平米數,預測出來一個y,就是房子的總價格。固然做爲簡化的舉例,這裏排除了不少更復雜的因素。
因此,做爲小學數學的課程,這是一個很簡單的房價方程式。

而後機器學習的重點來了。
在常見的方程式中,y是計算結果不用說了,x歷來都當作未知數,a/b是常量,常量在方程式中也是已知量的意思。
而在機器學習中,咱們會有一大批用於學習的數據。仍以這個杜撰的房價預測爲例,咱們手頭會有大量房間平米數、房價的對應樣本。因此房價y是已知量,房間平米數x也再也不是未知數,而成爲了已知量。
反過來做爲常量的a/b,咱們並不知道,也就是未知數。
單純從符號系統來看,這個公式太詭異了,已知數變成了未知數,未知數變成了已知數。
但也不過是就這麼一點點不適應,做爲程序員,用慣了各類奇怪的變量名,x/y聲明爲常量,a/b當作求解的未知數,也沒有什麼好奇怪的對不對?編程

只要適應了這一點點,接下來就沒有什麼好神奇的了。
公式\(y=ax+b\)中,有a/b兩個未知數,常識告訴咱們,其實不須要不少樣本,有兩組樣本,足以求得兩個未知數了。好比兩組樣本爲:
公寓A,30平米,房價69萬。公寓B,90平米,房價195萬。仍是老話,先別在乎這兩個數據合不合理,以及房價包含的不少複雜因素。
那麼,列出的方程組爲:
框架


\[ \begin{equation} \begin{cases} 69=30a+b \\ 195=90a+b \end{cases} \end{equation} \]
機器學習


這樣的方程,應當能夠秒解吧?萬一忘了怎麼解方程也不要緊,再附送一個python版本的解方程:

from sympy import *

a,b = symbols("a b")
s1 = solve([Eq(69,30*a+b),Eq(195,90*a+b)],[a,b])
print("a=",s1[a].evalf(),"    b=",s1[b].evalf())

最後的結果:函數

a= 2.10000000000000     b= 6.00000000000000

如今a/b兩個常量,終因而真正的常量了。以後再利用這個公式,就可以用來預測房價了。學習

小結一下:
機器學習,就是利用樣本中的已知量,求解方程中常量係數的過程。
機器學習完成後,人工智能的預測過程,是使用在學習過程當中求得的常量,經過計算輸入的特徵值x,得出預測值y的過程。人工智能

未知數無限多的方程

那說了這麼多,這跟梯度降低有啥關係呢?
事情是這樣的,在上面簡單的例子中,只有一個特徵值x,和兩個未知數(兩個常量係數須要求解),咱們很容易就能解方程。
但在人工智能系統中,特徵值可能有不少,好比一幅224x224的彩色圖片,就是224x224x3(色深)=150528個特徵值。至少有150529個常量須要求解。
用公式來表示會是這樣:
spa


\[ y = a_1x_1+a_2x_2+a_3x_3+ ... +a_{150528}x_{150528}+b \]


推廣一下:


\[ y = a_1x_1+a_2x_2+a_3x_3+ ... +a_nx_n+b \]


這個公式還能化簡,如今特徵值是 \(x_1\)一直到 \(x_n\)
咱們人爲設置一個內置的特徵值 \(x_0\),值一直是1。這樣常量b也就能統一進來了,由於 \(bx_0 = 1b = b\)。而把b換一個名字換成 \(a_0\),不用擔憂這個名字換來換去,由於求解出來,都是一個固定的常量,叫什麼名字都不重要。那整個方程就等於:

\[ \begin{align} y &= a_0x_0+a_1x_1+a_2x_2+a_3x_3+ ... +a_nx_n \\ &= \sum_{i=0}^na_ix_i \end{align} \]


這樣看起來更舒服,也更有表明性。
這樣狀況下,要求的未知數可多了,使用一般的解方程方式已經沒法知足這個要求。此時,梯度降低法已經能夠粉墨登場了。

假設函數

咱們首先要引入兩個概念,先說第一個:假設函數。
假設函數的意思是指,咱們使用一組特徵值x(x是簡寫,其實是\(x_1\)一直到\(x_n\)),經過上述的計算公式,能夠獲得一個結果y'。爲何是y'而不直接是y呢?由於咱們公式中全部的權重值\(a_0\)\(a_n\)尚未肯定的值,因此求得的y',跟實際上的y必然還不一樣。
整理一下,咱們把假設函數列出來,公式中h,是英語假設Hypothesis的縮寫:

\[ y' = h_a(x) = \sum_{i=0}^na_ix_i \]


剛纔的數學公式,咱們一直延續了小學生的習慣,爲了跟機器學習課程的統一,咱們再次重命名一下常量名稱,用希臘字母θ代替咱們一直使用的英文字母a。這是爲了便於咱們跟同行的交流,以及學習其它課程。那麼再次列出更名後的公式:

\[ y' = h_θ(x) = \sum_{i=0}^nθ_ix_i \]

損失函數

上面說到,咱們使用一組樣本的特徵值x,能夠求得一個目標值y'。由於公式中,咱們的常量值還沒有求得正確結果,因此此時y'跟正式的y值,確定是不一樣的。那麼二者的差別,就是「損失」。求得二者差別的函數,就是「損失函數」。也即:

\[ l(θ) = (y' - y)^2 = (h_θ(x) - y)^2 \]


l是損失(loss)的縮寫。這裏的差值再取平方就是大名鼎鼎的「方差」,是爲了保證結果是一個正數。由於咱們確定但願這個「損失」值越小越好,最好是0,0表示無差異。若是出現了負數,那負的越多,結果實際上更惡劣了。
若是隻有一組樣本,咱們不可能求得不少的未知數,但幸運的是,咱們一般都有不少組數據樣本。
這也是不少大佬口中說:擁有數據就擁有將來的意思。
在多組樣本的狀況下,科學表達損失值的方法有不少,常見的是均方差(Mean Squared Error)。均方差並不是最好,但易懂易用,就是累計m組樣本的方差,再求平均值:

\[ J(θ) = \frac1m\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})^2 \]


這裏的J是均方差損失的意思,彙總了全部樣本的表現。
損失函數也常常被稱爲代價函數Cost Function。但二者實際仍是有細微區別。不過如今混用已經如此普及,咱們就不吹毛求疵了。
爲了後續的計算方便,咱們把上面公式前面再增長一個1/2,後續化簡的時候你會看到這個1/2的做用。在這裏,咱們指望的J(θ)是無限接近於0,因此前面增長1/2不會影響J(θ)的結果。

\[ J(θ) = \frac1{2m}\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})^2 \]

梯度降低求解

對每個要求解的量θ,同損失函數值之間,都有一個函數關係圖示以下:

固然這是一個極度理想化的圖,只有一個全局的最低點。實際上大多複雜的機器學習問題,其圖示關係都如同重巒疊嶂,有不少個低谷,不理解的能夠參考如下題頭圖。那會致使咱們很容易到達了一個局部最優解以後陷入在那裏,而不是全局最優,這種狀況不在本文討論。
梯度降低是微分中的一個概念,在這裏應用的大意是,咱們把每個θ的取值範圍,都劃分爲不少份,每一份的寬度咱們稱爲動態∂,其實際寬度是由微分步長α決定的,咱們一步步嘗試改變θ的值,直至求得的損失值J(θ)最小,無限接近於0。
根據微分公式變形獲得的θ迭代公式爲:

\[ θ_j := θ_j - α\frac∂{∂θ_j}J(θ) \]


這個公式的原理不詳細解釋了,你知道是由微分公式推導得來的就好。這裏面的J是表示第J個未知數θ的意思。
咱們看公式中α步長後面的部分:

\[ \begin{align} \frac∂{∂θ_j}J(θ) & = \frac∂{∂θ_j}\frac1{2m}\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})^2 \\ 化簡後 \\ & = \sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})x_j^i \end{align} \]


由於有人爲添加的1/2的緣由,這個化簡讓公式變得相對簡單。因此對於肯定的每個θ,咱們的梯度降低求值公式爲:

\[ \begin{cases} θ_0 := θ_0 - α\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})^i \\ θ_1 := θ_1 - α\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})x_1^i \\ θ_2 := θ_2 - α\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})x_2^i \\ ...... \\ θ_j := θ_j - α\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})x_j^i \\ θ_n := θ_n - α\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})x_n^i \\ \end{cases} \]


上面公式第一行還記得 \(x_0\)恆定爲1嗎?因此那裏並無 \(x_0\)。隨後有多少個要求解的θ,就有多少行公式。
從數學角度上說,這些公式沒有疑問。從編程上說,有一個提醒。那就是這些公式在求取權重係數θ的時候,每一行求取一個新的θ的過程當中,所使用計算假設函數的θ,是在上一個循環中固定下來的那個θ值,全部行的θ均爲如此。直到全部這一個批次的θ值計算完成後,總體θ才能夠代入到公式,從而參與下一個循環的計算。不能每計算一個θ值,就單獨的代入到公式中,那樣梯度降低就永遠找不到方向了。

總結

說了這麼多,梯度降低就是一種解方程的方法,特別對應於機器學習這種,由於數據集特徵維度超多致使的方程式權重係數量大,沒法使用傳統方式求解的問題。 公式的推導和解釋只是爲了對機器學習的底層邏輯理解的更爲清楚,實際上在各個機器學習框架中,這些工做都已經由框架幫咱們完成了,而且封裝了不少種經典的算法,以適應不一樣的習慣和不一樣的工做。咱們更多的是靈活運用便可。 固然仍是指望出現更多的基礎數學專家,在基礎方程和解方程方面取得突破,相信每一次的收穫,對於這個計算密集的領域來講都是里程碑式的。

相關文章
相關標籤/搜索