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



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

導言

所有的深度學習,始於一個最簡單的公式:

$$ y=ax+b $$

如果不理解的,可以去看一下[房價預測](http://blog.17study.com.cn/2018/01/08/tensorFlow-series-1/)的例子。 簡單說: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版本的解方程: ```python from sympy import *

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

最后的結果:  
```python
a= 2.10000000000000     b= 6.00000000000000

現在a/b兩個常量,終於是真正的常量了。之后再利用這個公式,就能夠用來預測房價了。

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

未知數無限多的方程

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

$$ 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 \\ 化簡后 \\ & = \frac1m\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})x_j^i \end{align} $$

> 6月24日補充:上面公式化簡的過程主要是導數的計算,另外寫了一篇[詳細推導](http://blog.17study.com.cn/2019/06/24/gradient-descent-derivative/),有需要可自行前往閱讀。

因為有人為添加的1/2的原因,這個化簡讓公式變得相對簡單。所以對於確定的每一個θ,我們的梯度下降求值公式為:

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

上面公式第一行還記得$x_0$恆定為1嗎?所以那里並沒有$x_0$。隨后有多少個要求解的θ,就有多少行公式。 從數學角度上說,這些公式沒有疑問。從編程上說,有一個提醒。那就是這些公式在求取權重系數θ的時候,每一行求取一個新的θ的過程中,所使用計算假設函數的θ,是在上一個循環中固定下來的那個θ值,所有行的θ均為如此。直到所有這一個批次的θ值計算完成后,整體θ才可以代入到公式,從而參與下一個循環的計算。不能每計算一個θ值,就單獨的代入到公式中,那樣梯度下降就永遠找不到方向了。 ### 總結 說了這么多,梯度下降就是一種解方程的方法,特別對應於機器學習這種,因為數據集特征維度超多導致的方程式權重系數量大,無法使用傳統方式求解的問題。 公式的推導和解釋只是為了對機器學習的底層邏輯理解的更為清楚,實際上在各個機器學習框架中,這些工作都已經由框架幫我們完成了,並且封裝了很多種經典的算法,以適應不同的習慣和不同的工作。我們更多的是靈活運用即可。 當然還是期望出現更多的基礎數學專家,在基礎方程和解方程方面取得突破,相信每一次的收獲,對於這個計算密集的領域來說都是里程碑式的。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM