機器學習簡介 GAIR大講堂
雷鋒網註:本文作者為深度學習平台MxNet的作者李沐,文章由雷鋒網整理自作者的機器學習網站「動手學深度學習」。在這個網站中,李沐介紹了他做這個項目的初衷:
兩年前我們開始了MXNet這個項目,有一件事情一直困擾我們:每當MXNet發布新特性的時候,總會收到「做啥新東西,趕緊去更新文檔」的留言。我們曾一度都很費解,文檔明明很多啊,比我們以前所有做的項目都好。而且你看隔壁家輪子,都沒文檔,大家照樣也不是用的很嗨。
後來有一天,Zack問了這樣一個問題:假設回到你剛開始學機器學習的時候,那麼你需要什麼樣的文檔?
為此,李沐決定:
我們想開設一些系列課程,從深度學習入門到最新最前沿的演算法,從0開始通過互動式的代碼來講解每個演算法和概念。
而本文也正是這一系列的開篇介紹,向初學者介紹了機器學習的背景知識,並希望藉此吸引更多的初學者進入到機器學習的殿堂中來。本文原地址:機器學習簡介 - 動手學深度學習 0.1 documentation。
以下為全文:
本書作者跟廣大程序員一樣,在開始寫作前需要去來一杯咖啡。我們跳進車準備出發,Alex掏出他的安卓喊一聲「OK Google」喚醒語言助手,Mu操著他的中式英語命令到「去藍瓶咖啡店」。手機這時馬上顯示出識別的命令,並且知道我們需要導航。接著它調出地圖應用並給出數條路線方案,每條方案邊上會有預估的到達時間並自動選擇最快的線路。
好吧,這是一個虛構的例子,因為我們一般在辦公室喝自己的手磨咖啡。但這個例子展示了在短短几秒鐘里,我們跟數個機器學習模型進行了交互。
如果你從來沒有使用過機器學習,你會想,這個不就是編程嗎?或者,到底機器學習是什麼?首先,我們確實是使用編程語言來實現機器學習模型,我們跟計算機其他領域一樣,使用同樣的編程語言和硬體。但不是每個程序都用了機器學習。對於第二個問題,精確定義機器學習就像定義什麼是數學一樣難,但我們試圖在這章提供一些直觀的解釋。
一個例子
我們日常交互的大部分計算機程序可以使用最基本的命令來實現。當你把一個商品加進購物車時,你觸發了電商的電子商務程序來把一個商品ID和你的用戶ID插入到一個叫做購物車的資料庫表格中。你可以在沒有見到任何真正客戶前來用最基本的程序指令來實現這個功能。如果你發現你可以這麼做,那麼你就不應該使用機器學習。
對於機器學習科學家來說,幸運的是大部分應用沒有那麼容易。回到前面那個例子,想像下如何寫一個程序來回應喚醒詞例如「Okay, Google」,「Siri」,和「Alexa」。如果你在一個只有你和代碼編輯器的房間里寫這個程序,你該怎麼辦?你可能會想像下面的程序:
但實際上你能拿到的只是麥克風裡採集到的原始語音信號,可能是每秒44,000個樣本點。那麼需要些什麼樣的規則才能把這些樣本點轉成一個字元串呢?或者簡單點,判斷這些信號里是不是就是說了喚醒詞。
如果你被這個問題困住了,不用擔心。這就是我們為什麼要機器學習。
雖然我們不知道怎麼告訴機器去把語音信號轉成對應的字元串,但我們自己可以。我們可以收集一個巨大的數據集里包含了大量語音信號,以及每個語音型號是不是對應我們要的喚醒詞。在機器學習里,我們不直接設計一個系統去辨別喚醒詞,而是寫一個靈活的程序,它的行為可以根據在讀取數據集的時候改變。所以我們不是去直接寫一個喚醒詞辨別器,而是一個程序,當提供一個巨大的有標註的數據集的時候它能辨別喚醒詞。你可以認為這種方式是利用數據編程。換言之,我們需要用數據訓練機器學習模型,其過程通常如下:
初始化一個幾乎什麼也不能做的模型;
抓一些有標註的數據集(例如音頻段落及其是否為喚醒詞的標註);
修改模型使得它在抓取的數據集上能夠更準確執行任務(例如使得它在判斷這些抓取的音頻段落是否為喚醒詞上判斷更準確);
重複以上步驟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 …
傳統的實現是這樣的:
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-----
文本轉語音
這是語音識別問題的逆問題。這裡的輸入是一個文本序列,而輸出才是聲音序列。因此,這類問題的輸出比輸入長。
機器翻譯
機器翻譯的目標是把一段話從一種語言翻譯成另一種語言。目前,機器翻譯時常會翻譯出令人啼笑皆非的結果。主要來說,機器翻譯的複雜程度非常高。同一個詞在兩種不同語言下的對應有時候是多對多。另外,符合語法或者語言習慣的語序調整也另問題更加複雜。
非監督學習
上述的機器學習問題和應用場景都是基於監督學習的。與監督學習不同,非監督學習不需要訓練數據被標識。以圖片分析為例,對監督學習來說,訓練數據里的圖片需要被標識為狗、貓或者別的動物,如此一來,一個分類模型被訓練後就能把一張新圖片識別為某種動物。而對非監督學習而言,例如聚類學習,可以把一堆無標識的圖片自動聚合成若干類,其中每類分別對應一種動物。
以下我們簡要介紹一些常見的非監督學習任務。
聚類問題通常研究如何把一堆數據點分成若干類,從而使得同類數據點相似而非同類數據點不似。根據實際問題,我們需要定義相似性。
子空間估計問題通常研究如何將原始數據向量在更低維度下表示。理想情況下,子空間的表示要具有代表性從而才能與原始數據接近。一個常用方法叫做主成分分析。
表徵學習希望在歐幾里得空間中找到原始對象的表示方式,從而能在歐幾里得空間里表示出原始對象的符號性質。例如我們希望找到城市的向量表示,從而使得我們可以進行這樣的向量運算:羅馬 - 義大利 + 法國 = 巴黎。
生成對抗網路是最近一個很火的領域。這裡描述數據的生成過程,並檢查真實與生成的數據是否統計上相似。
小結
機器學習是一個龐大的領域。我們在此無法也無需介紹有關它的全部。有了這些背景知識鋪墊,你是否對接下來的學習更有興趣了呢?
點擊展開全文
※Google在北京成立人工智慧研究團隊推動機器學習應用技術
※新機器學習程序為阿爾茨海默病的早期診斷帶來希望
※將半自動圖像分析技術與機器學習演算法相結合加速大規模遺傳研究
※機器學習雲服務與自建開源的框架的區別表現在哪幾個方面呢?
※Python超過R,成為數據科學和機器學習的最常用語言
TAG:機器學習 |