您的位置:首頁>科技>正文

地平線機器人楊銘:深度神經網路在圖像識別應用中的演化

機器之心整理

編輯:杜雪

4 月 15 日, 楊銘博士在機器之心線下活動 Interface 上做了一次題為「深度神經網路在圖像識別應用中的演化」的演講。 這篇文章對楊銘博士分享的內容進行了整理, 同時還附有添加了字幕的視頻, 希望能為大家學習圖像識別提供説明。

地平線機器人技術 ( Horizon Robotics ) 聯合創始人&軟體副總裁楊銘博士畢業于清華大學電子工程系並獲得工學學士和碩士學位, 于美國西北大學電氣工程與電腦科學系獲得博士學位。 楊銘博士是 Facebook 人工智慧研究院創始成員之一, 曾任 NEC 美國研究院高級研究員, 專注于電腦視覺和機器學習領域研究, 包括物體跟蹤、人臉識別、海量圖片檢索、及多媒體內容分析。 在頂級國際會議 CVPR/ICCV 發表論文 20 餘篇。 在 Facebook 工作期間負責的深度學習研發專案 DeepFace。 多次擔任 CVPR/ICCV/NIPS/ACMMM 等頂級國際會議程式委員會成員, T-PAMI/IJCV/T-IP 等頂級國際期刊審稿人, 申請獲得美國專利 14 項。

2015 年, 楊銘博士回國加入地平線機器人技術。

下面是添加了字幕的視頻, 以及演講內容整理:

大家下午好!我是地平線機器人的楊銘, 非常高興有這樣一個機會跟大家交流和分享。 首先感謝機器之心的邀請, 更加感謝大家在這樣一個風和日麗、週六的下午來到這裡, 聽我的分享。

深度神經網路這幾年非常火熱, 取得了很多技術突破。 其中最關鍵的是深度網路的網路結構, 網路模型本身具有很強的建模能力, 能夠完成很多工, 每項任務也都有很好的結果。 網路模型本身也經歷了一些發展, 從 80 年代一直到現在。 我想把發展的過程和一些設計的考慮跟大家分享一下。

今天這個分享不只是我一個人的總結, 也包括我的同事黃暢博士。

黃暢博士也是地平線機器人聯合創始人, 負責演算法方面。 之前在清華大學電腦系讀博, 之後去南加州大學做博士後。 我們在矽谷、在 NEC Lab 當過一段時間的同事。 後來他去了百度深度學習研究院擔任主任架構師, 現在負責地平線的演算法研發工作。

還有一位合作者是羅恒博士, 在蒙特利爾大學做過博士後, 後來去了百度深度學習研究院工作, 目前在地平線負責圖像演算法的研發。

簡單說一下我的背景。 我在清華電子系讀的本科和碩士, 當時做的是視頻編碼。 2000 年左右的時候, 視頻編碼以及 4G 通信是比較火的項目。 我讀完碩士之後就去了美國西北大學讀博士, 那個時候轉向了電腦視覺、機器學習。 畢業後就去了矽谷, 跟黃暢做了同事。 後來他們回國, 先去了百度, 創立了百度深度學習研究院, 我去了 Facebook, Facebook 那幾年決定加大投入做 AI 相關的研發。

2013 年的 8、9 月份, 我們成立了 Facebook AI research, 開始叫做 Facebook AI Lab。 當年 12 月份的 NIPS 上, Yann LeCun 被 Mark 說服後就加入了我們。 之後改名為 Facebook AI Research。 在 Facebook, 我主要負責的人臉識別後端系統跟演算法。

2015 年, 我回國和余凱、黃暢一塊創立了地平線機器人。 這一波 AI 浪潮來勢兇猛, 我們想在這個浪潮之中, 順應歷史發展潮流, 做一些事情。

這可能是我之前做的比較重要的工作, 就是人臉識別。 我的感覺是說, 深度學習開始在 ImageNet 做的非常好, 在人臉識別也表現的非常好。 我們之前做的人臉識別工作, DeepFace 是第一次把深度學習在互聯網上應用、落地的產品。 我們在 2013 年底差不多做完的, 2014 年上線。

當時 DeepFace 每天處理 Facebook 上大約 4 億張人臉識別,現在應該更多了。基本上每一張上傳到 Facebook 的人臉會先經過一個人臉檢測,再進行後端的比對識別,向用戶推薦一下說這是不是人臉。如果我們識別出來了之後,就會打一個名字,如果沒有識別准的話,我們可能會列 4、5 個選項。如果說我們比較有把握,Facebook 就會把照片向用戶的朋友推薦或者發一些消息,提高使用者的活躍度。

這個工作我們只敢說接近人眼的性能,後來很多人它說超過了人的能力,但我覺得還沒到完全超過人的能力那個程度,還是有一定的差別。因為電腦非常適合在大規模的情況下做人臉識別,這其中還有一些限制,需要人臉偏正面、偏清晰。但是對於人說,如果是熟悉的親戚、朋友,甚至你看到一個背影,看到一點點,看到一撇,就可以看出這個人是誰。

整體來講,在一定規模下的人臉識別,機器肯定超過人的水準,但是遇上非常難和極端的條件,機器可能還是不能達到人的水準。這個工作是深度學習之後,人臉識別領域中應用最多的工作,也被 Science 等很多媒體報導過。

再稍微簡單介紹一下地平線機器人。地平線機器人成立于 2015 年 6 月,目前的總部在北京。我們在南京有研發中心,另外在深圳、上海都有辦公室。在深圳,我們主要是做人工智慧跟硬體相結合,在深圳是非常適合做硬體相關的生產的。我們上個月在上海剛剛成立了一個聚焦於汽車自動駕駛方面研發的分公司,位於上海汽車城,產業很聚集,進行相應測試也非常方便。

主要的員工和同事來自于百度、Facebook。我們硬體團隊主要來自於 NOKIA,也有很多同事來自于微軟、TI 和英偉達。目前我們還是偏研發的公司,超過 80% 的同事都是在做演算法、軟體硬體研發的工作。很多人有海外求學的經歷,14-15% 是有博士學位的。

目前我們所做的事情主要是希望把深度學習的方法跟硬體相結合,跟嵌入式系統相結合,能夠成功落地,影響大家生活。目前的主要目標是希望通過十年、二十年的努力,能夠讓世界上上千種設備都具有智慧的功能,讓大家生活更加安全、更加便捷、更加有序,具體來講我們現在聚焦一下幾個業務方向:

第一個,自動駕駛或者智慧汽車。這個方向大家也有所瞭解,這幾年非常火熱,不斷有大新聞曝出來。我們相信這個領域不僅僅可以國家整個社會的運行、整個社會的生活,而且也是人工智慧能夠發揮很大作用的場景。

第二個,智慧家居或者智慧生活。2015 年之前,大家聽到的智慧家居,歸結於一個詞就是 WIFI,家裡的設備能夠進行聯網控制,我們認為其實這是不夠的,還是非常不方便的。大家在外出工作的時候,經常會用手機溝通、打車。但是回家之後如果再掏出手機,點開 APP,再找到幾個按紐,對家裡的東西進行操控,這是挺不方便,挺不自然的。在家裡,人們希望手機可以放在一邊,能夠更自然地跟家裡各種電器、各種設備交互,這是我們的第二個方向,能夠在智慧家居的場景下,將人工智慧鑲嵌到設備裡面去,給大家提供更便捷的對話模式。

第三個,智慧安防或者智慧安全。這是跟攝像頭相關的,也是一個很好的場景,能夠讓圖像識別技術真正地説明大家,讓這個社會更安全,讓這個城市更安全。

這是我們主要做的三個業務方向。總得來說,我們希望把人工智慧、深度學習、深度網路這些技術放到嵌入式系統中去,提供一個從軟體到硬體,甚至到晶片的全套解決方案,説明這些產品、設備都具有這種人工智慧的功能。

我們公司叫做地平線機器人,但是我們對機器人的定義稍微有點不一樣。我們其實並不特別關注那些長得很像人的,有手有腳,能跑能跳的機器人。我們認為只要是一個機器,有感知環境,自主決策的功能,慢慢就發展成機器人。我們業務或者努力方向,更多是把大家生活中的設備變得更聰明,慢慢向機器人的方向發展。這是我們希望做的事情和正在做的事情。

我們從成立之後,也得到了很多世界知名 VC 的支援,包括晨興資本、紅杉資本、也包括李開複老師。去年,我們完成了 A 輪融資。吳亞軍老師對我們也很支持,她是中國非常著名的女企業家;還有 YuriMiiner,他是矽谷裡非常傳奇的俄羅斯大亨,他投資的早期 Facebook 等等公司,基本上屬於投了就能中的。

什麼是人工智慧?

我們大家經常說人工智慧。但什麼是人工智慧,希望大家有一個共識和定義。如果我們查一查百科或者說官方的權威定義,人工智慧是學習和設計一種 Intelligent Agents 的學科。這個 Agent 本身能夠感知環境,能夠採取一些行動,提高自己成功或者是做出一件事的機會。

這個定義本身有幾個點可以注意一下。首先是 Intelligent Agent 這個詞,這個詞語說明能夠執行 AI 的載體並不是一個簡單的機器或者一個電腦,有可能是一個非常大規模的、非常抽象的,能完成這些功能的設備的集合,甚至可能並不是設備,而只是一些程式。總之,這是一個非常寬泛的詞。

另外,它能對環境主動感知,採取行動,實現自己一定的目標。這裡包含三個含義,作為一個 AI,首先對物理世界感知(sensing),sensing 之後,相當於把這些獲得的資訊納入數位化的世界,在數位化的世界之內對這些資訊進行理解、分析、思考。重要的是最後一步,去回饋這個物理世界,做一些控制和行動,反過來影響物理世界,這是整個 AI 系統和人工智慧系統所具備的最全面的三個階段。

如果我們做的工作跟某一個階段相關,我覺得這也是屬於 AI 的研究。這三個環境包括 Sensing 、Thinking、Acting,也包括了很廣的概念。比如說 PC 上網,敲鍵盤打字,是把物理環境的資訊輸入到了數位世界中,在比如當攝像頭、麥克風,還有在汽車中的雷射雷達或者是其它的感測器,這些設備把我們物理世界的信號轉換到了電腦能夠處理的信號。在電腦的處理中,可以對這些資料進行分類、搜索、排序,這些都是理解的過程。再之後,我們對這個世界有一個回饋,包括可以根據搜索的內容,建議一些廣告,或者是對於語言的理解之後,比如說要打車哪裡,它可以自動給你導航,也包括圖像或者人臉識別之後,也許可以讓大家找到你的名字,找到你的一些偏好,做一些科學化的設置,包括像無人機、無人車可以根據信號自主避障、尋徑,這是回饋到物理世界進行控制。這些都是人工智慧研究的方面。

這個不多說了,確實很火,所有大公司還有一些政府都投入了很多的精力。谷歌原來是移動為先的公司,後來說要成為 AI 為先的公司,這個趨勢很多公司都看到了。Mobile 文化可能是一個很重要的浪潮了,下一個競爭會升級,升級到智慧,比的是誰自動化的控制、自動化資料分析能夠更快、更好。

稍微總結一下,為什麼人工智慧比較重要?從計算的角度可以看到,過去電腦的發展經歷了大概兩個時代。2000 年-2010 年左右或者更早是 PC 互聯網時代。就是我們有電腦、網路,可以上網流覽。這個時代其實催生了比如說像搜尋引擎、門戶網站,催生了很多很偉大的公司,這是一個時代。

第二個時代是我們正在經歷了的移動互聯網時代,手機的發展以及 4G 網路通訊的發展。手機我們幾乎是離不開的,每天不知道有多少比例的時間花在手機上看消息、去打車、找路、看小說、看電影。

未來會是什麼樣的時代?大家看到互聯網催生了很多公司,比如說高通、蘋果這些公司在那個時代做的很好,現在移動互聯網的發展已經比較成熟了,機會可能並不像 5 年前那麼多了。再往下看,我相信這個時代還沒有結束,還會延續很多年。

新的時代也慢慢興起,就是物聯網+智慧,IoT。IoT 是指所有的設備,不僅僅都要上網而且也會具有一定的智慧,讓這個世界更緊密地聯繫起來。從這個角度來講,這會是今後 5 年到 10 年會有大的發展。

總得來說,從大的發展來看,電腦的角度有三個因素,計算、連接、智慧。連接和計算現在有很大的發展,我們覺得下一步時代就是關於智慧,也是關於軟體方面智慧的發展。

