您的位置:首頁>手機>正文

曠視科技孫劍:如何在大公司和創業公司做好電腦視覺研究(一)

AI科技評論按:本文為曠視科技首席科學家孫劍日前在CCF-ADL上做的題為《如何在大公司和創業公司做好電腦視覺研究》的分享,雷鋒網進行了全文整理。以下是第一部分。

孫劍博士(攝影:雷鋒網 劉芳平)

孫劍,博士,曠視科技(Face++)首席科學家、研究負責人。2003年畢業于西安交通大學人工智慧與機器人研究所,畢業後加入微軟亞洲研究院(Microsoft Research Asia),任至首席研究員。其主要研究方向是計算攝影學(computational photography)、人臉識別(face recognition)和基於深度學習的圖像理解(deep learning based image understanding)。自2002年以來在CVPR、ICCV、ECCV、SIGGRAPH、PAMI五個頂級學術會議和期刊上發表學術論文100+篇,Google Scholar 引用 20,000+次,H-index58,兩次獲得CVPR Best Paper Award (2009, 2016)。孫劍博士于2010年被美國權威技術期刊Technology Review評選為“全球35歲以下傑出青年創新者”。孫劍博士帶領的團隊於2015年獲得圖像識別國際大賽五項冠軍(ImageNet分類,檢測和定位,MS COCO檢測和分割),其團隊開發出來的“深度殘差網路”和“基於區域的快速物體檢測”技術已經被廣泛應用在學術和工業界。同時孫劍帶領的團隊的研究成果也廣泛被應用在微軟Windows, Office, Bing, Azure, Surface, Xbox等多條產品線上。目前孫劍博士正在帶領曠視科技的研究團隊推進電腦視覺技術的進步和探索其在工業和商業上的實踐。

以下為演講內容,主要介紹了近期電腦視覺的發展現狀,

ResNet基本原理和設計,曠視科技在電腦視覺的研究進展等。最後他還分享了一些“如何在大公司和創業公司做好研究?”的心得。

圖一

電腦視覺發展現狀

去年夏天我加入曠視科技,就是大家所熟知的Face++,Face++其實是早期一款產品的名字,而並非公司名稱。簡單來說這家公司主要就是用深度學習來做電腦視覺。電腦視覺是目前人工智慧中比較熱的一塊。大家目前將人工智慧分為感知智慧和認知智慧兩部分,其中語音辨識、電腦視覺是人工智慧進展最快的技術。(圖一)右側NLP和各種通用人工智慧,屬於認知智慧領域,這部分有很大的進展,但仍處於很強的探索階段,所以,沒有(圖一)左側綠色部分進展大。

曠視科技就是做感知智慧的電腦視覺部分。當然,電腦視覺並不只是純感知智慧,它也涉及更高層的理解。但是作為感知智慧的第一步,它很大的一部分功能是在做感知部分。

電腦視覺和語音辨識不一樣,語音辨識可能只有一個應用,就是做翻譯。把語音翻譯成文本信號,當然還有一個文本合成的任務,但是它的主要任務只有一個,就是一直改善文本信號處理的結果。

圖二

但是電腦視覺很不一樣,它的應用非常多,這裡列舉了6個比較熱且重要的應用:

視頻監控

人臉識別

醫學圖像分析

自動駕駛

機器人

AR、VR

電腦視覺技術的內容非常豐富,並不是簡單的圖像識別,它還涉及很多其他的知識。

圖三

曠視科技在2011年~2014年做了一個Face++這樣的人工智慧開放雲平臺,提供人臉識別、圖像識別的開放服務;從2014年開始,公司聚焦在兩個方向:一個是互聯網金融,以提供人臉識別認證服務為主,另外一方面是IoT,就是智慧前端化。往後,我們希望打造最好的智慧雲和智慧型機器。

圖四

曠視怎樣去做視覺智慧呢?

