AlphaGo兩勝圍棋大師:深度學習原理和應用初探

北京時間3月9日中午開始了人機大戰的第一場:Google的AlphaGo vs圍棋九段李在石,歷時約三個半小時,首戰以AlphaGo告捷。有人歡喜有人愁。但無可否認的一點是科學技術越來越進步了。其中的功臣是AlphaGO背後的深度學習演算法。深度學習是什麼呢?深度學習為什麼如此的火火火(重要的事情說三遍),它又為什麼如此地牛呢?哪些方面又是它大展拳腳的地方?

我們再次跟隨著上周百度少帥李磊博士精彩的分享(由太閣實驗室舉辦的深度學習講座),一探深度學習的奧秘。

1.什麼是深度學習

深度學習其實是神經網路網路的品牌重塑。一提到神經網路,我們很容易聯想到腦瓜里的千絲萬縷。的確,神經網路(Neural Network)模型在發明之初是從人腦神經元這個概念得到靈感。首先我們看一個單一的神經元模型。

以圖像為例子,每個數據或者輸入就是一張圖片,而裡面的每個x可以是圖片中的每個像素。對於每個像素我們都賦予一個權重,然後經過轉換函數(Transfer Function, 這裡是線性疊加)得到一個數值。簡單來說,我們對所有像素做個線性加權疊加。得到的數值會經過激活函數得到新的數值。這個激活函數(Activation Function)往往是那幾個符合某些特性的非線性函數。為什麼需要非線性的轉換呢?舉個簡單的例子,在同一個平面你和你的影子是重疊是分不開的,在立體的空間你們卻能分開了。非線性的轉換有類似的作用。常用的激活函數有relu, softmax, tanh。

在認識單個神經元後,我們再來看看以此為基礎建立的多層神經網路和深度學習網路。

多層神經網路是,每一層神經網路經過轉換函數和激活函數後的輸出將會成為下一層神經網路的輸入,經過從輸入層到輸出層一層層傳播,最後輸出結果。從上圖可以看出,我們可以簡單地認為深度學習是「層數進一步加深的」神經網路。譬如以前是兩三層的神經網路,現在可以變成十層,甚至幾十層。

這是深度學習,也是神經網路的基本結構。接著我們要提到另外一個基本概念:代價函數。在工作中有衡量表現好壞的指標,在機器學習中也有衡量模型好壞的指標,這就是代價函數。在測試數據上的代價函數值越低,就說明在測試數據上模型能力表現得越好。這並不針對深度學習,而是對於所有機器學習模型都適用。換句話說,代價函數可以作為模型學習訓練過程(training)方向上的指導。常用的代價函數有cross entropy, hinge loss, least square。

在講述神經網路常用的訓練方法之前,我們提一個和代價函數聯繫的概念:監督學習。簡單地說,媽媽在你小時候告訴什麼是狗什麼是貓。這裡的「告訴」就是她的「監督」。你在她的「監督」之下分辨貓狗的過程就是一種「監督學習」。而深度學習常常也以監督學習的形式出現。代價函數代表著模型輸出值與實際結果的誤差,而誤差作為反饋「一層層往後傳播,從而修改模型的參數(譬如單個神經元模型里提到的權重)。這裡「一層層往後傳播」的訓練方法就是經典的神經網路訓練方法:反向傳播演算法(Back Propagation)。具體的實現有SGD,Adagrad,等等。

深度學習的三個重要方面(模型結構,代價函數,訓練方法)已經介紹完了。那麼我們接著說說為什麼深度學習那麼火。

2.為什麼深度學習那麼火

從1958年單層神經網路被設計,到1975年反向傳播演算法被發明,直到1996年Yann Lecun(Facebook AI實驗室主任)才成功訓練出第一個深度神經網路CNN,直到2006年,深度學習的發展才算出現轉機。

曾經一度被打入冷宮,現在卻又成為時代的新寵。是什麼原因導致深度學習的發展曾一度停滯,又是什麼原因使得現在的它變得如此之火?

其實,在最開始訓練深度網路的時候,結果並不理想:層數的增加並沒有提高準確率,反而提升錯誤率了。其中有個重要的原因在Sepp Hochreiter的博士論文中提到:梯度的消失。在反向傳播分層訓練(Back Propagation)的過程中本應用於修正模型參數的誤差隨著層數的增加指數遞減,導致了模型訓練的效率低下。