什麼是深度學習?

大家都提深度學習,什麼是深度學習?有一個非常簡單的定義。我們有一些沒有經過處理的原始資料,可能是語音、文字、圖像,也可能是一些感測器得到了沒有經過處理的資料。而深度學習本身的任務就是對這些原始資料進行數位化的表達,表達完成之後就可以做很多事情。做什麼事情?這就跟應用相關了。

深度學習的主要定義或者是要做的事情就是端到端的學習,能夠把原始資料轉化為某種程度上的表徵的方法,只要不是最簡單的數模轉換,其實都可以放到資料的框架裡面來。

深度學習的歷史沿革

這裡還是要簡單回顧一下歷史,最早起源於 1957 年的 Mark I perception。從數學上來講是一個很簡單的形式,就是你有若干個輸入,每一個信號輸入乘上一些權重,然後經過一個函數輸出,這個函數也是線性函數。這是神經網路或者是深度學習最最簡單的起源了。比較有意思的是,這個資料模型當時是通過硬體的方式提出來的,用物理的連線去聯接這些信號進行輸出的。但是為什麼它算是神經網路的起源?因為這些聯線的權重不是固定設好的,如果固定設好的,那就是電路系統,這些權重通過資料自動調節改進來確定的,所以它就是 learning machine 的雛形。

當年的紐約時報就報導說這是電腦能夠很快學習、走路、談話、理解、寫字,甚至繁殖的前兆吧。我們經過了60 年的發展,現在大概在 See 和 Write 左右。

當時大家對這個東西感到很興奮,覺得這個東西潛力很大。但是這個感知機還是線性的,經過實驗發現,它對一些基本的函數都沒有辦法建模或者描述,比如說異或 SOR。所以之後十年神經網路迎來了一個低谷期,大家覺得用途可能不是很大。1980 年,Fukushima 提出了神經網路多層的結構,但是並沒有提出如何學習這個結構。1980 年包括 Yann LeCun 等,大概有三、四個人,他們都提出了類似反向傳播的方式,能夠把這個神經網路學出來,這就是一個非常重大的進展里程碑了。

之後,80 年代到 90 年代有一個非常快速的發展時期,大家的期望值也很高,希望可以做很多的事情,但是由於種種的限制,其實沒有辦法做很複雜的功能,只能做到簡單的圖像識別,簡單的手寫 OCR,之後發展趨勢又掉下來了。在學術界,大概有差不多 7、8 年的時間,神經網路相關的研究基本上是很難發表的。大家都不在乎,認為神經網路不就是這樣子嘛!

神經網路的再度興起始於 2006 年,G.Hinton 提出深度神經網路。不過他當時不敢提深度神經網路這個名字。這種結構可以通過一層一層來學習,來得到一個比較好的結果。之前的網路太深,大家是學不了的。這種網路結構給大家的啟發是並不需要逐層地學習,通過端到端的學習也可以實現,而且學到一定深度之後,建模能力也是比較強的。

自那之後,深度神經網路的優越性能就不斷爆發。語音辨識是第一個被突破的領域。IBM、微軟以及穀歌等等幾個公司發表了一些文章,有了很大的突破,因為之前基於 HMM(隱瑪律科夫)的識別大概有 10 年、15 年沒有本質性的改進了。再之後 Jeff Dean 在穀歌率先實現了大規模的深度學習網路的基礎架構,當時是基於一萬個 CPU,比較重要的結果就是自動學習識別出是貓臉還是狗臉。穀歌做這個事情是有示範作用的。

再之後大家就很清晰了,2012 年 ImageNet 中,微軟將識別率降了 10 個百分點,這是很大的突破。之後,大家將這個技術應用到人臉識別和圖像識別中。到 2014 年、2015 年時 RNN 或者帶有一定記憶的程度網路開始流行,對於序列學習,以及生成文字上都有很大的提高。再之後應用到自動駕駛。

2016 年的 AlphaGO,基本上算是橫空出世,一下子就把 AI 從學術界推到了公眾領域中,做了一個很好的科普。2016 年、2017 年其實還在迅速的發展,包括 2016 年之前就有的對抗生成網路,2017 年穀歌剛剛公佈了用 TPU 晶片方式做成網路的結構。他們應該是 2015 年就做出來了,估計這個 TPU 不是他們第一代的產品,估計是把第一代的架構公佈了,現在已經做第二代。

總之從 2006 年開始,深度學習進入波瀾壯闊的快速發展時期。我們希望 2020 年以後或者是神經網路不光運行在雲端,用上百台的 GPU 跟大家下圍棋,而是希望真正運用到設備端,來影響大家的生活。這是一些簡單的歷史,大家可以看到 ANN、CNN、RNN、LSTM 等等,它們基本上都屬於神經網路,神經網路本身屬於深度學習,深度學習屬於 AI,這是一個大體的範疇。

在我們講這些神經網路結構之前,先簡單介紹一下架構,讓大家有一個統一的認識。這是最簡單的神經網路,只要超過兩層三層以上,都算是深的網路。

這種一般叫做 Multi-layer Perceptron(MLP,多層感知機)。有一些輸入層,輸入層是某種資料,最終會得到一個輸出,輸出可以是一個數,也可能是一個向量,是一個二維的或者是 tensor,你希望學到神經網路達到一定目的,實現你類比所達到那個目的的函數,比如一個函數 F 從輸入到輸出。這個網路本身有很多的隱層,每一層有很多的節點,節點都是線性的,互相相聯的,就是一個簡單的 MLP。有這個結構之後,我們需要定義這個輸入,然後定義這個輸出,再定義一個 Loss Function(損失函數),來評價神經網路測算出來的結果跟你希望的結果是不是一致的。有了輸出、輸入、評價這三個過程,就實現了機器學習。

在這個學習的過程中,大量的資料放到輸入層,給這個網路隨機分配一些初始的非常小的數來算,算出來之後結果肯定不對。也沒有理由是對的,有了這個不對的結果之後,可以反向根據這個結果與期望之間的差異,對每一個節點的參數求導。求導了之後沿著這個梯隊方向,稍微修改一點點,希望能讓這個結果有一點點變化,其實這個變化是沒有保證的。但是只要反復按照這個方式運行,給它一個結果去前向計算,得到一個輸出,跟你的希望結果去比較,計算這個誤差,通過誤差反過來調整這個參數以及權重,反復運行,之後就可以實現一個比較好的函數的擬和效果,擬和出你想實現的目標。

概念上說,這個每一步現在都已經發展出很多演算法,你用一個數據點去算\去修改網路,可能是很不穩定的,因為你這個點的 lable 可能是錯的。這時候你可能需要一個 minibatch 的方法,把一批資料結果平均一下,根據它們的方向去修改。修改的過程中,修改力度(learning rate)可以調整。開始的時候,拿不准的就學得快一慢,慢慢有把握了,就學得慢一點。

後來有一些比較新的方法,可以在這個過程中做出一些規劃,讓這個數值不要太大,數值上比較穩定,能快速地收斂。

這個網路的結構以及學習方法在上世紀八九十年代就有了,當時它有一些問題導致大家覺得它可能不是那麼有用。包括 over-fitting(過擬合),意思是在資料不是很多的情況下,網路參數很多。這種情況,雖然可以學到一個非常好的結果,但是來了一個新的結果未必能夠正確處理,這就是 Over-fitting。還有就是資料結果可能會有一些標注的錯誤,你不能保證你所有的標注都是 100% 正確的。另外,網路結構本身是一個黑盒子,它做什麼事情,大家很難理解。

現在有了很多改進。首先 Over-fitting 不再是問題了,因為資料足夠多。比如說人臉識別,如果有世界上所有的人臉來做訓練,就已經沒有必要 Over-fitting 了,因為你已經沒有更新的資料了。如果資料足夠多的話,Over-fitting 這個事情並不是那麼重要。

第二,大量資料的處理需要很高的性能,大家發現用 GPU 這種新架構,並行去練,可以處理很多資料,比 CPU 效率高很多,這確實能夠推動神經網路發展的一個很重要的關鍵因素。

剛才提到的訓練中的很多新改進,包括 dropout、batchnormalization 等都對處理更多資料,快速收斂有所改進等,這些是演算法上的提高。

但有一件事沒有本質性的改變,這個網路結構還是屬於 black magic。但是本質上還是實驗出來。實驗出來得到一些比較好的結構、功能,然後再反過來給大家解釋一下,它總是會有一些道理。

所以今天我可能稍微回顧一下各種網路結構和它設定的原則和思考。應該指出的是,確實還沒有放置四海皆可用的結構或者一個絕對正確的設計原則。有一些思考,但是這些思考是不是全面和正確,現在還不好說。這也是一個領域,大家可以繼續探索研究的。

為什麼深度學習現在能夠獲得這麼大的關注,跟其他的方法是有一些區別,隨著資料的,增加別的方法的性能在某一個點上不會再提升了,某種意義上飽和了,但是深度學習目前為止還沒有明顯地發現這種情況,增速會減慢,但不會停止。這是深度學習最吸引人的地方。對於各大公司來說,如果資料足夠多,能帶來性能提升,這就是非常好的事情。

網路結構越深越好?

從網路結構本身發展來看,第一個關鍵的問題還在深度。但是不是越深就越好?我覺得從物理上看,不應該越深越好,但是目前情況還是網路越深,性能越好。我在這裡打一個問號,但是這個趨勢發展還是很好的。

第二,深度學習很強大,它的模型或者說網路結構很深,參數很多,其實運算複雜度以及存儲複雜度很高了。我們能否把模型的規模精簡,這也是一個發展的方向。

另外這兩年大家重視的是,有沒有可能把這些適合於 GPU 運行的神經網路能夠用硬體加速?能夠進行更快的計算?能不能用嵌入式系統運算?這也是我們現在的努力的方向。

這裡有幾個里程碑式的工作,包括 80 年代 Yann LeCun 等人做的 LeNet5,2012 年 AlexNet 能突破性地把圖像識別的錯誤率降了 10%。再之後穀歌 GoogLeNet 能夠把網路結構的複雜程度突破大家的想像。在那之前,大家還是按照 LeCun 的方式去做。微軟的 Residual Net 也是一個很好的工作,可以讓網路結構變得更深,效果也更好。

通過最初的工作,大家看到 CNN 或神經網路大概的工作過程。剛才說那種多層的線性的神經網路,每一層都有很多節點,每一個節點都會連接到下一層的一個節點中去那麼這就是用來處理一維資料的最簡單方法。

L eNet-5

卷積神經網路有兩個角度的改進。第一個是下一層的節點並不是連接上一層的所有節點,它只連接一個區域的幾個節點。比如說如果你第 1 層有 10 個節點,第 2 層有 10 個節點,那麼第 2 層一個節點連接一個小區域,一個局部的小區域,比如 3 個節點。在圖像中就意味著你可能只是連接圖像中一個小區域,一個小 patch。

第二個改進是連接這個社區域中,你的這個小區域跟連接的下個小區域的所有的連接的 weight 是一樣的,這個叫做 weight sharing(權重共用)。或者說你有一個線性的卷積核(convolutional kernel)。這個卷積核,比如說 3×3 的卷積核,有 9 個數,這 9 個數拍在這個空間上去算一個卷積,平均一下再拍到另一個空間,也算一個卷積。這幾個卷積中的卷積核本身是一樣的。所以從原來最開始那個 MLP 向下發展到 CNN,定義出了一個卷積的概念。就是這兩點不同。

第一,下一個節點,就是第二層節點只連接上一層的局部的幾個輸入。第二,這幾個局部輸入位置在空間上是共用的、固定的。你有一個輸入之後可能會有幾個卷積核。如果你有一個卷積,一個 filter,然後通過掃描方式,或者放一個點,乘加一次就算出一個數來,就會得到這邊的一個點。你有一個卷積函數的話,就可以得到這邊的一個區域,叫 feature map。如果你有六個卷積的話就是 6 ×28×28,那就是你做了 6 個卷積把輸入圖像從 32×32 變成了 28×28,那是第一層的卷積操作。然後你需要一些降採樣。

當時 LeCun 為了計算量比較小,立刻就降採樣了。降採樣之後還是 6 個 feature map。之後他在 C3 層定義了 10 個 feature map。這 10 個 feature map,每一個卷積核在這 6 個卷積核的 6 個 feature map 上,上一層的 6 個 feature map 上也進行卷積。空間上不斷地移動。卷積了之後把結果線性組合一下。線性組合本身的所有參數都是學習到的。線性組合得到下一個層的 feature map。你有 10 個,那麼就重複 10 次這個過程,就把這 6 個 feature map 變成了 10 個。

