李沐:從頭開始介紹機器學習,眼花繚亂的機器學習應用

李沐:從頭開始介紹機器學習,眼花繚亂的機器學習應用

1新智元推薦

李沐:從頭開始介紹機器學習,眼花繚亂的機器學習應用

本書作者跟廣大程序員一樣,在開始寫作前需要去來一杯咖啡。我們跳進車準備出發,Alex掏出他的安卓喊一聲“OK Google”喚醒語言助手,Mu操著他的中式英語命令到“去藍瓶咖啡店”。手機這時馬上顯示出識別的命令,並且知道我們需要導航。接著它調出地圖應用並給出數條路線方案,每條方案邊上會有預估的到達時間並自動選擇最快的線路。

好吧,這是一個虛構的例子,因為我們一般在辦公室喝自己的手磨咖啡。但這個例子展示了在短短几秒鐘裡,我們跟數個機器學習模型進行了交互。

如果你從來沒有使用過機器學習,你會想,這個不就是編程嗎?或者,到底機器學習是什麼?首先,我們確實是使用編程語言來實現機器學習模型,我們跟計算機其他領域一樣,使用同樣的編程語言和硬件。但不是每個程序都用了機器學習。對於第二個問題,精確定義機器學習就像定義什麼是數學一樣難,但我們試圖在這章提供一些直觀的解釋。

一個例子

我們日常交互的大部分計算機程序可以使用最基本的命令來實現。當你把一個商品加進購物車時,你觸發了電商的電子商務程序來把一個商品ID和你的用戶ID插入到一個叫做購物車的數據庫表格中。你可以在沒有見到任何真正客戶前來用最基本的程序指令來實現這個功能。如果你發現你可以這麼做,那麼你就不應該使用機器學習。

對於機器學習科學家來說,幸運的是大部分應用沒有那麼容易。回到前面那個例子,想象下如何寫一個程序來回應喚醒詞例如“Okay, Google”,“Siri”,和“Alexa”。如果你在一個只有你和代碼編輯器的房間裡寫這個程序,你該怎麼辦?你可能會想像下面的程序

if input_command == 'Okey, Google': run_voice_assistant

但實際上你能拿到的只是麥克風裡採集到的原始語音信號,可能是每秒44,000個樣本點。那麼需要些什麼樣的規則才能把這些樣本點轉成一個字符串呢?或者簡單點,判斷這些信號裡是不是就是說了喚醒詞。

李沐:從頭開始介紹機器學習,眼花繚亂的機器學習應用

如果你被這個問題困住了,不用擔心。這就是我們為什麼要機器學習。

雖然我們不知道怎麼告訴機器去把語音信號轉成對應的字符串,但我們自己可以。我們可以收集一個巨大的數據集裡包含了大量語音信號,以及每個語音型號是不是對應我們要的喚醒詞。在機器學習裡,我們不直接設計一個系統去辨別喚醒詞,而是寫一個靈活的程序,它的行為可以根據在讀取數據集的時候改變。所以我們不是去直接寫一個喚醒詞辨別器,而是一個程序,當提供一個巨大的有標註的數據集的時候它能辨別喚醒詞。你可以認為這種方式是利用數據編程。換言之,我們需要用數據訓練機器學習模型,其過程通常如下:

  1. 初始化一個幾乎什麼也不能做的模型;

  2. 抓一些有標註的數據集(例如音頻段落及其是否為喚醒詞的標註);

  3. 修改模型使得它在抓取的數據集上能夠更準確執行任務(例如使得它在判斷這些抓取的音頻段落是否為喚醒詞上判斷更準確);

  4. 重複以上步驟2和3,直到模型看起來不錯。

李沐:從頭開始介紹機器學習,眼花繚亂的機器學習應用

眼花繚亂的機器學習應用

機器學習背後的核心思想是,設計程序使得它可以在執行的時候提升它在某任務上的能力,而不是有著固定行為的程序。機器學習包括多種問題的定義,提供很多不同的算法,能解決不同領域的各種問題。我們之前講到的是一個講監督學習應用到語言識別的例子。

正因為機器學習提供多種工具可以利用數據來解決簡單規則不能或者難以解決的問題,它被廣泛應用在了搜索引擎、無人駕駛、機器翻譯、醫療診斷、垃圾郵件過濾、玩遊戲、人臉識別、數據匹配、信用評級和給圖片加濾鏡等任務中。

雖然這些問題各式各樣,但他們有著共同的模式從而可以被機器學習模型解決。最常見的描述這些問題的方法是通過數學,但不像其他機器學習和神經網絡的書那樣,我們會主要關注真實數據和代碼。下面我們來看點數據和代碼。

