三十天博客計劃-《算法能解決什麼問題?》

一.問題>數據>算法

        最近幾年人工智能行業如火如荼,最近今年也能看到越來越多的落地應用:人臉識別、AI拍照、自動駕駛、智能音箱等等等等。所有的這些應用常常都是一個複雜的工程,其中可能會包含數個甚至數十上百個算法模型,我們可以抽絲剝繭,從最基本的算法功能單元總結出一些算法解決問題的範式,這對我們尋找新的算法應用場景有很大的價值。

 

        一般做算法的人會專心進行算法本身的創新和研發,你能看到的絕大多數paper都着墨在這個方面,但根據我這幾年,在業務的真實場景上使用算法的經驗看來,算法本身並不是最重要的,最重要的是對問題的定義,如果不能準確有效地定義問題,那麼後面的工作也無從談起

 

        舉個可能不恰當的例子,今日頭條成功的原因是因爲他們的推薦算法嗎?我認爲不是,今日頭條成功的首要條件是對於產品的定義,也就是他們最早的slogon:「你關心的,纔是頭條」,所以推薦算法要解決的問題是找到用戶關心的東西,算法需要依賴數據把這個問題解決得更好,所以在我看來實際應用中問題>數據>算法。在問題清晰、數據完備的情況下,即使是用簡單的統計,也能把推薦的體驗做到及格線,複雜深刻的算法很大程度上是在錦上添花,這並不是說新的算法技術不重要,而是提醒我們,在實際應用裏,不要忽視前面兩個模塊。

 

        本文我們着眼於「問題」的分析,其他兩個模塊以後再展開總結。

二.問題的分類

        業務的問題無窮無盡,從什麼角度對這些問題進行抽象和總結呢?太高層次的問題比如「自動駕駛」無法讓我們看清細節;太明確的問題比如「文本情感檢測」又失去了普遍性和範式。

image.png

 

        這裏我們借用scikit-learn(python最常用的基礎機器學習庫)這張圖的分類,來對機器學習算法能解決什麼問題進行一些梳理和總結,甭管五花八門的應用,NLP/CV/ASR,都逃不出這張圖的五指山。

image.png

2.1 分類 Classification

        什麼是分類?最簡單的解釋是:算法最終的輸出是一個離散的標籤。

 

        比如每個學機器學習的人都會做的MNIST手寫數字識別任務,它要解決的問題就是將一張圖片,分到0-9這十個類別裏,這就是最明顯的分類,在實際中這樣直白的分類任務應該是超過50%的,比如風控系統要判別一個用戶是否有風險,這是一個二分類;智能音響要判斷用戶說話的意圖,這是一個多分類;無人車要判斷前面這個物體是什麼東西,人、橫行道還是路牌,這是一個多分類問題。

image.png

 

        除了最直白的分類任務,一些時候因爲數據格式,會有一些變形,但其本質上都是在做分類這件事。

        比如在NLP領域,給我們一個文本,因爲文本是一個離散的輸入,如果我們的問題需要在每個詞上都輸出一個標籤,那麼這就是NLP裏面經典的序列標註(Sequence Tagging)問題,實際的目標可能是標註每個詞的詞性(pos tag)、識別句子裏的實體(Name Entity Recognition),比如要識別公司名,可以設計B-Company(公司名開始標識),I-Company,E-Company 這樣可以打在每個詞上的標籤來實現。

image.png

        NLP領域另一種常見的問題模式叫做Sequence to Sequence,比如將文本從英文翻譯到中文,在生成翻譯目標文本的時候,是輸出單詞這樣一個離散有限的標籤,所以它也是分類任務。但這個任務比較特殊的是會藉助循環神經網絡,連續生成一串文本。

image.png

 

        圖像領域也有類似的變形任務,比如我們想要用算法自動生成一個mask,把圖片裏的特定物品摳出來,我們設計的任務就可以是對每一個像素做二分類,0就是需要刪掉的,1就是需要保留的:

image.png

 

        無論形式如何變化,這些問題的本質上都是在做分類,分類可以說佔了機器學習問題的半壁江山,我們拿到具體問題的時候,如果判斷是一個分類問題,那麼就可以從已有的這些模式裏面,尋找和我們任務最契合的模式加以應用,第三章我們再詳細討論這個問題。

 

2.2 迴歸 Regression

 

        迴歸算法輸出的目標是一個數值,拿最簡單的線性迴歸來說,我們是期望算法能擬合出一個函數,對未知的目標值做很好地預測。

 

        一個最經典的推薦算法任務,在MovieLens數據集上預測用戶對於一個電影的評分,就是一個很直接的迴歸問題,學習目標是一個1-5的評分。股票交易裏也會有人用算法來預測未來一段時間的股票價格,這也是迴歸問題。

image.png

        預測離散的值,這是分類;預測連續的值,這是迴歸。在面對真實場景時,如果對問題建模決定了你猜用什麼目標,因爲對於絕大多數算法來說,這兩者的區別只是在最後輸出的形式有所不同。比如決策樹天然是可以區分到離散的值,但使用分到某個葉節點的訓練數據目標均值作爲得分輸出,就可以處理迴歸的問題了。神經網絡更不用說,最後如果用softmax做分類就是分類算法,如果直接輸出一個數值那就是迴歸

 

        迴歸和分類本質上是要看你對於問題的定義,比如同樣是MovieLens的任務,我完全可以使用分類算法,直接輸出一個五分類的得分,甚至我可以把得分切成50類,從0.1到5.0,得到更細化的結果。但分類問題失去的是目標空間的連續性,比如在這個評分任務上,你可能會得到一個1星概率爲0.5,5星概率爲0.5這樣不太合理的結果,而回歸的目標空間因爲是連續的就不會有這個問題。

 

 