後來大家想出各種方法,緩解這方面的問題,使得「層數變得越深,效果變得越好」成為了可能。但是,為什麼深度學習現在才火起來而不是以前呢?有兩個原因:數據量的激增和計算機能力/成本。

第一,機器學習里有一句非常經典的話,最後模型的成功不是取決於你的模型多好,而是你有多大的數據量。一般來說,越大的數據量,學出的模型也越好。而深度學習隨著層數的增加,模型變得更複雜,從海量數據學習的能力也變得越強,也就越能利用大的數據量。

第二,雖然神經網路經過層數的增加變成表達能力更強的深度學習,但是隨著層數的增加,模型的複雜度,訓練時間也會增加,少則幾個小時,多則需要多台機器運行幾天。這也就是為什麼在1996年,哪怕Yann Lecun第一次成功地訓練出深度學習網路CNN,深度學習卻沒有在那時火起來的原因。然而現在,單機的計算能力越來越強,而價格也越來越便宜。科學家和企業,通過廉價的計算機集群比起以前更快地訓練出深度學習模型,甚至通過GPU(硬體中的圖像處理單元)來一定程度避免了「梯度的消失」的問題。

但最直接的原因就是它跑出遠遠超過其他演算法好的結果。譬如在2012年的Large Scale Visual Recognition Challenge中,當大部分其他研究小組還都用傳統計算圖形演算法時,多倫多大學的Hinton發出了深度學習這個大招。差距是這樣的:第一名Deepnet的錯誤率是0.16422, 第二名日本東京大學的錯誤率是0.2617,第三名牛津大學的錯誤率是0.2679。

再加上媒體鋪天蓋地的宣傳,深度學習的火爆可謂集齊天時、地利、人和。

3.深度學習有什麼用

那麼深度學習有什麼用呢?它可以和你下棋,你很有可能贏不了它。

百度的自動車裝載深度學習系統,它可以帶你遊山玩水,萬里無憂。它能做出比人類還高的語音識別率。它甚至能「看圖說話」或者「看圖問答」。

深度學習效果真的很卓越,但是它並不是萬金油。雖然很久以前它已經存在,但現在才是深度學習在各個領域大展拳腳的時候。其中自然語言處理和圖像視覺是它最得心應手的領域之一。那麼接著我們跟隨著李磊博士的腳步,簡單了解一下百度在深度學習語義和視覺理解方面做出的努力和貢獻。

4.卷積網路與回歸式網路

在進一步介紹百度的深度學習應用之前,我們需要了解兩個重要的神經網路類型:CNN和RNN。如果您對此有所了解,可以直接跳過。

CNN,全稱為Convolutional Neural Network。不過它的發明者Facebook AI實驗室主任Yann Lecun更習慣把它稱為Convolutional Network(卷積網路),而不再和人腦扯上聯繫。CNN可以由不同的部分組成,這裡只講最主要的部分:Convolutional Layer(卷積層)。 從直觀上出發,圖像上可以收集的常用特徵有:點,角,邊。它們在二維平面的分布以及它們的本身可以一定程度表徵物體。如果你有計算視覺的背景的話,你會更清楚我說的這些特徵具體可以是HoG,SIFT,等等。獲取這些特徵的方法都是類似的——通過一個filter對圖片做卷積運算獲得這些特徵。下圖很好地展示這個過程:粉紅色小正方形代表的是filter,右邊的每個「乒乓球」就是對整張圖掃過一遍後得到的一個個值。以前的方法是人工設計這些filters,而卷積網路的關鍵是把filter當成是不確定的,通過數據和神經網路學習出使代價函數代價最低的filter。從生物視覺方面理解,我們看東西的時候常有視覺聚焦的時候,被聚焦的部分會有更清晰的特徵, filter也是根據同樣的直觀。

RNN,全稱是回歸式神經網路,Recurrent Neural Network,在1980年被首次提出。以下的圖很好表明它的特點,和一般向前傳播的神經網路不一樣,它會通過W(其實也是個矩陣)傳回自己那一層。這裡的s代表它的「記憶狀態」。從左邊的圖展開到右邊的圖我們可以看到,它把它的「記憶狀態」不斷往前傳播。後一個「記憶狀態」的改變依靠於前一個「記憶狀態」和輸入x。所以比起輸入長度是固定的一般神經網路,RNN可以處理任意長度的輸入。所以RNN本身很適合處理語言,聲音之類長度不定的輸入。最後補充一個和RNN經常一起提起的概念:Word Embedding。簡單地說,它就是把詞或者詞語從詞典映射到實數向量。神經網路本身可以實現這種映射,譬如圖下W,U的部分就可以是代表Word Embedding的轉換。