用代碼編程和用數據編程

這個例子靈感來自 Joel Grus 的一次 應聘面試. 面試官讓他寫個程序來玩Fizz Buzz. 這是一個小孩子游戲。玩家從1數到100,如果數字被3整除,那麼喊’fizz’,如果被5整除就喊’buzz’,如果兩個都滿足就喊’fizzbuzz’,不然就直接說數字。這個遊戲玩起來就像是:

1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz 16 …

傳統的實現是這樣的:

In [1]:
res = for i in range(1, 101): if i % 15 == 0: res.append('fizzbuzz') elif i % 3 == 0: res.append('fizz') elif i % 5 == 0: res.append('buzz') else: res.append(str(i))print(' '.join(res))
1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz 16 17 fizz 19 buzz fizz 22 23 fizz buzz 26 fizz 28 29 fizzbuzz 31 32 fizz 34 buzz fizz 37 38 fizz buzz 41 fizz 43 44 fizzbuzz 46 47 fizz 49 buzz fizz 52 53 fizz buzz 56 fizz 58 59 fizzbuzz 61 62 fizz 64 buzz fizz 67 68 fizz buzz 71 fizz 73 74 fizzbuzz 76 77 fizz 79 buzz fizz 82 83 fizz buzz 86 fizz 88 89 fizzbuzz 91 92 fizz 94 buzz fizz 97 98 fizz buzz

對於經驗豐富的程序員來說這個太不夠一顆賽艇了。所以Joel嘗試用機器學習來實現這個。為了讓程序能學,他需要準備下面這個數據集:

  • 數據 X [1, 2, 3, 4, ...] 和標註Y ['fizz', 'buzz', 'fizzbuzz', identity]

  • 訓練數據,也就是系統輸入輸出的實例。例如[(2, 2), (6, fizz), (15, fizzbuzz), (23, 23), (40, buzz)]

  • 從輸入數據中抽取的特徵,例如 x -> [(x % 3), (x % 5), (x % 15)].

有了這些,Jeol利用TensorFlow寫了一個分類器。對於不按常理出牌的Jeol,面試官一臉黑線。而且這個分類器不是總是對的。

顯然,用原子彈殺雞了。為什麼不直接寫幾行簡單而且保證結果正確的Python代碼呢?當然,這裡有很多一個簡單Python腳本不能分類的例子,即使簡單的3歲小孩解決起來毫無壓力。

李沐:從頭開始介紹機器學習,眼花繚亂的機器學習應用李沐:從頭開始介紹機器學習,眼花繚亂的機器學習應用李沐:從頭開始介紹機器學習,眼花繚亂的機器學習應用李沐:從頭開始介紹機器學習,眼花繚亂的機器學習應用

幸運的是,這個正是機器學習的用武之地。我們通過提供大量的含有貓和狗的圖片來編程一個貓狗檢測器,一般來說它就是一個函數,它會輸出一個大的正數如果圖片裡面是貓,一個大的負數如果是狗,如果不確信就輸出一個0附近的。當然,這是機器學習能做的最簡單例子。

機器學習最簡要素

成功的機器學習有四個要素:數據、轉換數據的模型、衡量模型好壞的損失函數和一個調整模型權重來最小化損失函數的算法。

  • 數據。越多越好。事實上,數據是深度學習復興的核心,因為複雜的非線性模型比其他機器學習需要更多的數據。數據的例子包括

  • 圖片:例如你的手機圖片,裡面可能包含貓、狗、恐龍、高中同學聚會或者昨天的晚飯

  • 文本:郵件、新聞和微信聊天記錄

  • 聲音:有聲書籍和電話記錄

  • 結構數據:Jupyter notebook(裡面有文本,圖片和代碼)、網頁、租車單和電費表

  • 模型。通常數據和我們最終想要的相差很遠,例如我們想知道照片中的人是不是在高興,所以我們需要把一千萬像素變成一個高興度的概率值。通常我們需要在數據上應用數個非線性函數(例如神經網絡)

  • 損失函數。我們需要對比模型的輸出和真實值之間的誤差。損失函數幫助我們決定2017年底亞馬遜股票會不會價值1500美元。取決於我們想短線還是長線,這個函數可以很不一樣。

  • 訓練。通常一個模型裡面有很多參數。我們通過最小化損失函數來學這些參數。不幸的是,即使我們做得很好也不能保證在新的沒見過的數據上我們可以仍然做很好。

  • 訓練誤差。這是模型在評估用來訓練模型的數據集上的誤差。這個類似於考試前我們在模擬試卷上拿到的分數。有一定的指向性,但不一定保證真實考試分數。

  • 測試誤差。這是模型在沒見過的新數據上的誤差,可能會跟訓練誤差不很一樣(統計上叫過擬合)。這個類似於考前模考次次拿高分,但實際考起來卻失誤了。(筆者之一曾經做GRE真題時次次拿高分,高興之下背了一遍紅寶書就真上陣考試了,結果最終拿了一個剛剛夠用的低分。後來意識到這是因為紅寶書裡包含了大量的真題。)


