【原創】零基礎認識深度學習——猿人的第一次直立行走
前言
人工智慧是當今的熱議行業,深度學習是熱門中的熱門,浪尖上的浪潮,但對傳統IT從業人員來說,人工智慧技術到處都是模型、演算法、矢量向量,太晦澀難懂了。所以我寫了這篇入門級科普文章,目標是讓IT從業者能看清讀懂深度學習技術的特點,以及我們如何從中受益,找到自己的工作。
第一. 人工智慧的天時地利人和
行業的成熟要靠從業者的奮鬥(人和),也要考慮大環境和歷史的進程(天時和地利)。
人工智慧技術的井噴並不是單純的技術進步,而是軟體、硬體、數據三方面共同努力水到渠成的結果,深度學習是AI技術的最熱分支,也是受這三方面條件的限制。
AI軟體所依賴的演算法已經存在很多年了,神經網路是50年前提出的技術,CNN/RNN等演算法比大部分讀者的年齡都要大。AI技術一直被束之高閣,是因為缺乏硬體算力和海量數據。隨著CPU、GPU、FPGA硬體的更新,幾十年時間硬體算力擴充了萬倍,硬體算力被逐漸解放。隨著硬碟和帶寬的降價提速,20年前全人類都沒幾張高清照片,現在單個公司的數據量就能達到EB級。大數據技術只能讀寫結構化日誌,要讀視頻和圖片必須用AI,人類已經盯不過來這麼多攝像頭了。
我們只有從心裡把AI技術請下神壇,才能把它當做順手的工具去用。AI的技術很深理論很晦澀,主要是這個行業剛剛發芽還未分層,就像20年前IT工程師需要全面掌握技能,現在的小朋友們連字符集都不用關注。
第二. 關聯度模型
深度學習有兩步工作,先要訓練生成模型,然後使用模型去推測當前的任務。
比如說我用100萬張圖片標記好這是貓還是狗,AI把圖片內各個片段的特徵提取出來,生成一個貓狗識別模型。然後我們再給這個模型套上介面做成貓狗檢測程序,每給這個程序一張照片它就能告訴你有多大幾率是貓多大幾率是狗。
這個識別模型是整個程序中最關鍵的部分,可以模糊的認為它就是一個密封黑盒的識別函數。以前我們寫程序都是做if-then-else因果判斷,但圖像特徵沒有因果關係只看關聯度,過去的工作經驗反而成了新的認知障礙,還不如就將其當做黑盒直接拿來用。
接下來我放一個模型訓練和推測的實驗步驟截圖,向大家說明兩個問題:
1.需要用客戶的現場數據做訓練才能出模型,訓練模型不是軟體外包堆人日就行,很難直接承諾模型訓練結果。
2.訓練模型的過程很繁瑣耗時,但並不難以掌握,其工作壓力比DBA在線調試SQL小多了,IT工程師在AI時代仍有用伍之地。
第三. 動手實驗
本節較長,如果讀者對實驗步驟和結果沒興趣,而是直接想看我的結論,也可以跳過這一節。
這個實驗是Nvidia提供的入門培訓課程——ImageClassification with DIGITS - Training a model。
我們的實驗很簡單,用6000張圖片去訓練AI識別0-9這幾個數字。
訓練樣本數據是6000張標號0-9的小圖片,其中4500張是用來做訓練(train),1500張是驗證(val)訓練結果。
####實驗數據準備 ####
1.訓練圖片很小也很簡單,如下圖預覽,就是一堆數字:
--下圖是 01樣本圖片 --
2.我做測試的圖片是官方教程提供了個白底紅字的「2」.
--下圖是 02測試圖片 --
####製作數據集 ####
3.首先我們要做一個圖片識別的數據集,數據集文件放在「/data/train_small」目錄下,圖片的類型選擇「Grayscale」,大小選28x28,其他都選默認,然後選擇創建數據集「minidata」。
--下圖是 03初始數據集 --
4.下面是數據集創建的過程,因為我們的文件很小很少,所以速度很快;如果是幾千萬張高清大圖速度就會很慢,甚至要搭建分散式系統把IO分散到多台機器上。
--下圖是 04初始數據集中 --
5.這是創建完成數據集的柱形統計圖,滑鼠恰好停在第二個柱形上,顯示當前標記為「9」的圖片有466個。
--下圖是 05創建完成數據集 --
####開始創建模型 ####
6.有了數據集以後我們就可以創建模型了,我們選擇創建一個圖像分類模型(Image Classification Model),數據集選之前創建的「minidata」,訓練圈數輸30次,其他選項暫時保持默認。
--下圖是 06新建模型 --
7.到了創建模型的下半段是選擇網路構型,我們選擇LeNet即可,將模型命名為TestA。
--下圖是 07選擇LeNet --
8.這次Demo我們沒做細節設置,但生產環境可能要經常修改配置文件。
--下圖是 08微調LeNet --
9.接下來就開始生成模型了,小數據集簡單任務的速度還是很快的,而且驗證正確率很高。但是如果是大任務大模型,可能會算上幾天時間。
--下圖是 09開始生成模型 --
10.模型生成完成,我們再看一下驗證正確率很高了,如果生產環境正確率太低,可能你要微調創建模型的參數。
--下圖是 10訓練完成後的accuracy--
####調試模型 ####
11.在模型頁面往下拖就可以看到下載模型、測試模型等按鈕,我們選擇測試模型,將那個「白底紅字2」提交做個測試。
--下圖是 11測試模型 --
12.默認是測試Epoch #30,我們先跑10次試試。本來想省點伺服器電費,結果只有20.3%的幾率識別正確。
--下圖是 12TestA模型10圈結果 --
13.我們提高測試圈數到25圈,結果準確率從20.3%提高到了21.9%。
--下圖是 13TestA模型25圈結果 --
14.整個模型的上限是30圈,正確識別結果也才21.92%。到了這裡我插一句,未正確識別可能是因為我的建模數據是28*28的黑白圖,而我給測試圖片大小和顏色都不對。
--下圖是 14TestA模型30圈結果 --
####更換模型繼續調試 ####
15.在TestA這個模型上可以點克隆任務,即製作一個同配置的模型再跑一次;這個按鈕有意思啊,我們以前編譯程序不通過的時候,retry十萬次也是不通過啊,為什麼克隆任務是個面板常用按鈕?
--下圖是 15克隆模型TestA --
16.這時好玩的事情發生了,我做出的「TestA-Clone」,識別出數字2的幾率是94.81%。
--下圖是 16克隆TestA結果 --
17.我們再把老模型克隆一次,結果識別出數字2的幾率是63.4%。
--下圖是 17再次克隆TestA結果 --
18.我新建一個模型TestB,讓它在TestA的基礎上再次訓練。
--下圖是 18新建TestB --
19.TestB的訓練結果反而不如最早的那一版模型,正確率20.69%。
--下圖是 19TestB的訓練結果 --
20.沒有最慘只有更慘,看我新訓練的模型TestC。
--下圖是 20TestC訓練失敗 --
21.從這次測試看,最好的模型是TestA-Clone,其次是Clone2。
--下圖是 21模型結果匯總 --
22.但這就算找到合適模型了嗎?我又手寫了個數字2,還特地選的黑底白字28*28,結果這幾個模型沒一個識別準確的,全部識別失敗。
--下圖是 22.新圖識別失敗 --
第四. 實戰才能出模型
本次實驗拿到正確率是94.81%的模型是意外驚喜,那個模型測其他圖片失敗倒是意料之中的。因為這次實驗的初始樣本才幾千張,如果樣本數量夠多,過擬合(即噪音特徵被納入模型)的可能性就越小;我用的全部是默認調試選項,添加其他特徵項調試模型可能會減少欠擬合(主特徵沒提取到)的幾率;我並未明確定義該模型的使用場景,即沒有明確訓練數據、測試文件和生產文件是否相同。
我們看到完全相同配置的模型,只因為點擊生成模型的時間不同,對同一個圖片的識別結果確千差萬別,再次強調這不是因果判斷而是相關性計算。實驗結論和我上文的主張相同,模型需要拿實戰數據進行實際訓練,且我們只能預估但不能預測模型生成結果。我做這個實驗就是給大家解釋,AI模型訓練不是軟體外包,不是談攏了價格就能規劃人日預估效果的。
一個AI技術供應商簡單點就是賣現成的模型,比如說人臉識別模型、OCR識別模型等等。但如果客戶有定製需求,比如說識別臉上有青春痘、識別是不是左撇子簽名,那就需要先明確技術場景,再準備數據大幹一場。至於練模型的時間是1天還是1個月不太確定,AI模型訓練像做材料試驗一樣,可能半年也可能十年才能發現目標。
第五. IT工程師的新工作
前文我提到兩個觀點,第二個觀點就是訓練模型的工作並不難,IT工程師可以較為容易的學會訓練模型的工作,然後我們就能繼續擴展從業範圍,在AI大浪潮中分一杯熱羹了。
首先說技術不是門檻,我們舉個IT工程師能聽懂的例子:一個Oracle DBA既沒讀過資料庫源碼,也還沒摸過新業務場景,甚至缺乏理論知識只能做常見操作;現在這個項目可以慢慢上線,讓他離線調試SQL,拿到性能最佳值的點日誌保存就完工了。做AI模型調試時,懂原理懂演算法會讓工作更有目的性,但更有目的性只能保證接近而不能保證命中目標。
根據上文的實驗,我們可以看到有下列工作是需要人做的:
1.根據客戶的要求,提出對原始數據的需求。這裡要動業務方向的腦子,比如說想查一下什麼人容易肥胖,天然能想到的是每個人的飲食和運動習慣,但專業醫生會告訴你要調取轉氨酶膽固醇一類的數據。
2.原始數據需要清洗整理和標註,沒找到相關性的樣本不是未標註的樣本。前文試驗中6000張圖片可都是標註了0-9的數字的,我們測試模型是為了找到「2」這一組圖片的相關性。清洗、整理和標註數據的工作可能是自動也可能是人工,自動做那就是我們寫腳本或跑大數據,人工做就是提需求然後招1500個大媽給黃圖打框,但工程師會對打框過程全程指導。這裡還有取巧的方法,友商的模型太貴甚至不賣,那就是直接用友商的公有雲API介面,或者買友商大客戶的日誌,讓友商幫你完成數據篩檢。
3.上文試驗中僅僅是圖片分類數據集,已經有很多可調整選項了;生產環境不僅有圖片還有聲音、文字、動作特徵等數據集,數據集的設置是否合理,要不要重建數據集都需要多次調試和長期觀察。
4.實驗中生成模型沒怎麼調參數也只花了一分鐘時間,但生產環境的模型生成參數要經常調整,而生成一個模型的時間可能是幾小時甚至幾天。
5.驗證結果的準確性,如果是柔性需求可以目測幾個測試結果就把模型上線了,但如果是剛性業務可能又要組織十萬份以上樣本進行測試驗證。順路說一句,用來訓練模型的硬體未必是適用於來驗證和跑生產環境的,如果是高壓力測試可能還要換硬體部署。
6.模型也有日常維護,可能隨著數據集的更新模型也要定期更新,也可能發現模型有個致命的誤判會威脅到業務,這都需要及時處理。
第六. 附贈的小觀點。
談到最後再附贈一些個人觀點,隨機想的,只寫論點不寫論證過程了:
1.現在搭建和使用AI環境很難,但軟體會進步和解決這個問題;三年前雲計算平台很難部署和維護,現在遍地都是一鍵部署和UI維護的雲平台方案。
2.深度學習這個技術領域太吃數據和算力了,人腦不會像AI這麼笨,可能以後會有新技術出現取代深度學習在AI領域的地位。
3.因為需要數據和算力,搞個AI公司比其他創業企業更難;現在有名的AI創業企業都是單一領域深耕三年以上,讓用戶提供數據他們只做單一典型模型。同樣巨頭企業搞AI也不容易,即使挖到人AI項目也要花時間冷起動,清洗數據不僅消耗體力同樣消耗時間。
4.深度學習的計算過程不受控制,計算結果需要人來驗證,所以它不能當做法務上的證據。當AI發現嫌疑人時警察會立刻採取行動,但它的創造者都無法描述AI下一步會如何下圍棋。一個嬰兒能尿出來世界地圖,某人隨手亂輸能碰對銀行卡的密碼,AI會告訴你股市99.99%要暴漲,但這些都不能當做獨立擔責的證據。
5.搞AI需要準備大量數據,中國對美國有個特色優勢,可以做數據標註的人很多而且價格便宜,但到模型實踐這一步,中國的人力成本太低又限制了AI走向商用。
6.不要恐慌AI會消滅人類,對人類有威脅的AI肯定是有缺陷的AI,但人類一樣也選出過希特勒這類有缺陷的領袖。也不要鼓吹AI會讓人類失業社會動蕩的,大家還是老老實實談星座運勢吧,我為什麼就不擔心自己失業?
7.有些事AI的確准率看起來很低實其很高,比如兩人對話聽能清楚80%的字就不錯了,AI只聽懂85%了的文字已經越超人類了。你看我打倒顛字序並不影響你讀閱啊。
推薦閱讀:
TAG:AI初創 | 人工智慧 | 深度學習DeepLearning |