原文 How computers got shockingly good at recognizing images 作者 Timothy B. Lee 譯者 李平海
圖片如無標示亦出自原文
文末附有專業詞彙對照表
囿於專業知識水平,譯文如有不達之處,望留言斧正。
如今,我可以在GooglePhotos裡輸入“沙灘”,就可以看到過去一段時間裡我去過的各個沙灘。我並沒有管理過我的照片,給它們打標籤。實際上是Google根據照片內容識別出沙灘。這個看似普通的功能基於深度卷積神經網路技術,此技術允許軟體以一種複雜的方式理解影象,這是以前的技術做不到的。
這些年來研究人員發現,隨著他們建立更深層的網路,積累更大的資料集來訓練它們,軟體的準確性越來越高。這導致了對算力的需求幾乎無法滿足,讓英偉達(Nvidia)和AMD等GPU製造商大賺一筆。Google幾年前開發了自己定製的神經網路晶片,其他公司爭相效仿。
例如在特斯拉,深度學習專家Andrej Karpathy被任命為負責自動駕駛專案。這家汽車製造商在開發定製的晶片,以加速未來的自動駕駛版本中的神經網路操作。又例如蘋果公司,最近幾款的iPhone中的A11/A12晶片就包含“神經引擎”,可以加速神經網路執行,以提供更好的影象識別/語音識別應用。
那些我為了寫本文而採訪的專家們認為,如今深度學習的熱潮可以追溯到一篇專業論文——AlexNet(以該文首要作者Alex Krizhevsky的暱稱命名)。
“在我看來,AlexNet論文發表的2012年可謂里程碑。”機器學習專家、《智慧機器如何思考》(How Smart Machines Think)作者Sean Gerrish如是說。
2012年之前,深度神經網路只是機器學習領域中的死水泥潭。但隨即Krizhevsky和他的多倫多大學團隊向一個備受矚目的影象識別競賽提交了作品,準確率突破性地超越了以往任何技術。一夜之間,深度神經網路成為了影象識別的領銜技術。其他研究人員很快地利用這項技術使影象識別精度飛躍發展。
在這篇文章中,我們將深入探討深度學習。我會解釋神經網路究竟是什麼,它如何被訓練,以及它為什麼需要那麼大的算力。然後我將解釋一種特殊神經網路——深層卷積網路——為什麼它特別擅長理解影象。別擔心,我們會有很多配圖。
簡單的單神經元的例子
“神經網路”這個詞可能比較含糊,讓我們從一個簡單例子開始吧。假設你想要一個根據紅綠黃交通燈決定車子是否能走的神經網路。此神經網路可以用一個神經元來完成這項任務。
這個神經元接收每個輸入(1代表開啟,0代表關閉),乘以各自權重(weight),並且把加權值(weighted value)相加。然後此神經元會加上偏置(bias),這決定了神經元“啟用(activate)”的閾值。此情況下如果輸出值為正,我們認為此神經元“啟用”了,否則沒“啟用”。這個神經元相當於不等式“green - red - 0.5 > 0”。如果計算結果為true,就意味著綠燈亮了,紅燈滅了,車子可以通過。
在真正的神經網路中,虛擬神經元會有額外的一步。在加權值加上偏置求和後,神經元會呼叫非線性啟用函式(Non-linear activation function)。一種流行的做法是sigmoid函式,一個S型函式,它總是產生一個0~1間的值。
在我們簡單的交通燈模型中,使用啟用函式並不會改變結果(但不能用0,例子中我們用0.5)。但啟用函式的非線性是讓神經網路模擬更復雜函式的關鍵。沒有了啟用函式,無論多複雜的神經網路都可以簡化為它的輸入的線性組合。而且線性函式不可能模擬複雜的真實現象。非線性啟用函式可以讓神經網路更接近任何數學函式。
一個神經網路樣例
當然,有很多辦法可以近似函式。神經網路之所以特別,是因為我們知道如何用一些算式,一堆資料,以及海量算力來“訓練”它們。我們可以建造一個合適的通用神經網路來替代用人類程式設計師專門寫來執行特定任務的神經網路。刷過一堆打過標籤的資料後,它會修改神經網路本身,讓自己能儘可能打出正確的標籤。我們希望得出的神經網路具有通用性,能為不在訓練資料中的樣本也正確地打標籤。
在AlexNet發表之前,這個努力已經開始了。1986年,三位研究人員發表了一篇關於反向傳播(backpropagation)的里程碑式論文。該技術是一種有助於訓練複雜神經網路的數學方法。
為了直觀地瞭解反向傳播如何工作,讓我們來看看Michael Nielsen在他傑出的線上深度學習教程中描述的一個簡單神經網路。目標是讓神經網路從28X28畫素的圖片上正確地識別一個手寫的數字(例如0,1,2)。
每個圖片有28x28=784個輸入值,每個都用0或1代表這個畫素是深色還是淺色。Nielsen 構建了一個這樣的神經網路:
插圖裡中層和右層每個圓圈代表我們上一段說的那種神經元。每個神經元為輸入值加權求平均,然後加上偏置,然後呼叫一個啟用函式。值得注意的是左層的圓圈不是神經元,它們代表的是輸入值。雖然只畫了8個輸入圈,但實際上有784個輸入——每個代表一個畫素。
右層的10個神經元代表“亮燈”猜測不同的數字:假如是0,首個神經元應該被啟用(其他神經元不啟用),假如是1則是第二個神經元被啟用(其餘的不啟用),如此類推。
每個神經元接收上一層所有神經元的輸入。所以中層的15個神經元都是收784個輸入值。它們每個都為784個輸入值設定權重。這意味著在此層有15X784=11760個權重引數。同理,輸出層有10個神經元,每個都從中層的15個神經元接收輸入值,所以又多了15*10個權重引數。與此同時,整個網路25個神經元共有25個偏置。
訓練神經網路
我們目標是調整這11935個引數,儘可能正確地得讓代表對應手寫數字的輸出神經元亮燈。我們可以用一個叫MNIST的著名資料集來訓練,它提供了60000個已經正確標註的28X28畫素影象:
此圖是 MNIST 資料集裡60000個影象種的160個Nielsen 示範瞭如何不依賴任何機器學習庫,僅用74行正常Python程式碼來訓練這個神經網路。訓練從選取11935個隨機的權重/偏置引數開始。軟體將遍歷每張圖片樣本,完成兩步過程:
-
根據輸入影象和網路的當前引數,前饋步驟計算網路的輸出值。
-
反向傳播步驟將計算結果與正確輸出值的偏差,然後修改網路種的引數,以略微提高其在特定輸入影象上的效能。
下例中,假設網路收到了這張圖片:
如果網路經過良好調校,網路中“7”的輸出值應該接近1,其他9個輸出值應該都接近0。但假如收到此圖時“0”值是0.8。那就太離譜了!訓練演算法會改變輸入“0”輸出神經元的各個權重,好讓下次輸入這張圖片時,輸出值會更接近0。
為此,反向傳播演算法會為各個權重引數算出一個誤差梯度。這是一個衡量輸出錯誤有多大程度被輸入權重所被改變的維度。演算法會依照這個梯度決定多大程度改變每個輸入值的權重——梯度越大,這個引數修改越多。
換句話說,這個訓練過程“教會”輸出神經元更少地注意導向錯誤的輸入方(即中層的神經元),更多地注意正確方向的輸入方。
演算法一直為每個輸出神經元重複此步驟。它將降低 "1," "2," "3," "4," "5," "6," "8," 和 "9" 神經元(除了神經元“7”)的輸入方的權重,使輸出神經元的值降低。輸入值越大,反映此輸入值的權重引數的誤差梯度就越大,因此這個權重會減少越多。
同理,訓練演算法會增加輸出神經元“7”的輸入值的權重。令下次遇到這個影象時,此神經元會產生更大的輸出值。同樣的,輸入值越大,加權後的增加值也越大,這使得輸出神經元“7”在以後的幾輪學習中更加關注這些輸入。
接下來,演算法需要對中層執行相同的計算:改變每個輸入值的權重以減少網路的錯誤——同樣,使“7”輸出更接近1,其他輸出更接近0。但每個中層神經元都會對向全部10個輸出層神經元進行輸出,這會導致兩個方向的矛盾。
首先,中層的誤差梯度,不僅僅取決於輸入值,也同時取決於下一層的誤差梯度。
這個演算法之所以被稱為反向傳播,是因為網路裡後層的誤差梯度會反向傳到前面層級(沿著算式中的關係鏈)並用來計算梯度。
同時,每個中層神經元也是全部10個輸出層神經元的輸入源。因此,訓練演算法計算的誤差梯度,必須反映輸入權重的變化如何影響所有輸出的平均誤差。
反向傳播是一種爬坡演算法:該演算法的每一輪都會使輸出結果更接近訓練影象的正確結果,但只會更接近一點。隨著演算法經歷越來越多的樣本,它會“爬坡”到一個最優引數集,該引數集能夠正確地分類儘可能多的訓練樣本。要獲得較高的準確率,需要成千上萬的訓練樣本,演算法可能需要對訓練集中的每個影象進行數十次迴圈,才能達到最優。
Nielsen展示瞭如何用74行Python程式碼實現上述所言。值得注意的是,使用這個簡單程式訓練的神經網路能夠識別MNIST資料庫中95%以上的手寫數字。通過一些額外的改進,像這樣一個簡單的兩層神經網路能夠識別98%以上的數字。
AlexNet的突破
你可能以為,上世紀80年代反向傳播的發展會開啟一段基於神經網路的機器學習的快速發展時期,但事實並非如此。在90年代和21世紀初,有一些人在研究這項技術。但對神經網路的熱潮直到2010年代初才真正興起。
我們可以在由史丹佛大學電腦科學家李飛飛組織的年度機器學習競賽《ImageNet》的結果中看到這一點。在每年的比賽中,參賽者都會得到一組由100多萬張訓練圖片組成的通用圖片,每張圖片上都手工標註著1000種可能的分類,比如“消防車”、“蘑菇”或“獵豹”。參賽者的軟體根據其對未被納入訓練集的其他影象進行分類的能力進行評判。程式可以進行多次猜測,如果前五次對影象的猜測中有一次與人類選擇的標籤相匹配,則該軟體被認為是成功的。
比賽從2010年開始舉辦,在前兩屆比賽中,深度神經網路並沒有發揮主要作用。頂級團隊使用了各種其他機器學習技術,但結果平平無奇。2010年獲勝的那支球隊,top5錯誤率(即五輪皆猜錯)為28%。2011年度則是25%。
然後就到了2012年。這個來自多倫多大學的團隊提交了一份參賽作品,不啻於將選手們從死水泥潭中拖出。該參賽作品即後來以主要作者Alex krizhevsky名字命名的AlexNet。通過使用深度神經網路,該研究小組獲得了16%的top5錯誤率。當年最接近的競對手錯誤率達到26%。
前文所說的手寫識別網路有兩層,25個神經元,以及將近12000個引數。AlexNet更大更復雜:8個可訓練的層、65萬個神經元和6000萬個引數。訓練這樣規模的網路需要大量的算力,而AlexNet的設計就是利用現代GPU提供的大量並行算力。
研究人員想出瞭如何在兩個GPU之間分配網路訓練的工作,從而使他們的算力提高了一倍。儘管進行了積極的優化,使用2012年水平的硬體(兩個Nvidia GTX 580 GPU,每個有3GB記憶體)對網路訓練依然耗費了5到6天。
看看AlexNet結果的一些例子,對我們理解這是一個多麼引人矚目的突破很有幫助。以下是那篇論文的插圖,展示了一些圖片樣本和AlexNet對應的top5分類猜測:
AlexNet能夠識別出第一張圖片中包含了一隻蟎蟲,儘管這隻蟎蟲只是圖片邊緣的一小塊。該軟體不僅能正確識別美洲豹,它的其他先行猜測——美洲虎、獵豹、雪豹和埃及貓——都長得很像。AlexNet將蘑菇的圖片標註為“傘菌”——蘑菇的一種。官方正確的標籤“蘑菇”是AlexNet的第二選擇。
AlexNet的“錯誤結果”同樣令人驚訝。照片上,一隻斑點狗站在櫻桃後面,旁邊寫著“斑點狗”,而官方的標籤是“櫻桃”。AlexNet意識到這張照片上有某種水果——“葡萄”和“接骨木果”是它的前五種選擇——但它沒有完全意識到它們是櫻桃。
給AlexNet展示一張馬達加斯加貓在樹上的照片,它會猜一系列的小型爬樹哺乳動物。很多人(包括我)都會同樣地猜錯。這確實是一個引人矚目的表現,表明軟體可以識別各種方向和排布中的常見物件。深度神經網路迅速成為影象識別任務中最受歡迎的技術,機器學習的世界從此邁上快車道不回頭。
ImageNet的發起人寫道:“隨著基於深度學習的方法在2012年取得成功,2013年的絕大多數參賽作品都使用了深度卷積神經網路。”這種模式持續了好幾年,後來的優勝者都是建立在AlexNet團隊開創的基本技術之上。到2017年,使用深度神經網路的參賽者將top5錯誤率降至3%以下。考慮到這項任務的複雜度,可以說這使得計算機比許多人更擅長這項任務。
這張來自ImageNet團隊的條形圖顯示了每年top-5分類比賽中獲勝團隊的錯誤率。從2010年到2017年,錯誤率穩步下降。
卷積網路的概念
從技術上講,AlexNet是一個卷積神經網路。在本節中,我將解釋卷積網路的作用,以及為什麼這項技術對現代影象識別演算法至關重要。
我們之前研究的簡單手寫識別網路是全連線的:第一層的每個神經元都是第二層神經元的輸入源。此結構比較適合相對簡單的任務,例如識別28×28畫素影象中數字。但進一步擴充套件就很難了。
在MNIST手寫數字資料集中,字元總是居中的。這大大簡化了訓練,因為這意味7在影象的頂部和右側總是有一些黑色畫素,而左下方總是白色的。0總是中間白塊,四周的畫素則較暗。一個簡單的、全連線的網路可以相當容易地檢測這些型別的模式。
但是假如你想建立一個神經網路來識別可能位於大圖中的任何位置的數字。一個全連線的網路不擅長於此,因為它沒有一種有效的方法來識別位於影象不同部分的形狀之間的相似性。如果你的訓練集的左上角恰好有大部分的7,那麼你會得到一個網路,它比影象中其他地方更善於識別左上角的7。
從理論上講,你可以通過確保你的訓練集在每個可能的畫素位置上都有很多數字的樣本來解決這個問題。但在實踐中,這將是巨大的浪費。隨著影象的大小和網路的深度的增加,連線的數量——也就是輸入權重引數的數量——將會激增。你需要更多的訓練影象和算力來達到足夠的準確性。
當神經網路學習識別影象中某個位置的形狀時,它應該能夠將這種學習應用於識別影象中其他位置的類似形狀。卷積神經網路為這個問題提供了一個優雅的解決方案。
“這就像拿一個模板或模式,然後將其與影象上的每一個點進行匹配,”人工智慧研究員唐傑(音)說。“你有一個狗的模板輪廓,然後發現右上角和你的模板基本匹配——那裡有條狗吧?”如果沒有,可以稍微移動一下模板,遍歷整張圖片。狗出現在在影象哪個位置並不重要。模板會匹配到它。你不會想讓網路的每個子部分都學習自己單獨的狗識別器。
試想一下,如果我們把一幅大影象分成28*28畫素的小塊。然後,我們可以將每個小塊輸入到之前所述的全連線的手寫識別網路中。如果這些小塊中的“7”輸出至少有一個被點亮,就意味著整個大圖中可能有7的存在。這就是卷積網路的本質。
卷積網路在AlexNet中如何工作?
在卷積網路中,這些“模板”被稱為特徵檢測器(feature detector),它們所觀察的區域被稱為接受域(receptive field)。真正的特徵檢測器的接受域往往比邊長28畫素小得多。在AlexNet中,第一個卷積層具有接受域為11×11畫素的特徵檢測器。它隨後的卷積層有3到5個單位寬的接受域。
當特徵檢測器掃過輸入影象時,它會生成一個特徵圖(feature map):一個二維網格,表示該檢測器被影象的不同部分啟用的強度。卷積層通常有多個特徵檢測器,每個檢測器掃描輸入影象以尋找不同的模式。在AlexNet中,第一層有96個特徵檢測器,生成了96個特徵圖。
為了更具體地說明這一點,以下是經過網路訓練的AlexNet第一層中的96個特徵檢測器所學習的視覺模式的視覺化表示。特徵檢測器可以尋找水平或垂直的線條、從亮到暗的漸變、棋盤圖形和其他形狀。
彩色影象用畫素分佈格式表示,每個畫素有三個值:紅值、綠值和藍值。AlexNet的第一層會將紅綠藍三位表示的畫素歸納為96個型別值之一。影象中的每個“畫素”(指第一層分割的單元)有96種可能的值,對應96種特徵檢測器。
在本例中,這96個值中的第一個值指示影象中的某個特定點是否與此模式匹配:
第二個值指示某個特定點是否與此模式匹配:
第三個值表示某個特定點是否與此模式匹配:
如此類推,在AlexNet的第一層中,其他93個特徵檢測器也是如此。第一層將影象的每個“畫素”用一種新表現形式輸出——表示為96個值(類似96進位制?)的向量(我稍後將解釋,這個新表示形式也被按比例縮小四倍)。
這是AlexNet的第一層。接下來是另外四個卷積層,每個層的輸入都是前一層的輸出。
正如我們所看到的,第一層檢測基本的模式,如水平和垂直的線,光到暗的變化,以及曲線。然後,第二層使用第一層的結果作為構建塊來檢測稍微複雜一些的形狀。例如,第二層可能有一個特徵檢測器,它通過組合第一層特徵檢測器的輸出來查詢曲線,從而查詢圓。第三層通過結合第二層的特徵找到更復雜的形狀。第4層和第5層可以找到更復雜的模式。
研究人員Matthew Zeiler和Rob Fergus在2014年發表了一篇出色的論文,為視覺化類似ImageNet的五層神經網路所識別的模式提供了一些有用的方法。
在下列插圖中,每張圖片(第一張除外)都有兩個部分。在右邊,你將看到一些縮圖影象,它們高度匹配了特定的特徵檢測器。它們9個分為一組,每組對應一個不同的特徵檢測器。在左邊是一個地圖,它顯示了縮圖影象中的哪些特定畫素產生了高度匹配。你可以在第5層中最顯著地看到這一點,因為有一些特性檢測器可以高度匹配為狗、企業標識、獨輪車輪子等。
瀏覽這些影象,你可以看到每一層都能夠識別比前一層更復雜的模式。第一層識別簡單的畫素模式,看起來也並不十分相像。第二層識別紋理和簡單的形狀。在第三層,我們可以看到可識別的形狀,如汽車輪子和紅橙色的球體(可能是西紅柿、瓢蟲或其他東西)。
第一層的感受域為11X11單位大小,而後面的層的感受域大小則為3X3單位到5X5單位不等。但是請記住,後面的這些層接收的是前面的層生成的特徵圖,這些特徵圖中的每個“畫素”表示原始影象中的n個畫素。所以每一層的感受域都包含了原始影象中比前一層更大的部分。這就是為什麼後期圖層的縮圖看起來比早期圖層更復雜的原因之一。
感受域示意圖,from深度神經網路中的感受野網路的第五層也是最後一層能夠識別這些影象中最顯眼的大尺度元素。例如這張圖片,我從上面第5層圖片的右上角擷取的:
右邊的9張圖片看起來可能不太相似。但是如果你看一下左邊的9張熱圖,你會發現這個特定的特徵檢測器並沒有聚焦於每張影象前景中的物體。相反,它關注的是每個影象背景中的綠色部分!
顯然,如果你要識別的類別之一是“草”,那麼用“草檢測器”就合適了,但是它同時也可能檢測其他東西。在五個卷積層之後,AlexNet有三個層是全連線的,就像我們手寫識別網路中的層一樣。這些層會利用第五卷積層生成的每個特徵圖,嘗試將影象分類為1000個類別中的一個。
所以如果一幅畫的背景是草,那麼它更有可能是野生動物。另一方面,如果這幅畫的背景是草,那麼它不太可能是一幅室內傢俱的畫。其他位於第五層的特徵探測器提供了豐富的資訊可用於猜測照片內容。網路的最後幾層將這些資訊綜合起來,對整個圖片所描繪的內容進行有理據的猜測。
卷積層的獨到之處:共享輸入權重
我們已經看到卷積層中的特徵檢測器執行了牛逼的模式識別,但是到目前為止,我還沒有解釋卷積網路實際上是如何工作的。
卷積層是一層神經元。像任何神經元一樣,這些神經元取其輸入的加權平均值,然後應用一個啟用函式。用我們討論過的反向傳播技術來訓練當中的引數。
但與上面的神經網路不同,卷積層沒有全連線。每個神經元只接受前一層神經元的一小部分輸入。更重要的是,卷積網路中的神經元共享輸入權重。
讓我們放大AlexNet的第一個卷積層中的第一個神經元。這一層的接受域大小是11×11畫素,所以第一個神經元接收某角落的11×11畫素。這個神經元接受這121個畫素的輸入,每個畫素有三個值——紅、綠、藍。神經元總共有363個輸入。和任何神經元一樣,這個神經元取363個輸入值的加權平均值,然後應用一個啟用函式。因為它有363個輸入值,它也需要363個輸入權重引數。
AlexNet第一層中的第二個神經元與第一個神經元非常相似。它同樣接收11×11畫素,但它的接受域是從第一個神經元的接受域平移4個畫素開始。這就在兩個接受域之間產生了7個畫素的重疊,這就避免了遺漏兩個神經元之間的有趣模式。第二個神經元同樣接收描述11×11畫素的363個值,每個值乘以權重引數,求和,並呼叫一個啟用函式。
特殊的是,第二個神經元沒有自己的一組363個輸入權重,而是使用與第一個神經元相同的輸入權重。第一個神經元的左上角畫素使用與第二個神經元的左上角畫素相同的輸入權重。所以這兩個神經元在尋找完全相同的模式。它們的接受域之間有4個畫素的偏移。
當然實際遠不止兩個神經元——圖片分為55×55格共3025個神經元。這3025個神經元中的每一個都使用與開始兩個神經元相同的363個輸入權重。所有這些神經元共同“掃描”影象中可能存在的特定模式,組成一個特徵檢測器。
請記住,AlexNet的第一層有96個特性檢測器。我剛才提到的3025個神經元組成了96個特徵探測器中的一個。其他95個特徵探測器則是由各自的一組3025個神經元組成。每組3025個神經元與組內其他神經元共享其363個輸入權重,但不是和其他95個特徵檢測器的神經元共享。
卷積網路的訓練使用與訓練全連線網路相同的基礎反向傳播演算法,但是卷積結構使得訓練過程更加高效。
“使用卷積非常有用,因為可以重用引數,”機器學習專家和作家Sean Gerrish告訴Ars(本文原作者機構)。這大大減少了網路需要學習的輸入權重的數量,這使得網路可以用更少的訓練樣本產生更好的結果。
從影象的一個部分學到的識別模式,可以轉化用於識別其他影象的其他位置的相同模式。這使得網路可以通過更少的訓練例項來實現高效能。
深度卷積網路威名遠揚
AlexNet的論文在學術機器學習社群引起了轟動,它的重要性也很快得到了業界的認可。谷歌對這項技術特別感興趣。
2013年,谷歌收購了AlexNet論文作者創辦的一家初創公司。他們利用這項技術為谷歌照片新增了一個新的影象搜尋功能。谷歌的Chuck Rosenberg寫道:“我們直接從一個學術研究實驗室進行了前沿研究,並在短短6個多月的時間裡啟動了它。”
與此同時,谷歌2013年的一篇論文描述了它如何使用深度卷積網路從谷歌街景(Google Street View )的照片中讀取地址碼。“我們的系統幫助我們從街景影象中提取了近1億個實體街道編號,”作者寫道。
研究人員發現,隨著神經網路的發展,其效能不斷提高。谷歌街景團隊寫道:“我們發現這種方法的效能隨著卷積網路的深度而提高,在我們訓練層級最多的架構中,效能最好。我們的實驗表明,更深層次的架構可能獲得更好的準確性,但效率會逐漸降低。”
所以在AlexNet之後,神經網路變得越來越深。一個谷歌的團隊在2014年ImageNet競賽中提交的作品獲得了優勝——就在2012年AlexNet獲勝的兩年後。和AlexNet一樣,它也是基於一個深度卷積神經網路,但是谷歌使用了一個更深層的22層網路,從而獲得了6.7 %的top5錯誤率——這比AlexNet的16%錯誤率有了很大的提高。
不過,更深層的網路只對大型訓練集有用。基於這個原因,Gerrish認為ImageNet資料集和競爭對深度卷積網路的成功起到了關鍵作用。大家還記得嗎?ImageNet競賽給了參賽者一百萬張圖片,要求他們從1000個不同的類別中選擇一個。
Gerrish說:“擁有100萬張圖片來訓練你的神經網路,意味著每個類別有1000張圖片(1m/1000 = 1000)。”他說,如果沒有這麼大的資料集,“你訓練網路的引數就多得多。”
近年來,人們聚焦於收集更大的資料,以便訓練更深入、更準確的網路。這是自動駕駛汽車公司如此專注於在公共道路上積累里程的一大原因——來自測試的影象和視訊被送回總部,用於培訓公司的影象識別網路。
深度學習計算的繁榮
更深層次的網路和更大的訓練集可以提供更好的效能,這一發現對更多的算力產生了無法滿足的需求。AlexNet成功的一個重要原因是意識到,神經網路訓練涉及矩陣運算,可以使用顯示卡高度並行的算力高效地執行這些運算。
“神經網路是可並行的,”機器學習研究員唐傑說。顯示卡本來是為視訊遊戲提供大規模並行算力的,結果非常適合神經網路使用。
“GPU的核心運算是極快的矩陣乘法,最終成為神經網路的核心運算,”唐說。
這為英偉達(Nvidia)和AMD這兩家行業領先的GPU製造商帶來了滾滾財源。這兩家公司都致力於開發適應機器學習應用程式獨特需求的新晶片,而人工智慧應用程式目前在這些公司的GPU銷售中佔據了相當大的比例。
2016年,谷歌公開了一個定製晶片,稱為張量處理單元(TPU),專門用於神經網路操作。谷歌2017年寫道,雖然他們早在2006年就考慮過為神經網路構建專用積體電路(ASIC),但2013年這種情況變得緊迫起來。
“就在那時,我們意識到神經網路快速增長的計算需求可能要求我們將運營的資料中心數量增加一倍。”最初,TPU僅允許谷歌自己的專有服務使用,但後來,谷歌開始允許任何人通過它的雲端計算平臺使用這項技術。
當然,谷歌並不是唯一一家致力於人工智慧晶片的公司。一個小例子是,iPhone最新版本的晶片就包括一個為神經網路操作優化的“神經引擎”。英特爾正在開發自己的針對深度學習的優化晶片系列。特斯拉最近宣佈放棄英偉達的晶片,轉而採用自制神經網路晶片。亞馬遜據說也在開發自己的AI晶片。
為何深層神經網路難以理解
我已經解釋了深度神經網路是如何工作的,但我還沒有真正解釋它們的工作何以那麼出色。大量的矩陣運算可以讓計算機區分美洲虎和獵豹,接骨木和醋栗,這真令人驚訝。
但也許神經網路最值得注意的地方是它們做不到的事。卷積使神經網路能夠理解平移——它們可以判斷一幅影象的右上角的模式是否與另一幅影象的左上角的模式相似。
但除此之外,卷積網路並沒有真正的理解幾何圖形。如果影象旋轉45度或放大2倍,他們就無法識別出這兩幅影象是否相似。卷積網路並沒有嘗試去理解三維物體的結構,而且它們也不能識別不同的光照條件。
然而,深度神經網路能夠識別狗的圖片,無論它們是正面還是側面拍攝的,無論它們是佔據了圖片的一小部分還是很大一部分。
神經網路是怎麼做到的?事實證明,有了足夠的資料,暴力統計方法就足以完成這項工作。卷積網路的設計初衷並不是“想象”如果從不同的角度或在不同的環境下,一張特定的影象會是什麼樣子,但是有了足夠多的標記樣本,它可以通過純粹的重複來學習所有可能的排列。
有證據表明,人類的視覺系統實際上是以類似的方式工作的。我們來看這兩張圖片(在看第二張圖片之前,確保你仔細看了第一幅圖片):
顯然,這張照片的創作者把人像的眼睛和嘴巴顛倒過來,再把整張照片翻過來。當你把影象倒過來看時,它看起來相對正常,因為人類的視覺系統已經習慣了在這個方向上看眼睛和嘴。但是當你看後者時,就會發現人像面容變得畸形。
這表明人類視覺系統依賴於一些與神經網路相同的粗糙模式匹配技術。如果我們看到的東西幾乎都是同一個方向的——就如人類的眼睛——我們就能更好地識別出它們通常的方向。
神經網路善於利用圖片中的所有環境來理解它所顯示的內容。例如,汽車通常出現在道路上。裙子通常要麼出現在女性的身體上,要麼掛在衣櫥裡。飛機要麼在藍天的襯托下出現,要麼在跑道上滑行。沒有人明確地教神經網路這些相關性,但有足夠多的標記樣本,網路可以自動學習它們。
2015年,谷歌的一些研究人員試圖通過“反向操作”來更好地理解神經網路。他們不是用影象來訓練神經網路,而是用訓練過的神經網路來修改影象。
比如,他們從一幅包含隨機噪聲的影象開始,然後逐漸修改它,使其強烈地“點亮”神經網路的輸出之一——要求神經網路高效地“繪製”一個它被訓練識別的類別。在一個有趣的例子中,他們用一個被訓練用來識別啞鈴的神經網路來畫圖。
研究人員在研究報告中寫道:“這些是啞鈴沒錯,但似乎都畫出了肌肉發達的舉重運動員來舉啞鈴。”
乍一看,這似乎很奇怪,但實際上這與人類的行為並沒有太大的不同。如果我們在一幅影象中看到一個小的或模糊的物體,我們就會觀察周圍的環境,尋找圖片中可能發生的事情的線索。很明顯,人類通過不同的方式對影象進行推理,利用我們對周圍世界複雜的概念理解。
總而言之,深層神經網路擅長於影象識別,是因為它們充分利用了圖片中顯示的所有環境,這與人類的識別方式並沒有太大的不同。(完)
專業詞彙對照表
- neural network 神經網路
- computing power 算力
- convolutional network 卷積網路
- neuron 神經元
- weight 權重
- bias 偏置
- activation function 啟用函式
- Non-linear activation function 非線性啟用函式
- light up 亮燈(即匹配)
- layer 層
- receptive field 感受域
- backpropagation 反向傳播
- top-five error rate top5錯誤率
- error gradient 誤差梯度
- matrix 矩陣
- fully connected layer 全連線層
- pattern 模式
- feature detector 特徵檢測器
- brute-force statistical 暴力統計