事實上,LeCun 在處理這個工作的時候是處理不了這麼多的。就是說 6 個 feature map 對應 10 個 feature map,他其實是隨機選了一下。可能只有一個 C3 層的一個 feature map 是對應於 6 個,其他幾個是對應之前的 3 個或 4 個。

當時 LeCun 的文章解釋說是為了破壞對稱性,就說不要完全對稱。

但我覺得主要還是計算量的原因。最後類似地你可以再把規模降小一點,進行降採樣,然後做一些全連接。全連接就是指每個輸入跟下一層每個輸出全連接在一起,這不是一種卷積形式。

當時這個結構有大概是 6 萬個參數,能識別手寫體的數位或者是郵編。LeCun 他們把這做完之後還真的實現產品化了。當時它發展到可以處理美國 1/3 的郵件的手寫體識別,這應該是八九十年代最巔峰的工作了。

到了 2012 年的 AlexNet,結構本身沒有本質性的提高,但是規模大了很多。

AlexNet

LeNet-5 是 6 萬個參數,那麼 AlexNet 是 6000 萬個參數。

分成上下兩層,輸入的是 24×24 的圖像,之後第一層是 11×11 卷積,也是一個 11×11 的卷積的濾波器,放到圖像上去,開始平移,乘加,平移一次,算出一個點,算出來之後做一次採樣。

採樣是指你有幾個點,你挑一個點使用。這個採樣叫 pooling。比如你有 4 個點,取 1 個最大的,那就叫 Max pooling。如果說有 4 個點,平均一下就是一個值,那就是 average pooling。只要能夠把多個點變成一個點,那麼這種某種方式就叫 pooling。

做完 Max Pooling 之後,繼續卷積,去做 Pooling。

本質上結構跟原來是一樣的,只是大了很多,以至於當時的 GPU,用一塊是訓練不了的,所以同時用兩塊去訓練。當時一個 GPU 的記憶體可能是 3G。訓練的時候開始對輸入進行一些歸一化,要加一些 dropout,就是隨機的在訓練過程中把一些節點設置為 0。

在神經網路中,很多連接、很多節點,每個節點可能都會輸出一個值,做一個 Activation,輸給下一層。那麼本來是說每個節點都會對最終結果有貢獻,那麼 dropout 就是在這過程中隨機性把 50% 或者 40% 的節點的輸出置為 0,讓它沒有貢獻,那這樣你訓練得到的分類結果,就不能依賴於所有節點都正常工作,或者所有的資訊都能收集到。這種情況下,如果還要得到一個好結果,那麼你在測試的時候,就不會非常依賴於這些資料要跟之前的資料很像,或者是見過的資料,這樣的話你就能處理一些未知的資料。這是當時就是 AlexNet 的改進,但是本質網路結構本身還是相當。

VGG

這之後一個有名的工作是牛津大學做出來的 VGG。他們其實是把 AlexNet 這種網路結構推到了極致。

一個主要的一個變化是基本上主要採取最簡單的 3×3 的卷積。他們覺得 3×3 的卷積就可以完成任務了,此時的層數是到了 19 層,參數又多了很多,之前可能是八九層。基本上來說,VGG 某種意義上就是把 CNN 推到了極致。

Network in network

2014 年的一個比較重要的工作是顏水成他們在新加坡做的 Network in Network。

之前的網路是一層一層去卷積,還是比較規則的。而顏水成做的工作是設計一些小的網路。大的網路是由一些小的網路來組成的。小的網路,比如 11×11 的卷積,在卷積之後加了一些 MLP,多層的 Perceptron,就是說每個輸入層跟輸出層都是全連接的、線性的網路連接。

另外一種意義上講,可以把它看成一種叫 1×1 的卷積。1×1 的卷積就是指它在空域上就是一個點,所以它就沒有把周圍的空間資訊做聚合了。但是它在不同的 feature map 之間做了一個線性組合。比如說你有 96 個 feature map,那麼你可以把 96 個 feature map 在某一個點上進行組合,再生成下一層的 feature map 一個點。採取比較少的 1×1 的卷積,你就可以把這種 96 個 feature map 的個數變小。你也可以考慮把它變多,比如你用這層是 96 個,下層用 128。但比較有意義的一個作用是,在這種結果下變小了之後,再進行下一級的一個小的 In Network。

我覺得這個工作一個重要的價值在於把大家的思維給稍微解放了一點。原來純粹就是不斷地去加層數,加 feature map 個數、濾波器的個數,像 VGG 那樣可能也已經差不多到頭了。VGG 的參數已經非常多非常重了。現在我們加一些小的網路,在小的網路中間,我可以把一些維數,再降低一點,降低了之後,我們可以再加點網路,就可以使網路變得更深。變深之後確實是還是有些提高的。

GoogLeNet

受 Network In Network 的啟發,2015 年,穀歌某種意義上講就 go crazy 了,他們當時做的應該是有 30 多層網路,很複雜。但其實基本上是分成兩個部分。一部分是開始這一部分,還是比較傳統的卷積,然後 pooling 的方式,之後就是累加了很多這種 Inception model。

Inception model 是什麼樣的呢?就是你有一個 Previous layer ,就是上一層,那麼你做一個 1×1 的卷積,就相當於把很多 feature map 給平均了一下,或者線性組合了一下。

這個過程可以減少 feature map,再做一些個 3×3 跟 5×5,做一些 pooling,再把這些個卷積層、卷積的 feature map 的結果拼在一起,作為下次的輸出。它能把這個單元作為一個獨立單元放在後面,後面都是類似結構單元。

每個單元其實蠻複雜的,這個複雜的一個小單元,從設計上講,借鑒了剛才那個 Network in Network 的思路,放了一些 1×1 的卷積,必須把這 feature map 減小,否則都用 3×3、5×5,那麼其實還是會很大的,會很難訓練的。

一個小單元內部考慮了 1×1 考慮 3×3,或者 5×5,實際上是說捕捉到了不同 scale 大小的圖像資訊。有的分類問題可能需要要看非常 local,或者非常小的圖像的結構,而有的分類問題需要看到大一點,那麼它的一個小單元其實是包括了不同的資訊,1×1、3×3、5×5。但是如果直接這麼用,可能會出現 feature map 太多,參數太多,學得比較困難,所以先用 1×1 卷積把它稍微降一點,把 feature map 層數降一點,組成這麼一個單元,在這個單元拼到後面,拼出 30 多層來。

層數越深,性能是會提高的,但是訓練的難度會增加。當時為了能夠快速地訓練,去收斂,不會把訓練給訓崩了,就加了幾個分支,在那個分支上,把正確圖像分類的資訊也加上去。先訓練一些個小的網路,再不斷加深,做了幾個分支。這是當時所需要的,後面一些改進可能,也就不需要這些分支了。不需要這些個分支,也可以訓練出來比較深的網路,那時候是 30 幾層。

這是第一個是 GoogLeNet 是他們的第一個版本。之後他們又推出了幾個版本。在這個過程中他們對網路結構做了一些思考和總結。

第一,在網路結構過程中有很多層,你儘量避免在早期的時候觸碰瓶頸,或者說 information bottleneck。比如說你有你有 10 層網路,第 1 層有很多卷積,第 2 層就放 1 個卷積核,就 1 個 feature map。甚至再極端一點,那個點就一個輸出,也就是說一層之後,到第二層就只有一個數。那麼你可以想像,後面無論加多少層,結果都不會好,因為資訊都被濃縮到了一個數之後,就不可能再把它發散出來。

所以他的第一個想法就是說,你儘量避免在比較早的時候有一些資訊的瓶頸,導致資訊傳遞不出去。其實這也是一個比較直觀的想法,因為我們現在需要多層的網路,是希望它通過訓練之後,到最後一層抽象出比較好的一個表達,去做分類、檢測或識別,而不是在開始的時候,資訊就沒有了,後面就更不可能得到了。

舉個例子。比如說是圖像是一個小 patch,就是 35×35,其實不一定是圖像,就是一個二維的資料,35×35 的,你有 320 個 feature map,那麼到第二層,把它限制成 17×17,然後有 320 feature map,之後後面一級,把它升成 17×17,有 640 個 feature map,那麼這 640 個 feature map 就很有可能學不到特別多的資訊了,因為你已經把它縮到 320 了。所以這是他這個圖的意思是,如果中間加了一個瓶頸,後面學到東西可能就不會那麼多。

這個怎麼改變。如果不想有瓶頸限制,那麼第二子集也還是 35×35×640。資訊是增加了,沒有瓶頸,再縮減下去,變成 17×17×640,所以最後輸出都是 17×17。左邊有瓶頸,右邊沒瓶頸。雖然沒有瓶頸,但是 35×35×640 是一個非常大的 tensor,有很多參數要學,比左邊那個 17×17×320 圖多了八倍。

所以說如果是簡單地為了沒有瓶頸加很多 feature,可能解決這個問題了,但是代價就是要學很多參數。你的資料要求很多,其實很慢。

怎麼去解決?首先左邊這一個結構是用 1×1 的去降維,這樣縮小 feature map 的個數,再統統去做卷積,另外就是說我可以把它拆成兩個並行的小網路,左邊是 17×17×320,右邊是 17×17×320,然後把它們拼在一起,結果還是 17×17×640 個 feature map。但是中間那兩個小網路是並行的,它們的參數是相加的關係,能夠容納資訊的量也比原來的 17×17×320,翻了兩倍。通過這種方式同時保證了參數不是特別多,也沒有資訊瓶頸。這是他們當時關於設計網路結構的思考。

第二個是思考是,做一個 3×3 的卷積或者 5×5 的卷積,實際上是把圖像中 spatial 的資訊聚合到一起了。這種聚合其實是可以用低維的卷積核來實現的。這就回到了 3×3 的卷積有什麼特殊的這個問題上。

其實沒什麼特殊的。那為什麼用 3×3,不用 5×5 、7×7 的卷積?這個時候有一個解釋是說,用 5×5 、7×7 的卷積是可以的,但是這些卷積本身其實可以,用 3×3 的卷積來表示,因為卷積本身其實是線性的。你用兩個 3×3 去做,是可以等價於一個 5×5。

與其用一個 5×5,不如用兩個 3×3 的兩級。好處是每一級的計算量減小了,每級最後作為卷積之後,還會有一個 activation function,還能加入一些非線性的資訊和變換。所以與其用比較大的卷積核去做網路,還不如用多層、多個小的卷積核去等價它,這樣節省了參數,又增加了網路的非線性。整個神經網路它能夠學習,能夠去能建模很多東西很多內容,是因為它參數很多,同時也因為整個網路是非線性的函數而不是一個線性函數。

到這個時候大家對 VGG 用 3×3 的 kernel,有一個更好的解釋,用小的 kernel,用多級,其實比用較大的卷積核有好處。進一步推一下,3×3 其實還可以進一步去等價於一個 1×3 和一個 3×1,就是一個水準的一個卷積,再加一個豎直卷積,用進一步拆分的卷積去聚合空間上的資訊。所以他們在設計這個網路的時候,就用了一個在 17×17 的那一級上,用 1×7 跟 7×1 的卷積,這樣一來,聚合了比較多的資訊,但是一個 1×7 再加上一個 7×1,是 14 個量級的參數,比直接一個 7×7,參數小很多,但是層數就深了很多。

所以這也是後來我們為什麼可以進一步看到,網路越來越深的一個理由. 用更深的網路、更少的參數去近似一些比較大的 kernel 很有可能是有好處的。

第三個總結是指導原則。在高層的一些網路的最後幾層中,一個點代表著最開始輸入圖像當中的一大塊區域。如果說原始圖像中哪些區域可以影響到最後的一個點,那麼在最後幾層的一個點,是有一大片區域可以影響的。這個區域,某種意義上來說,是這個點的 receptive field,意思是它能夠去影響的區域。那麼在最後幾層的時候,你就不應該去用一些很大的卷積核,儘量用一些小的卷積核,他寫的是:

Higher dimensional representations are easier to process locally.

所以你最好有些小卷積核,可以總結很多空間上的資訊。他們當時在最後幾級 8×8 的規則上面是用這種很小的卷積核。

總體來看,第一代的 GoogLeNet 中,他們估計也沒有搞清楚為什麼要這麼設計,之後就做了很多實驗,總結出一些設計的指導思路。