基本路線和很多公司類似。從技術、到產品、再到資料,希望這三部分能運轉起來。今天深度學習的方法需要大量的資料,更精准的說是大量的標注資料,有大量的資料,才能把演算法做的更好。

很多人會問資料如何而來,曠視認為最有效的方法還是通過真實業務,不斷地把資料從真實場景回流回來,然後再去驅動演算法,自然就可以把第一版演算法做不好的事情解決了。

曠視科技研究院的基本任務是產生核心的技術,這些技術可以用來做產品,然後產品落地到市場。

圖五

研究院主要關心4個技術:

分類

檢測

分割

序列學習

其中分類技術是對圖片做一個分類,或者對圖片中的區域做一個分類,或者對圖片的每個圖元都做一個分類;序列學習技術是輸入一個視頻,或者一個有序列的Python(比如一串文字)後,怎樣用序列之間的關係來做學習和推理。

這裡不包含電腦視覺3D感知的部分,一個公司要做電腦視覺,首先要聚焦在一個具體的方向。

圖六

這4個方向的主要研究成果有:

圖像分類:現在最強的方法是用深度學習來做。有個資料庫叫ImageNet,這張PPT展示的是2010年的一個比賽情況,上面的數位是Top5的錯誤率,意思是大概1000類的物體大概能分多准,這個數字越小越好。最大的進展發生在2012年,Geoffrey Hinton和他的學生Alex第一次用深度學習方法把錯誤率大幅降低。隨著神經網路的深度層次越來越多,錯誤率越來越低。在2015年的時候,當時我在微軟亞洲研究院的團隊做的ResNet,第一次把網路的深度從幾十層提高到100多層,後來可以做到上千層。後來在ImageNet的資料庫上,error可以降到比人類還要低的錯誤率。

圖七

背後的核心技術是深度卷積神經網路,這個網路其實是一切嵌套到非線性函數的組合,因為不斷的嵌套非線性,構成了一個非常複雜的非線性系統。

深度神經網路的一個精髓是要做end-to-end Learning,輸入最好不要涉及feature,因為中間的很多參數都希望整個系統是可求導的。不輸入feature的end-to-end Learning的 ,所有參數都可以學,從而簡化了訓練過程,避免了很多人工因素。一個系統如果非常複雜的話,但人的能力是非常有限的,人類只能調有限的參數,所以能簡化訓練的end-to-end Learning顯得尤為重要。

那麼問題來了,如果做一個非線性變換,這相當於映射一個函數,那麼研究人員到底要做什麼呢?以前研究人員的主要任務是設計feature,設計一個有效的feature是一個很大的貢獻。有了feature再設計分類器,在end-to-end Learning的體系下,你到底可以做什麼東西,能夠對end-to-end Learning有用?

仔細觀察神經網路的結構,有一部分不是learn出來的,比如網路的結構就不是learn出來的,結構目前還是手工指定的。

不過現在的一些最新的進展,希望通過RNN的方法或者是深度增強學習的方法,來自動探索網路結構。目前來說,還沒有很顯著的成果。

圖八

如果你指定一個卷積神經網路的話,裡面的結構有一些變數是可以來設計的。這個是時間複雜度的公式,這裡面有幾個關鍵的資料:Depth(深度),filter number(卷積神經網路每一層filter的數目),以及filter size卷積神經網路每一層filter的大小)和filter map size(圖像卷積後的空間解析度)。這同時也是決定一個網路計算複雜度的公式。

其實一個網路的能力在很大程度上是被計算力限制。比如說計算力法則,如果相似體系的一個網路,如果計算力相似的話,不管參數多也好、少也好,包括上述提到的在變化的參數,大致的filter能力都是相似的。在design space中,我們可以做一些事情,探尋一下怎樣組合這些參數,能夠做一個更好的網路。

圖九

其中有一些設計原理,比如在對圖像分類的時候,隨著層級的增加,應該把圖像的空間解析度慢慢縮小,但這同時也需要在每一層中增加filter number。後來大家發現,用小的filter size是更經濟的,還有一些則包括用Low-rank逼近的方法,比如說在網路中持續的用1*1的filter。

我們在2015年的時候研究過,哪些參數是最關鍵的,當時的結論是在剛才的4個參數裡面,深度是非常關鍵的。如果給定你一個fixed的計算代價的話,你首先要考慮的參數是深度,深度決定了這個網路的能力。有興趣的話可以參看下面這篇論文。

圖十

2012年,AlexNet是8層網路,幾層卷積,幾層全連接。當時很多人是不相信深度是有用的。但是兩年後,牛津大學和穀歌分別做了VGG Net 和Google Net,隨著層級的增加,性能得到大幅改善。

ResNet基本原理

圖十一

2015年,微軟提出了ResNet,進一步將深度從20多層推進到152層。ResNet的關鍵思想是引入了一個跳層的技術,理論上叫“殘差學習”的概念。我們可以將神經網路理解成嵌套很多層的映射,從輸入到輸出,如果直接映射很難的話,有可能殘差學習會更容易。殘差學習的意思是只學輸出相對輸入的變化,而不是直接學習輸入本身。

舉個例子,如果一張圖像有些噪點,你想學習一張沒有噪點的照片,那你可能只需要學習怎樣去掉噪點就行了,而不需要去學習怎樣重構一張自然的照片。

殘差學習的設計結構和以前網路比起來非常簡單,只是加了一些跳層連結。

圖十二

這個網路為什麼能訓練好?這個是我們官方的解釋,比較直觀。如果從前向角度看,在訓練過程中有一個動態的特性,整個訓練系統是由淺到深的。在訓練的初期,可以認為我們是在訓練一個淺層的網路,後期是深層網路。目前神經網路採用反向傳播演算法,梯度反傳過程中幅度會逐層衰減。如果網路淺還好,如果很深的話會衰減到非常小,最後相當於反向傳播,就傳播不到前面去了,導致訓練困難。在新的Design of ResNet裡面,大家可以看我們的論文,大概意思就是反向傳播的梯度會從最後結果一層直接回饋到很多中間層去。而這個幅度都是不小的。所以從這個意義上來說是繞開了以前梯度消失的問題。

這個工作為什麼會有這麼大的意義?原因是當做到20層後,就很難再做下去;當再加層的時候,訓練將變得非常困難。加完以後訓練錯誤和測試錯誤都會增加,這其實是個非常大的優化問題,ResNet就試圖解決這個優化的問題。

圖十三

方法有兩種:

第一種方法尋找是不同於隨機梯度下降的新方法,這個可以行的通,但是非常困難。神經網路發展這麼多年,最有效的還是隨機梯度下降法,原因未知。

第二個方法,如果能夠從新定義這個問題,重新修改數學的formulation的話,就會使解決問題變得容易。學解線性系統的時候我們知道,有一種方法叫做preconditioning,要解方程時,左右兩邊乘另外一個矩陣,乘完以後整個系統的解其實是不變的,但是這樣以後去做優化就會變得容易很多。通過類比以後,殘差學習的reformulation,可以讓優化過程變得更容易,這個也是引入殘差學習最大的意義。

ResNet優化的結果是到今天為止不管設計多少層的網路,只要顯存裝的下,只要能訓練起來,這些都沒有任何問題。這就破除了深度學習歷史上的一個魔咒:深到一定程度就訓練不了了。在深度學習的發展過程中,在一定階段是沒有人相信會有這麼深的訓練系統。如果考慮非線性系統的話,這麼多的參數,這麼高的非線性,怎麼能給他訓練好呢?現在實踐做到了,但理論研究很不完善,因為它是一個高度的非線性系統,缺少有效的分析工具,大多數好的分析工具都是分析線性系統的。

以上是ResNet的基本原理。

圖十四

ResNet設計

下一步曠視(Face++)要做的就是如何將ResNet 怎麼設計的更好,其中一個方向是要有更高的精度,但是在實際的工程應用中有個很大的問題:就是它的計算量是非常大的。如果你用參加ImageNet得冠軍的那個Model來去做實際應用的話是非常不現實的。

大家可以看一下這個圖,x軸是不同的網路,y軸上每個bar上的數位是每個網路的計算量,單位是GFLOPs。可以看到雖然error下降了,但是計算量卻在不停的上升。雖然結果做的很好,但是計算量非常的大。比如說一個好的網路可以到十幾到二十幾的GFLOPs,但是在實際應用中,我們常用的手機或者嵌入式設備,能承擔的GFLOPs可能在0.01,也就是說你需要做一個百分之一或者千分之一計算複雜度的Model,才可以在實際的系統用,所以這是一個很大的挑戰。

圖十五

目前曠視(Face++)與研究領域在不同的方向探索後找到了一個解決方案,大致有三類方式可以解決這個問題:設計一個更好的網路,或者簡化網路,再或者對於如何表述網路內部的值可以做一些研究。

圖十六

第一,如何更好的設計這個網路?這裡列了一些最近比較流行的網路設計。整體網路的結構還是ResNet的設計,但是每一層怎麼設計,每一層怎麼設計最經濟,所以這是一個非常重要的問題。

第二,在簡化網路方面,我們可以做結構的Pruning,這裡我大概分了一共有3種方法。

第一種方法叫做稀疏連接,本來一個網路裡有很多連接的。然後基本思想是去除不重要的連接,讓這個連接變稀疏了。但是這個方法的問題就是它可以減少網路的模型大小,但是不一定能夠減少網路的執行時間;

第二種就是tensor分解的方法,就是把一個卷積網路通過tensor分解,用它的低值特性做逼近;

第三種是channel pruning,是我們最近做的一種比較有趣的方法,就是訓練好一個網路後,簡單粗暴的把一些channel 去掉。

圖十七

其中這個tensor分解的方法,基本思想是a是原來網路設計的卷積過程,然後怎麼能夠將它通過一個低值分解的方式,拆成中間的channel filter數目比較小的b。

圖十八

圖十九

第三,就是我們在曠視(Face++)做的非常多的Low-bit的表示。這張圖大概描述了一下什麼是卷積,卷積就是輸入一個三維的feature map,拿另外一個卷積核在上面卷,feature map標準的話都是float表示的,卷積核其實也是一個三維的矩陣,它也是float表示的。Low-bit的表示方法就是不要用這些float的方式來表示,而是用一些低精度的表示,比如8位或者更加極端的兩位來表示。大家可以看到這是之前的兩篇比較著名的工作。一個是Binary connect,他的思想是把這個weight都變成01,這也是很誇張的一個想法。下面是更進一步的工作,它是將feature和weight全變成01,這樣的好處是叫XNOR-Net,好處是卷積神經網路裡的矩陣層,可以變成一個bitcount的指令,就可以完成它想要完成的計算,這個是在硬體中很有效的一個方法,也是Low-bit網路非常吸引人的地方。優點在於:1.記憶體可以降得非常多;2.潛在的加速比非常大。

這個(Low-bit)Reoresentation是我們曠視(Face++)研究員做的,它除了能量化weight或feature,還可以量化gridient,就是在反向回傳的過程中,gridient標準其實也是float的,他的意義是如果你想做並行訓練,主要問題是通訊的overfit非常大,也需要傳gridient,或者你想把訓練放在FPGA或者晶片上來做的話,這樣如果你能做weight或feature,gridient的話,你就可以做這樣的訓練,所以我們推薦了一個設置就是weight用01表示,activation用兩位表示,gridient用4位表示。所以我們同事將它取名為DOReFa-Net。

圖二十

這個圖表是最近的一個類似的工作,比較了一下DOReFa-Net和他們的Net的性能差別。

未完待續,請持續關注雷鋒網的後續文章……

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