學習演算法
什麼是學習演算法,學習當然不是一個動詞,學習演算法最簡單的理解便是能夠從資料中學習的演算法,學習的解釋根據 Mitchell 提出的定義:“對於某類任務 Task 和效能度量 Performace ,如果一個計算機程式在任務中,效能能夠隨著經驗 Experience 而自我完善,那麼我們就稱為程式在經驗中學習 。”
舉一個非常簡單的例子,加入你有一個女朋友,你們每次約好出去吃飯的時候,你總是興沖沖的去等她,但是每次都要等很久,你也不敢抱怨什麼,但是也不想和個孤兒一樣站著。於是你就開始了學習。你的任務就是“縮小等待的時間”,然後你在約好時間後等待了五分鐘再出門,結果你還是等了15分鐘。下一次,你等待了十分鐘再出門,你還是等了十分鐘。後來你不斷的調整等待的時間,這就是一個學習的過程。那麼有一次,你等了25分鐘再出門,結果被臭罵了一頓,這也就是我們機器學習裡面很常見的一個東西,叫做懲罰。當然學習也是有一個前提條件,就是任務必須要有潛在的規律,它不可以是一個無規律的事物。
學習任務
事實上很多人會有一種誤解,認為我們學習的就是任務。請記住,我們學習的永遠不是任務本身,學習指的是獲得執行任務的能力。比如,我們要實現人臉的自動識別,那麼識別就是任務,我們要獲得識別的能力。說到底,機器學習就是試圖讓程式替代或者輔助人的智慧行為。
效能度量
我們在評估學習演算法裡面某項任務的好壞的時候,我們常常需要設計一些東西去量化它的效能。比如人臉識別的任務重,我們需要衡量識別的正確率和準確率,通常我們稱之為精度,當然還有錯誤率。
為了衡量一個演算法的好壞,我們常常需要人為的製作出資料,我們稱為 測試資料 (test set of data),不過通常來說,測試資料也是已知資料的一部分,只是我們單獨的劃分開,只用於訓練完成後的最終測試。那麼平時我們進行引數的最佳化時所使用的資料,我們稱為訓練資料 (train set of data),同時還有驗證資料等等。
- 查全率與查準率
錯誤率和精度是最為常用的度量方式,但在一些任務中,比如分類任務,我們還需要一些額外的度量方式。比如進行資訊檢索時,我們經常要關心分類中有多少是正確的以及分類正確的中有多少被選出來了,這時候,我們引入查準率(precison)和查全率(recall)。
我們舉一個二分類的問題,我們將分類器的預測結果分為一下四種結果:
(1)真正例(True Positive,TP),即預測為1,真實列表為“1”的分類資料。
(2)假正例(Flase Positive,FP),即預測為0,真實列表為“0”的分類資料。
(3)真反例(True Negative,TN),即預測為0,真實列表為“0”的分類資料。
(4)假反例(False Negative,FN),即預測為1,真實列表為“1”的分類資料。
總資料量=TP+FP+TN+FN,在這裡,你可以列出一個混淆矩陣方便你的閱讀。
查準率 P 就是分類器預測結果為“1”中預測正確的比率。
查全率R就是真實類標為"1”的資料中分類器預測正確的比率。
通常來說,查全率和查準率是矛盾關係,當查準率很高的時候,查全率往往很低。比如講一張照片中的人全部查詢出來,你可以將所有的動物都標記為人,那麼你的查全率就是1了,但是查準率顯然是很低。所以你需要有時候謹慎的選擇,有時候寧可錯殺一千也不放過一個,有時候你需要反其道行之。
在評估多個演算法的時候,我們可以作出 P-R 圖,如果一個演算法的 P-R 圖將另一個演算法的圖完全包住,那麼可以判定後者的效能更優秀。如果它們發生了交叉,我們通常很難判定它們的效能,通常會進行比較 BEP (P=R的點),不過BEP過於簡陋了,所以我們使用 F1度量:
有的時候我們對查全率和查準率的要求不同,比方說,我們進行內容推薦的時候,要儘可能降低查全率提高查準率,因為我們的要求是更少的打擾。我們使用F1度量的一般形式——\(F_\beta\):
其實我們可以發現,F1是基於查準率和查全率的調和平均,也就是\(\frac{1}{F1}=\frac{1}{2}(\frac{1}{P}+\frac{1}{R})\),\(F_\beta\)則是廣義的F1,也就是加權調和平均,\(\frac{1}{F_\beta}=\frac{1}{1+\beta^2}(\frac{1}{P}+\frac{\beta^2}{R})\)。
對於\(F_\beta\),如果\(\beta > 1\),展開表示式很容易發現查全率會有更大的影響,如果\(\beta < 1\),則查準率更有影響。
學習經驗
在這裡我會很粗略的講一下監督學習(Supervised Learning)和非監督學習(Unsupervised Learning)。事實上機器學習的演算法則是粗略的分為這兩種。
監督學習演算法: 簡單地說就是我們試圖將每一個資料都用一個相對應的類標(Label)進行關聯,就好比我指著一堆車子,告訴你,這種形狀的就是車,或者說,以江西省為例,所有籍貫江西的人的身份證號前兩位都是36,這也是一個類標。我們讓一個小朋友去學習認識這些,每次錯誤的時候,我們相應的提醒糾正他,他慢慢的就會調整自己,不斷學習提高自己的識別能力。你可以把監督學習認為是一種對映關係,對於每一個資料 x ,都會有一個對應的 y。
非監督學習演算法: 現實生活中,大部分資料是沒有標記的,即使我們人為的給它新增上標記,這個工作量基本上是無法估量的。非監督學習就是在沒有標記的情況下,學習資料內部自有的結構和規律。最常使用的非監督學習演算法就是聚類,例如我們聽到了兩種毫無關聯的聲音,我們在此之前也從來沒有聽過。但是我們能很清楚的分辨出這兩種聲音,儘管我們並不知曉這兩種聲音是什麼。但是我們的任務只是將他們以最大的共同點進行分類就行了。
監督學習費時費力,半監督學習能力有限,那麼有沒有什麼是可以取到兩種演算法的優點呢?這個時候,我們提出了半監督學習。
半監督學習很好理解,就是我們在面對大量無標記資料或者只有少部分有標記資料時,我們將兩種資料一起運用上,這就是半監督學習。
不過對於一個演算法的學習來說,即使我們只標記一部分資料,這樣的工作量也是很大的。並且存在一個問題,很多標記使用人為的方式並不好,標記通常都從環境中獲取。那麼我們怎麼評判這些資料的標記是否合適呢?我們只需要提供某些評價機制(獎勵和懲罰)。這一種學習方式我們稱為強化學習。不知道讀者中養狗的多不多,這種機制類似我們教狗上廁所,小狗可能不懂你的意思,但是它亂撒尿我們打它一頓,當它前往指定位置的撒尿我們獎勵它一個食物。慢慢的它自然就懂了。
我的掘金:WarrenRyan
我的簡書:WarrenRyan
歡迎關注我的部落格獲得第一時間更新 https://blog.tity.xyz
我的Github:StevenEco