機器學習:從入門到沉迷之機器的思考方式

通常狀況下咱們人類大腦能夠在沒有明確指示的狀況下處理絕大部分問題。例如,你作房產經紀時間很長,你對於房產的合適訂價、它的最佳營銷方式以及哪些客戶會感興趣等等都會有一種本能般的「感受」。強人工智能(Strong AI)研究的目標就是要讓計算機能這樣思考。php

可是目前的機器學習算法尚未那麼好——它們只能專一於很是特定的、有限的問題。也許在這種狀況下,「機器學習」更貼切的定義是「在少許範例數據的基礎上找出一個等式來解決特定的問題」。python

不幸的是,「機器在少許範例數據的基礎上找出一個等式來解決特定的問題」這個名字太繞口。因此最後咱們用「機器學習」取而代之。算法

讓咱們開始寫代碼吧!

前面例子中評估房價的程序,你打算怎麼寫呢?能夠先思考一下。less

若是你對機器學習一無所知,頗有可能你會嘗試寫出一些基本規則來評估房價,以下:機器學習

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = 0

  # In my area, the average house costs $200 per sqft
  price_per_sqft = 200

  if neighborhood == "hipsterton":
    # but some areas cost a bit more
    price_per_sqft = 400

  elif neighborhood == "skid row":
    # and some areas cost less
    price_per_sqft = 100

  # start with a base price estimate based on how big the place is
  price = price_per_sqft * sqft

  # now adjust our estimate based on the number of bedrooms
  if num_of_bedrooms == 0:
    # Studio apartments are cheap
    price = price — 20000
  else:
    # places with more bedrooms are usually
    # more valuable
    price = price + (num_of_bedrooms * 1000)

 return price

假如你像這樣瞎忙幾個小時,也許會取得一點成效,可是你的程序永不會完美,並且當價格變化時很難維護。函數

若是能讓計算機找出實現上述函數功能的辦法,這樣豈不更好?只要返回的房價數字正確,誰會在意函數具體幹了些什麼呢?學習

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = <computer, plz do some math for me>

  return price

考慮這個問題的一種角度是將房價看作一碗美味的湯,而湯中成分就是臥室數、面積和地段。若是你能算出每種成分對最終的價格有多大影響,也許就能獲得各類成分混合起來造成最終價格的具體比例。this

這樣能夠將你最初的程序(全是瘋狂的if else語句)簡化成相似以下的樣子:人工智能

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
 price = 0

 # a little pinch of this
 price += num_of_bedrooms * .841231951398213

 # and a big pinch of that
 price += sqft * 1231.1231231

 # maybe a handful of this
 price += neighborhood * 2.3242341421

 # and finally, just a little extra salt for good measure
 price += 201.23432095

 return price

請注意那些用粗體標註的神奇數字——.841231951398213, 1231.1231231,2.3242341421, 201.23432095。它們稱爲權重。若是咱們能找出對每棟房子都適用的完美權重,咱們的函數就能預測全部的房價!lua

找出最佳權重的一種笨辦法以下所示:

 

步驟1:

首先,將每一個權重都設爲1.0:

def estimate_house_sales_price(num_of_bedrooms, sqft, neighborhood):
  price = 0

  # a little pinch of this
  price += num_of_bedrooms * 1.0

  # and a big pinch of that
  price += sqft * 1.0

  # maybe a handful of this
  price += neighborhood * 1.0

  # and finally, just a little extra salt for good measure
  price += 1.0

  return price

步驟2:

將每棟房產帶入你的函數運算,檢驗估算值與正確價格的偏離程度:

運用你的程序預測房屋價格。

例如:上表中第一套房產實際成交價爲25萬美圓,你的函數估價爲17.8萬,這一套房產你就差了7.2萬。

再將你的數據集中的每套房產估價偏離值平方後求和。假設數據集中有500套房產交易,估價偏離值平方求和總計爲86,123,373美圓。這就反映了你的函數如今的「正確」程度。

如今,將總計值除以500,獲得每套房產的估價偏離平均值。將這個平均偏差值稱爲你函數的代價

若是你能調整權重使得這個代價變爲0,你的函數就完美了。它意味着,根據輸入的數據,你的程序對每一筆房產交易的估價都是分絕不差。而這就是咱們的目標——嘗試不一樣的權重值以使代價儘量的低。

步驟3:

不斷重複步驟2,嘗試全部可能的權重值組合。哪個組合使得代價最接近於0,它就是你要使用的,你只要找到了這樣的組合,問題就獲得瞭解決!

頭腦風暴時間

這太簡單了,對吧?想想剛纔你作了些什麼。你取得了一些數據,將它們輸入至三個通用的簡單步驟中,最後你獲得了一個能夠對你所在區域的房屋進行估價的函數。
可是下面的事實可能會擾亂你的思想:

1.過去40年來,不少領域(如語言學/翻譯學)的研究代表,這種通用的權重運算方式的學習算法已經賽過了須要利用真人明確規則的方法。機器學習的「笨」辦法最終戰勝了人類專家。

2.你最後寫出的函數真是笨,它甚至不知道什麼是「面積」和「臥室數」。它知道的只是攪動,改變數字來獲得正確的答案。

3.極可能你都不知道爲什麼一組特殊的權重值能起效。因此你只是寫出了一個你實際上並不理解卻能證實的函數。
4.試想一下,你的程序裏沒有相似「面積」和「臥室數」這樣的參數,而是接受了一組數字。假設每一個數字表明瞭你車頂安裝的攝像頭捕捉的畫面中的一個像素,再將預測的輸出不稱爲「價格」而是叫作「方向盤轉動度數」,這樣你就獲得了一個程序能夠自動操縱你的汽車了!

太瘋狂了,對吧?

步驟3中的「嘗試每一個數字」怎麼回事?

好吧,固然你不可能嘗試全部可能的權重值來找到效果最好的組合。那可真要花很長時間,由於要嘗試的數字可能無窮無盡。
爲避免這種狀況,數學家們找到了不少聰明的辦法(維基百科)來快速找到優秀的權重值,而不須要嘗試過多。下面是其中一種:
首先,寫出一個簡單的等式表示前述步驟2:

接着,讓咱們將這同一個等式用機器學習的數學術語(如今你能夠忽略它們)進行重寫:

 θ表示當前的權重值。 J(θ) 意爲「當前權重值對應的代價」。

這個等式表示咱們的估價程序在當前權重值下偏離程度的大小。
若是將全部賦給臥室數和麪積的可能權重值以圖形形式顯示,咱們會獲得相似下圖的圖表:

事實上這個圖在之後的學習中會遇到,咱們通常給它取名叫損失函數與參數之間的曲面圖

 

圖中藍色的最低點就是代價最低的地方——即咱們的程序偏離最小。最高點意味着偏離最大。因此,若是咱們能找到一組權重值帶領咱們到達圖中的最低點,咱們就找到了答案!

所以,咱們只須要調整權重值使咱們在圖上能向着最低點「走下坡路」。若是對於權重的細小調節能一直使咱們保持向最低點移動,那麼最終咱們不用嘗試太多權重值就能到達那裏。

若是你還記得一點微積分的話,你也許記得若是你對一個函數求導,結果會告訴你函數在任一點的斜率。換句話說,對於圖上給定一點,它告訴咱們那條路是下坡路。咱們能夠利用這一點朝底部進發。

因此,若是咱們對代價函數關於每個權重求偏導,那麼咱們就能夠從每個權重中減去該值。這樣可讓咱們更加接近山底。一直這樣作,最終咱們將到達底部,獲得權重的最優值。(讀不懂?不用擔憂,接着往下讀)。

這種找出最佳權重的辦法被稱爲批量梯度降低,上面是對它的高度歸納。若是想搞懂細節,不要懼怕,咱們在後面會繼續學習。

先簡單發一張損失函數的等高線圖來鎮樓:

當你使用機器學習算法庫來解決實際問題,全部這些都已經爲你準備好了。但明白一些具體細節老是有用的。

還有什麼你隨便就略過了?

其時上面整個內容介紹的就是機器學習中的一種思想:多元線性迴歸,一種深度學習算法。即根據多個數據樣本生成一個問題解決方案。

這邊的內容須要有必定的入門知識,我打算按照這個方向學習下去(加個好友一塊兒學習啊)。

機器學習法力無邊嗎?

一旦你開始明白機器學習技術很容易應用於解決貌似很困難的問題(如手寫識別),你心中會有一種感受,只要有足夠的數據,你就可以用機器學習解決任何問題。只須要將數據輸入進去,就能看到計算機變戲法同樣找出擬合數據的等式。

可是很重要的一點你要記住,機器學習只能對用你佔有的數據實際可解的問題才適用。

例如,若是你創建了一個模型來根據每套房屋內盆栽數量來預測房價,它就永遠不會成功。房屋內盆栽數量和房價之間沒有任何的關係。因此,不管它怎麼去嘗試,計算機也推導不出二者之間的關係。

 

怎樣深刻學習機器學習

打算採用Andrew Ng的網頁教程UFLDL Tutorial,聽說這個教程寫得淺顯易懂,也不太長。不過在這這以前仍是複習下machine learning的基礎知識,見網頁:http://openclassroom.stanford.edu/MainFolder/CoursePage.php?course=DeepLearning。內容其實很短,每小節就那麼幾分鐘,且講得很是棒。

 

入門已經結束,接下來還有好幾座大山去爬。共勉!!

相關文章
相關標籤/搜索