下面我們詳細討論一些不同的機器學習應用。

監督學習

監督學習描述的任務是,當給定輸入x,如何通過在有標註輸入和輸出的數據上訓練模型而能夠預測輸出y。從統計角度來說,監督學習主要關注如何估計條件概率P(y|x)。在實際情景中,監督學習最為常用。例如,給定一位患者的CT圖像,預測該患者是否得癌症;給定英文句子,預測出它的正確中文翻譯;給定本月公司財報數據,預測下個月該公司股票價格。

迴歸分析

迴歸分析也許是監督學習裡最簡單的一類任務。在該項任務裡,輸入是任意離散或連續的、單一或多個的變量,而輸出是連續的數值。例如我們可以把本月公司財報數據抽取出若干特徵,如營收總額、支出總額以及是否有負面報道,利用迴歸分析預測下個月該公司股票價格。

如果我們把模型預測的輸出值和真實的輸出值之間的差別定義為殘差,常見的迴歸分析的損失函數包括訓練數據的殘差的平方和或者絕對值的和。機器學習的任務是找到一組模型參數使得損失函數最小化。我們會在之後的章節裡詳細介紹迴歸分析。

分類

值得一提的是,迴歸分析所關注的預測往往可以解答輸出為連續數值的問題。當預測的輸出是離散的類別時,這個監督學習任務就叫做分類。分類在我們日常生活中很常見。例如我們可以把本月公司財報數據抽取出若干特徵,如營收總額、支出總額以及是否有負面報道,利用分類預測下個月該公司的CEO是否會離職。在計算機視覺領域,把一張圖片識別成眾多物品類別中的某一類,例如貓、狗等。

李沐:從頭開始介紹機器學習,眼花繚亂的機器學習應用

動物的分類

給定一個實例被抽取出的若干特徵作為輸入,我們的分類模型可以輸出實例為各個類別的概率,並將概率最大的類別作為分類的結果。

標註

事實上,有一些看似分類的問題在實際中卻難以歸於分類。例如,把下面這張圖無論分類成貓還是狗看上去都有些問題。

李沐:從頭開始介紹機器學習,眼花繚亂的機器學習應用

正如你所見,上圖裡既有貓又有狗。其實還沒完呢,裡面還有草啊、輪胎啊、石頭啊等等。與其將上圖僅僅分類為其中一類,倒不如把這張圖裡面我們所關心的類別都標註出來。比如,給定一張圖片,我們希望知道里面是否有貓、是否有狗、是否有草等。給定一個輸入,輸出不定量的類別,這個就叫做標註任務。

這類任務有時候也叫做多標籤分類。想象一下,人們可能會把多個標籤同時標註在自己的某篇技術類博客文章上,例如“機器學習”、“科技”、“編程語言”、“雲計算”、“安全與隱私”和“AWS”。這裡面的標籤其實有時候相互關聯,比如“雲計算”和“安全與隱私”。當一篇文章可能被標註的數量很大時,人力標註就顯得很吃力。這就需要使用機器學習了。

搜索與排序

搜索與排序關注的問題更多的是如何把一堆對象排序。例如在信息檢索領域,我們常常關注如何把一堆文檔按照與檢索條目的相關性排序。在互聯網時代,由於搜索引擎的流行,我們更加關注如何對網頁進行排序。互聯網時代早期有一個著名的網頁排序算法叫做PageRank。該算法的排序結果並不取決於特定的用戶檢索條目。這些排序結果可以更好地為所包含檢索條目的網頁進行排序。

推薦系統

推薦系統與搜索排序關係緊密,並廣泛應用於購物網站、搜索引擎、新聞門戶網站等等。推薦系統的主要目標是把用戶可能感興趣的東西推薦給用戶。推薦算法用到的信息多種多樣,例如用戶的自我描述、對過往推薦的反應、社交網絡、喜好等等。下圖展示了亞馬遜網站對筆者之一有關深度學習類書籍的推薦結果。

李沐:從頭開始介紹機器學習,眼花繚亂的機器學習應用

