AI首席測試架構師 孫高飛:《機器學習服務的測試實踐》

AI首席測試架構師 孫高飛:《機器學習服務的測試實踐》


9月15日FMI-2018人工智能與大數據高峰論壇圓滿落幕,AI測試架構師孫高飛就機器學習服務的測試實踐進行了深入的分享。

飛馬網將其內容整理如下:

大家好,我叫孫高飛,目前在一家AI公司就職測試開發工程師,主要的職責是測試我們公司自研的機器學習平臺,我們在日常的工作中總結出來一些測試的方法和策略,今天想跟大家分享一下。

我們先來講一下什麼是人工智能,不嚴謹的說,現階段實現人工智能最好的方式就是機器學習+大數據,為什麼說是現階段的?因為根據人類科技不斷的進步,我們實現人工智能的方式是有變化的,比如在上世紀六七十年代的時候,我們普遍認為實現人工智能最好的方式是專家系統。

機器學習我們發現他在某些方面不僅可以達到人類的數據,甚至遠遠超出人類的水平,隨著這幾年大數據的發展,我們的深度學習也隨之而崛起,之所以在大數據的發展之下深度學習崛起,因為我們之前所有的模型訓練,機器學習的應用都受限於數據量的大小而限制了他的效果,像以前有些教科書會說我們在神經網絡中最好不要把神經網絡的層數設置為超過三層以上,就是因為之前我們的數據量和計算能力都足以支撐複雜的神經網絡,之前數據比較小,在實驗室中我們在網上下載的數據可能是幾萬條,在這種數據量的情況下用一個比較深的神經網絡基本上夠用了。隨著大數據的來臨和對機器學習算法的研究,把機器學習的應用帶到前所未有的高度。這也是我們為什麼說現在這個階段,我們實現人工智能最好的方式是這種方式,也許過了幾十年或者一百年以後,人類又發展出了更好的方式實現人工智能。

所以說對於機器學習人工智能和深度學習來說,他的關係差不多是這個樣子的。機器學習是人工智能的一種實現方式,而深度學習是機器學習的分支。

再接下來我們可以講一下什麼是機器學習,用一個之前給銀行做的反欺詐場景的項目為例子講一下。什麼是銀行反欺詐,以前銀行中有一批業務專家,他們的工作是向系統中輸入一些規則,如果系統發現一個人在一個城市中用信用卡刷了一筆交易,但是在一個小時之內又在另外一個城市內刷了一筆交易,這時候根據人的經驗判斷這是有盜刷風險的,因為一個小時內跨一個城市的行為不會出現,專家會制訂規則,向系統中輸入幾千條規則組成專家系統,專家系統是根據人的經驗總結而來實現反欺詐的目的,但是這樣的專家系統有侷限,它的效果沒有那麼好,因為人的計算能力和分析能力都有侷限,在一個系統中沒有任何規格的時候,我們創建一條規格比較容易,但是系統中有大量前提下再創建新的規格很難,我們要保證新規格有效的同時,還要保障不跟之前的規格衝突,這是很難的事情。

我聽說的最大的專家系統是當時百度鳳巢的專家系統,他們有一萬條左右專家規則,有一個將近50人的團隊維護這些規則,當時他們所有人的力量都沒有辦法向系統中添加任何一個規則,人的分析能力達到極限,我們當時面對這個問題之後開始尋找更好的思路能夠生成更多更復雜的規則幫助我們實現更好的效果。這個思路就是機器學習。

為什麼我們叫機器學習?因為它也能夠像人一樣,它給人的感覺是這樣的,它像人一樣從過去的數據中總結出一些規律,制定出一些規定,他也能夠像人一樣向系統中定製很多規則,只不過它的規則更細緻更復雜。

