仍然是一篇入門文,用以補充之前文章中都有意略過的部分。
以前的系列中,咱們指望對數學並無特別喜愛的程序員,也能夠從事人工智能應用的開發。但走到比較深刻以後,基本的數學知識,仍是沒辦法躲過的。python
全部的深度學習,始於一個最簡單的公式:
程序員
\[ y=ax+b \]
算法
而後機器學習的重點來了。
在常見的方程式中,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} \]
機器學習
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 \]
\[ \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 \]
\[ y' = h_θ(x) = \sum_{i=0}^nθ_ix_i \]
上面說到,咱們使用一組樣本的特徵值x,能夠求得一個目標值y'。由於公式中,咱們的常量值還沒有求得正確結果,因此此時y'跟正式的y值,確定是不一樣的。那麼二者的差別,就是「損失」。求得二者差別的函數,就是「損失函數」。也即:
\[ l(θ) = (y' - y)^2 = (h_θ(x) - y)^2 \]
\[ J(θ) = \frac1m\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})^2 \]
\[ J(θ) = \frac1{2m}\sum_{i=1}^m(h_θ(x^{(i)}) - y^{(i)})^2 \]
對每個要求解的量θ,同損失函數值之間,都有一個函數關係圖示以下:
固然這是一個極度理想化的圖,只有一個全局的最低點。實際上大多複雜的機器學習問題,其圖示關係都如同重巒疊嶂,有不少個低谷,不理解的能夠參考如下題頭圖。那會致使咱們很容易到達了一個局部最優解以後陷入在那裏,而不是全局最優,這種狀況不在本文討論。
梯度降低是微分中的一個概念,在這裏應用的大意是,咱們把每個θ的取值範圍,都劃分爲不少份,每一份的寬度咱們稱爲動態∂,其實際寬度是由微分步長α決定的,咱們一步步嘗試改變θ的值,直至求得的損失值J(θ)最小,無限接近於0。
根據微分公式變形獲得的θ迭代公式爲:
\[ θ_j := θ_j - α\frac∂{∂θ_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} \]
\[ \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} \]
說了這麼多,梯度降低就是一種解方程的方法,特別對應於機器學習這種,由於數據集特徵維度超多致使的方程式權重係數量大,沒法使用傳統方式求解的問題。 公式的推導和解釋只是爲了對機器學習的底層邏輯理解的更爲清楚,實際上在各個機器學習框架中,這些工做都已經由框架幫咱們完成了,而且封裝了不少種經典的算法,以適應不一樣的習慣和不一樣的工做。咱們更多的是靈活運用便可。 固然仍是指望出現更多的基礎數學專家,在基礎方程和解方程方面取得突破,相信每一次的收穫,對於這個計算密集的領域來講都是里程碑式的。