搜索引擎的搜索條目自動補全系統也是個好例子。它可根據用戶輸入的前幾個字符把用戶可能搜索的條目實時推薦自動補全。在筆者之一的某項工作裡,如果系統發現用戶剛剛開啟了體育類的手機應用,當用戶在搜索框拼出”real”時,搜索條目自動補全系統會把”real madrid”(皇家馬德里,足球球隊)推薦在比通常更頻繁被檢索的”real estate”(房地產)更靠前的位置,而不是總像下圖中這樣。

李沐:從頭開始介紹機器學習,眼花繚亂的機器學習應用

序列學習

序列學習也是一類近來備受關注的機器學習問題。在這類問題中,輸入和輸出不僅限於固定的數量。這類模型通常可以處理任意長度的輸入序列,或者輸出任意長度的序列。當輸入和輸出都是不定長的序列時,我們也把這類模型叫做seq2seq,例如語言翻譯模型和語音轉錄文本模型。以下列舉了一些常見的序列學習案例。

語法分析

一個常見語法分析的例子是,給定一個本文序列,如何找出其中的命名實體,例如人物姓名、城市名稱等。以下是一個這樣的例子。其中Tom、Washington和Sally都是命名實體。

Tom wants to have dinner in Washington with Sally.
E - - - - - E - E

語音識別

在語音識別的問題裡,輸入序列通常都是麥克風的聲音,而輸出是對通過麥克風所說的話的文本轉錄。這類問題通常有一個難點,例如聲音通常都在特定的採樣率採樣,因為聲音和文本之間不存在一一對應。換言之,語音識別是一類序列轉換問題。這裡的輸出往往比輸入短很多。

----D----e--e--e-----p----------- L----ea-------r---------ni-----ng-----
李沐:從頭開始介紹機器學習,眼花繚亂的機器學習應用

文本轉語音

這是語音識別問題的逆問題。這裡的輸入是一個文本序列,而輸出才是聲音序列。因此,這類問題的輸出比輸入長。

機器翻譯

機器翻譯的目標是把一段話從一種語言翻譯成另一種語言。目前,機器翻譯時常會翻譯出令人啼笑皆非的結果。主要來說,機器翻譯的複雜程度非常高。同一個詞在兩種不同語言下的對應有時候是多對多。另外,符合語法或者語言習慣的語序調整也另問題更加複雜。

非監督學習

上述的機器學習問題和應用場景都是基於監督學習的。與監督學習不同,非監督學習不需要訓練數據被標識。以圖片分析為例,對監督學習來說,訓練數據裡的圖片需要被標識為狗、貓或者別的動物,如此一來,一個分類模型被訓練後就能把一張新圖片識別為某種動物。而對非監督學習而言,例如聚類學習,可以把一堆無標識的圖片自動聚合成若干類,其中每類分別對應一種動物。

以下我們簡要介紹一些常見的非監督學習任務。

  • 聚類問題通常研究如何把一堆數據點分成若干類,從而使得同類數據點相似而非同類數據點不似。根據實際問題,我們需要定義相似性。

  • 子空間估計問題通常研究如何將原始數據向量在更低維度下表示。理想情況下,子空間的表示要具有代表性從而才能與原始數據接近。一個常用方法叫做主成分分析。

  • 表徵學習希望在歐幾里得空間中找到原始對象的表示方式,從而能在歐幾里得空間裡表示出原始對象的符號性質。例如我們希望找到城市的向量表示,從而使得我們可以進行這樣的向量運算:羅馬 - 意大利 + 法國 = 巴黎。

  • 生成對抗網絡是最近一個很火的領域。這裡描述數據的生成過程,並檢查真實與生成的數據是否統計上相似。

小結

機器學習是一個龐大的領域。我們在此無法也無需介紹有關它的全部。有了這些背景知識鋪墊,你是否對接下來的學習更有興趣了呢?

*****

你知道嗎?李沐和他的同事也開設了深度學習課程,介紹深度學習模型,提供簡單易懂的代碼實現。“我們不是通過幻燈片來講解,而是通過解讀代碼,實際動手調參數和跑實驗來學習。”

北京時間 9月9號星期六早10點到中午12點,李沐將開始他的第一講,從上手到多類分類:

  • 鬥魚直播地址:https://www.douyu.com/jiangmen

  • 課前預習材料:https://zhuanlan.zhihu.com/p/29125290

李沐:從頭開始介紹機器學習,眼花繚亂的機器學習應用

(本文首發於知乎,獲作者授權後轉載,特此感謝)

相關推薦

推薦中...