據我從鳳巢出來的同學說,他們在2011年引入機器學習,從一萬條規則擴展到幾十億還是幾百億,他們當年的鳳巢廣告營收的收益比往年提升了四倍,我們是把專家系統看成一個大腦,但它是比較小的大腦,他能處理的東西比較有侷限性,我們把機器學習看成一個比較大的大腦,它能做的事情更多更好更復雜。

機器學習雖然現在已經崛起了,它被認定為比專家系統擁有更良好的性能,但是也有一些侷限,這些侷限我之後會慢慢的說。

說完了什麼是機器學習,我們再說一下什麼是模型,因為我們知道在機器學習中,經過訓練之後會產生一個模型,這個模型是什麼,尤其是之後在測試的時候,大部分時間圍繞模型進行側我們要先弄明白模型是什麼,所以我們繼續不嚴謹的說,模型我們看成一個數據庫,這個數據庫裡存的就是所有的規則和他對應的權重。實際上在我們模型上線之後,很多算法都是這樣的,一條條的數據過來之後,我們會把新的數據輸入到模型中,查找新的數據匹配模型中哪些規則,把這些對應的規則和權重拿出來,然後進行累加,返回一個預測值,這就是機器學習最終提供的能力,提供一個預測的能力,所以我們可以把機器學習訓練出的模型當成一個數據庫。

接著問題就來了,我們如何測試這個模型。模型是用機器學習算法在比較大的情況下訓練出來的,所以我們也需要在比較大量測試數據的情況下輸入給模型,讓模型預測,然後我們去預測這個模型他的一些諸如準確率的指標評估模型效果的好壞,在模型測試領域裡基本上不會體積模型有沒有什麼Bug,我們基本上說這個模型好或者不好,這個模型好或者不好的因素有很多,有時候是數據選取的不對,有的可能是訓練的時候參數調整的不太合適,我們不會以Bug的形式說這個模型有問題,只是這個模型的效果是不是達到我們的預期。

接下來講一下模型的評估指標,先從二分類模型說,因為二分類模型從我們商業領域來說應用的最多的一種,而且它的模型評估指標是最複雜的,我們把它說清楚之後再講多分類和迴歸模型比較容易,一般來說二分類模型有很多,我就講主要的,主要的可能就這幾種,混淆矩陣,ROC、AUC,召回、精準。

剛才基本上講完了常用的模型評估指標,但是講這些指標的重點不在這裡,剛才說的所有東西在網上找論文都可以看到,這些指標計算公式都可以查到,最重要的是如何抽取我們的測試數據,因為測試數據才是真正決定我們這次測試本身的指標,我們在業界經常有一句話,一份數據的重要性,一個數據的質量決定了模型效果的上限,而我們調整算法的參數只是為了這個模型儘量逼近這個上限,真正決定這個上限的是數據,數據出現了誤差,會出現什麼後果。

在我們日常對於模型的測試中,我們對數據也特別看重,首先使用真實的數據,這個可能大家都理解,因為最真實的數據符合最真實的業務場景,但是有時候我們可能沒有辦法使用真實的數據。

我們在很多開源算法庫裡都有這種方式,比如他有預處理模塊,有圖片反轉的東西都可以拿來利用,所以我們第一個原則,儘量使用真實數據,如果真實數據實在不能用,就可以用其他手段人工造一些我們需要的數據。第二,注意特徵呈現時序性,我們數據中的特徵隨著時間出現劇變。比如推演系統怎麼建模的,一般來說推演系統的AUC不會超過0.8,以前做圖象識別都有過AUC特別高的情況,我們給龍泉寺做古經識別AUC達到98%多,我們推演系統預測的是人點擊這個廣告的概率,人點擊一個廣告的概率是很隨性的,有時候今天心情好點一下,心情不好就不點,或者我這個人萬年不點,什麼廣告都不點。在這種場景下,人點擊廣告的行為並沒有過多的邏輯性可以推測,所以他的AUC比較低,不會超過0.8,一般我們自己建模的時候超過0.8可能是數據穿越了。