2.3 聚類 Clustring

        對於算法的分類,還有另外的一個維度,就是從「有監督」和「無監督」來看,上面提到的的分類和迴歸,基本上都是有監督的算法,也就是我們在準備數據的時候會準備好一個ground truth,模型會試着學習一個函數來輸出接近ground truth的結果。

 

        最近幾年隨着算法的創新算力的增加和大量標註數據的出現,有監督算法得到了長足的進步,但是無監督信號的算法變化不是很大,聚類就是其中一種典型的無監督算法。

image.png

 

        我們拿到一批沒有任何目標標籤的數據,聚類的目標就是要從中區分出哪些數據是比較類似的,在實際應用中,比如我們可以把相似的用戶聚類出來,進行針對性地推薦或者引導。實際應用裏比如我們可以在地圖上通過聚類算法,聚類出很多的用戶羣落,產生一些有意義的輸出。聚類一般在數據挖掘領域會比較常用一點。

三.問題的抽象和判斷

        實際應用中,問題千千萬,我們如何以使用算法解決問題爲目標來把問題抽象成算法可以應用的問題呢?這邊簡單總結了一點心得,供大家參考。

3.1 理解應用目標和數據

        理解應用的目標,判斷這個目標可能是什麼任務,分類還是迴歸?這樣我們可以在一些經典的問題裏,找到可以套用的模式,來達成我們的目標。下面我們可以舉個例子來說明這個理解和套用的過程。

 

        如果我們要判斷一個用戶的風險係數,看起來好像是個迴歸問題,但實際場景裏我們很難拿到這樣一個連續值作爲輸出目標,一般都是一個0/1的標籤(數據),所以這實際上是一個分類問題,風險係數最終可以使用預測的概率。

 

        作爲分類問題,而且是一個典型的二分類問題,事實上已經有很多的方法,我們可以考慮使用決策樹、GBDT或者神經網絡來解決,各種教程都會有這樣的示例,我們就可以套用類似的模式

 

        如果每個用戶的特徵並不是簡單的向量,而是他轉賬、查詢等等行爲的記錄(數據),這個時候常見的二分類模式似乎不夠用了。但稍作思考我們就會發現,這樣一個序列的行爲,而且每個行爲都是離散的標籤。這和NLP數據的定義非常類似,那麼我們完全可以套用NLP的算法模式來完成我們的任務,一個可以直接對應的任務就是「文本情緒檢測」,我們可以統計出現行爲(單詞)的次數作爲特徵,也可以套用循環神經網絡等算法這些方法模式都是現成的

 

        所以對於目標和數據本身的理解,抽象和定義出具體的問題,並依次找到合適的算法,達成最終應用或者業務的目標。

3.2 什麼問題使用算法有價值

算法可以做很多事情,但做這些事情也需要投入很多成本,包括且不限於人力成本、計算成本和機會成本。那麼哪些問題值得使        用基礎算法,或者投入更大精力改良算法呢?我認爲主要是有兩點。

 

規模效應:規模效應有兩種解釋:

  • 一種是單一業務的規模非常大,如果用算法或者更好的算法可以提升業務的效果,就可以創造出很大的價值,那麼這樣的問題值得我們去用心解決,比如電商平臺的推薦系統、搜索引擎廣告投放的點擊預測系統
  • 另一種是問題是普遍存在於很多場景的,如果能夠很好地解決這一類問題,可以較低成本地推廣到很多的應用場景。比如對於一些指標或者系統的自動異常檢測、比如淘寶的魯班系統可以批量設計出海報,應用在很多場景。

 

價值導向:算法是要創造價值的,我認爲算法的價值和自動化工程的價值是一樣的,主要是這樣幾點

  • 算法可以比人做得更好,比如推薦系統,過往的歷史已經證明算法比任何手工的推薦更有效。人臉檢測等場景也超過了人的能力。
  • 雖然沒有人好,但勝在自動化和低成本,比如在視頻網站上,藉助圖像算法我們可以快速判斷一個新上傳的視頻是否有違規風險,這樣作爲一層粗篩可以把有風險的再交由人工進行判斷,這樣大大節省審覈的人力成本。

 

 

 

四.總結

    以上我們主要總結了算法能解決問題的一些概念,以及粗淺的抽象和判斷問題的方法,雖然分類、迴歸、聚類這樣的劃分還是太粗粒度了,但是是對實際問題進行分析的導火索。程序員們總愛討論編程是否是一個吃青春飯的職業,隨着工作年限的增加能夠累積什麼經驗,我認爲對於算法工程師來說,培養對問題的理解和判斷力是其中很重要的一點,同時知道哪些技術和範式可以很好地解決這些問題,需要算法創新的時候可以參考什麼領域的前沿技術,可能是最重要的一部分經驗。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章