最後一個總結是,要平衡網路的寬度跟深度,你當然可以搞得非常深,非常窄或者是非常寬。但是基本上應該有一個大體的平衡。

ResNet

下面一個是微軟 MSRA 的非常好的工作:Residual Network。他們當時發現用一個神經網路去類比一個函數,雖然說無論多複雜的函數,我們都可以類比,但是發現層數很深之後,性能提升就會變慢。這並不是由於 Over Fitting 引起的,而是由於訓練中可能有些數值的問題引起的。微軟的一個很好的想法是,與其去類比一個函數,還可以類比函數跟原始資料的差。我們不去模擬輸出 y=F(x) 的 F (x),模擬這個 F(x)-x,模擬殘差。

這個是一個很好的想法,反應到網路結構上去,就是這邊可能還有一些常規的卷積,有一些矩陣操作。那麼有一條通路,豎向本身直接到最後,去跟模擬的結果做一個加法,之後再有一個 activation function,一般都用 ReLU,就是說負的地方是零,正的地方是線性,通過一個非線性函數去輸出。通過這種方式,你在右邊分支,這個小的網路結構類比的就是輸出-x,是殘差。所以這叫 Residual Network。通過這種方式,你就可以進一步的把網路加深,他們都嘗試了。有一個版本是 101 層,還有一個版本是 152 層,這是微軟做出的很好的工作。

Inception V4

後來,穀歌的人覺得,我們要說明我們的 Inception 網路結構一樣可以做得很深,一樣可以做到很好。這就有了 Inception V4。

整體結構是這樣的,第一步輸入圖像,有一個叫 STEM。開始的幾層是比較常規的,做一些 3×3 的卷積。之後涉及到 Inception A B C。讓 A 在 35×35 的 grid(網格)上去做卷積,B 是在 17×17,後面那個 C 是在那個 8×8 的 grid 上做卷積,然後再設計出這個結構。這些結構就符合他們之前說的那幾個設計的思想。就是儘量用 1×7、7×1 的這些卷積,去把大的卷積核拆開。第二層是用 1×7、7×1 的卷積。在 8×8 最後那幾層,要儘量用小的卷積核,這樣也把網路結構變得非常深。

他們做了一些實驗,跟 Residual Network 去比,認為加入 Residual Network 一個連線直接把輸入信號傳下去,是會有幫助的,但是也不是必須的。這個結論本身不好評價。只是說他們至少在 ImageNet 任務上,錯誤率只有 3.5%-3.6% 左右。但是是不是用了 Inception Network 就可以提高呢?我覺得這還是沒有結論的。

稍微總結一下。至少在 ImageNet 上,設計神經網路時要考慮以下因素。一個是性能,就是準確度怎麼樣;一個是網路模型的大小,就是有多少參數;一個是運算量,就是有多少個 operation。下面的圖就把剛才提到的所有網路結構做了一個很好的總結。

可以看到,至少到目前為止,Inception V4 設計得很複雜,用了那幾個原則去指導去設計,性能確實是略高一點,參數至少比 AlexNet、ResNet 還少一些,計算量也是相當。所以設計複雜的結構還是能夠獲得一些收益的。

全卷積網路

還有一個比較重要的工作是全卷積網路(Fully Convolutional Network),它可以做比較合理的分割。這種網路結構本身是正常的,但是最後輸出到一個跟輸入是相當大小的 pixel-wise prediction。它就可以去對每個 pixel 做一個 lable,就是給一個分類,比較適合做分割。我覺得這個工作比較好,雖然網路結構並不是特別特殊,但是我還是把它列在這裡。

以上這一系列網路結構的發展都是在 CNN 框架下。基本上是你給我一個輸入,我就算出了一個輸出,你再給我一個輸入,我又算出了一個輸出。這兩個輸入跟輸出,跟結果之間是沒有關係,沒有任何記憶的。所以在這個範圍內,我們可以看到,從 AlexNet9 層,到 GoogLeNet 30 層,到後來現在 ResNet100 多層,到 Inception。

從 RNN 到 LSTM 和 GRU

與 CNN 相對的另一種思路是把網路中加入一些記憶的單元,某種意義上講,也是使網路深了很多。

我們可以看到原來的一個神經元,就是說你有一個輸入 X,你有一個輸出,這個過程本身是無狀態,無記憶的。第一個想法就是,我們是不是可以加入記憶,或者加入一些狀態。每個神經元本身有一個狀態,那麼你的輸出就不止決定於當前時刻的輸入,還決定於本身實際上存的資料,兩個數決定出一個輸出。如果你做這方面的改進之後,本身有個狀態,狀態本身 X 乘上一個 W,跟你輸入 X 乘上一個 U,最後經過 V 輸出 O。這個結構本身也可以等價的看成一個很深的網路,從時間上講它是一個很深的網路。Xt-1 是 t-1 時刻的輸入,有個狀態 St-1,那麼下一個時刻就相當於,St-1 跟 St 決定輸出,同時也決定狀態 St,再決定下一個時刻。如果你考慮神經元有了狀態跟記憶之後,從邏輯上講或者概念上講神經網路本身就等效於一個非常非常深的網路。

所以這是另外一個角度把網路變得 deeper 的一個方面。這種方式被稱為 Recurrent Neural Network——RNN,後面有一些發展,一個就是 LSTM——長短時間記憶,還有一個簡化版就是 gated recurrent network。

概念上簡單地來說,我們加了一個狀態,那麼每個神經網路神經元就記住了一個數,那麼這個數會對多長時間的預測有影響呢?是可以記住一個時間單位,還是十個時間單位還是一百個時間單位?從道理上講,其實沒有限制,你可以記錄很多時間單位,但實際上其實是很難控制的。這裡的一個改進就是 LSTM,它把長時間的記憶跟短時間記憶比較顯式地在網路結構中描述出來。

這是 LSTM 網路。看上去蠻複雜的,它有三個門,或者說三個小的神經網路單元,來決定什麼資訊去記憶到這個神經元裡去,什麼資訊去輸出,什麼資訊去更新自己的狀態。這個 Xt 就是指 t 時刻的輸入,Ht 是 t 時刻的輸出,還有一個 Ct 是這個 cell 或者結構本身記錄的資訊的內容。

首先,你有一個輸入,就是上一個時刻的輸出跟現在時刻的輸入來決定你有多少資訊會繼續保留在這個單元,叫 forgetting gate,在這裡是 Ft。下一個需要的是上一時刻的輸出和現在時刻輸入來決定當前的內容,就是 Ct。C 是 cell 本身的內容,意思是有多少資訊是繼續保留。所以通過那個 [Ht-1,Xt],算出來一個 It 那個 Sigma 就是 whatever 一個函數了,一個 activation function。Wt 是某種意義上你會學到一個 weight,一個矩陣。重要是 Ht-1 跟 Xt 決定了一個 it,it 去決定 Ct。也就是說什麼資訊能繼續保留下來。ft 是指需要多少記憶去忘記,它和 Ct 這一時刻,這二者會做一個線性組合去決定 Ct,決定繼續保留在這個時刻這個單元裡的資訊內容。最後還有一個 Ot,就是輸出的 gate,就是說決定一下 Ht-1 跟 Xt,去學習一些參數,去決定哪些作為下一個時刻輸出。

雖然看上去是很複雜的,但是總的來說,從概念上講,就是上一時刻的輸出,跟現在當前時刻的外界的輸入,去決定哪些資訊是繼續保留的,哪些資訊是需要遺忘的,哪些資訊是需要輸出的。那麼這個建模能力就比較強,可以說是很全面很綜合了。更重要的是,這些函數本身都是可以根據你的輸入資料學出來的,也就是說,對於每一個這樣的單元,哪些是記性型記憶,哪些記憶型輸出 哪些是保留都是可以學出來的。

其實後面會有很多變種,比如說你可以看到這些所有的資訊輸入的函數都是 ht-1 的一個 It,就是說只由上一時刻的輸出,跟當前時刻輸入決定。那麼你可能也考慮到當前那個狀態 Ct,那就是一系列 RNN 變種了。

一個比較有意義的變種是它可以把這個 RNN 進一步簡化,而且它的性能可能接近的就是 gated recurrent network、gated recurrent unit。就相當於把剛才有三個這種控制的門,forgetting gate、input、output。把它合併成兩個,變成 zt 跟 rt,其中一個還是控制輸出。另外一個就是說,原來是 ft 跟那個 rt 兩個數位去控制哪些資訊繼續保留,那麼現在要合併成一個 zt。就是說我只考慮這一個因素。你哪些資訊保留,1-Zt 跟那個 Zt 平均一下。我覺得目前看來這是比較 promising(有前途)的一個改進了。它進一步簡化了,而且建模能力還是相當的。

這一系列工作為的是如何讓 network 更深,而且是在時間運用角度上更深。

Fixed point neural network

前面兩塊內容基本上介紹了一下神經網路結構如何變得更深或者網路結構的發展。下面再簡單介紹一下另一個方向,讓網路變小,或者是參數量變得更簡單或者參數量變少。簡單的意義是講原來那些參數都是,比如說 floating point,32 位的 floating point,或者是 16 位的 floating point。那麼下一步的工作是我們能不能把這些參數用一些 8 位元的定點,或甚至一些二值化(Binary)的+1 和-1 這些數來表示。這些工作可以讓網路變得更羽量級,所需的存儲更小。

所以這一個工作是把這個網路定點化,第一步主要是把這些參數進行量化,這一系列的工作我覺得到極致了,就是可以 binary——二值化的網路。如果你把網路結構每個參數、每個權重都二值化,這樣就非常非理想,適合用硬體去實現,而且效率就會高很多。

這裡有一個簡單的比較。之前如果是浮點運算的話,那每個卷積其實就是乘加運算,就是一個核往那一放,對應位置相乘,乘完之後累加,得出一個數。如果是二值化的網路,就變成了一種 XNOR 的操作,加上 bit count 相乘,就是做一些反的亦或,然後去累加,其實就是去數到底有多少個 0,多少個 1,是奇數個 1,還是偶數個 1,決定出結果。這個操作不僅簡化了而且也更適合硬體來實現。

一個比較好的一個工作是它如何去訓練這樣的一個二值化的網路。二值化網路在訓練過程中的梯度還是用浮點來表示的,否則你沒辦法去計算梯度,去更新這些 weight 了。在反向傳播的時候仍然要用浮點去表示,但網路在正向去算的時候,就強迫它們每個節點、每個 activation 輸出都是二值化的,可以通過進行限制一下範圍或者做一個直接的量化來變成二值。所以正向的是二值,反向的時候可以用浮點操作,去更新這些參數。

有一些比較新的工作證明至少目前在一些小的集合上,比如 Cifar 10,它的性能跟浮點是很接近的。它的存儲空間可以想像一下,如果從 32 位浮點直接變成二值,大約是能夠簡化 32 倍了。

所這也是現在神經網路結構發展一個很重要的方向,用網路結構表示精度,去簡化,能夠更適合硬體的使用。

下面有一些比較具體的操作,能保證訓練成功。因為表示的精度變差後,還要訓練出來一個比較穩定的性能比較好的網路結構是需要一些 trick 的。

這些技巧跟網路結構本身沒有關係。實際上深度神經網路結構本身有改進之後,它對很多工作都是有幫助的。我沒有談具體的分類、檢測或者分割但是,實際在很多工上,任務本身的 formulation 是沒有變的。

什麼變了呢?變的是這種最複雜的需要建模那個部分替換成神經網路,這邊就舉一個簡單的例子,強化學習。

強化學習

強化學習,Reinforcement Learning 是現在相當火的一個概念。強化學習、監督學習、非監督學習都屬於機器學習。監督學習(supervised learning)的每個資料都有一個標注的結果後,你學到一個集合函數。無監督學習(unsupervised learning)沒有標注,就要學出一個函數來去擬合。強化學習(reinforcement learning)不是給定了標注之後再學習,而是一步一步在一種 online 的狀態下去學習,這種學習你告訴它好壞,它每次去做一點改進。所以 Reinforcement Learning 跟 Deep Learning 之間不屬於隸屬的關係,而是不同的 learning Paradigm——學習範式。

Reinforcement Learning 存在很多年了,最近我們看到它在圍棋,或者一些自動控制的任務中,都有很大的改進。改進的本身是指最核心的一些部分現在用了深度神經網路去做近似。