所以我們的建模工程師為了能解決這個問題做了一個決定,高度定製化,他們抽取特徵的時候有時候對廣告的ID做抽取,比如我們有一千萬個用戶,就有一千萬個特徵,我們有一億個廣告,我們對廣告進行抽取就有一億的特徵出來,我們讓我們模型對每一個用戶做了擬合,讓這個模型記錄每一個用戶的喜好,甚至每一個廣告對應的不同的用戶畫像的人群都有一個刻畫。這樣我們的模型就有高度的定製化能力。但是這樣的模型有一個特點,什麼特點?我們發現這種場景很像是我們在建模中出現的異常,過擬合。我剛才一開始說的在數據量比較小的情況下,我們深度學習的算法會出現過擬合的情況,因為數據量比較小,網絡比較複雜,函數比較大,在於訓練級效果特別好,但是測試級效果非常差,因為我們忽略了真實場景。

我們在推薦系統裡為了達到這個目的做了一個熱點的模型,他就會出現一個特點,他不會很好的擬合時間久遠的數據。我們每天有新的用戶出來,新的用戶沒有擬合到模型中,我們還有新的廣告,甚至在做視頻推薦的時候,我們的特徵抽取方式對視頻的標題做切詞處理,對每一個詞做一個特徵處理,我的模型會得到一個熱點詞的效果,但是隨著時間的推移,今天這個詞是熱點,到了明天就不是熱點了,這個模型在這個情況下引入高頻的自學習,使用最新的數據不斷更新模型,讓模型達到一個熱點的效果。在測試這種模型的時候我們一定要注意測試數據的時間,首先要清楚我們訓練的數據是什麼時間段,我們不能取訓練數據時間段之前的,那相當於用之前數據預測過去的數據,我們一定要取未來的數據,如果只是緊接著訓練數據是今天的,我不能拿今天的數據緊接著做,因為模型迭代是有時間的,自學習有迭代效率,可能要幾個小時時間將模型更新完,我們選取測試數據的時間片段,首先要知道訓練數據的時間,然後再知道自學習迭代時間是多少,然後在這段時間之後測試數據,做在這個場景下的一個測試數據的採集,這才是比較符合我們真實的情況。

以前我跟其他同行聊天的時候,很多他們在做這種模型的效果評估都把這個忽略了,測試的時間不是很正確,所以出現模型評估效果不是特別好的地方,還有特徵隨字段呈現不均勻分佈,這個東西跟我們講的分組AUC結合來做,從訓練角度來講,我們希望我們的訓練數據中包含所有數據類型,所有的用戶類型。有時候發現這麼一種情況,我們在處理數據的時候某一個數據類型數據量不足夠,比如跟之前的項目合作,他們抽取數據方式就是在線上隨機抽取,這樣出現一個問題,他們的數據分佈不是很均勻。比如我們給脈脈做的模型,他們的分佈肯定是用戶職業,如果用隨機抽取或者線上按時間段抽取會發生一個問題,如果我們點子不好會造成嚴重的數據傾斜,數據傾斜會造成某一個職業的數據不太夠,這個結果會造成,假如說訓練的數據這個職業的數據不夠會造成模型擬合這部分的用戶效果不好,如果我們測試數據抽取的時候,這份數據抽取的比較少,也會造成測試的評估效果不夠權威,因為過小的數據量沒有評估的價值。

所以說我們一般都會根據業務的規則確定不同的數據要怎樣按照每一個分段進行隨機抽取。這是我們數據採集的一個注意事項,接下來我們還會講一些基於業務場景的測試,比如自學習,數據流和結合外圍的方法。