5.應用一:語義解析

自然語言處理可以分為兩個大塊:語言理解和語言生成。而語義解析都可以為這兩大塊所用。

我們先看個具體的例子。在百度地圖搜索里,當我們輸入「武漢理工大學附近的拉麵館」這樣的搜索查詢時,語義解析就會一顯神通。語義解析可以認為本質上是個分類問題。譬如說,機器需要知道「武漢理工大學」是屬於center這個類,而「拉麵館」是keywords這個類。然而它又不是個簡單的分類問題——詞語之間或者字母自己的依賴關係可以為準確的分類提供更可靠的信息。

那麼我們看一下百度處理這個問題簡化版的深度學習模型。

像之前所說那樣RNN很適合處理語言這種輸入——長度不定,然後每個字元或者每個詞對於前面的詞有依賴關係。首先embedding是把字元映射到數值向量的空間。數值化是便於比較和計算。然後這裡有共四層的RNN與RNN(reverse)交替出現。每一對RNN與RNN(reverse)分別充當encoder與decoder,然後共同組成Autoencoder。Autoencoder字面上意思是自編碼,大家可以認為這就像壓縮和解壓縮的過程。當學出這個Autoencoder就可以認為學出這些數據比較好的表示,可以進一步用作其他的任務。剩下其他的部分和一般的神經網路無異。另外補充一句,這裡的fully connected layer意思是,現在一層的每個神經元都會連接到下一層所有的神經元。

上面的例子簡單地介紹了用RNN處理語義解析的問題。語義解析不是只有深度學習才能做到,其中概率圖模就是一種常用解決方案。但由於深度學習給出了更好的結果,所以受到更多的關注和青睞。語義解析有很多應用,譬如實體識別(識別出地點,人名等等),語法分析(譬如找出主謂賓),機器問答(譬如在一篇文章里,識別中那些詞對應的是Harry Potter)。

除了語言理解,百度還致力於語言生成,譬如在百度的Neural Casual Chatting Machine里,百度就通過深度學習模型實現人機對話。譬如以下的例子,人類問了一句「星球大戰好看嗎?」機器回了一句「不很好看」。

可以看出這個模型和語義解析的模型很相似,一樣利用了RNN的特性。不過這個模型不再是個分類模型,而是個生成模型。經過第一個RNN輸出的值不再用來分類,而是作為語言/回答生成的依據。仔細觀察這個模型語言生成的流程,就會發現和之前RNN「記憶狀態」傳遞的過程很像——每個字的生成都是由一層RNN(橙色部分)產生的,並且根據的是上一層的RNN的輸出(「記憶狀態」)和前一個生成的字(譬如「很」的前面是「不」)為依據。

6.應用二:圖像字幕

根據語言可以產生語言,那麼根據圖像可以產生語言,也就是描述性字幕嗎?答案是肯定的。

觀察深度學習的語言生成模型,一個很自然的想法是把之前的語言生成模型的encoder部分把適合自然語言處理的RNN換成適合圖像處理的CNN。

當然事情沒有那麼直接明了。百度深度學習研究院的博士實習生Junhua Mao在處理這個問題式用了個「夾心餅」模型m-RNN, 全稱是Multimodal Recurrent Neural Network。我們可以簡單地認為是CNN+MultiModal+RNN。在他的論文中,RNN整體結構基本不變,只有在Recurrent和CNN之間加上Multimodal的融合。簡單地說,這個模型對CNN,Recurrent和Embedding得到的值做線性相加,然後把得到的值映射多態分布(Multimodal Distribution)空間。

既然可以根據圖像產生字幕,那麼根據視頻產生字幕應該不會有大問題吧?最近百度被CVPR(圖像視覺方面的頂級會議)2016收錄的一篇文章「Video Paragraph Captioning using Hierarchical Recurrent Neural Networks」就是用深度學習的方法解決這個問題。這裡比較關鍵的一個地方是如果採用之前「圖像字幕」的方法會忽略一個視頻里不同段之間的聯繫。所以百度利用Hierarchical RNN實現了Paragraph RNN,考慮這些聯繫,並對視頻產生更有聯繫的段落描述。

7.應用三:圖像問答