所以 Reinforcement Learning 這個概念本身就是說我是一個 agent,是能夠去自主做決策的實體。我用一個大腦來表示,它可以感知周圍的狀態、環境,它會挑選一些它能選擇的 action 去影響環境。影響環境之後,環境的狀態會改變,同時給出回饋,一個 reward,也會更新自己的狀態。這個過程是一步一步的:給一個 action,得到一個回饋改變了環境,改變了自己,再不斷地去改進——希望我的 reward 能夠最大化。這就是強化學習的過程。

Agent 在學習如何最大化自己的利益時,有兩個很重要的函數。一個是如何去選擇採取 action 的方法,到底是用什麼策略去選擇採取什麼行動,這個一般叫策略函數(policy function)。另外一個是能夠去選擇這些方法的原因。它自己對這個 action 能帶來的這種回饋,會有一個評估,這個評估叫 value function(價值函數)。

這些概念其實都是早就有了。現在 policy function 和 value function 本身就是比較複雜的函數。用深度神經網路去類比深度的 DNN,讓 DNN 去模擬去近似。最著名的應用是在 AlphaGo 裡了,我就不多講了。它將 policy network 和 value network 都用 CNN 去表示、去近似。

這裡就把它作為一個例子,說明這些深度神經網路本身的結構在不斷發展,它的建模能力不斷提高。提高之後,它就可以用來近似任何任意的比較複雜的函數。如果具有近似複雜函數的能力,那麼對很多工就有很大的幫助,包括增強學習、圖像識別、語音控制。比如在今後的無人車控制中,可能會用這種強化學習的方式去不斷地改進、去選擇自己的路徑。但是對於路徑本身,其實沒辦法用一個很簡單的一個函數去規定好每次獲得什麼輸入之後要去做什麼樣的改變什麼規劃什麼路徑。

這個肯定是很複雜的函數。這些函數可以用之前所介紹的那些神經網路中比較好的一些來做。也就是說,你有一個很好的神經網路結構之後,你就可以潛在地用它去做一個非常複雜的非線性函數的類比,然後可以完成很多工,這個在很多應用中都會有説明。

OK,這基本上就是我今天想分享的內容。

當時 DeepFace 每天處理 Facebook 上大約 4 億張人臉識別,現在應該更多了。基本上每一張上傳到 Facebook 的人臉會先經過一個人臉檢測,再進行後端的比對識別,向用戶推薦一下說這是不是人臉。如果我們識別出來了之後,就會打一個名字,如果沒有識別准的話,我們可能會列 4、5 個選項。如果說我們比較有把握,Facebook 就會把照片向用戶的朋友推薦或者發一些消息,提高使用者的活躍度。

這個工作我們只敢說接近人眼的性能,後來很多人它說超過了人的能力,但我覺得還沒到完全超過人的能力那個程度,還是有一定的差別。因為電腦非常適合在大規模的情況下做人臉識別,這其中還有一些限制,需要人臉偏正面、偏清晰。但是對於人說,如果是熟悉的親戚、朋友,甚至你看到一個背影,看到一點點,看到一撇,就可以看出這個人是誰。

整體來講,在一定規模下的人臉識別,機器肯定超過人的水準,但是遇上非常難和極端的條件,機器可能還是不能達到人的水準。這個工作是深度學習之後,人臉識別領域中應用最多的工作,也被 Science 等很多媒體報導過。

再稍微簡單介紹一下地平線機器人。地平線機器人成立于 2015 年 6 月,目前的總部在北京。我們在南京有研發中心,另外在深圳、上海都有辦公室。在深圳,我們主要是做人工智慧跟硬體相結合,在深圳是非常適合做硬體相關的生產的。我們上個月在上海剛剛成立了一個聚焦於汽車自動駕駛方面研發的分公司,位於上海汽車城,產業很聚集,進行相應測試也非常方便。

主要的員工和同事來自于百度、Facebook。我們硬體團隊主要來自於 NOKIA,也有很多同事來自于微軟、TI 和英偉達。目前我們還是偏研發的公司,超過 80% 的同事都是在做演算法、軟體硬體研發的工作。很多人有海外求學的經歷,14-15% 是有博士學位的。

目前我們所做的事情主要是希望把深度學習的方法跟硬體相結合,跟嵌入式系統相結合,能夠成功落地,影響大家生活。目前的主要目標是希望通過十年、二十年的努力,能夠讓世界上上千種設備都具有智慧的功能,讓大家生活更加安全、更加便捷、更加有序,具體來講我們現在聚焦一下幾個業務方向:

第一個,自動駕駛或者智慧汽車。這個方向大家也有所瞭解,這幾年非常火熱,不斷有大新聞曝出來。我們相信這個領域不僅僅可以國家整個社會的運行、整個社會的生活,而且也是人工智慧能夠發揮很大作用的場景。

第二個,智慧家居或者智慧生活。2015 年之前,大家聽到的智慧家居,歸結於一個詞就是 WIFI,家裡的設備能夠進行聯網控制,我們認為其實這是不夠的,還是非常不方便的。大家在外出工作的時候,經常會用手機溝通、打車。但是回家之後如果再掏出手機,點開 APP,再找到幾個按紐,對家裡的東西進行操控,這是挺不方便,挺不自然的。在家裡,人們希望手機可以放在一邊,能夠更自然地跟家裡各種電器、各種設備交互,這是我們的第二個方向,能夠在智慧家居的場景下,將人工智慧鑲嵌到設備裡面去,給大家提供更便捷的對話模式。

第三個,智慧安防或者智慧安全。這是跟攝像頭相關的,也是一個很好的場景,能夠讓圖像識別技術真正地説明大家,讓這個社會更安全,讓這個城市更安全。

這是我們主要做的三個業務方向。總得來說,我們希望把人工智慧、深度學習、深度網路這些技術放到嵌入式系統中去,提供一個從軟體到硬體,甚至到晶片的全套解決方案,説明這些產品、設備都具有這種人工智慧的功能。

我們公司叫做地平線機器人,但是我們對機器人的定義稍微有點不一樣。我們其實並不特別關注那些長得很像人的,有手有腳,能跑能跳的機器人。我們認為只要是一個機器,有感知環境,自主決策的功能,慢慢就發展成機器人。我們業務或者努力方向,更多是把大家生活中的設備變得更聰明,慢慢向機器人的方向發展。這是我們希望做的事情和正在做的事情。

我們從成立之後,也得到了很多世界知名 VC 的支援,包括晨興資本、紅杉資本、也包括李開複老師。去年,我們完成了 A 輪融資。吳亞軍老師對我們也很支持,她是中國非常著名的女企業家;還有 YuriMiiner,他是矽谷裡非常傳奇的俄羅斯大亨,他投資的早期 Facebook 等等公司,基本上屬於投了就能中的。

什麼是人工智慧?

我們大家經常說人工智慧。但什麼是人工智慧,希望大家有一個共識和定義。如果我們查一查百科或者說官方的權威定義,人工智慧是學習和設計一種 Intelligent Agents 的學科。這個 Agent 本身能夠感知環境,能夠採取一些行動,提高自己成功或者是做出一件事的機會。

這個定義本身有幾個點可以注意一下。首先是 Intelligent Agent 這個詞,這個詞語說明能夠執行 AI 的載體並不是一個簡單的機器或者一個電腦,有可能是一個非常大規模的、非常抽象的,能完成這些功能的設備的集合,甚至可能並不是設備,而只是一些程式。總之,這是一個非常寬泛的詞。

另外,它能對環境主動感知,採取行動,實現自己一定的目標。這裡包含三個含義,作為一個 AI,首先對物理世界感知(sensing),sensing 之後,相當於把這些獲得的資訊納入數位化的世界,在數位化的世界之內對這些資訊進行理解、分析、思考。重要的是最後一步,去回饋這個物理世界,做一些控制和行動,反過來影響物理世界,這是整個 AI 系統和人工智慧系統所具備的最全面的三個階段。

如果我們做的工作跟某一個階段相關,我覺得這也是屬於 AI 的研究。這三個環境包括 Sensing 、Thinking、Acting,也包括了很廣的概念。比如說 PC 上網,敲鍵盤打字,是把物理環境的資訊輸入到了數位世界中,在比如當攝像頭、麥克風,還有在汽車中的雷射雷達或者是其它的感測器,這些設備把我們物理世界的信號轉換到了電腦能夠處理的信號。在電腦的處理中,可以對這些資料進行分類、搜索、排序,這些都是理解的過程。再之後,我們對這個世界有一個回饋,包括可以根據搜索的內容,建議一些廣告,或者是對於語言的理解之後,比如說要打車哪裡,它可以自動給你導航,也包括圖像或者人臉識別之後,也許可以讓大家找到你的名字,找到你的一些偏好,做一些科學化的設置,包括像無人機、無人車可以根據信號自主避障、尋徑,這是回饋到物理世界進行控制。這些都是人工智慧研究的方面。

這個不多說了,確實很火,所有大公司還有一些政府都投入了很多的精力。谷歌原來是移動為先的公司,後來說要成為 AI 為先的公司,這個趨勢很多公司都看到了。Mobile 文化可能是一個很重要的浪潮了,下一個競爭會升級,升級到智慧,比的是誰自動化的控制、自動化資料分析能夠更快、更好。

稍微總結一下,為什麼人工智慧比較重要?從計算的角度可以看到,過去電腦的發展經歷了大概兩個時代。2000 年-2010 年左右或者更早是 PC 互聯網時代。就是我們有電腦、網路,可以上網流覽。這個時代其實催生了比如說像搜尋引擎、門戶網站,催生了很多很偉大的公司,這是一個時代。

第二個時代是我們正在經歷了的移動互聯網時代,手機的發展以及 4G 網路通訊的發展。手機我們幾乎是離不開的,每天不知道有多少比例的時間花在手機上看消息、去打車、找路、看小說、看電影。

未來會是什麼樣的時代?大家看到互聯網催生了很多公司,比如說高通、蘋果這些公司在那個時代做的很好,現在移動互聯網的發展已經比較成熟了,機會可能並不像 5 年前那麼多了。再往下看,我相信這個時代還沒有結束,還會延續很多年。

新的時代也慢慢興起,就是物聯網+智慧,IoT。IoT 是指所有的設備,不僅僅都要上網而且也會具有一定的智慧,讓這個世界更緊密地聯繫起來。從這個角度來講,這會是今後 5 年到 10 年會有大的發展。

總得來說,從大的發展來看,電腦的角度有三個因素,計算、連接、智慧。連接和計算現在有很大的發展,我們覺得下一步時代就是關於智慧,也是關於軟體方面智慧的發展。

什麼是深度學習?

大家都提深度學習,什麼是深度學習?有一個非常簡單的定義。我們有一些沒有經過處理的原始資料,可能是語音、文字、圖像,也可能是一些感測器得到了沒有經過處理的資料。而深度學習本身的任務就是對這些原始資料進行數位化的表達,表達完成之後就可以做很多事情。做什麼事情?這就跟應用相關了。

深度學習的主要定義或者是要做的事情就是端到端的學習,能夠把原始資料轉化為某種程度上的表徵的方法,只要不是最簡單的數模轉換,其實都可以放到資料的框架裡面來。

深度學習的歷史沿革

這裡還是要簡單回顧一下歷史,最早起源於 1957 年的 Mark I perception。從數學上來講是一個很簡單的形式,就是你有若干個輸入,每一個信號輸入乘上一些權重,然後經過一個函數輸出,這個函數也是線性函數。這是神經網路或者是深度學習最最簡單的起源了。比較有意思的是,這個資料模型當時是通過硬體的方式提出來的,用物理的連線去聯接這些信號進行輸出的。但是為什麼它算是神經網路的起源?因為這些聯線的權重不是固定設好的,如果固定設好的,那就是電路系統,這些權重通過資料自動調節改進來確定的,所以它就是 learning machine 的雛形。

當年的紐約時報就報導說這是電腦能夠很快學習、走路、談話、理解、寫字,甚至繁殖的前兆吧。我們經過了60 年的發展,現在大概在 See 和 Write 左右。

當時大家對這個東西感到很興奮,覺得這個東西潛力很大。但是這個感知機還是線性的,經過實驗發現,它對一些基本的函數都沒有辦法建模或者描述,比如說異或 SOR。所以之後十年神經網路迎來了一個低谷期,大家覺得用途可能不是很大。1980 年,Fukushima 提出了神經網路多層的結構,但是並沒有提出如何學習這個結構。1980 年包括 Yann LeCun 等,大概有三、四個人,他們都提出了類似反向傳播的方式,能夠把這個神經網路學出來,這就是一個非常重大的進展里程碑了。