我們先說自學習,剛才推薦系統的時候說過我們的模型有熱點能力,為了能夠讓我們用最新的數據更新模型,讓模型保持它的時效性,而不會因為隨著時間的流失變成一個過擬合的場景,所以我們用高頻的自學習來階段性的更新模型。自學習的原理特別簡單,我們用N天數據訓練出模型,到新一天之後把新的數據加進來,把最老的數據拋出,訓練出新的模型更新代替老的模型上線,這是我們自學習的一個原理,到這兒也許有朋友問為什麼把老的數據刪除,如果我們用FGD算法他可以實時訓練建模,那個時候不會把老數據幹掉,在數據來了之後直接訓練一下,直接更新到裡面,所以作為流式計算他不會刪老數據,但是自學習為什麼要刪老數據,原因很簡單,因為我們建模的方式,我們特徵抽取的方式就是過擬合的,就是屬於很有時效性的,老數據已經過了時效性了,如果把它再加到模型訓練中就會有問題,首先他的效果有問題,再一個是數據越來越大,你的訓練迭代速度也越來越慢,這個時候會出現問題,對於自學習來說,迭代的速度是非常重要的,因為我們剛才也說了模型有時效性,隨著時間的推移,模型的效果越來越差,如果我們自學習迭代速度越快,更新模型速度越快,模型在線上效果越好,對於自學習來說,迭代速度很重要,很多時候拼的就是速度。

曾經我們公司裡專門有一個關於自學習迭代速度的討論,專門講如何提升迭代速度,有了自學習之後發現一個問題,自學習是自動化的,他自動採集數據,自動模型更新,我們必須要在自學習更新模型上線的時候有一個良好的質量保證的過程,模型上線是很嚴肅的,一個模型出現問題造成損失非常大。所以我們要有一個比較完善的數據流,從數據採集一直到最後的模型更新上線到監控,都有一個數據閉環的過程,這個過程有數據模型的採集測試,就是這樣的。首先有一個數據測試,先有一個數據採集系統,每天甚至迭代的頻率更高,甚至每隔幾個小時採集一次,採集到系統中,迴流到數據裡,一般將數據進行模型訓練,這個時候發現一點,這些數據並沒有經過測試,數據也有一定概率出現異常,雖然在自學習中我們用的模型訓練的算法參數跟線下一致,如果我們線下進行測試了,這是沒有問題的,但是我們並不能保證數據沒有問題,有時候數據出現異常,所以這個時候第一件要做的事情是這樣的。數據運行,每一天的數據,從數據採集系統採集到分佈式系統上之後,我們要採集分佈式技術掃描這些數據,我們公司常用的是Star(音),我們掃描這些字段,根據業務場景制訂一些規則,掃描有沒有異常的數據,有沒有異常的分佈,我們經常統計這些數據分佈,比如用戶的類型分佈是什麼樣子的產品類型分別是什麼樣子的,商品類型分佈是什麼樣子的。看看分佈有沒有異常,通常也會拿新的數據分佈之後跟老數據對比,看看有沒有用戶行為異常,當然在這個時候這個目的不僅僅是測試了,也有數據分析目的,一旦這些數據出了異常,不管這個異常是預期的行為,還是用戶發生了詭異的事情,或者數據採集系統發生了Bug,我們都要通知到建模科學家,讓他們判斷,這個數據加入自學習系統中是否合適,當然也有一些常見的符合預期的數據分佈,比如我們遇到什麼節日,或者政府發佈了哪些法令,或者社會上出現了什麼熱點新聞,都有可能造成數據的分佈異常。

比如賣商品的網站突然發現某一天玫瑰花產品銷量激增,可能是碰上情人節了。這個時候用戶行為有一個特性,一旦這個節日過去了,你的用戶行為立刻恢復正常,比如快到情人節了,前一週開始玫瑰銷量已經飆升了,但是一旦過了情人節銷量直接斷崖式的下來了。出現了因為某種情況導致數據分佈的異常都要通知到建模科學家他們自己判斷什麼時候把數據加入到系統中什麼時候不需要加入。這是數據預警功能,我們的數據已經經過測試了,數據經過測試之後可以加入自學習模型訓練中,自學習模型訓練跟線下模型訓練一樣,他也會統計模型評估指標,這裡面有一些策略,我們要求AUC達到多少以上,我們才允許自學習生成的模型更新到線上。這方面模型評估指標我不說了。我們看下一個A/BTest,模型是非常嚴肅的不能出問題的,我們如果直接把模型替換上去,會有很大的風險,所以我們傾向於A/BTest的模式,我們同時上線兩個模型,一個老模型一個新模型,把流量分發到這兩個模型上,比較線上真實流量下兩個模型效果對比,如果我們證明了在A/BTest情況下新模型優於老模型,我們是可以把模型更新上去的。這種更新策略也是有不同的方式,根據不同的情況有不同的策略。