既然可以對圖像進行描述,那麼可以根據描述進行圖像問答嗎?答案依然是肯定的。如果只是用傳統的方法,就會出現下圖的問題——當問蛋糕顏色的時候,機器可能把重點當成蛋糕上面的水果了。為了解決這個問題,百度在CNN的基礎上建立Attention-based CNN,從問題中提取重點,譬如「cake」,然後從圖中映射到值得注意的部分(Attention),譬如蛋糕的身體,從而降低回答的失誤率。

8.Paddle:百度的深度學習異構分散式系統

百度深度學習研究院的首席科學家吳恩達(Coursera創始人)曾經說過,「重要的不僅是機器學習演算法本身,還有能實現它們的平台」。而支撐起之前提到的應用的功臣就是百度的深度學習異構分散式系統Paddle。Paddle每一部分的功能和層次都非常分明——底層把異構的計算資源(CPU,GPU,FPGA)封裝起來起來,模型本身(CNN,RNN,Attention)也和具體的訓練/優化方法(SGD, LBFGS)獨立分開。

9.總結

從語義分析,到圖像字幕,到圖像問答,李磊博士給我們展示了百度在應用深度學習的過程中如何一步步改進模型,使它適用不同的情景。對於初戰告捷的AlphaGo,它背後的兩個主要深度學習網路(走棋網路和估值網路)也經歷這樣一步步進化的過程,感興趣的朋友不妨了解一下bit.ly/1LRZyPx

然而深度學習不是萬金油。在它提供更通用和更有效的解決方案的同時,它在不同情景的使用依然需要大家經驗的積累和對問題的思考。雖然依靠著現代強大的計算能力發光發熱,但現在的它更像個黑箱子。背後的原理需要大家共同努力發現。

10.資料匯總

網上好的資料很多,筆者稍微總結一下。

  1. 想了解神經網路基本原理,包括數學模型,激活函數和代價函數的選擇,反向傳播演算法的推導,可以觀看Coursera里由Andrew NG(斯坦福吳恩達教授)教授的Machine Learning

  2. 想一個更統一的角度看CNN與RNN的話,可以了解斯坦福圖形視覺大牛老師FeiFei Li的門徒Andrej Karpathy的博客:

The Unreasonable Effectiveness of Recurrent Neural Networks

  1. 對於深度學習的使用李磊博士推薦百度的平台和CMU的MXNET:

GitHub - dmlc/mxnet: Lightweight, Portable, Flexible Distributed/Mobile Deep Learning with Dynamic, Mutation-aware Dataflow Dep Scheduler; for Python, R, Julia, Go, Javascript and more

  1. 筆者本身尤其推薦Keras (python 深度學習庫)。它吸收了Torch(lua語言的深度學習庫)的模塊化和最小化的思想,非並包括豐富的例子: keras/examples at master · fchollet/keras · GitHub。本文的例子很容易通過它來搭建,並有已經實現的例子

  2. 想了解CNN一層層學習的過程,並有可視化,請閱讀The Keras Blog

  3. RNN with word embedding: Recurrent Neural Networks with Word Embeddings

  4. 語言生成模型:

    1. The Unreasonable Effectiveness of Recurrent Neural Networks

    2. keras/lstm_text_generation.py at master · fchollet/keras · GitHub

  5. 圖像字幕(生成):arxiv.org/abs/1412.6632

  6. 視頻字幕(生成):arxiv.org/abs/1510.0771

  7. 圖像問答:arxiv.org/abs/1511.0596

備註

以上是太閣實驗室講座「百度少帥李磊博士 —— Large-Scale Deep Learning for Language and Visual Understanding」的總結稿,在筆者(Chi Chen)理解的基礎上有所拓展,轉載請註明。

更多精彩內容, 請掃描下面二維碼,關注微信公眾賬號「論碼農的自我修養」

推薦閱讀:

《深度卷積網路:從AlphaGo到GAN》連載:1.1 從人工智慧,到深度學習 + 1.2 深度神經網路的威力
28 天自制你的 AlphaGo (2) : 安裝 MXNet 搭建深度學習環境
AlphaGo有沒有缺點或弱點?
為什麼AlphaGo不願意和羅洗河下一盤?
如果AlphaGo走出第四局白78,大家會給出"這是神之一手,超越了人類的巔峰"這樣的評價嗎?

TAG:AlphaGo | 深度学习DeepLearning | 人工智能 |