1. 程式人生 > >對機器學習的一點理解

對機器學習的一點理解

求導 分段 梯度下降法 部分 技術分享 直接 標註 sqrt 插件

????機器是什麽,機器就是電腦、芯片、代碼這些東西。讓電腦遵循人的指令,完成一件特定的任務從計算機發明那天開始就在研究了,現在的各種編程語言、數據結構和編程算法等都是在做這個。但是它們只能依賴於程序員輸入的確定的代碼才能 work,也就是說他們不能“自己學習”,這樣對於有些問題就很尷尬,比如檢測一張圖片中有幾個人,識別一句話中提到了幾個人名,識別一張圖片是不是黃圖等等。這些任務要是寫一個代碼,依靠規則去實現,那還是非常困難。但是我們可以換個思路,讓我們寫代碼去實現這些功能很困難,但是讓我們去給圖片打標簽(比如給一批圖,人為的打上是不是黃圖的標簽…)不是很簡單的嘛,我們如果能讓機器自己從打好標簽的圖片中自己學習那些是黃圖不就萬事大吉了嘛。這樣看的話,標註的工作就對應了傳統寫代碼中寫規則匹配的工作。
????那麽有了標註好的圖片,怎麽讓程序學習呢?這一步就需要借助於萬能的數學了。如果我們能構造一個擬合函數,這個擬合函數可以擬合訓練集,比如這裏就是給函數輸入各個圖片的像素 RGB 值,輸出就是是不是黃圖。擬合完了之後給定一張沒見過的圖片也就能用這個函數得到是不是黃圖了。
????那麽具體是怎麽實現這個思路的呢?想一想最小二乘法的做法。舉個例子,比如有 100 個點\((x_{0},y_{0}),...,(x_{100},y_{100})\)

,我們想用一條直線去擬合它。首先直線的方程就是 \(y = ax+b\), 其實這裏我們只要求出 a 和 b 就行了,a 和 b 的選擇有無數多種,我們要選一種最好的。沒有量化就沒有優化,我們首先要把 “最好的” 這個標準進行量化,在數學上就是選一個目標函數,比較好的一個目標函數就是讓每個點到 y 的距離之和最小(圖上畫圈部分就是每個點的誤差,目標就是讓每個點的誤差加起來最小)。


技術分享圖片

????所以目標函數就是 \(\sum_{i=0}^{n}\frac{\left | ax_{i} - y_{i} + b \right |}{\sqrt{a^{2}+1}}\),我們要讓它最小。
????但是這樣比較難算(點到直線的公式太煩了……),所以我們可以退而求其次,讓每個點到 y 的差的和最小,這裏只要關註距離,所以可以把一個點的誤差寫成 \(\left | x_{i}- (ax_{i}+b)\right |\)
。然後把每個點的誤差加起來就是我們的目標函數了。我們要讓理論值和測試值之間誤差最小。

技術分享圖片

????這樣表示的目標函數就是 \(\sum_{i=0}^{n}\left | x_{i}- (ax_{i}+b)\right |\)
????但是絕對值是個令人頭痛的東西,是一個分段函數並且還有不可導的點。所以我們用平方代替,最終的目標函數是 \(\sum_{i=0}^{n} (x_{i}- (ax_{i}+b))^{2}\),現在的任務只要求使得這個式子最小的 a 和 b 就行了。在高等數學中,對於這個問題只要對 a 和 b 分別求偏導,並令其為 0,然後解一個二元一次方程就行了。鑒別黃圖的思路也是類似的,只不過這個擬合函數就沒有 \(y = ax+b\)
這麽簡單了,可能還要用到高大上的深度學習什麽的……但是道理是一樣的。
????對於其他的大部分機器學習算法思路是一樣的。流程都是確定目標函數,然後對每個參數求導的方法找到目標函數的最大值(優化參數的過程)。只不過這裏每個步驟都有很多方法可以選擇。比如針對是否有訓練集可以分為有監督、無監督和半監督。目標函數有極大似然估計、貝葉斯估計、平方誤差、交叉熵之類的。優化參數可以直接求出解析解(如果可以的話),或者用 EM 算法、梯度下降法、牛頓法之類的進行叠代優化。


????對機器學習感興趣的新手或者大牛,如果有覺得對別人有幫助的,高質量的網頁,大家可以通過 chrome 插件分享給其他人,在這裏安裝分享插件。

對機器學習的一點理解