在經過A/BTest之後老的模型完成歷史使命可以下架了,新的模型產生新的價值,這裡還有一個監控,我們一定要對線上模型進行監控,起碼監控每日AUC多少,線上是,尤其是線上時時訓練裡更需要監控的機制,因為我們可以看到在迭代速度比較慢的情況下,不管是線上迭代或者自學習迭代,我們可以通過數據測試、A/BTest都可以進行測試,這是線上計算,可能一小時數據來了訓練一次,或者32個小時數據做一次熟練,訓練完後直接到服務上,所以監控很重要,要監控當前AUC多少,這樣才能實時調整線下模型,經過模型上線之後,我們新的數據過來產生新的價值,新的數據繼續迴流到數據採集系統裡,再繼續做數據預警,形成數據閉環,有時候評價一個公司是否有人工智能能力的時候要看有沒有數據閉環的能力,一旦有數據閉環,他就建立起了一個數據上的壁壘。

這個時候我們認為擁有這個能力的公司是擁有人工智能智能能力的重要的評價指標。在數據迴流的時候,我也說了線上有Level(音)的功能,這個根據不同業務場景有不同的情況,有些情況數據迴流完全自動化,比如我們的推薦系統完全自動化,用戶點擊之後我們可以拼回來,也有些沒有辦法拼,比如銀行反欺詐,他沒有辦法自動做這個事情,所以他們每週或者每個月人工的拼Level,把數據回到採集系統裡,這是數據閉環場景下要做的測試,A/BTest和監控。

接下來還有預測值的測試,這是經常發生在模型和系統打交道時候的事情,推薦系統特徵抽取的方式和建模方式,但是推薦系統並不是一個典型的二分類的問題,只不過我們把解決推薦系統的方式轉化成二分類處理。我們在模型做訓練的時候做的是預測用戶點擊的概率是多少,我們的目標值就是他是否為點擊,所以我們把推薦系統的場景慢慢轉換成二分類場景做,但是我們的模型出來之後,到了外圍系統裡可能沒有什麼閾值了,剛才我們說評價模型評估指標的時候,混淆矩陣在閾值情況下做,但是對於推斷系統來說,他並不希望你告訴他這個用戶是不是有點擊,他只希望你告訴他這個用戶點擊的概率是多少。這樣他的玩法就不一樣了,模型不會告訴用戶會點擊,反而告訴他概率是多少。

假如我有一個用戶,有兩千份數據推薦廣告的侯選值,我們分別把這個用戶的數據和廣告的數據輸入到模型中,讓他預測,把預測值做一個排序,取Top10,把這Top10的廣告輸出給用戶,大部分情況下沒有閾值,這個時候問題來了,沒有閾值,他的要求,完全是給我用戶點擊的概率,如果用戶點擊的概率一直在下降,比如說我們的模型出現了什麼問題,我們計算出來的概率一直在下降,他只把Top10推薦給用戶,用戶點擊概率越來越下降了,這個模型或者數據出現了什麼問題,但是推薦系統無法感知,他判斷不出來,所以這個時候我們都會做一個預測,我們的新的數據進行測試的時候要統計預測值的分佈,看一下跟以前的分佈是否一致,或者誤差比較小,如果出現了預測值斷崖式的下降,我們一定會找出為什麼出現這種行為。

