作者李理,目前就職于環信——全球最大的即時通訊云PaaS平臺和移動端最佳實踐的全媒體智能客服平臺。李理童鞋在環信從事智能客服和智能機器人相關工作,致力于用深度學習來提高智能機器人的性能。李理也是MDCC 2016移動開發者大會人工智能與機器人專場的出品人,邀請人工智能一線專家擔任演講嘉賓,從無人駕駛、智能機器人、智能應用開發實戰等方面解讀人工智能技術的內涵及其對移動開發工作的影響。敬請關注。
0.前面的話
建丁讓我寫一篇深度學習相關小文章,目標讀者是國內的開發者。剛接到這個任務時我是頗為忐忑的,寫文章要講究厚積薄發,如果“水之積也不厚”,“則其負大舟也無力”。因為我自知水平很有限,又不是在學校和科研機構做研究,只不過因為工作和個人的興趣,對深度學習有一點點粗淺的了解,所以擔心寫出來的東西不但于人無益,甚至還讓人誤入歧途。但后來又一想,如果把自己作為一個深度學習的學習者,和對它感興趣的普通開發者分享一些學習的經歷,包括學習過程中遇到的問題,可能也是有一些意義的。畢竟讀論文或者聽學術大牛的講座只能看到“成功”的經驗,而且大部分開發者相對來說沒有太多的背景知識,而很多圈內的人都是假設讀者擁有這些知識的。但是對于普通的開發者來說,很多基礎知識比如線性代數和微積分在上完大學后估計就還給老師了,因此可能理解起來難度更大。而從另外一個角度來說,工程師(開發者)和科學家(科研工作者)關注的點也是不一樣的。科學家更關注理論的東西,比如一個模型是怎么提出來的,為什么要這么設計模型,這樣的模型怎么轉化成一個優化問題。而工程師則更關注這個東西能夠做什么,具體這個優化問題怎么求解更高效。學術界每年有大量的論文發表,大量的idea被提出,其中有好有壞,有的工作可能看起來理論很漂亮,但實際應用起來很難;有些工作可能不被太多人關注,但卻是某些工業界非常需要的。
另外從人工智能的發展來說,我個人覺得在傳統行業的普及也是非常重要的。現在很多人工智能創業公司,很多想用人工智能創造一個全新的產品,比如早期類似Siri的語音助手到現在火熱的機器人。但我個人覺得目前的人工智能的水平還很難做出達到用戶預期的產品,尤其是很多初創公司吹牛吹得有些過分,導致用戶期望過高,而真正使用產品后則形成巨大的反差。我覺得目前階段人工智能更大的用處是提升現有系統,用我自己的話來說就是目前的人工智能只是錦上添花而不是雪中送碳。也就是說光靠人工智能是不能吸引用戶來購買你的產品的。
比如現在國外很火的Amazon的智能音箱產品Echo,如果我不想買一個音箱,估計你很難這樣說服我購買Echo——我們的Echo有非常智能的語音交互功能,可以問天氣,可以設置鬧鐘,可以Uber打車,可以控制家里的智能冰箱。但是如果我想購買一個音箱,現在面臨兩個選擇:一個是傳統的音箱,另一個是Echo。那么你對我說Echo有多么牛逼的智能可能會打動我,反正也差不了多少錢,能有這么多聽起來很酷炫的功能也挺不錯的。
由于Echo的成功,國內很多人也想“山寨”一個類似的產品,不過可能很多人忽略了美國和中國的一些細小差異,那就是音箱似乎不是大城市居民的必備品。就我個人的朋友圈來說,每個家庭肯定都有個電視,但是有音箱寥寥無幾。為什么會這樣呢,因為中國的大城市居民大都是住樓房,很多老破小隔音效果都很差,你整個音箱弄家里還沒high兩分鐘,估計鄰居就該敲門了。倒是耳機,屌絲們擠公交地鐵時的必備利器,也許會更好賣。
說了這么多,想表達的就是目前人工智能應該更多的提高現有產品。比如提到Google,大家可能會想到它收購的Deepmind的AlphaGo,但是我們可能沒有意識到日常使用的很多產品中都使用了深度學習。比如搜索引擎的排序,郵件的智能回復生成,都大量使用了深度學習。而AlphaGo的作用則更多的是一種市場PR,一種宣傳作用,讓大家知道人工智能目前的一些進展,而現在AlphaGo團隊則是想將其技術用到醫療行業幫助醫生診斷疾病。
也就是說人工智能在未來也許就像計算機,互聯網,云計算一樣是一個非常基礎的設施,在任何需要用機器來替代或者減少人力的場景都是有用武之地的。目前不論是國內還是國外,人工智能的人才都是非常稀缺的,而且都是集中在少數學校的實驗室和大公司的研究院里。因此向普通開發者傳播相關的知識就顯得尤為重要。基于這樣的考慮,雖然自己的能力不夠,但還是愿意把自己學習的一些經驗和問題向大家分享。
1.為什么分享Image Caption Generation這個話題?
這篇小文章并沒有限定什么范圍,只要是深度學習相關的就行。這反倒讓人煩惱,就和人生一樣,選擇太多了也是一種煩惱。因為最近工作有空之余正在學習斯坦福的課程CS231N,Convolutional Neural Networks for Visual Recognition。這個課程非常好,除了詳盡的slides和notes,最值得一提的就是它的作業。每個作業包含完整的模型,比如CNN、LSTM,所有的模型的代碼都只是用最簡單的python代碼實現,而不是用現成的庫比如TensorFlow/Theano/Caffe。紙上得來終覺淺,絕知此事要躬行。很多理論,光聽課看slides,似乎覺得自己懂了,其實還是一知半解,真正要掌握,就得自己動手,最好是全部自己實現。但是全部自己實現需要花的時間太多,而且從實際工作的角度來說,大部分開發者肯定都是用TensorFlow這樣的工具。而這個課程的好處就是:把一些瑣碎的與核心代碼不相關的部分包括學習的框架都已經實現了,然后用IPythonnotebook把關鍵的代碼的函數的輸入和輸出都描述的非常清楚,學習者只需要實現一個一個這樣的函數就行了,而且每個函數都會有類似單元測試的檢測代碼正確性的數據,從而保證我們的每一步都是在朝著正確的方向前進。
因此這篇小文章打算講一講其中的Assignment3的ImageCaptionGeneration部分。目的是想通過一個具體的任務來給大家介紹深度學習的一些知識,讓大家對深度學習有一些概念和興趣。選擇ImageCaptionGeneration的原因,一來這個任務挺有意思的;第二就是它涉及到很多深度學習流行的模型如CNN,RNN/LSTM,Attention。 首先來介紹一下什么叫做Image Caption Generation。
對于計算機視覺相關的任務,圖片分類和定位大家可能比較熟悉。圖片分類就是給定一張圖片,讓計算機告訴我們它是一只貓還是一只狗;而圖片定位除了告訴我們這是一張狗的圖片,還需要用用一個矩形框把狗的位置標識出來。當然還有要求更高的Image Segmentation,需要告訴我們哪一些像素屬于狗,而另外一些屬于背景。
圖1就是這些任務的例子:
圖1:常見機器視覺任務
而Image Caption Generation任務是給定一張圖片,需要讓計算機用一句話來描述這張圖片。 如圖2所示:圖2:Caption Generation任務示例
從實際的應用來說,這個任務也是很有用處的。比如一個手機拍完照片之后,我們可以用這個方法生成一句話來描述這個圖片,方便分享和以后查找。而從理論研究的角度來說,Caption Generation相對于之前的task來說需要更加深入“理解”圖片中物體之間的關系,甚至包括一些抽象的概念。它把一幅信息量極大的圖片壓縮成短短一句話。
我是做自然語言處理(NLP)相關工作的,之前對計算機視覺有一些錯誤的看法。認為視覺信號是更底層和原始的信號,除了人類,動物也有很強的視覺能力,也能分辨不同物體。而語言是人類創造的符號系統,屬于更高層的抽象,因而屬于更高級的人工智能問題,似乎不少人會有類似的觀點。
但是現在我有了一些不同的看法,人類的大腦并沒有什么特殊之處。一個小孩在一歲之前一般不會說話,他認識世界的主要方式就是主要通過視覺系統來區分物體,也許和神經網絡類似,通過復雜的神經元的連接來“理解”世界。這些不同層次的網絡就是不同層次的特征,就像神經網絡的“黑盒”,我們自己也很難用精確的語言描述我們大腦到底學習到了什么樣的特征。而且很可能每個人學到的特征,尤其是底層的特征都是不相同的。
比如下圖的一個汽車,最底層的特征可能是不同方向的線條,而中間層的特征可能是各種基本的形狀,而更上層的特征就是車輪這樣的更上層概念。 一個復雜的概念由一些簡單的概念組合而成,而簡單的概念可能由最基本的原子概念組合而成。語言就是對這些概念的描述,或者說就是一個標簽,一種命名。但是語言有一個特點就是它是用來溝通和交流的,所以語言的使用者需要達成一定程度的共識。那怎么達成共識呢,比如我們在教小孩語言時是怎么與他達成共識的呢?比如一個桌子,我們通過手指這一個條狗狗,反復對小孩說“狗狗”這個詞(其實是聲音,為了簡化,我們暫且當成文字),這樣我們就和小孩達成了共識,“狗狗”就是指這樣一個動物,然后又指著另外一條狗狗,也說“狗狗”,小孩就學到這一“類”物體都是狗狗。所以他需要調整他的神經元連接,使得那些符合某種特征的物體都被識別成狗狗。至于具體這個識別狗狗的神經網絡的參數是什么樣的,我們很難知道,也許剛開始他需要分類的物體很少,比如只有“爸爸”,“媽媽”和“狗狗”,那么它可能需要不是那么“本質”的特征來區分,比如他可能認為四條腿走的是“狗狗”,兩條腿直立行走的就是“爸爸”和“媽媽”。當隨著需要識別的類別的增多,比如有了“貓貓”,那他一上來可能認為也是“狗狗”,但父母告訴他分類錯誤,這不是“狗狗”而是“貓貓”。那么他可能需要別的特征來區分貓貓和狗狗,也許他學到的是:四條腿走并且嘴很長的是狗狗,而四條腿圓臉的是貓貓。
那為了能夠區分貓貓和狗狗,小孩的中層的特征可能需要抽取類似“臉”的特征,或者說概念。我們也會告訴他這是狗狗的臉,這是貓貓的臉,這是爸爸的臉。這樣他需要學習出臉的共性的特征。
從上面的過程我們可以發現,概念本身只是一種“特征”的指代,是我們的感覺系統(視覺)對一個物體的反應。而語言是一部分相似的生物對同一個/類物體達成共識的一種指代。但每個人的感覺系統和神經網絡結構都是不一樣的,所以也只能在非常粗糙的程度達成比較一致的共識,而在非常精細的概念層次是很難達成廣泛共識的。因此我們會把周圍的人打上各種標簽,分成各種類別,由此各種概念也就產生——膚色,語言,宗教,性別,階級。每個人也只能和同一個標簽的人在某個方面達成共識,所以要找到一個完全“了解”自己的人是如此之難,而不同的物種的共識可能就更難了。所以就像《莊子·齊物論》里說的“毛嬙、麗姬,人之所美也;魚見之深入,鳥見之高飛,麋鹿見之決驟。四者孰知天下之正色哉?自我觀之,仁義之端,是非之涂,樊然殽亂,吾惡能知其辯!”毛嬙、麗姬是我們人類眼中的美,但是在魚和雁看來只是可怕的敵人。可笑的是自戀的人類卻還要曲解莊子的愿意,認為它們是因為驚異于她們的美麗才沉魚落雁閉月羞花的。不說動物,即使是人類而言,美也是很難達成共識的,那些黑人國家的美女,我們中國人是很少會認為她們是美女的。
因此從這個意義上來說,語言也許并沒有我們想像中的那么高大上。就目前人工智能或者深度學習的水平來說,也許研究小孩在建立復雜概念之前的行為更有用處。