之後,80 年代到 90 年代有一個非常快速的發展時期,大家的期望值也很高,希望可以做很多的事情,但是由於種種的限制,其實沒有辦法做很複雜的功能,只能做到簡單的圖像識別,簡單的手寫 OCR,之後發展趨勢又掉下來了。在學術界,大概有差不多 7、8 年的時間,神經網路相關的研究基本上是很難發表的。大家都不在乎,認為神經網路不就是這樣子嘛!

神經網路的再度興起始於 2006 年,G.Hinton 提出深度神經網路。不過他當時不敢提深度神經網路這個名字。這種結構可以通過一層一層來學習,來得到一個比較好的結果。之前的網路太深,大家是學不了的。這種網路結構給大家的啟發是並不需要逐層地學習,通過端到端的學習也可以實現,而且學到一定深度之後,建模能力也是比較強的。

自那之後,深度神經網路的優越性能就不斷爆發。語音辨識是第一個被突破的領域。IBM、微軟以及穀歌等等幾個公司發表了一些文章,有了很大的突破,因為之前基於 HMM(隱瑪律科夫)的識別大概有 10 年、15 年沒有本質性的改進了。再之後 Jeff Dean 在穀歌率先實現了大規模的深度學習網路的基礎架構,當時是基於一萬個 CPU,比較重要的結果就是自動學習識別出是貓臉還是狗臉。穀歌做這個事情是有示範作用的。

再之後大家就很清晰了,2012 年 ImageNet 中,微軟將識別率降了 10 個百分點,這是很大的突破。之後,大家將這個技術應用到人臉識別和圖像識別中。到 2014 年、2015 年時 RNN 或者帶有一定記憶的程度網路開始流行,對於序列學習,以及生成文字上都有很大的提高。再之後應用到自動駕駛。

2016 年的 AlphaGO,基本上算是橫空出世,一下子就把 AI 從學術界推到了公眾領域中,做了一個很好的科普。2016 年、2017 年其實還在迅速的發展,包括 2016 年之前就有的對抗生成網路,2017 年穀歌剛剛公佈了用 TPU 晶片方式做成網路的結構。他們應該是 2015 年就做出來了,估計這個 TPU 不是他們第一代的產品,估計是把第一代的架構公佈了,現在已經做第二代。

總之從 2006 年開始,深度學習進入波瀾壯闊的快速發展時期。我們希望 2020 年以後或者是神經網路不光運行在雲端,用上百台的 GPU 跟大家下圍棋,而是希望真正運用到設備端,來影響大家的生活。這是一些簡單的歷史,大家可以看到 ANN、CNN、RNN、LSTM 等等,它們基本上都屬於神經網路,神經網路本身屬於深度學習,深度學習屬於 AI,這是一個大體的範疇。

在我們講這些神經網路結構之前,先簡單介紹一下架構,讓大家有一個統一的認識。這是最簡單的神經網路,只要超過兩層三層以上,都算是深的網路。

這種一般叫做 Multi-layer Perceptron(MLP,多層感知機)。有一些輸入層,輸入層是某種資料,最終會得到一個輸出,輸出可以是一個數,也可能是一個向量,是一個二維的或者是 tensor,你希望學到神經網路達到一定目的,實現你類比所達到那個目的的函數,比如一個函數 F 從輸入到輸出。這個網路本身有很多的隱層,每一層有很多的節點,節點都是線性的,互相相聯的,就是一個簡單的 MLP。有這個結構之後,我們需要定義這個輸入,然後定義這個輸出,再定義一個 Loss Function(損失函數),來評價神經網路測算出來的結果跟你希望的結果是不是一致的。有了輸出、輸入、評價這三個過程,就實現了機器學習。

在這個學習的過程中,大量的資料放到輸入層,給這個網路隨機分配一些初始的非常小的數來算,算出來之後結果肯定不對。也沒有理由是對的,有了這個不對的結果之後,可以反向根據這個結果與期望之間的差異,對每一個節點的參數求導。求導了之後沿著這個梯隊方向,稍微修改一點點,希望能讓這個結果有一點點變化,其實這個變化是沒有保證的。但是只要反復按照這個方式運行,給它一個結果去前向計算,得到一個輸出,跟你的希望結果去比較,計算這個誤差,通過誤差反過來調整這個參數以及權重,反復運行,之後就可以實現一個比較好的函數的擬和效果,擬和出你想實現的目標。

概念上說,這個每一步現在都已經發展出很多演算法,你用一個數據點去算\去修改網路,可能是很不穩定的,因為你這個點的 lable 可能是錯的。這時候你可能需要一個 minibatch 的方法,把一批資料結果平均一下,根據它們的方向去修改。修改的過程中,修改力度(learning rate)可以調整。開始的時候,拿不准的就學得快一慢,慢慢有把握了,就學得慢一點。

後來有一些比較新的方法,可以在這個過程中做出一些規劃,讓這個數值不要太大,數值上比較穩定,能快速地收斂。

這個網路的結構以及學習方法在上世紀八九十年代就有了,當時它有一些問題導致大家覺得它可能不是那麼有用。包括 over-fitting(過擬合),意思是在資料不是很多的情況下,網路參數很多。這種情況,雖然可以學到一個非常好的結果,但是來了一個新的結果未必能夠正確處理,這就是 Over-fitting。還有就是資料結果可能會有一些標注的錯誤,你不能保證你所有的標注都是 100% 正確的。另外,網路結構本身是一個黑盒子,它做什麼事情,大家很難理解。

現在有了很多改進。首先 Over-fitting 不再是問題了,因為資料足夠多。比如說人臉識別,如果有世界上所有的人臉來做訓練,就已經沒有必要 Over-fitting 了,因為你已經沒有更新的資料了。如果資料足夠多的話,Over-fitting 這個事情並不是那麼重要。

第二,大量資料的處理需要很高的性能,大家發現用 GPU 這種新架構,並行去練,可以處理很多資料,比 CPU 效率高很多,這確實能夠推動神經網路發展的一個很重要的關鍵因素。

剛才提到的訓練中的很多新改進,包括 dropout、batchnormalization 等都對處理更多資料,快速收斂有所改進等,這些是演算法上的提高。

但有一件事沒有本質性的改變,這個網路結構還是屬於 black magic。但是本質上還是實驗出來。實驗出來得到一些比較好的結構、功能,然後再反過來給大家解釋一下,它總是會有一些道理。

所以今天我可能稍微回顧一下各種網路結構和它設定的原則和思考。應該指出的是,確實還沒有放置四海皆可用的結構或者一個絕對正確的設計原則。有一些思考,但是這些思考是不是全面和正確,現在還不好說。這也是一個領域,大家可以繼續探索研究的。

為什麼深度學習現在能夠獲得這麼大的關注,跟其他的方法是有一些區別,隨著資料的,增加別的方法的性能在某一個點上不會再提升了,某種意義上飽和了,但是深度學習目前為止還沒有明顯地發現這種情況,增速會減慢,但不會停止。這是深度學習最吸引人的地方。對於各大公司來說,如果資料足夠多,能帶來性能提升,這就是非常好的事情。

網路結構越深越好?

從網路結構本身發展來看,第一個關鍵的問題還在深度。但是不是越深就越好?我覺得從物理上看,不應該越深越好,但是目前情況還是網路越深,性能越好。我在這裡打一個問號,但是這個趨勢發展還是很好的。

第二,深度學習很強大,它的模型或者說網路結構很深,參數很多,其實運算複雜度以及存儲複雜度很高了。我們能否把模型的規模精簡,這也是一個發展的方向。

另外這兩年大家重視的是,有沒有可能把這些適合於 GPU 運行的神經網路能夠用硬體加速?能夠進行更快的計算?能不能用嵌入式系統運算?這也是我們現在的努力的方向。

這裡有幾個里程碑式的工作,包括 80 年代 Yann LeCun 等人做的 LeNet5,2012 年 AlexNet 能突破性地把圖像識別的錯誤率降了 10%。再之後穀歌 GoogLeNet 能夠把網路結構的複雜程度突破大家的想像。在那之前,大家還是按照 LeCun 的方式去做。微軟的 Residual Net 也是一個很好的工作,可以讓網路結構變得更深,效果也更好。

通過最初的工作,大家看到 CNN 或神經網路大概的工作過程。剛才說那種多層的線性的神經網路,每一層都有很多節點,每一個節點都會連接到下一層的一個節點中去那麼這就是用來處理一維資料的最簡單方法。

L eNet-5

卷積神經網路有兩個角度的改進。第一個是下一層的節點並不是連接上一層的所有節點,它只連接一個區域的幾個節點。比如說如果你第 1 層有 10 個節點,第 2 層有 10 個節點,那麼第 2 層一個節點連接一個小區域,一個局部的小區域,比如 3 個節點。在圖像中就意味著你可能只是連接圖像中一個小區域,一個小 patch。

第二個改進是連接這個社區域中,你的這個小區域跟連接的下個小區域的所有的連接的 weight 是一樣的,這個叫做 weight sharing(權重共用)。或者說你有一個線性的卷積核(convolutional kernel)。這個卷積核,比如說 3×3 的卷積核,有 9 個數,這 9 個數拍在這個空間上去算一個卷積,平均一下再拍到另一個空間,也算一個卷積。這幾個卷積中的卷積核本身是一樣的。所以從原來最開始那個 MLP 向下發展到 CNN,定義出了一個卷積的概念。就是這兩點不同。

第一,下一個節點,就是第二層節點只連接上一層的局部的幾個輸入。第二,這幾個局部輸入位置在空間上是共用的、固定的。你有一個輸入之後可能會有幾個卷積核。如果你有一個卷積,一個 filter,然後通過掃描方式,或者放一個點,乘加一次就算出一個數來,就會得到這邊的一個點。你有一個卷積函數的話,就可以得到這邊的一個區域,叫 feature map。如果你有六個卷積的話就是 6 ×28×28,那就是你做了 6 個卷積把輸入圖像從 32×32 變成了 28×28,那是第一層的卷積操作。然後你需要一些降採樣。

當時 LeCun 為了計算量比較小,立刻就降採樣了。降採樣之後還是 6 個 feature map。之後他在 C3 層定義了 10 個 feature map。這 10 個 feature map,每一個卷積核在這 6 個卷積核的 6 個 feature map 上,上一層的 6 個 feature map 上也進行卷積。空間上不斷地移動。卷積了之後把結果線性組合一下。線性組合本身的所有參數都是學習到的。線性組合得到下一個層的 feature map。你有 10 個,那麼就重複 10 次這個過程,就把這 6 個 feature map 變成了 10 個。

事實上,LeCun 在處理這個工作的時候是處理不了這麼多的。就是說 6 個 feature map 對應 10 個 feature map,他其實是隨機選了一下。可能只有一個 C3 層的一個 feature map 是對應於 6 個,其他幾個是對應之前的 3 個或 4 個。

當時 LeCun 的文章解釋說是為了破壞對稱性,就說不要完全對稱。

但我覺得主要還是計算量的原因。最後類似地你可以再把規模降小一點,進行降採樣,然後做一些全連接。全連接就是指每個輸入跟下一層每個輸出全連接在一起,這不是一種卷積形式。

當時這個結構有大概是 6 萬個參數,能識別手寫體的數位或者是郵編。LeCun 他們把這做完之後還真的實現產品化了。當時它發展到可以處理美國 1/3 的郵件的手寫體識別,這應該是八九十年代最巔峰的工作了。

到了 2012 年的 AlexNet,結構本身沒有本質性的提高,但是規模大了很多。

AlexNet

LeNet-5 是 6 萬個參數,那麼 AlexNet 是 6000 萬個參數。

分成上下兩層,輸入的是 24×24 的圖像,之後第一層是 11×11 卷積,也是一個 11×11 的卷積的濾波器,放到圖像上去,開始平移,乘加,平移一次,算出一個點,算出來之後做一次採樣。

採樣是指你有幾個點,你挑一個點使用。這個採樣叫 pooling。比如你有 4 個點,取 1 個最大的,那就叫 Max pooling。如果說有 4 個點,平均一下就是一個值,那就是 average pooling。只要能夠把多個點變成一個點,那麼這種某種方式就叫 pooling。

做完 Max Pooling 之後,繼續卷積,去做 Pooling。

本質上結構跟原來是一樣的,只是大了很多,以至於當時的 GPU,用一塊是訓練不了的,所以同時用兩塊去訓練。當時一個 GPU 的記憶體可能是 3G。訓練的時候開始對輸入進行一些歸一化,要加一些 dropout,就是隨機的在訓練過程中把一些節點設置為 0。