接下來是一開始說的對於專家系統,我們並沒有淘汰的,在很多做反欺詐系統的時候都是專家系統和決策引擎一起使用,為什麼機器學習之後還使用專家系統,因為銀行歷史上曾經出現數次黑天鵝事件,這些事件有一些特點,它的發生概率很小,一旦發生了對銀行造成非常大的損失,這些黑天鵝事件不允許再出現,一定要防止,這個場景給機器學習來說有一個問題,機器學習是從歷史中尋找規律的算法,你給他的數據越多,它的效果越好,那問題來了,黑天鵝事件的數量非常小,小到了完全可以淹沒在龐大的訓練數據中。這個時候機器學習訓練出來的模型對於黑天鵝事件模型不好。就像分組AUC一樣,黑天鵝事件分組下數據量太小,機器學習無法達到很好的性能,這個時候採用專家系統人為制訂規則防止黑天鵝事件發生,跟機器學習一起配合的制訂我們反欺詐系統的性能。

所以說在這個時候我們要測的不僅僅是機器學習,而是把機器學習和專家系統聯合起來做,一般產品中做這麼一個系統會有決策引擎,這個決策引擎是決定什麼情況下使用機器學習模型,什麼情況下使用專家系統,我們要測試的是決策引擎和模型還有專家系統三個合起來一塊進行測試,當然測試的方式跟以前一樣,還是統計那些指標,因為他們解決的業務場景一樣。

接下來過一下性能測試的東西。算法和性能測試跟互聯網高併發測試有什麼不一樣的地方,首先算法性能沒有高併發,他就是調用分佈式系統,讓分佈式處理,所以對算法來說,數據是最重要的。有時候說大數據時代到來了,深度學習到了高峰期的時候要做高維特徵,有高維能力,客戶說這個算法都是高維的,我們高低能處理多少高維,十億特徵情況下我們的算法性能是什麼樣子的。假如說是十億特徵的數據,這種高維場景,我們要給客戶提供一份比較詳細的性能報告,這個性能報告詳實的展示著在不同數據類型不同數據規模和不同數據分佈下我們算法性能是什麼樣子的。

這個測試數據的採集跟我們剛才說的儘量使用真實數據是完全不一樣的,在做性能測試的時候一定不能用真實數據的,因為真實數據無法控制數據分佈,比如我要求測試數據在一億行一百列的情況下,這個數據不可能有這麼規整的數據分佈給我們使用。我們公司內部孵化出了一個造數的項目,這個項目是專門用來給各種各樣的場景造要求嚴格的數據分佈下的數據。它的原理特別簡單,我們跟PIsbark(音)合作,它在數據系統上生成數據有兩種方式,一種從已有中讀取,一種從列表中創建,還有一個特性,它可以用生成器的方式,不佔用內存的方式生成這些數據,所以我們制訂了這麼一個項目,製作了一個工具,這個項目專門提供一些可視化的配置,這些配置可以讓用戶選,我的列數是一百列,前十列是中文隨機數據,要求他抽出多少的特徵,要求他的字段長度是多少,這樣通過這種方式就能夠創造出符合企業級的性能測試標準的數據出來,在固定的資源下驗證這些算法處理不同數據時候的性能是什麼,因為在分佈式的情況下對大數據小數據處理方式不一樣。在高維情況下放在分佈式情況下比較快,假如有些場景就是低維的處理,你還用高維的分佈式的處理方式處理肯定非常慢,肯定不如存在數據庫裡快,我們都要在不同的維度下,不同的數據下給用戶提供性能測試報告,來證明我們擁有比較良好的算法的性能,這是我們性能測試需要注意的點。我今天的分享就到這兒了,謝謝大家。

想要獲取大會PPT的朋友可以關注公眾號【FMI飛馬網】—底部導航欄回覆關鍵詞"ppt"進行查閱哦!


分享到:


相關文章: