再舉個例子。當初阿爾法狗與李世石一戰成名。如果說前三盤的結果令各路專家大跌眼鏡的話。那第四盤可能是讓所有人都大跌眼鏡了。阿爾法狗連出昏招,幾乎是將這一局拱手相讓。那阿爾法狗出bug了?DeepMind團隊說,這是一個系統問題。那我們來看看這個系統到底有什么問題。根據當時公布出來的數據我們發現阿爾法狗的養成方法是這樣的。
阿爾法狗如何養成
1.整理過去人類對弈的80多萬盤棋局
2.拿1的棋譜,訓練一只狗狗,能夠預測人類下一步會下在哪里
3.拿2得到的狗狗,每天自己和自己下100萬盤棋
4.拿1和3的棋譜,再訓練一只狗狗,這就是阿爾法狗。
阿爾法狗是基于1億+盤機器棋局和80萬人類棋局訓練出來的狗狗。問題出在哪?我們看到,訓練阿爾法狗所用的棋譜,只有80萬是人類棋局,總數上億的棋局是機器對弈的。它下的每一步,都是將局面導向歷史上(也就是80萬人類棋局和1億自己對弈的棋局)勝率最大的局面。
問題就恰恰出在這里,80萬和1億。相差甚多。那么阿爾法狗選擇的所謂勝率最大,一定是贏自己的概率最大,而不是贏人類的概率最大。這樣的標準在順豐棋尚且不容易出問題,一旦遇到逆風局,它的選擇就變成了,選擇對手犯錯概率最大的棋,而這個對手恰恰就是它自己。
這就是為什么當初阿爾法狗在逆風局中下出一些匪夷所思的棋。當然這些都只是行業內的人的猜測。但從這個例子就可以看到數據的重要性。數據出現偏差會直接導致不可估計的后果。
所以我們總結出的第一個突破口就是數據測試。保證我們用來建模的數據是正確的。在這里的數據測試會跟我們以往的測試有些不一樣。
首先是數據規模的增長。數據大了里面的有些數據可能會發生一些很詭異的事情。然后是存儲介質和技術棧的變化,我們用來訓練模型的數據都會存放在hadoop集群上,所以一般都會用spark或者Hbase來編寫測試腳本。最后是驗證方式的變化,之前我們測試的時候都是精確的測試每條數據的正確性。 但是現在我們需要根據業務設定每一個字段的規則。然后掃描每一行數據,如果這條數據超出了這個字段的規定范圍,會發出報警。 假如用戶年齡這個字段,正常值可能是0~100歲。如果突然出現個300歲,那么這條數據肯定是有問題的。我們之前曾經碰見過這樣的數據。本來這條數據應該是30歲的,但卻多了個0。
針對這方面的測試,一般都是使用spark或者Hbase這種大數據處理框架把任務提交到集群上去掃描每一張表。
分層測試
雖然我們能測試用來做訓練的數據是正確的。但是一個人工智能系統是很復雜的, 我們只是保證了作為源頭的數據貌似是不夠的。以前我們測試的時候都知道把系統拆解開做分層測試,所以我們的第二個突破口就是基于這個思路。我們先來了解一下,一個模型的誕生都經理了哪些步驟。
模型誕生的步驟:
·數據引入
·數據處理(清洗,拆分,拼接等)
·特征工程
·模型訓練
·模型上線
數據引入:將歷史數據引入到系統中,并做第一步的預處理。例如處理一些明顯的異常的行為。
數據處理: 其中又包含很多種操作。 例如對數據進行清洗,拆分。 把兩張表進行拼接等。
特征工程:我們從數據中按一定規律提取一些特征出來。之后需要將提取的樣本表傳遞給機器學習算法進行訓練。
可以看到我們把數據引入到系統后,先是用SQL算子對數據做了拼接,然后清洗一些無效數據。 再把數據拆分為訓練集和測試集。分別對兩個數據集做特征抽取。之后訓練集傳遞給邏輯回歸這個機器學習算法進行訓練。訓練之后使用測試集來測試一下模型的效果。大家看到這個圖了,這是創建一個模型比較常見的流程。
圖中的邏輯歸回就是一種機器學習算法,也是一種最簡單的二分類算法,其他的算法諸如 GBDT,SVM,DNN等算法的模型都是這個流程。我們可以看到算法上面的流程。全部與機器學習無關。他們都屬于大數據處理范疇。而且一個成型的系統在每一個模塊都會提供一些固定的接口。