一:問題描述和流程圖
將介紹一種機器學習的應用實例:照片OCR技術,介紹它的原因:
(1)首先,展示一個復雜的機器學習系統是如何被組合起來的;
(2)接着,介紹一下機器學習流水線的有關概念以及如何分配資源來對下一步計划作出決定;(適用於個人或者團隊開發機器學習應用)
(3)最后,介紹一下照片OCR問題,展現機器學習中有用的想法和概念,其中之一就是應用在計算機視覺問題中,另一個是人工數據合成的概念。
照片OCR的全稱為照片光學字符識別,它注重的問題是如何讓計算機讀出圖片中的文字信息(方便以后輸入文字即可查找照片),它有以下幾個步驟:
(1)首先,給定某張圖片,將圖像掃描一遍; (2)然后,找出照片中的文字信息,找出文字后,重點關注這些文字區域,並對區域中的文字進行識別; (3)正確讀取中照片中的文字后,將這些文字內容顯示並記錄下來。
三個步驟:
文字檢測、字符分割、字符分類(可以含有修正系統,修正部分單詞);
在復雜的機器學習系統中,流水線的概念已經滲透到各種應用中,上圖就是照片OCR流水線的具體運作流程,接下來將繼續介紹流水線的有關內容。(不同模塊可以分別、並行完成)
二:滑動窗口
討論一種滑動窗口分類器的方法。
圖像OCR流水線的第一步是文字識別,文字識別在計算機視覺中是比較難的問題,因為根據找到的文字區域和它們對應的矩形具有不同的長寬比例,如下圖:
不同的長寬比例具有一定難度,所以先來討論一下行人檢測的問題:
(一)行人檢測
在行人檢測中,找出圖片中的行人,如下圖:
這個問題與文字識別問題的簡單的地方在於要識別的東西具有相似的長寬比,僅用一個固定長寬比的矩形就行了,所以為建立一個行人檢測系統,需要這樣做:
例如,把長寬比設為82*36,然后從數據集中收集一些正樣本(y=1,包含行人的照片)和負樣本(y=0,不包含行人的照片),接着可以在網絡中訓練或者使用其他學習算法向其中輸入一個82*36的圖塊來對y進行分類,來划分每個圖塊是否包含一個行人。
所謂的滑動窗口分類器是:首先在圖片中選取一個矩形塊,比如一個82*36的圖塊,把這個圖塊傳遞給分類器,來檢測圖片中是否有行人,若有返回y=1,若沒有返回y=0,接下來把綠色矩形塊稍稍移動一點,接續剛才的操作,然后繼續向右滑動窗口,直到這個矩形塊在整個圖片各個位置都過一遍,滑動窗口每次移動的距離是一個參數,稱為步長/滑動參數。
....
如果選擇的矩形塊小了,則再用大一點的矩形塊再做一次滑動的過程。
這就是如何訓練一個監督學習分類器,然后使用一個滑動窗口分類器,來找出圖中的所有行人。
(二)文本檢測
接下來回到文本檢測的這個例子中來:
與行人檢測類似拿出一系列包含正樣本和負樣本的訓練集,正樣本是對應含有文字的圖塊,負樣本是對應沒有文字的圖塊。
使用了滑動窗口的文本檢測系統,通過找出這些包含文字的矩形,將這些區域剪切出來
然后進入流水線的下個階段,也就是識別文本。
流水線的第二步是字符分割,給定如下所示的圖:
如何分割出圖中的單個字符,要再次使用監督學習算法,用些正樣本(存在分割線)和負樣本。(也需要進行滑動窗口操作)
現在觀察這些圖塊,然后判斷出圖塊中是否文字分割的地方,所以對於初始的正樣本,即左邊的圖片,確實存在兩個字符分割的地方,而右邊的圖片不能表示兩個字符的分割。所以,要訓練一個分類器嘗試將正負樣本進行區分,訓練完這些分類器后,可以將它們運行在文字檢測系統輸出的這些文本中,同樣用到滑動窗口分類器,如下圖:
慢慢的向右移動,最后可以將圖像中的文本全部分割成單個字符:
總結步驟:
這就是OCR識別流水線的全部過程以及使用滑動窗口這樣的思想,來組合這些不同的組件,開發出圖片OCR系統。
三:獲取大量數據和人工數據
之前提及:一個最可靠得方法得到高性能機器學習系統得方法是使用一個低偏差機器學習算法,並且使用龐大得訓練集去訓練他。但是我們從哪獲取這么多得訓練集數據?
機器學習中有一個概念叫做人工數據合成,它主要有兩種形式:
(1)自己創造數據(從零生成新數據);
(2)已經有小的標簽訓練集,然后以某種方式擴充訓練集。
(一)文字檢測
這里繼續使用字符識別的例子進行討論:
假如收集到一個大的標簽數據集,如下圖:
1.從零生成新數據
目標是輸入一個圖像塊后識別出圖像塊中央的字符,這里的所有例子都是真實圖像,那么怎樣才能得到一個更大的訓練集呢?
一個方法是用不同的字體生成符,然后將其粘貼到任意不同的背景中,這樣做了之后,就會得一個人造訓練集,如下圖:
可以看到上述圖中的合成數據,它實際上與真實的數據非常相似,那么使用合成數據實際上能為人工訓練合成提供無限的訓練數據樣本。
在這個人工數據合成的例子中,基本上是從零開始生成新數據。
2.使用現有的樣本生成數據
接下來介紹另一種生成人工數據的方法:使用現有的樣本生成數據。
例如,下圖是一張字符A的圖像,它取自一張真實圖像,而不是合成圖像:
接下來對這個字母這張圖進行人工拉伸,這樣可以把A編程16個新的樣本,采用這種方法就能夠將一個小的標簽數據集擴充為一個更大的訓練集:
(二)語音識別
這里舉另一個不同領域的例子:語音識別。
假定有一些音頻片段,想從中學習來識別語音片段中出現的單詞,如果有一個帶標簽的訓練樣本(某人從one數到five的語音片段),想嘗試應用一個學習算法來識別那個人說的單詞,那么如何擴充數據集呢?
可以做的是引入額外的語音失真到數據集中,這里將加入不同的背景音來模擬手機通話信號不好的情況,因此,只需要花功夫收集一個標簽樣本,通過人工添加失真(引入不同的背景音),很容易將一個樣例擴充為更多的樣本。
應該注意:選擇失真時,應該認真考慮一下,哪一種失真應該添加,是有意義的。怎樣才能使得生成的數據帶有一定代表性。
圖二中,添加的失真就沒有意義,添加了高斯噪聲,改變了亮度信息等。
(三)提幾點有關用人工數據合成來生成大量數據的問題:
(1)在花大力氣想法生成人工訓練樣本之前,通常最好先確保分類器的偏差較低,這樣的話通過更多的訓練數據,才能真正起作用。
標准的做法是繪制一個學習曲線來確保有一個低偏差、高方差的分類器。如果分類器的偏差太高,那么可以嘗試持續增加分類器的特征數量或增加神經網絡隱藏單元數,直到偏差值降低。再花費時間到生成大量的人工訓練集上。
(2)在研究機器學習問題時,“獲得當前擁有的數據的10倍的數據量,需要花費多大努力?”
1.人工數據合成方法(上面兩種)
2.自己收集或是添加標簽
3.“眾包”(眾包數據標記)---雇人
這一節中,我們探討了人工數據合成的兩種方法,希望能記住一點是:加假如遇到一個機器學習問題有兩件事是值得做的,一個是用學習曲線做一個合理檢驗,另一個是問一下要花費多少資源才能獲得當前數據的10倍。
四:上限分析:下一步工作的pipeline
將介紹關於上限分析的內容,當在設計某個機器學習系統工作流時,這種方式通常能提供一個很有價值的信號來指導工作流中的哪一部分最值得花時間去研究。
(一)文本檢測
為了講解上限分析,這里繼續使用照片OCR工作流的例子:
這些模塊中,哪一塊最值得投入精力去做?假設當前得到整個系統目前地准確率為72%,下面是上限分析的主要思想:
1.首先,關注機器學習工作流中的第一模塊(文本檢測),遍歷整個測試集,人為地直接給出正確答案或標簽來給工作流的文本檢測部分,然后用這些正確的標簽傳給工作流的下一階段,度量整個系統的准確率提高到89%;
2.同前面一樣,找出測試集,現在不僅用正確的文本檢測結果,還同時用標准的字符分割結果,人為地把文本標記成單個字符,然后度量整個系統的准確率提高到90%;
3.最后執行字符識別模塊,同樣是人工給出這一模塊的正確標簽,然后度量整個系統的准確率提高到100%;
進行上限分析的好處就是理解了,如果對每一個模塊進行改善,它們各自的上升空間有多大,可以從上述得到結論:
如果在現有的系統基礎上花費時間和精力改善文本檢測模塊的效果,可以提高系統17%的性能;而花費精力改善字符分割模塊,性能只提高了1%;同樣地,如果花費精力改善字符識別模塊,系統性能提高了10%。這就估計出了性能的上限,通過這種分析,可以知道提升每個模塊的潛在效果如何。
(二)人臉識別
下面再用一個人臉識別例子來闡述上限分析的思想:
假設用圖片做人臉識別,希望能辨識圖片中人,想通過這個例子展現一個工作流,給出上限分析,假設對給出的圖片給出如下的工作流:
還是假設當前得到整個系統目前地准確率為85%。
第一步,人為地去掉圖片背景,准確率提高到85.1%;第二步,遍歷測試集,給出正確的臉部識圖案,准確率提高到91%;第三步,依次運行眼睛、鼻子和嘴巴的分割,准確率分別提高到95%、96%和97%;第四步,最終給出正確的標簽,准確率提高到100%。可能最值得關注的是臉部識別的這個步驟,性能提高了5.9%,這樣就能很清楚看到不同步驟系統性能的上升程度。
(三)總結
總結一下:工作流是非常常用卻又很復雜的機器學習應用,當在開發某個大型機器學習應用的時候,作為一個開發者,時間是很寶貴的,應該花在值得去研究的模塊,所以上限分析是很好的方法,可以幫助判斷哪個模塊是值得花精力去改善的。
五:課程總結
在整個機器學習課程中,花了很長時間來講監督學習算法:
比如線性回歸、邏輯回歸、神經網絡以及支持向量機,這些問題中,會有帶標簽的數據和樣本;
同樣,也花了很長時間講無監督學習算法:
比如K-Means算法、主城分分析法(PCA)以及異常檢測算法,在這些問題中,只有無標簽數據,當然有時候異常檢測算法可以用有標簽數據對算法進行評估;也用了一些時間來講一些特定的應用和話題:比如推薦系統以及大規模機器學習系統(包括MapReduce思想),滑動窗口分類器解決計算機視覺的應用。
最后,也花了時間從各個不同的方面給出了如何構建機器學習系統的建議:
討論了偏差和方差以及如何使用正則化解決一些方差問題、討論了在開發機器學習系統時如何合理分配時間、討論了學習算法的評價方法、召回率和F1-score這樣的評價指標、討論了實踐方面的評測方法:比如訓練集、交叉驗證集和測試集;還花了很多時間介紹了如何調試算法,講了一些診斷方法:比如學習曲線、誤差分析和上限分析的內容。
機器學習是一門在科學、技術和產業方面都有深遠影響的學科,我們要做的不僅是認識這些工具和算法,更重要的是怎樣有效地使用它們來構建強大的機器學習系統。