一.問題>數據>算法
最近幾年人工智能行業如火如荼,最近今年也能看到越來越多的落地應用:人臉識別、AI拍照、自動駕駛、智能音箱等等等等。所有的這些應用常常都是一個復雜的工程,其中可能會包含數個甚至數十上百個算法模型,我們可以抽絲剝繭,從最基本的算法功能單元總結出一些算法解決問題的范式,這對我們尋找新的算法應用場景有很大的價值。
一般做算法的人會專心進行算法本身的創新和研發,你能看到的絕大多數paper都著墨在這個方面,但根據我這幾年,在業務的真實場景上使用算法的經驗看來,算法本身并不是最重要的,最重要的是對問題的定義,如果不能準確有效地定義問題,那么后面的工作也無從談起。
舉個可能不恰當的例子,今日頭條成功的原因是因為他們的推薦算法嗎?我認為不是,今日頭條成功的首要條件是對于產品的定義,也就是他們最早的:「你關心的,才是頭條」,所以推薦算法要解決的問題是找到用戶關心的東西,算法需要依賴數據把這個問題解決得更好,所以在我看來實際應用中,問題>數據>算法。在問題清晰、數據完備的情況下,即使是用簡單的統計,也能把推薦的體驗做到及格線,復雜深刻的算法很大程度上是在錦上添花,這并不是說新的算法技術不重要,而是提醒我們,在實際應用里,不要忽視前面兩個模塊。
本文我們著眼于「問題」的分析,其他兩個模塊以后再展開總結。
二.問題的分類
業務的問題無窮無盡,從什么角度對這些問題進行抽象和總結呢?太高層次的問題比如「自動駕駛」無法讓我們看清細節;太明確的問題比如「文本情感檢測」又失去了普遍性和范式。
這里我們借用-learn(最常用的基礎機器學習庫)這張圖的分類,來對機器學習算法能解決什么問題進行一些梳理和總結,甭管五花八門的應用,NLP/CV/ASR,都逃不出這張圖的五指山。
2.1 分類
什么是分類?最簡單的解釋是:算法最終的輸出是一個離散的標簽。
比如每個學機器學習的人都會做的MNIST手寫數字識別任務,它要解決的問題就是將一張圖片,分到0-9這十個類別里,這就是最明顯的分類,在實際中這樣直白的分類任務應該是超過50%的,比如風控系統要判別一個用戶是否有風險,這是一個二分類;智能音響要判斷用戶說話的意圖,這是一個多分類;無人車要判斷前面這個物體是什么東西,人、橫行道還是路牌,這是一個多分類問題。
除了最直白的分類任務,一些時候因為數據格式,會有一些變形,但其本質上都是在做分類這件事。
比如在NLP領域,給我們一個文本,因為文本是一個離散的輸入,如果我們的問題需要在每個詞上都輸出一個標簽,那么這就是NLP里面經典的序列標注( )問題,實際的目標可能是標注每個詞的詞性(pos tag)、識別句子里的實體(Name ),比如要識別公司名,可以設計B-(公司名開始標識),I-,E- 這樣可以打在每個詞上的標簽來實現。
NLP領域另一種常見的問題模式叫做 to ,比如將文本從英文翻譯到中文,在生成翻譯目標文本的時候,是輸出單詞這樣一個離散有限的標簽,所以它也是分類任務。但這個任務比較特殊的是會借助循環神經網絡,連續生成一串文本。
圖像領域也有類似的變形任務用a星算法解決八數碼問題,比如我們想要用算法自動生成一個mask,把圖片里的特定物品摳出來,我們設計的任務就可以是對每一個像素做二分類,0就是需要刪掉的,1就是需要保留的:
無論形式如何變化,這些問題的本質上都是在做分類,分類可以說占了機器學習問題的半壁江山,我們拿到具體問題的時候,如果判斷是一個分類問題,那么就可以從已有的這些模式里面,尋找和我們任務最契合的模式加以應用,第三章我們再詳細討論這個問題。
2.2 回歸
回歸算法輸出的目標是一個數值,拿最簡單的線性回歸來說,我們是期望算法能擬合出一個函數,對未知的目標值做很好地預測。
一個最經典的推薦算法任務,在數據集上預測用戶對于一個電影的評分,就是一個很直接的回歸問題,學習目標是一個1-5的評分。股票交易里也會有人用算法來預測未來一段時間的股票價格,這也是回歸問題。
預測離散的值,這是分類;預測連續的值,這是回歸。在面對真實場景時,如果對問題建模決定了你猜用什么目標,因為對于絕大多數算法來說,這兩者的區別只是在最后輸出的形式有所不同。比如決策樹天然是可以區分到離散的值,但使用分到某個葉節點的訓練數據目標均值作為得分輸出,就可以處理回歸的問題了。神經網絡更不用說,最后如果用做分類就是分類算法,如果直接輸出一個數值那就是回歸。
回歸和分類本質上是要看你對于問題的定義,比如同樣是的任務,我完全可以使用分類算法,直接輸出一個五分類的得分,甚至我可以把得分切成50類,從0.1到5.0,得到更細化的結果。但分類問題失去的是目標空間的連續性,比如在這個評分任務上,你可能會得到一個1星概率為0.5,5星概率為0.5這樣不太合理的結果,而回歸的目標空間因為是連續的就不會有這個問題。
2.3 聚類
對于算法的分類,還有另外的一個維度,就是從「有監督」和「無監督」來看,上面提到的的分類和回歸,基本上都是有監督的算法,也就是我們在準備數據的時候會準備好一個 truth用a星算法解決八數碼問題,模型會試著學習一個函數來輸出接近 truth的結果。
最近幾年隨著算法的創新、算力的增加和大量標注數據的出現,有監督算法得到了長足的進步,但是無監督信號的算法變化不是很大,聚類就是其中一種典型的無監督算法。
我們拿到一批沒有任何目標標簽的數據,聚類的目標就是要從中區分出哪些數據是比較類似的,在實際應用中,比如我們可以把相似的用戶聚類出來,進行針對性地推薦或者引導。實際應用里比如我們可以在地圖上通過聚類算法,聚類出很多的用戶群落,產生一些有意義的輸出。聚類一般在 數據挖掘領域會比較常用一點。
三.問題的抽象和判斷
實際應用中,問題千千萬,我們如何以使用算法解決問題為目標來把問題抽象成算法可以應用的問題呢?這邊簡單總結了一點心得,供大家參考。
3.1 理解應用目標和數據
理解應用的目標,判斷這個目標可能是什么任務,分類還是回歸?這樣我們可以在一些經典的問題里,找到可以套用的模式,來達成我們的目標。下面我們可以舉個例子來說明這個理解和套用的過程。
如果我們要判斷一個用戶的風險系數,看起來好像是個回歸問題,但實際場景里我們很難拿到這樣一個連續值作為輸出目標,一般都是一個0/1的標簽(數據),所以這實際上是一個分類問題,風險系數最終可以使用預測的概率。
作為分類問題,而且是一個典型的二分類問題,事實上已經有很多的方法,我們可以考慮使用決策樹、GBDT或者神經網絡來解決,各種教程都會有這樣的示例,我們就可以套用類似的模式。
如果每個用戶的特征并不是簡單的向量,而是他轉賬、查詢等等行為的記錄(數據),這個時候常見的二分類模式似乎不夠用了。但稍作思考我們就會發現,這樣一個序列的行為,而且每個行為都是離散的標簽。這和NLP數據的定義非常類似,那么我們完全可以套用NLP的算法模式來完成我們的任務,一個可以直接對應的任務就是「文本情緒檢測」,我們可以統計出現行為(單詞)的次數作為特征,也可以套用循環神經網絡等算法,這些方法模式都是現成的。
所以對于目標和數據本身的理解,抽象和定義出具體的問題,并依次找到合適的算法,達成最終應用或者業務的目標。
3.2 什么問題使用算法有價值
算法可以做很多事情,但做這些事情也需要投入很多成本,包括且不限于人力成本、計算成本和機會成本。那么哪些問題值得使用基礎算法,或者投入更大精力改良算法呢?我認為主要是有兩點。
規模效應:規模效應有兩種解釋:
價值導向:算法是要創造價值的,我認為算法的價值和自動化工程的價值是一樣的,主要是這樣幾點:
四.總結
以上我們主要總結了算法能解決問題的一些概念,以及粗淺的抽象和判斷問題的方法,雖然分類、回歸、聚類這樣的劃分還是太粗粒度了,但是是對實際問題進行分析的導火索。程序員們總愛討論編程是否是一個吃青春飯的職業,隨著工作年限的增加能夠累積什么經驗,我認為對于算法工程師來說,培養對問題的理解和判斷力是其中很重要的一點,同時知道哪些技術和范式可以很好地解決這些問題,需要算法創新的時候可以參考什么領域的前沿技術,可能是最重要的一部分經驗。