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