在神經網路中,很多連接、很多節點,每個節點可能都會輸出一個值,做一個 Activation,輸給下一層。那麼本來是說每個節點都會對最終結果有貢獻,那麼 dropout 就是在這過程中隨機性把 50% 或者 40% 的節點的輸出置為 0,讓它沒有貢獻,那這樣你訓練得到的分類結果,就不能依賴於所有節點都正常工作,或者所有的資訊都能收集到。這種情況下,如果還要得到一個好結果,那麼你在測試的時候,就不會非常依賴於這些資料要跟之前的資料很像,或者是見過的資料,這樣的話你就能處理一些未知的資料。這是當時就是 AlexNet 的改進,但是本質網路結構本身還是相當。

VGG

這之後一個有名的工作是牛津大學做出來的 VGG。他們其實是把 AlexNet 這種網路結構推到了極致。

一個主要的一個變化是基本上主要採取最簡單的 3×3 的卷積。他們覺得 3×3 的卷積就可以完成任務了,此時的層數是到了 19 層,參數又多了很多,之前可能是八九層。基本上來說,VGG 某種意義上就是把 CNN 推到了極致。

Network in network

2014 年的一個比較重要的工作是顏水成他們在新加坡做的 Network in Network。

之前的網路是一層一層去卷積,還是比較規則的。而顏水成做的工作是設計一些小的網路。大的網路是由一些小的網路來組成的。小的網路,比如 11×11 的卷積,在卷積之後加了一些 MLP,多層的 Perceptron,就是說每個輸入層跟輸出層都是全連接的、線性的網路連接。

另外一種意義上講,可以把它看成一種叫 1×1 的卷積。1×1 的卷積就是指它在空域上就是一個點,所以它就沒有把周圍的空間資訊做聚合了。但是它在不同的 feature map 之間做了一個線性組合。比如說你有 96 個 feature map,那麼你可以把 96 個 feature map 在某一個點上進行組合,再生成下一層的 feature map 一個點。採取比較少的 1×1 的卷積,你就可以把這種 96 個 feature map 的個數變小。你也可以考慮把它變多,比如你用這層是 96 個,下層用 128。但比較有意義的一個作用是,在這種結果下變小了之後,再進行下一級的一個小的 In Network。

我覺得這個工作一個重要的價值在於把大家的思維給稍微解放了一點。原來純粹就是不斷地去加層數,加 feature map 個數、濾波器的個數,像 VGG 那樣可能也已經差不多到頭了。VGG 的參數已經非常多非常重了。現在我們加一些小的網路,在小的網路中間,我可以把一些維數,再降低一點,降低了之後,我們可以再加點網路,就可以使網路變得更深。變深之後確實是還是有些提高的。

GoogLeNet

受 Network In Network 的啟發,2015 年,穀歌某種意義上講就 go crazy 了,他們當時做的應該是有 30 多層網路,很複雜。但其實基本上是分成兩個部分。一部分是開始這一部分,還是比較傳統的卷積,然後 pooling 的方式,之後就是累加了很多這種 Inception model。

Inception model 是什麼樣的呢?就是你有一個 Previous layer ,就是上一層,那麼你做一個 1×1 的卷積,就相當於把很多 feature map 給平均了一下,或者線性組合了一下。

這個過程可以減少 feature map,再做一些個 3×3 跟 5×5,做一些 pooling,再把這些個卷積層、卷積的 feature map 的結果拼在一起,作為下次的輸出。它能把這個單元作為一個獨立單元放在後面,後面都是類似結構單元。

每個單元其實蠻複雜的,這個複雜的一個小單元,從設計上講,借鑒了剛才那個 Network in Network 的思路,放了一些 1×1 的卷積,必須把這 feature map 減小,否則都用 3×3、5×5,那麼其實還是會很大的,會很難訓練的。

一個小單元內部考慮了 1×1 考慮 3×3,或者 5×5,實際上是說捕捉到了不同 scale 大小的圖像資訊。有的分類問題可能需要要看非常 local,或者非常小的圖像的結構,而有的分類問題需要看到大一點,那麼它的一個小單元其實是包括了不同的資訊,1×1、3×3、5×5。但是如果直接這麼用,可能會出現 feature map 太多,參數太多,學得比較困難,所以先用 1×1 卷積把它稍微降一點,把 feature map 層數降一點,組成這麼一個單元,在這個單元拼到後面,拼出 30 多層來。

層數越深,性能是會提高的,但是訓練的難度會增加。當時為了能夠快速地訓練,去收斂,不會把訓練給訓崩了,就加了幾個分支,在那個分支上,把正確圖像分類的資訊也加上去。先訓練一些個小的網路,再不斷加深,做了幾個分支。這是當時所需要的,後面一些改進可能,也就不需要這些分支了。不需要這些個分支,也可以訓練出來比較深的網路,那時候是 30 幾層。

這是第一個是 GoogLeNet 是他們的第一個版本。之後他們又推出了幾個版本。在這個過程中他們對網路結構做了一些思考和總結。

第一,在網路結構過程中有很多層,你儘量避免在早期的時候觸碰瓶頸,或者說 information bottleneck。比如說你有你有 10 層網路,第 1 層有很多卷積,第 2 層就放 1 個卷積核,就 1 個 feature map。甚至再極端一點,那個點就一個輸出,也就是說一層之後,到第二層就只有一個數。那麼你可以想像,後面無論加多少層,結果都不會好,因為資訊都被濃縮到了一個數之後,就不可能再把它發散出來。

所以他的第一個想法就是說,你儘量避免在比較早的時候有一些資訊的瓶頸,導致資訊傳遞不出去。其實這也是一個比較直觀的想法,因為我們現在需要多層的網路,是希望它通過訓練之後,到最後一層抽象出比較好的一個表達,去做分類、檢測或識別,而不是在開始的時候,資訊就沒有了,後面就更不可能得到了。

舉個例子。比如說是圖像是一個小 patch,就是 35×35,其實不一定是圖像,就是一個二維的資料,35×35 的,你有 320 個 feature map,那麼到第二層,把它限制成 17×17,然後有 320 feature map,之後後面一級,把它升成 17×17,有 640 個 feature map,那麼這 640 個 feature map 就很有可能學不到特別多的資訊了,因為你已經把它縮到 320 了。所以這是他這個圖的意思是,如果中間加了一個瓶頸,後面學到東西可能就不會那麼多。

這個怎麼改變。如果不想有瓶頸限制,那麼第二子集也還是 35×35×640。資訊是增加了,沒有瓶頸,再縮減下去,變成 17×17×640,所以最後輸出都是 17×17。左邊有瓶頸,右邊沒瓶頸。雖然沒有瓶頸,但是 35×35×640 是一個非常大的 tensor,有很多參數要學,比左邊那個 17×17×320 圖多了八倍。

所以說如果是簡單地為了沒有瓶頸加很多 feature,可能解決這個問題了,但是代價就是要學很多參數。你的資料要求很多,其實很慢。

怎麼去解決?首先左邊這一個結構是用 1×1 的去降維,這樣縮小 feature map 的個數,再統統去做卷積,另外就是說我可以把它拆成兩個並行的小網路,左邊是 17×17×320,右邊是 17×17×320,然後把它們拼在一起,結果還是 17×17×640 個 feature map。但是中間那兩個小網路是並行的,它們的參數是相加的關係,能夠容納資訊的量也比原來的 17×17×320,翻了兩倍。通過這種方式同時保證了參數不是特別多,也沒有資訊瓶頸。這是他們當時關於設計網路結構的思考。

第二個是思考是,做一個 3×3 的卷積或者 5×5 的卷積,實際上是把圖像中 spatial 的資訊聚合到一起了。這種聚合其實是可以用低維的卷積核來實現的。這就回到了 3×3 的卷積有什麼特殊的這個問題上。

其實沒什麼特殊的。那為什麼用 3×3,不用 5×5 、7×7 的卷積?這個時候有一個解釋是說,用 5×5 、7×7 的卷積是可以的,但是這些卷積本身其實可以,用 3×3 的卷積來表示,因為卷積本身其實是線性的。你用兩個 3×3 去做,是可以等價於一個 5×5。

與其用一個 5×5,不如用兩個 3×3 的兩級。好處是每一級的計算量減小了,每級最後作為卷積之後,還會有一個 activation function,還能加入一些非線性的資訊和變換。所以與其用比較大的卷積核去做網路,還不如用多層、多個小的卷積核去等價它,這樣節省了參數,又增加了網路的非線性。整個神經網路它能夠學習,能夠去能建模很多東西很多內容,是因為它參數很多,同時也因為整個網路是非線性的函數而不是一個線性函數。

到這個時候大家對 VGG 用 3×3 的 kernel,有一個更好的解釋,用小的 kernel,用多級,其實比用較大的卷積核有好處。進一步推一下,3×3 其實還可以進一步去等價於一個 1×3 和一個 3×1,就是一個水準的一個卷積,再加一個豎直卷積,用進一步拆分的卷積去聚合空間上的資訊。所以他們在設計這個網路的時候,就用了一個在 17×17 的那一級上,用 1×7 跟 7×1 的卷積,這樣一來,聚合了比較多的資訊,但是一個 1×7 再加上一個 7×1,是 14 個量級的參數,比直接一個 7×7,參數小很多,但是層數就深了很多。

所以這也是後來我們為什麼可以進一步看到,網路越來越深的一個理由. 用更深的網路、更少的參數去近似一些比較大的 kernel 很有可能是有好處的。

第三個總結是指導原則。在高層的一些網路的最後幾層中,一個點代表著最開始輸入圖像當中的一大塊區域。如果說原始圖像中哪些區域可以影響到最後的一個點,那麼在最後幾層的一個點,是有一大片區域可以影響的。這個區域,某種意義上來說,是這個點的 receptive field,意思是它能夠去影響的區域。那麼在最後幾層的時候,你就不應該去用一些很大的卷積核,儘量用一些小的卷積核,他寫的是:

Higher dimensional representations are easier to process locally.

所以你最好有些小卷積核,可以總結很多空間上的資訊。他們當時在最後幾級 8×8 的規則上面是用這種很小的卷積核。

總體來看,第一代的 GoogLeNet 中,他們估計也沒有搞清楚為什麼要這麼設計,之後就做了很多實驗,總結出一些設計的指導思路。

最後一個總結是,要平衡網路的寬度跟深度,你當然可以搞得非常深,非常窄或者是非常寬。但是基本上應該有一個大體的平衡。

ResNet

下面一個是微軟 MSRA 的非常好的工作:Residual Network。他們當時發現用一個神經網路去類比一個函數,雖然說無論多複雜的函數,我們都可以類比,但是發現層數很深之後,性能提升就會變慢。這並不是由於 Over Fitting 引起的,而是由於訓練中可能有些數值的問題引起的。微軟的一個很好的想法是,與其去類比一個函數,還可以類比函數跟原始資料的差。我們不去模擬輸出 y=F(x) 的 F (x),模擬這個 F(x)-x,模擬殘差。

這個是一個很好的想法,反應到網路結構上去,就是這邊可能還有一些常規的卷積,有一些矩陣操作。那麼有一條通路,豎向本身直接到最後,去跟模擬的結果做一個加法,之後再有一個 activation function,一般都用 ReLU,就是說負的地方是零,正的地方是線性,通過一個非線性函數去輸出。通過這種方式,你在右邊分支,這個小的網路結構類比的就是輸出-x,是殘差。所以這叫 Residual Network。通過這種方式,你就可以進一步的把網路加深,他們都嘗試了。有一個版本是 101 層,還有一個版本是 152 層,這是微軟做出的很好的工作。

Inception V4

後來,穀歌的人覺得,我們要說明我們的 Inception 網路結構一樣可以做得很深,一樣可以做到很好。這就有了 Inception V4。

整體結構是這樣的,第一步輸入圖像,有一個叫 STEM。開始的幾層是比較常規的,做一些 3×3 的卷積。之後涉及到 Inception A B C。讓 A 在 35×35 的 grid(網格)上去做卷積,B 是在 17×17,後面那個 C 是在那個 8×8 的 grid 上做卷積,然後再設計出這個結構。這些結構就符合他們之前說的那幾個設計的思想。就是儘量用 1×7、7×1 的這些卷積,去把大的卷積核拆開。第二層是用 1×7、7×1 的卷積。在 8×8 最後那幾層,要儘量用小的卷積核,這樣也把網路結構變得非常深。

他們做了一些實驗,跟 Residual Network 去比,認為加入 Residual Network 一個連線直接把輸入信號傳下去,是會有幫助的,但是也不是必須的。這個結論本身不好評價。只是說他們至少在 ImageNet 任務上,錯誤率只有 3.5%-3.6% 左右。但是是不是用了 Inception Network 就可以提高呢?我覺得這還是沒有結論的。

稍微總結一下。至少在 ImageNet 上,設計神經網路時要考慮以下因素。一個是性能,就是準確度怎麼樣;一個是網路模型的大小,就是有多少參數;一個是運算量,就是有多少個 operation。下面的圖就把剛才提到的所有網路結構做了一個很好的總結。

可以看到,至少到目前為止,Inception V4 設計得很複雜,用了那幾個原則去指導去設計,性能確實是略高一點,參數至少比 AlexNet、ResNet 還少一些,計算量也是相當。所以設計複雜的結構還是能夠獲得一些收益的。

全卷積網路

還有一個比較重要的工作是全卷積網路(Fully Convolutional Network),它可以做比較合理的分割。這種網路結構本身是正常的,但是最後輸出到一個跟輸入是相當大小的 pixel-wise prediction。它就可以去對每個 pixel 做一個 lable,就是給一個分類,比較適合做分割。我覺得這個工作比較好,雖然網路結構並不是特別特殊,但是我還是把它列在這裡。

以上這一系列網路結構的發展都是在 CNN 框架下。基本上是你給我一個輸入,我就算出了一個輸出,你再給我一個輸入,我又算出了一個輸出。這兩個輸入跟輸出,跟結果之間是沒有關係,沒有任何記憶的。所以在這個範圍內,我們可以看到,從 AlexNet9 層,到 GoogLeNet 30 層,到後來現在 ResNet100 多層,到 Inception。

從 RNN 到 LSTM 和 GRU

與 CNN 相對的另一種思路是把網路中加入一些記憶的單元,某種意義上講,也是使網路深了很多。

我們可以看到原來的一個神經元,就是說你有一個輸入 X,你有一個輸出,這個過程本身是無狀態,無記憶的。第一個想法就是,我們是不是可以加入記憶,或者加入一些狀態。每個神經元本身有一個狀態,那麼你的輸出就不止決定於當前時刻的輸入,還決定於本身實際上存的資料,兩個數決定出一個輸出。如果你做這方面的改進之後,本身有個狀態,狀態本身 X 乘上一個 W,跟你輸入 X 乘上一個 U,最後經過 V 輸出 O。這個結構本身也可以等價的看成一個很深的網路,從時間上講它是一個很深的網路。Xt-1 是 t-1 時刻的輸入,有個狀態 St-1,那麼下一個時刻就相當於,St-1 跟 St 決定輸出,同時也決定狀態 St,再決定下一個時刻。如果你考慮神經元有了狀態跟記憶之後,從邏輯上講或者概念上講神經網路本身就等效於一個非常非常深的網路。

所以這是另外一個角度把網路變得 deeper 的一個方面。這種方式被稱為 Recurrent Neural Network——RNN,後面有一些發展,一個就是 LSTM——長短時間記憶,還有一個簡化版就是 gated recurrent network。

概念上簡單地來說,我們加了一個狀態,那麼每個神經網路神經元就記住了一個數,那麼這個數會對多長時間的預測有影響呢?是可以記住一個時間單位,還是十個時間單位還是一百個時間單位?從道理上講,其實沒有限制,你可以記錄很多時間單位,但實際上其實是很難控制的。這裡的一個改進就是 LSTM,它把長時間的記憶跟短時間記憶比較顯式地在網路結構中描述出來。

這是 LSTM 網路。看上去蠻複雜的,它有三個門,或者說三個小的神經網路單元,來決定什麼資訊去記憶到這個神經元裡去,什麼資訊去輸出,什麼資訊去更新自己的狀態。這個 Xt 就是指 t 時刻的輸入,Ht 是 t 時刻的輸出,還有一個 Ct 是這個 cell 或者結構本身記錄的資訊的內容。

首先,你有一個輸入,就是上一個時刻的輸出跟現在時刻的輸入來決定你有多少資訊會繼續保留在這個單元,叫 forgetting gate,在這裡是 Ft。下一個需要的是上一時刻的輸出和現在時刻輸入來決定當前的內容,就是 Ct。C 是 cell 本身的內容,意思是有多少資訊是繼續保留。所以通過那個 [Ht-1,Xt],算出來一個 It 那個 Sigma 就是 whatever 一個函數了,一個 activation function。Wt 是某種意義上你會學到一個 weight,一個矩陣。重要是 Ht-1 跟 Xt 決定了一個 it,it 去決定 Ct。也就是說什麼資訊能繼續保留下來。ft 是指需要多少記憶去忘記,它和 Ct 這一時刻,這二者會做一個線性組合去決定 Ct,決定繼續保留在這個時刻這個單元裡的資訊內容。最後還有一個 Ot,就是輸出的 gate,就是說決定一下 Ht-1 跟 Xt,去學習一些參數,去決定哪些作為下一個時刻輸出。

雖然看上去是很複雜的,但是總的來說,從概念上講,就是上一時刻的輸出,跟現在當前時刻的外界的輸入,去決定哪些資訊是繼續保留的,哪些資訊是需要遺忘的,哪些資訊是需要輸出的。那麼這個建模能力就比較強,可以說是很全面很綜合了。更重要的是,這些函數本身都是可以根據你的輸入資料學出來的,也就是說,對於每一個這樣的單元,哪些是記性型記憶,哪些記憶型輸出 哪些是保留都是可以學出來的。

其實後面會有很多變種,比如說你可以看到這些所有的資訊輸入的函數都是 ht-1 的一個 It,就是說只由上一時刻的輸出,跟當前時刻輸入決定。那麼你可能也考慮到當前那個狀態 Ct,那就是一系列 RNN 變種了。

一個比較有意義的變種是它可以把這個 RNN 進一步簡化,而且它的性能可能接近的就是 gated recurrent network、gated recurrent unit。就相當於把剛才有三個這種控制的門,forgetting gate、input、output。把它合併成兩個,變成 zt 跟 rt,其中一個還是控制輸出。另外一個就是說,原來是 ft 跟那個 rt 兩個數位去控制哪些資訊繼續保留,那麼現在要合併成一個 zt。就是說我只考慮這一個因素。你哪些資訊保留,1-Zt 跟那個 Zt 平均一下。我覺得目前看來這是比較 promising(有前途)的一個改進了。它進一步簡化了,而且建模能力還是相當的。

這一系列工作為的是如何讓 network 更深,而且是在時間運用角度上更深。

Fixed point neural network

前面兩塊內容基本上介紹了一下神經網路結構如何變得更深或者網路結構的發展。下面再簡單介紹一下另一個方向,讓網路變小,或者是參數量變得更簡單或者參數量變少。簡單的意義是講原來那些參數都是,比如說 floating point,32 位的 floating point,或者是 16 位的 floating point。那麼下一步的工作是我們能不能把這些參數用一些 8 位元的定點,或甚至一些二值化(Binary)的+1 和-1 這些數來表示。這些工作可以讓網路變得更羽量級,所需的存儲更小。

所以這一個工作是把這個網路定點化,第一步主要是把這些參數進行量化,這一系列的工作我覺得到極致了,就是可以 binary——二值化的網路。如果你把網路結構每個參數、每個權重都二值化,這樣就非常非理想,適合用硬體去實現,而且效率就會高很多。

這裡有一個簡單的比較。之前如果是浮點運算的話,那每個卷積其實就是乘加運算,就是一個核往那一放,對應位置相乘,乘完之後累加,得出一個數。如果是二值化的網路,就變成了一種 XNOR 的操作,加上 bit count 相乘,就是做一些反的亦或,然後去累加,其實就是去數到底有多少個 0,多少個 1,是奇數個 1,還是偶數個 1,決定出結果。這個操作不僅簡化了而且也更適合硬體來實現。

一個比較好的一個工作是它如何去訓練這樣的一個二值化的網路。二值化網路在訓練過程中的梯度還是用浮點來表示的,否則你沒辦法去計算梯度,去更新這些 weight 了。在反向傳播的時候仍然要用浮點去表示,但網路在正向去算的時候,就強迫它們每個節點、每個 activation 輸出都是二值化的,可以通過進行限制一下範圍或者做一個直接的量化來變成二值。所以正向的是二值,反向的時候可以用浮點操作,去更新這些參數。

有一些比較新的工作證明至少目前在一些小的集合上,比如 Cifar 10,它的性能跟浮點是很接近的。它的存儲空間可以想像一下,如果從 32 位浮點直接變成二值,大約是能夠簡化 32 倍了。

所這也是現在神經網路結構發展一個很重要的方向,用網路結構表示精度,去簡化,能夠更適合硬體的使用。

下面有一些比較具體的操作,能保證訓練成功。因為表示的精度變差後,還要訓練出來一個比較穩定的性能比較好的網路結構是需要一些 trick 的。

這些技巧跟網路結構本身沒有關係。實際上深度神經網路結構本身有改進之後,它對很多工作都是有幫助的。我沒有談具體的分類、檢測或者分割但是,實際在很多工上,任務本身的 formulation 是沒有變的。

什麼變了呢?變的是這種最複雜的需要建模那個部分替換成神經網路,這邊就舉一個簡單的例子,強化學習。

強化學習

強化學習,Reinforcement Learning 是現在相當火的一個概念。強化學習、監督學習、非監督學習都屬於機器學習。監督學習(supervised learning)的每個資料都有一個標注的結果後,你學到一個集合函數。無監督學習(unsupervised learning)沒有標注,就要學出一個函數來去擬合。強化學習(reinforcement learning)不是給定了標注之後再學習,而是一步一步在一種 online 的狀態下去學習,這種學習你告訴它好壞,它每次去做一點改進。所以 Reinforcement Learning 跟 Deep Learning 之間不屬於隸屬的關係,而是不同的 learning Paradigm——學習範式。

Reinforcement Learning 存在很多年了,最近我們看到它在圍棋,或者一些自動控制的任務中,都有很大的改進。改進的本身是指最核心的一些部分現在用了深度神經網路去做近似。

所以 Reinforcement Learning 這個概念本身就是說我是一個 agent,是能夠去自主做決策的實體。我用一個大腦來表示,它可以感知周圍的狀態、環境,它會挑選一些它能選擇的 action 去影響環境。影響環境之後,環境的狀態會改變,同時給出回饋,一個 reward,也會更新自己的狀態。這個過程是一步一步的:給一個 action,得到一個回饋改變了環境,改變了自己,再不斷地去改進——希望我的 reward 能夠最大化。這就是強化學習的過程。

Agent 在學習如何最大化自己的利益時,有兩個很重要的函數。一個是如何去選擇採取 action 的方法,到底是用什麼策略去選擇採取什麼行動,這個一般叫策略函數(policy function)。另外一個是能夠去選擇這些方法的原因。它自己對這個 action 能帶來的這種回饋,會有一個評估,這個評估叫 value function(價值函數)。

這些概念其實都是早就有了。現在 policy function 和 value function 本身就是比較複雜的函數。用深度神經網路去類比深度的 DNN,讓 DNN 去模擬去近似。最著名的應用是在 AlphaGo 裡了,我就不多講了。它將 policy network 和 value network 都用 CNN 去表示、去近似。

這裡就把它作為一個例子,說明這些深度神經網路本身的結構在不斷發展,它的建模能力不斷提高。提高之後,它就可以用來近似任何任意的比較複雜的函數。如果具有近似複雜函數的能力,那麼對很多工就有很大的幫助,包括增強學習、圖像識別、語音控制。比如在今後的無人車控制中,可能會用這種強化學習的方式去不斷地改進、去選擇自己的路徑。但是對於路徑本身,其實沒辦法用一個很簡單的一個函數去規定好每次獲得什麼輸入之後要去做什麼樣的改變什麼規劃什麼路徑。

這個肯定是很複雜的函數。這些函數可以用之前所介紹的那些神經網路中比較好的一些來做。也就是說,你有一個很好的神經網路結構之後,你就可以潛在地用它去做一個非常複雜的非線性函數的類比,然後可以完成很多工,這個在很多應用中都會有説明。

OK,這基本上就是我今天想分享的內容。

Next Article
喜欢就按个赞吧!!!
点击关闭提示