文:城主
何愷明,大名鼎鼎的深度殘差網(wǎng)絡(luò)(ResNets)的主要發(fā)明者。沒有ResNets就沒有現(xiàn)在大放異彩的的深度學(xué)習(xí)AI大模型。
直接上百度百科:
何愷明(Kaiming He),1984年出生于廣東廣州,2003年廣東省高考滿分狀元。2003-2007年就讀于清華大學(xué)物理系基礎(chǔ)科學(xué)班,連續(xù)3年獲得清華獎學(xué)金,本科畢業(yè)后進入香港中文大學(xué)攻讀研究生,師從湯曉鷗。2009年成為CVPR最佳論文首位華人得主。2011年獲得香港中文大學(xué)信息工程哲學(xué)博士學(xué)位,之后進入微軟亞洲研究院工作。2016年8月加入Facebook AI Research(FAIR),擔任研究科學(xué)家。2017年獲得ICCV最佳論文獎(馬爾獎)。2018年獲得CVPR大會PAMI青年研究者獎。2022年入選AI 2000人工智能全球最具影響力學(xué)者榜單,綜合排名第一。2023年獲得未來科學(xué)大獎數(shù)學(xué)與計算機科學(xué)獎。2024年2月加入麻省理工學(xué)院(MIT)電氣工程與計算機科學(xué)系,擔任副教授。
本文推薦的講座即為何愷明在MIT傳道授業(yè)生涯試講的第一課,一方面很有意義,另外一方面,著實精彩。縱觀目前所能看到的公開資料,甚少有在知識深度廣度兼?zhèn)渲线€能講解得如此清晰易懂的深度學(xué)習(xí)講座,PPT也做得很棒,非常適合有一丁點兒科普基礎(chǔ)希望提高深度學(xué)習(xí)認知的讀者們,強烈推薦。
原講座為英文,本文根據(jù)講座原意全部重寫為中文書面文字。
![]()
喜歡看視頻的朋友,講座的視頻完整中英版 (字幕錯別字請見諒 不影響理解):
--天空之城中文版--
![]()
好的,讓我們開始。我叫愷明,實際上,我將在下個月加入一所大學(xué)(MIT),因此,我今天在這里做的是一份無薪工作。現(xiàn)在,讓我們看看我這份無薪工作的名稱——深度表征(深度表示)學(xué)習(xí)。我將在圖像識別的背景下,以及可能的其他一些場景中討論這個主題。以下是本教程的概述。
![]()
首先,我將討論什么是表征學(xué)習(xí)以及為什么表征學(xué)習(xí)是一個重要問題。然后,我將討論如何構(gòu)建和訓(xùn)練非常深的神經(jīng)網(wǎng)絡(luò)。我將討論一些具有里程碑意義的有影響力的神經(jīng)網(wǎng)絡(luò)架構(gòu)。接著,我將介紹一些重要的組件和元素,這些元素對于我們訓(xùn)練非常深的神經(jīng)網(wǎng)絡(luò)架構(gòu)是必要的,包括一些初始化方法,歸一化方法,以及殘差連接的引入。最后,我將介紹圖像識別的應(yīng)用和一些序列處理問題。
![]()
那么,為什么要深度學(xué)習(xí)?為什么大約十年前,人們突然開始幾乎到處談?wù)撋疃葘W(xué)習(xí)?簡單來說,深度學(xué)習(xí)就是表征學(xué)習(xí)。有趣的是,十多年前,深度學(xué)習(xí)并不流行,也沒有受到計算機視覺或機器學(xué)習(xí)領(lǐng)域主流會議的青睞。然而,一些深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)架構(gòu)的先驅(qū),比如Yann LeCun和Yoshua Bengio,決定再舉辦一次對深度學(xué)習(xí)研究更加友好、更加開放的會議。他們決定將他們的新會議命名為國際學(xué)習(xí)表征會議,這反映了深度學(xué)習(xí)和表征學(xué)習(xí)之間的密切關(guān)系。
那么,為什么表征學(xué)習(xí)如此重要呢?表征學(xué)習(xí)是一個常見問題,可以在許多領(lǐng)域的許多應(yīng)用程序中找到。表征學(xué)習(xí)的一個共同目標是將原始數(shù)據(jù)轉(zhuǎn)換為一些高級表征空間,我們在這個表征空間中可以更好地進行壓縮、抽象或概念化。當計算機算法在這個表征空間上運行時,它們可以更輕松地解決非常復(fù)雜的問題。并且,根據(jù)場景的不同,原始數(shù)據(jù)可以有多種不同的形式。例如,在計算機視覺中,原始數(shù)據(jù)可以是圖像或視頻中的像素;在自然語言處理中,原始數(shù)據(jù)可以是字母或單詞;在語音識別或音頻識別中,原始數(shù)據(jù)可以是音頻波或頻譜圖;在玩游戲的情況下,原始數(shù)據(jù)可以是游戲板的狀態(tài);在一些科學(xué)問題中,原始數(shù)據(jù)可以是分子序列、DNA序列或其他一些結(jié)構(gòu)。在許多此類應(yīng)用程序中,一個常見的問題是如何在某些高級抽象空間中表征數(shù)據(jù),這樣計算機算法就可以更容易地解決問題。
![]()
現(xiàn)在,讓我們以圍棋游戲為例。在過去的幾十年里,使用計算機解決圍棋游戲被認為是一個非常具有挑戰(zhàn)性甚至可能不可行的問題。部分原因是圍棋游戲中的不同狀態(tài)數(shù)量呈指數(shù)級增長。例如,棋盤有19列和19行,如果我們把所有的東西加在一起,那么就會有361個位置,每個位置都可以有黑、白、空白三種選擇。那么這將得到3的361次方種不同狀態(tài)。這是一個巨大的數(shù)字,如果計算機算法要在這個狀態(tài)空間中進行分析甚至枚舉或記憶,那么今天的計算機就無法使用這種表征來解決這個問題。
然而,如果真是這樣的話,那么我們可能永遠無法解決計算機視覺或圖像識別問題。現(xiàn)在,讓我們考慮一個非常簡單的計算機視覺案例。假設(shè)我們有一個非常小的圖像,即500像素x500像素,每個像素可能具有三種顏色通道:紅色、綠色和藍色,每個顏色通道可能有256個不同的值。如果我們把所有的東西放在一起,那么我們將得到256的3x500x500次方個不同的狀態(tài),只是為了一個非常小的圖像。如果我們的計算機視覺算法直接在這個原始像素空間上運行,并且如果該算法要枚舉或記住這個狀態(tài)空間,那么我們永遠無法解決計算機視覺問題,因為這個問題比圍棋問題更棘手。
然而,這并不是計算機視覺算法解決圖像識別問題的方式。我們不是直接在原始像素空間上工作,而是使用一個模型將原始像素轉(zhuǎn)換為一些表征形式。如今,我們做到這一點的最成功的模型是使用深度神經(jīng)網(wǎng)絡(luò),例如卷積神經(jīng)網(wǎng)絡(luò)。然后這些表征將為我們提供一些非常好的抽象或概念化壓縮。當使用這些表征時,計算機算法可以解決許多不同的問題,例如圖像分類、對象檢測或圖像分割。
類似地,回到圍棋的問題,我們可以將圍棋中的棋盤想象成一個非常小的圖像。該圖像只有19x19像素,每個像素只有三種可能的顏色:黑色、白色和空白。然后我們可以使用相同的想法。例如,我們可以使用卷積神經(jīng)網(wǎng)絡(luò)來處理游戲的狀態(tài)并獲得一些高級抽象。并且計算機算法可以直接在這個高級抽象空間上工作,做一些分析或做一些搜索。這將使圍棋問題更容易得到解決。這實際上是著名的AlphaGo算法背后的眾多基本思想之一。
![]()
這張圖來自AlphaGo Zero論文。在這張圖中,作者比較了四種不同版本的AlphaGo棋手。這些版本是按照L-low評級進行比較的,通常評級越高意味著圍棋表現(xiàn)越好。這個圖簡單地表明,通過將深度從例如12層增加到40層,我們可以輕松地享受圍棋表現(xiàn)方面的巨大提升。
![]()
事實上,如果我們不斷增加神經(jīng)網(wǎng)絡(luò)的深度,例如增加到80層,我們將看到圍棋性能的另一個巨大提升。有趣的是,這種表現(xiàn)甚至比世界上最好的人類玩家還要好。而AlphaGo算法可以在不使用任何人類知識的情況下實現(xiàn)這種性能。
還值得注意的是,對于這里比較的四五個不同的棋手,許多其他組件完全相同。例如,強化學(xué)習(xí)算法和蒙特卡羅樹搜索算法的用法是完全相同的。這五個不同版本中只是用于學(xué)習(xí)圍棋表征的神經(jīng)網(wǎng)絡(luò)架構(gòu)有所不同。因此,我希望這能讓您了解表征學(xué)習(xí)對于我們解決非常具有挑戰(zhàn)性的問題有多么重要。
![]()
現(xiàn)在,讓我們回到計算機視覺的問題,接下來我要講的是我們?nèi)绾伪碚鲌D像。在深度學(xué)習(xí)流行之前,計算機視覺領(lǐng)域就已經(jīng)出現(xiàn)了。假設(shè)我們有一張圖像,我們可以將其視為一堆像素,我們可以直接將這堆像素發(fā)送到分類器中。分類器可以是SVM分類器、支持向量機,也可以是決策樹,也可以是隨機森林。通常這不是一個好的解決方案,因為即使對象的微小變化也會導(dǎo)致原始像素表征空間發(fā)生較大變化。
那么,為了解決這個問題,我們?nèi)绾伪碚鲌D像呢?我們可以通過觀察圖像,找出它們的相似之處。有人做過這個實驗嗎?這是一個很好的問題。我不是一個好的圍棋手,但我知道有一些關(guān)于圍棋的非常奇特的術(shù)語。這是一個關(guān)于專業(yè)玩家的術(shù)語,他們對當前狀態(tài)有自己的感覺。因此,圍棋手對于圍棋有自己的內(nèi)部表征,而且這些內(nèi)部表征可能與計算機算法可以學(xué)習(xí)到的表征不太一致。實際上,自AlphaGo的開發(fā)以來,我相信許多頂級玩家已經(jīng)開始利用人工智能來改善他們對人類內(nèi)在表現(xiàn)的理解。現(xiàn)在,讓我們回到我們的主題。
為了得到更好的表現(xiàn),我們可能會考慮計算像素頂部的邊緣,因為這將為我們提供更穩(wěn)定的表現(xiàn),以防輸入空間的照明或顏色發(fā)生變化。然后,再次為了得到更好的表現(xiàn),我們可能會考慮計算邊緣的方向或方向的直方圖,或者我們可以在直方圖上運行一些聚類算法。
實際上,如果問題足夠簡單,這個流程可以很好地工作。然而,在這個流程中,我們需要人類或者計算機視覺專家來定義什么是好的表現(xiàn)或者什么是好的特征來解決當前的問題。因此,雖然特征設(shè)計問題對于一些低級表現(xiàn),如邊緣、紋理或顏色的定義,是相對可行的,但如果我們想定義一些高級表現(xiàn),這個問題將變得非常困難。例如,我們很難定義什么是魚,什么是貓,或者另一方面,什么是樹,或者什么是人。
![]()
實際上,在計算機視覺領(lǐng)域,過去幾十年里,定義高級抽象和表現(xiàn)一直是計算機視覺社區(qū)的主要瓶頸。深度學(xué)習(xí)為我們解決計算機視覺問題提供了另一種方法,如圖像識別等許多復(fù)雜問題。深度學(xué)習(xí)的一個關(guān)鍵思想是將一組簡單的通用模塊組合成高度復(fù)雜的函數(shù),幫助我們解決高度復(fù)雜的問題。因此,如果你從我今天的演講中只能得到一個信息,那就是這個信息。我將在本次演講的以下部分中多次重復(fù)這一點。
因此,在一組通用模塊的幫助下,我們可以輕松地構(gòu)建多個抽象級別并學(xué)習(xí)多個表現(xiàn)級別。而這些模塊的具體實例,例如這些模塊的參數(shù)或權(quán)重,可以通過反向傳播來學(xué)習(xí)。因此,對人類知識的依賴大大減少。同樣,學(xué)習(xí)是在一些更大規(guī)模的數(shù)據(jù)上完成的,因此人類知識的要求已經(jīng)從設(shè)計特征轉(zhuǎn)移到收集與問題相關(guān)的數(shù)據(jù)的另一個問題。
總的來說,深度學(xué)習(xí)的所有這些關(guān)鍵思想或關(guān)鍵概念可以幫助我們大大減少我們解決手頭問題的領(lǐng)域知識。因此,深度學(xué)習(xí)可以成為我們解決許多領(lǐng)域許多問題的通用工具箱的原因有很多。
![]()
接下來,我將討論如何學(xué)習(xí)圖像識別的深度表征。我將回顧卷積神經(jīng)網(wǎng)絡(luò)發(fā)展史上的一些里程碑式且有影響力的步驟。我將從大約 30 年前開發(fā)的 LeNet 架構(gòu)開始。
![]()
LeNet 架構(gòu)是卷積神經(jīng)網(wǎng)絡(luò)(簡稱 ConvNet 或 CNN)的成功實例之一。簡單來說,卷積神經(jīng)網(wǎng)絡(luò)是一種平移不變的架構(gòu)。因此,通過平移不變性,我們通常意味著如果我們在滑動窗口內(nèi)進行一些操作, 并且當窗口平移幾個像素時,我們?nèi)匀粫谢蚨嗷蛏傧嗤牟僮鳌F揭撇蛔冃赃€意味著,如果我們將整個輸入圖像平移幾個像素,我們?nèi)匀豢梢該碛邢嗤妮敵鲱悩撕灒绻覀冋谧龇诸悊栴}。
然后,LeNet架構(gòu)引入了幾個基本元素對于卷積神經(jīng)網(wǎng)絡(luò)。這些元素包括卷積層、池化層的使用,全連接層,更重要的是,通過反向傳播端到端地訓(xùn)練整個架構(gòu)的想法。再說一遍,卷積神經(jīng)網(wǎng)絡(luò)只是深度學(xué)習(xí)方法的一個實例,即將簡單的模塊組合成高度復(fù)雜的功能。接下來,我將介紹其中兩個簡單的基礎(chǔ)模塊。
![]()
第一個模塊是卷積層。簡單來說,卷積層只是局部連接加上空間權(quán)重共享。與卷積層相比,最流行的層類型之一是全連接層。在這種情況下,每個輸出神經(jīng)元都連接到該層中的每個輸入神經(jīng)元。在這里,每個連接代表一個權(quán)重或一個可以訓(xùn)練的參數(shù)。也就是說,如果我們有很多輸入神經(jīng)元,并且如果我們也有很多輸出神經(jīng)元,那么我們將有大量的可訓(xùn)練參數(shù)。這并不理想。
為了部分解決這個問題,人們開發(fā)了另一種層類型,稱為局部連接層。在這種情況下,每個輸出神經(jīng)元僅連接到輸入神經(jīng)元的一小部分。通常在實踐中,這些小子集將位于輸出神經(jīng)元周圍的滑動窗口或局部鄰域中。并且引入局部連接層可以大大減少可訓(xùn)練參數(shù)的數(shù)量。卷積層僅領(lǐng)先一步。也就是說,當我們在輸入圖像空間的不同位置滑動窗口時,我們可以在不同的空間位置之間共享權(quán)重。
![]()
卷積神經(jīng)網(wǎng)絡(luò)的另一個重要模塊是池化層。池化層的作用是減小特征圖的大小,因此如果輸入圖像很大,可以大大減少所需的計算量。另一方面,池化層也可以幫助實現(xiàn)局部不變性。也就是說,如果我們的輸入內(nèi)容在一個小窗口內(nèi)經(jīng)歷一些局部抖動,我們?nèi)匀荒軌蛟谠摯翱谥蝎@得或多或少相同的表征。這可以幫助我們獲得更多的抽象表征,這是我們做分類問題所需的屬性。
![]()
然后給出這組簡單的通用模塊,接下來我將逐步介紹學(xué)習(xí)架構(gòu)。盡管這種建筑的提出已經(jīng)有30多年了,但我們漫步在這座古典建筑中總是令人愉悅和鼓舞。在這種情況下,神經(jīng)網(wǎng)絡(luò)的輸入只有一個顏色通道,因為它是灰度的。在此示例中,空間大小將為 32 x 32。然后它將執(zhí)行第一組卷積核,其空間大小為 5 x 5。
![]()
在本例中,它有六個不同的輸出通道。這將為我們提供第一組輸出特征圖。在本例中,空間大小為 28 x 28。因為我們的卷積層有六個輸出通道,那么這組特征圖也將有六個輸出通道。
![]()
然后我們可以應(yīng)用第一個池化操作,將每個維度的空間大小減少兩倍。然后我們將得到下一組空間特征圖,其空間大小為 14 x 14。
![]()
然后我們準備再次應(yīng)用下一組卷積層,其內(nèi)核大小為 5 x 5。而此時,它有16個不同的輸出通道。
![]()
然后我們將得到下一組特征圖,這里的空間大小為10x10。
![]()
再次,下一個池化層減少空間大小。
![]()
我們將得到最終的一組空間特征圖,其空間大小為 5 x 5。
![]()
之后,我們就可以展平這個特征圖。我們將使用第一組全連接層、第二組全連接層以及具有十個通道的輸出全連接層來處理它,
在本例中,針對十類分類問題。而在高層,整個架構(gòu)非常簡單。它只是幾個基本模塊的組合,在本例中只是卷積層、池化層和全連接層。線性架構(gòu)實際上效果非常好,如果我們有數(shù)據(jù)來訓(xùn)練它。
![]()
不幸的是,這種架構(gòu)在提出后的 20 多年里一直被忽視。部分原因是我們沒有計算能力或沒有數(shù)據(jù)來充分展示該架構(gòu)的強大功能。當時最大的數(shù)據(jù)集,令人驚訝的是,它是當時最大的數(shù)據(jù)集,是 MNIST 數(shù)據(jù)集,其中包含 10 個類別的 50,000 張圖像。這個數(shù)據(jù)集足以訓(xùn)練一個非常小的模型,但還不足以完全說服計算機視覺社區(qū)在他們的問題中采用卷積神經(jīng)網(wǎng)絡(luò)。
![]()
然后深度學(xué)習(xí)真正的革命發(fā)生在 2012 年,這篇 AlexNet 論文介紹了它。據(jù)我了解,這篇 AlexNet 論文中只有一篇論文。本文旨在探討擴大卷積神經(jīng)網(wǎng)絡(luò)規(guī)模的相關(guān)問題。規(guī)模化實際上涉及到幾個方面。
首先,我們要討論的是數(shù)據(jù)的問題。AlexNet在ImageNet數(shù)據(jù)集上進行訓(xùn)練,該數(shù)據(jù)集擁有100萬張圖像和1,000個類別。實際上,這個數(shù)據(jù)集比當時人們一直在研究的許多其他數(shù)據(jù)集要大得多。在那個時候,我們可以在原始像素上端到端地訓(xùn)練神經(jīng)網(wǎng)絡(luò)架構(gòu),這遠遠超出了人們的想象在如此大規(guī)模的數(shù)據(jù)集中。
其次,我們要討論的是架構(gòu)的問題。AlexNet的架構(gòu)實際上很大。在那篇論文的摘要中,作者特別表示這是一個巨大的架構(gòu),這個架構(gòu)有超過6000萬個參數(shù)和超過60萬個神經(jīng)元。該模型的尺寸實際上也比當時的許多其他模型大得多。
然而,為了訓(xùn)練這么大的模型,即使借助更大規(guī)模的數(shù)據(jù),人們需要引入有效的技術(shù)來減少過度擬合。AlexNet論文在這方面探索了兩種非常有效的技術(shù):一是數(shù)據(jù)增強,二是數(shù)據(jù)丟失。這兩種技術(shù)在當今的神經(jīng)網(wǎng)絡(luò)訓(xùn)練技術(shù)中仍然廣泛使用。
AlexNet論文的另一個亮點是其出色的工程工作。它探索了使用GPU訓(xùn)練模型的潛力。事實上,他們已經(jīng)為未來10年的GPU訓(xùn)練奠定了基礎(chǔ)。他們介紹了關(guān)于GPU訓(xùn)練的兩個基本概念:一是數(shù)據(jù)分布,二是模型分布。在數(shù)據(jù)分布的情況下,同一小批量中的不同樣本可以由不同的GPU處理,從而大大減少每個GPU的計算量。在模型分布的情況下,不同的過濾器組或不同的層可以存儲在不同的GPU中,從而大大減少內(nèi)存消耗。這些仍然是當今GPU實現(xiàn)的基礎(chǔ)。
![]()
接下來,我們將對比原始的LeNet架構(gòu)和AlexNet架構(gòu)。在高層次上,它們是同一件事,因為它們只是許多簡單通用模塊的組合,如卷積層、池化層和全連接層。那么,它們之間有什么區(qū)別呢?為什么AlexNet具有革命性呢?
首先,AlexNet更深。它還有三個卷積層和一個池化層。這些層可以幫助它從更大規(guī)模的數(shù)據(jù)中學(xué)習(xí)更高層次的抽象,這將比更淺的模型具有更強的表征能力。
![]()
其次,AlexNet首次開始探索使用ReLU激活函數(shù)來訓(xùn)練非常深的神經(jīng)網(wǎng)絡(luò)架構(gòu)。在ReLU的情況下,只有當輸入信號小于零時,它將具有零梯度。然后,當您在非常深的神經(jīng)網(wǎng)絡(luò)架構(gòu)中擁有許多激活函數(shù)時,您將有更高的機會在反向傳播過程中獲得非零梯度。事實證明,這可以在很大程度上促進非常深的模型的訓(xùn)練。所以從某種意義上說,ReLU激活的引入是深度學(xué)習(xí)的一場革命。
![]()
這兩種架構(gòu)之間的另一個巨大差異在很大程度上被許多人忽視了,那就是AlexNet實際上是比原始LeNet更寬的架構(gòu)。在深度學(xué)習(xí)的術(shù)語中,“更寬”通常意味著模型有更多的通道。然后,通過為每個層提供更多通道,我們將擁有更豐富的特征集,然后它將比更窄的模型更具代表性。
![]()
AlexNet在ImageNet數(shù)據(jù)集中的成功引起了計算機視覺界的廣泛關(guān)注。在AlexNet提出后的第二年,計算機視覺界開始更加關(guān)注理解神經(jīng)網(wǎng)絡(luò)行為。計算機視覺社區(qū)獲得更好理解的一種方法是可視化。而一個非常成功的可視化方法就是回答下面的問題:什么輸入可以產(chǎn)生特定的特征呢?
為了回答這個問題,我們可以做以下兩個步驟。首先,我們只需要將特征圖設(shè)置為one-hot向量或one-hot張量。也就是說,對于這個特定的特征圖,只有一個元素非零,所有其他元素都將設(shè)置為零。然后我們可以使用完全相同的反向傳播算法將這個單熱特征圖從特征空間傳播回像素空間。然后我們將在像素空間上對這個特征進行一些可視化。
接下來我將展示通過這種方式獲得的一些可視化效果。我將展示具有五個卷積層的卷積神經(jīng)網(wǎng)絡(luò)的可視化。
![]()
這是第一個卷積層的可視化。在這里我將展示左側(cè)的功能。我還將在右側(cè)展示一些刺激物。因此,通過刺激,我的意思是這些是在相應(yīng)特征中具有最強激活的補丁或輸入圖像。正如我們在這個神經(jīng)網(wǎng)絡(luò)的第一層中看到的,它們通常是邊緣檢測器或一些顏色檢測器。這種行為與經(jīng)典圖像識別系統(tǒng)非常相似,其中第一層是邊緣檢測器。
![]()
這是同一網(wǎng)絡(luò)中第二個卷積層的一些可視化。在這種情況下,我們可以看到功能級別稍高一些比第一層的特征。我們可以看到一些特征顯示出一些紋理圖案。在其他一些情況下,它們顯示出一些局部形狀,例如圓形或角或細線的形狀。這就是為什么我們說這些特征可能比第一層中的特征(只是邊緣)更高級別。
![]()
接下來是第三層的可視化。在這種情況下,我們開始看到它開始顯示出一些語義模式。例如,對于這個特征,它開始顯示一些關(guān)于人類上半身的語義模式。在另一種情況下,它開始顯示出類似網(wǎng)或蜂窩的圖案。
![]()
再說一次,這是第四層的可視化。同樣,它比前一層的表征級別更高。還有一些狗頭的形狀,或者可能是兩條腿的鳥的身體形狀。
![]()
這些是最后一個卷積的可視化網(wǎng)絡(luò),該網(wǎng)絡(luò)中的卷積層。再說一次,這將是更高的水平。它并不完美。例如,在這一層中,它會將幾種東西混合在一起。但在其他一些例子中,例如對于這個過濾器,它將給出不同類型的狗的表征。對于這個過濾器,它將給出不同類型的有眼睛動物的表征。
實際上,在計算機視覺中,這些高級抽象或高級表征很難手工設(shè)計。因此,這些高級表征正是計算機視覺社區(qū)在過去幾十年中一直在尋找的東西。因此,這種可視化有助于讓計算機視覺社區(qū)相信深度學(xué)習(xí)或深度卷積神經(jīng)網(wǎng)絡(luò)是正確的選擇。
![]()
作為這種可視化的副產(chǎn)品,當時計算機視覺界開始做出一個非常重大的發(fā)現(xiàn)。當時,他們發(fā)現(xiàn)這些深層表征是可遷移的。在我看來,這實際上是深度學(xué)習(xí)革命中最重要的發(fā)現(xiàn)。
那么,可遷移或遷移學(xué)習(xí)意味著什么呢?在我看來,遷移學(xué)習(xí)是一個了不起的想法。假設(shè)我們是否可以在更大規(guī)模的數(shù)據(jù)集上訓(xùn)練更大規(guī)模的網(wǎng)絡(luò)。如果我們能夠發(fā)現(xiàn)這個網(wǎng)絡(luò)將學(xué)習(xí)一些高級表征或高級抽象,那么我們可以希望這種高級表征不僅僅與該數(shù)據(jù)集相關(guān)。這種高級表征也可以用于與該較大規(guī)模數(shù)據(jù)集有關(guān)的許多其他較小規(guī)模數(shù)據(jù)集。但為了享受這個福利,我們可以將這些特征轉(zhuǎn)移到一些較小規(guī)模的數(shù)據(jù)集。通常,我們可以通過微調(diào)來實現(xiàn)遷移學(xué)習(xí)。例如,我們可以只訓(xùn)練神經(jīng)網(wǎng)絡(luò)的一小部分,這只需要在小規(guī)模數(shù)據(jù)集上完成。這一發(fā)現(xiàn)使得深度學(xué)習(xí)模型可以在小規(guī)模數(shù)據(jù)集上得到應(yīng)用。因此,您的特定任務(wù)并不需要更大規(guī)模的數(shù)據(jù)集來訓(xùn)練超大規(guī)模的模型,您只需要少量與您的任務(wù)相關(guān)的數(shù)據(jù)集。
這個發(fā)現(xiàn)徹底改變了計算機視覺社區(qū),因為在遷移學(xué)習(xí)的幫助下,我們基本上可以在所有小規(guī)模數(shù)據(jù)集中享受深度學(xué)習(xí)的好處。它們可以在許多計算機視覺任務(wù)中實現(xiàn)前所未有的準確性。這只是改變游戲規(guī)則。因此,一些規(guī)模較大的數(shù)據(jù)集,比如ImageNet數(shù)據(jù)集,不再是一個細粒度或繁瑣的細粒度分類問題,它有超過100萬張圖像或1000個類。ImageNet數(shù)據(jù)集成為我們學(xué)習(xí)的引擎,基本上可以幫助所有計算機視覺任務(wù)的通用表征。
![]()
遷移學(xué)習(xí)的這一發(fā)現(xiàn)影響如此之大,其影響遠遠超出了計算機視覺的范圍。例如,GPT或者ChatGPT模型也是按照完全相同的原理開發(fā)的。接下來我要談?wù)勎易钕矚g的另一部作品,這項工作被稱為VGG,是Visual Geometric Group的縮寫,該小組是牛津大學(xué)的一個小組。
VGG架構(gòu)非常簡單,這只是關(guān)于我們?nèi)绾螛?gòu)建一個非常深入的神經(jīng)網(wǎng)絡(luò)架構(gòu)而不需要花哨的想法。所以VGG網(wǎng)絡(luò)是高度模塊化的設(shè)計,它只有卷積層、池化層和全連接層。而且所有的卷積層實際上都是三乘三的,因此不需要仔細設(shè)計這些層。所以VGG網(wǎng)絡(luò)只是簡單地堆疊相同類型的模塊,它們就可以構(gòu)建非常深的神經(jīng)網(wǎng)絡(luò)架構(gòu),例如最多90層,是之前最深模型的兩倍。
![]()
有趣的是,它第一次顯示出明確的證據(jù)表明更深的模型會比更淺的模型更好。這似乎是一個令人驚訝的說法,因為,事實上,當時幾乎沒有明確的證據(jù)表明更深的模型更好。一部分原因是在VGGNet論文之前,當人們增加神經(jīng)網(wǎng)絡(luò)的深度時,他們同時還做其他事情。所以沒有明確的證據(jù)表明更深層次是網(wǎng)絡(luò)獲得更好準確率的主要原因。
然后在VGGNet論文中,作者設(shè)計了非常仔細的控制實驗。他們試圖消除架構(gòu)設(shè)計中的所有花里胡哨的東西。他們引入了很少的配置工程,并且開發(fā)了非常簡單的規(guī)則來設(shè)置每個階段的通道數(shù)或?qū)訑?shù)。他們所做的一切只是添加越來越多的3x3卷積層。這是一個非常簡單的設(shè)計,這是非常優(yōu)雅的。然而,這些簡單的基線很難被超越。事實上,在那些年里,VGG 神經(jīng)網(wǎng)絡(luò)是計算機視覺領(lǐng)域最先進的架構(gòu)。它是我們解決很多不同問題的默認主干架構(gòu),包括分類、檢測和分割。而且它們可以輕松超越使用較淺神經(jīng)網(wǎng)絡(luò)架構(gòu)的對手。實際上,VGGNetworks是之前最先進的更深層次的神經(jīng)網(wǎng)絡(luò)。
![]()
關(guān)于VGGNetworks架構(gòu)只有一個警告,也就是說,這些模型沒有經(jīng)過端到端訓(xùn)練。令人驚訝的是,這些模型是通過一種稱為分階段訓(xùn)練的技術(shù)進行訓(xùn)練的。例如,為了訓(xùn)練更深的神經(jīng)網(wǎng)絡(luò)架構(gòu),他們需要預(yù)先訓(xùn)練一個較淺的對應(yīng)部分。然后,他們在之前的模型之上添加了兩個層,然后不斷對其進行微調(diào)。所以這種分階段的訓(xùn)練策略其實并不理想。這實際上違背了深度學(xué)習(xí)的端到端訓(xùn)練理念。為了從頭開始訓(xùn)練這些模型架構(gòu),我們需要開發(fā)更好的初始化算法。
![]()
然后,在VGGNetworks論文發(fā)表的第二年,社區(qū)開始更加關(guān)注網(wǎng)絡(luò)初始化問題。然后,現(xiàn)在讓我們再縮小一點,我們將討論為什么這些更深的神經(jīng)網(wǎng)絡(luò)更難訓(xùn)練。直觀地說,一個非常深的神經(jīng)網(wǎng)絡(luò)將具有許多構(gòu)建塊和許多模塊的堆棧。現(xiàn)在假設(shè),如果每一個積木都會做錯事,或者會帶來一些麻煩,那么當我們把這個積木堆放很多次之后,我們的麻煩就只會越來越多。所以在實踐中,我們會看到一些信號爆炸的問題,或者我們也可能會看到一些信號消失的問題。在這種情況下,我們可能需要一些網(wǎng)絡(luò)初始化幫助我們讓神經(jīng)網(wǎng)絡(luò)開始訓(xùn)練。接下來,我將更深入地研究網(wǎng)絡(luò)初始化算法。
![]()
這里我展示了一個簡單的層,它在神經(jīng)網(wǎng)絡(luò)中是線性的。在這種情況下,輸入x將有x個節(jié)點或x個神經(jīng)元,輸出y將有m個節(jié)點。輸出只是輸入的線性變換,變換將由權(quán)重矩陣w表示。在神經(jīng)網(wǎng)絡(luò)架構(gòu)中這是一件簡單的事情。
那么如果我們假設(shè)所有元素都在這里,例如x,y和w,彼此獨立,并且如果我們進一步假設(shè)整個神經(jīng)網(wǎng)絡(luò)內(nèi)部只有線性激活,那么我們可以證明,信號經(jīng)過一層處理后,信號的方差將按縮放因子縮放。例如,該方程基本上表示該層輸出的方差等于輸入神經(jīng)元的數(shù)量乘以權(quán)重矩陣的方差乘以輸入信號的方差。因此該層將通過該縮放因子縮放信號的方差。
如果我們沒有任何激活或者我們的激活函數(shù)是線性的,我們可以在非常深的神經(jīng)網(wǎng)絡(luò)中多次應(yīng)用這個公式。好吧,我們將看到方差仍然按比例縮放許多縮放因子的乘積。這個方程基本上表示輸出,即網(wǎng)絡(luò)輸出的方差,等于這些數(shù)字乘以網(wǎng)絡(luò)輸入方差的乘積。這就是前向傳播的公式。
我們可以做一些數(shù)學(xué)計算,然后我們會得到一個逆向公式,向后的表述方式也非常相似。基本上這個方程表示,如果你想通過反向傳播計算淺層的梯度,那么這個梯度的方差將等于這些許多縮放因子的乘積乘以網(wǎng)絡(luò)輸出梯度的方差。這就是后向傳播公式。
![]()
那么基本上這很多因素的乘積基本上就是說,如果每個單層的縮放因子都小于1,那么這個效果會經(jīng)過很多層的積累之后,你將會遇到梯度消失的問題。也就是說,你的網(wǎng)絡(luò)不會進行訓(xùn)練。它似乎已經(jīng)飽和,或者似乎已經(jīng)收斂。但真正的原因是它沒有收到足夠的梯度來進行訓(xùn)練。另一方面,如果每個層的縮放因子都大于1,您將遇到梯度爆炸問題。也就是說,你的網(wǎng)絡(luò)可能會在第一次迭代中出現(xiàn)分歧。
![]()
然后為了讓網(wǎng)絡(luò)至少開始訓(xùn)練,我們需要開發(fā)良好的初始化算法。前面的推導(dǎo)將引導(dǎo)我們得到這種初始化方法,在PyTorch或TensorFlow包中稱為Xavier初始化。基本上,您希望將此縮放因子設(shè)置為每個單層的縮放因子。您可能想要將前向公式設(shè)置為1,或者將后向公式設(shè)置為1。這就是初始化神經(jīng)網(wǎng)絡(luò)中每一層權(quán)重的方法。通常在實踐中,您只需要設(shè)置一種或另一種形式即可。其實這并不重要。
![]()
這種網(wǎng)絡(luò)初始化可以幫助我們在信號傳播過程中保留信號的方差。而之前的推導(dǎo)是基于激活函數(shù)是線性的假設(shè)。而在實踐中,通常這不是您想要的。您可能想引入ReLU激活。那么我們還可以證明,隨著ReLU的引入,您可能想稍微改變一下這個公式。意味著,您需要在這些方程中添加一個1/2的因子。直觀地講,ReLU激活可能會在訓(xùn)練過程中削減一半的信號。這就是為什么您需要引入1比2的比例因子。盡管這似乎是一個非常小的變化,但與之前的版本相比,事實證明它非常重要。這是因為,如果您在每一層都引入一些問題或一些麻煩,那么在很多層之后,如果您沒有做對事情,您將遇到梯度消失問題。這個初始化方法可以幫助我們訓(xùn)練VGG網(wǎng)絡(luò),從頭開始,無需階段性訓(xùn)練。這就是我們?nèi)绾握_初始化神經(jīng)架構(gòu)。
![]()
讓我們回到2014年。接下來我要講的是另外一個非常有趣的工作,這與VGG網(wǎng)絡(luò)并行。這一領(lǐng)域的研究通常被稱為GoogleNet或Inception。這項研究的一個共同主題是如何設(shè)計深度且同時經(jīng)濟的卷積神經(jīng)網(wǎng)絡(luò)。其中涉及到幾個有趣的想法。第一個想法是使用多個分支。例如,同一模塊中可能有1x1、3x3或5x5卷積。同時,您可以使用1x1卷積作為瓶頸。也就是說,您可以使用這個1x1的卷積來靈活控制您的神經(jīng)網(wǎng)絡(luò)的通道數(shù)。在某些其他情況下,您可以減少通道數(shù)或增加通道數(shù)。同樣作為副產(chǎn)品,GoogleNet還引入了1x1卷積作為其模塊中的快捷方式。所以它是一個shortcut,因為這個1x1的卷積可以比同一個模塊中的其他分支更淺,所以它可以被稱為shortcut。
![]()
實際上,在我看來,Inception架構(gòu)簡直太瘋狂了,而且有數(shù)百萬個不同設(shè)計的版本。大多數(shù)時候,如果你足夠幸運,那就太好了。它將在神經(jīng)網(wǎng)絡(luò)設(shè)計方面為您提供非常引人注目的計算和準確性權(quán)衡。然而,它也帶來了另一個問題。因此,這些架構(gòu)的瘋狂設(shè)計可能會打破我們開發(fā)初始化算法所需的簡單假設(shè)。所以你可能想開發(fā)一些其他的初始化算法專門針對所有這些瘋狂的設(shè)計,或者您可能想引入一些其他模塊來幫助您更改這些神經(jīng)網(wǎng)絡(luò)架構(gòu)。
![]()
受到這些Inception架構(gòu)的激勵,人們開始看看另一類方法,它們在神經(jīng)網(wǎng)絡(luò)中被稱為歸一化模塊。2015年,人們開始關(guān)注標準化模塊。其實,早在這之前,人們就已經(jīng)意識到,如果我們想要訓(xùn)練一個非常好的神經(jīng)網(wǎng)絡(luò),如果我們想要這個神經(jīng)網(wǎng)絡(luò)開始收斂,您可能想要標準化輸入。事實上,即使在今天,這就是您需要對數(shù)據(jù)進行預(yù)處理的操作。而另一方面,我們剛才講的網(wǎng)絡(luò)初始化方法也可以被認為是歸一化的一種形式。這是因為我們希望在信號傳播過程中保持信號的方差或多或少保持不變。這種網(wǎng)絡(luò)初始化的歸一化是基于一些分析推導(dǎo)或分析假設(shè)。而這些假設(shè)只在訓(xùn)練開始時有效,在訓(xùn)練過程中就會被打破。這并不理想。
為了解決這個問題,人們想開發(fā)另一個模塊,它基本上是神經(jīng)網(wǎng)絡(luò)內(nèi)的一層。并且這些模塊會在整個訓(xùn)練過程中進行歸一化。因此他們可以在整個過程中保持信號標準化。如果你想將這些模塊應(yīng)用于所有層,它們還可以幫助您保持指定的所有層的信號標準化。而且,該歸一化模塊可以通過反向傳播進行端到端訓(xùn)練,因此它們只是深度學(xué)習(xí)方法工具箱中的另一個簡單且通用的模塊。
![]()
這是可以由歸一化模塊執(zhí)行的典型計算的示例。通常會涉及三個步驟。在第一步中,我們可能想要計算該模塊的輸入信號的期望或方差。然后我們可以通過減去平均值和除以標準差。而這個操作可能會降低自由度,因為我們進行了這種標準化。所以我們可能想要補償這種減少通過引入另一個線性變換,可以簡單地是Ax加b。并且這三個操作可以放在一個層中,這是標準化模塊或標準化層。從概念上講,這一層基本上可以在神經(jīng)網(wǎng)絡(luò)架構(gòu)中的任何地方或任何地方使用。
![]()
在實踐中,規(guī)范化模塊有多種類型。這些模塊之間的區(qū)別之一在于它們計算均值和方差的支持集。例如,在本例中,我顯示了2D圖像的張量。這里,n是batch size的軸,c是通道數(shù),h和w是高度,即空間大小。而這個操作就代表了批量歸一化操作。基本上,它將計算整個空間域的統(tǒng)計數(shù)據(jù),并且還跨批處理域。這就是為什么它被稱為批量歸一化。然后還有許多其他類型的歸一化層。它們僅在支持集的定義上有所不同。今天,我們使用的最流行的選擇之一,或者也許是我們使用的默認選擇,是層標準化操作。因此還值得注意的是,它在限制或Transformer中的定義可能略有不同。
![]()
那么,為什么這些標準化模塊很重要呢?所以首先,使用這些模塊可以使模型開始訓(xùn)練,否則他們就會停止訓(xùn)練,或者一開始就會出現(xiàn)分歧。另一方面,即使模型可以開始訓(xùn)練,歸一化模塊的引入有助于加快收斂速度,也有助于提高模型收斂時的精度。
![]()
接下來我要講一下ResNet。在此之前,讓我們稍微縮小一下我們來記錄一下深度學(xué)習(xí)的核心思想是什么。因此,關(guān)鍵思想是將一組簡單的通用模塊組合成高度復(fù)雜的功能。所以為了組成大量簡單的模塊,我們可能想要構(gòu)建一個不同的神經(jīng)網(wǎng)絡(luò)架構(gòu)。這是基礎(chǔ),也是ResNet架構(gòu)背后的基本動機。
在殘差學(xué)習(xí)的這項工作中,我們證明了深度學(xué)習(xí)或深度神經(jīng)網(wǎng)絡(luò)架構(gòu)可以比人們想象的更深入。而且,有趣且令人驚訝的是,這可以通過一個非常簡單的組件來完成,這只是一個身份快捷方式,從概念上講,基本上,它幾乎什么都不做。然而,這個簡單組件的引入可以使數(shù)百層的神經(jīng)網(wǎng)絡(luò)從頭開始訓(xùn)練并達到更好的精度。接下來,我將講述一些關(guān)于ResNet的故事。
![]()
ResNet的靈感來自于一項經(jīng)驗觀察,這就是所謂的退化問題。我們討論了非常好的初始化方法以及非常有效的標準化模塊。然后在這些模塊的幫助下,我們足以從頭開始訓(xùn)練非常深的神經(jīng)網(wǎng)絡(luò)架構(gòu)并獲得一定的準確性。那么,深度學(xué)習(xí)是否只是堆疊越來越多的層那么簡單呢?不幸的是,答案是否定的。實際上,事實證明,在20層之后模型會很快退化。而這種退化并不是因為過度擬合。也就是說,越深的模型不僅驗證精度越差,他們在實踐中的訓(xùn)練準確性也會較差。事實證明,這些不同的神經(jīng)網(wǎng)絡(luò)只是更難訓(xùn)練,這是違反直覺的。
![]()
現(xiàn)在讓我們來做一個思想實驗。較深的模型實際上比較淺的模型具有更豐富的解空間。所以也就是說,越深的神經(jīng)網(wǎng)絡(luò)不應(yīng)該有越低的訓(xùn)練精度。我們很容易通過構(gòu)建得到更深層次的神經(jīng)網(wǎng)絡(luò)的解決方案。如果我們能做到的話,我們可以簡單地訓(xùn)練一個較淺的神經(jīng)網(wǎng)絡(luò)來達到一定的精度。然后我們可以將訓(xùn)練后的層從這個較淺的模型復(fù)制到更深的對應(yīng)層中的相應(yīng)層。然后對于更深層特有的其他層,我們可以簡單地將它們設(shè)置為身份映射。以及這種更深層神經(jīng)架構(gòu)解決方案的存在。建議至少應(yīng)該具備一些較淺的對應(yīng)物。然而,退化的經(jīng)驗觀察表明,優(yōu)化可能無法找到該解決方案,或者優(yōu)化可能無法找到與該解決方案足夠相似的解決方案。這促使我們開發(fā)一個稱為深度殘差學(xué)習(xí)的框架。
![]()
再次,讓我們縮小一點,想象一個非常深的神經(jīng)網(wǎng)絡(luò)架構(gòu)。然后讓我們關(guān)注一個非常深的神經(jīng)架構(gòu)內(nèi)的一個小子網(wǎng)。在此圖中,這個小子網(wǎng)只有兩層。然后我們使用函數(shù) hx 來表示要適合這個小子網(wǎng)的底層所需函數(shù)。在經(jīng)典的普通神經(jīng)網(wǎng)絡(luò)的情況下,我們唯一能做的就是希望這兩層能夠契合hx的底層功能。
![]()
然而,殘差學(xué)習(xí)的思想就不同了。我們不需要使用這個權(quán)重層來直接擬合這個函數(shù)hx。相反,我們可能希望它們適合另一個函數(shù),即 fx。這個函數(shù)將代表我們可以在這個小子網(wǎng)的輸入之上進行的增量或更改。為了擁有原來想要的功能,我們只需要將 fx 添加到該子網(wǎng)的輸入中即可。并且這種加法可以很容易地實現(xiàn)為恒等映射,它將該子網(wǎng)的輸入連接到該子網(wǎng)的輸出。并且信號將通過逐元素相加來合并。這也將把這個子網(wǎng)變成一個殘差塊。
![]()
在這個殘差塊中,權(quán)重層將執(zhí)行一個稱為殘差函數(shù)的函數(shù)。基本上,殘差函數(shù)只是輸入之上的增量變化。現(xiàn)在讓我們將整個殘差塊視為我們要使用的函數(shù)。如果恒等映射對于該函數(shù)是最佳的,那么我們應(yīng)該很容易實現(xiàn)它。因為我們可以將所有權(quán)重層設(shè)置為零。如果恒等映射幾乎是最優(yōu)的,那么我們也許也能有一個好的解決方案,因為我們可以將權(quán)重設(shè)置為一些小數(shù)字。
從這個意義上說,實際上,剩余學(xué)習(xí)的想法鼓勵進行小的、保守的和漸進的改變的基石。然而,通過將許多小的改變放在一起,我們?nèi)匀挥锌赡軐W(xué)習(xí)一個非常復(fù)雜的函數(shù)。這也遵循深度學(xué)習(xí)方法論。再次,作為引入殘差塊的副產(chǎn)品,我們很容易有另一種初始化方法。我們可以在訓(xùn)練開始時將權(quán)重設(shè)置為一些小數(shù)字或?qū)⑺鼈冊O(shè)置為零。
![]()
也就是說,整個殘差塊將只是恒等映射或類似于訓(xùn)練開始時的恒等映射。所以信號在前向過程中也是在后向過程中可以在訓(xùn)練開始時使用此恒等映射輕松傳播。所以你不需要太擔心初始化算法。
![]()
那么,我們很容易采用這個想法來構(gòu)建一個非常深的神經(jīng)網(wǎng)絡(luò)架構(gòu)。因此,從某種意義上說,您可能只需要將這么多身份連接添加到普通神經(jīng)網(wǎng)絡(luò)中,然后就可以將其變成殘差神經(jīng)網(wǎng)絡(luò)。或者等價地,這可以被認為是簡單地堆疊許多殘差塊來創(chuàng)建一個非常深的模型。所以從這個意義上來說,殘差塊的引入或者設(shè)計實際上成為我們構(gòu)建非常深的神經(jīng)網(wǎng)絡(luò)架構(gòu)的新通用設(shè)計或新通用模塊。
所以引入ResNet之后,人們開始關(guān)注每一個構(gòu)建模塊的設(shè)計。也許最成功的設(shè)計之一是Transformer塊。之后,您只需要多次堆疊相同類型的塊即可,當您有更多層時,您不需要仔細設(shè)計每個特定層。
![]()
這里是一些關(guān)于 ResNet 的結(jié)果。圖中,x軸是神經(jīng)網(wǎng)絡(luò)的深度,y軸是分類精度。這個數(shù)字基本上表明,例如,普通神經(jīng)網(wǎng)絡(luò)在 20 層之后將開始快速退化。而且ResNet可以在多層之后不斷改進。同樣的模式也可能發(fā)生在 ImageNet 和許多其他數(shù)據(jù)集上。
![]()
而這個模式可以概括為這樣的形式:在沒有剩余連接的幫助下,神經(jīng)網(wǎng)絡(luò)將在某一點后開始退化,具體取決于您的場景。并且在殘差連接的幫助下,它可以不斷改進,當你添加越來越多的層時,這是一個非常理想的屬性。
![]()
這里列出了構(gòu)建和訓(xùn)練非常深層的神經(jīng)網(wǎng)絡(luò)架構(gòu)時可以執(zhí)行的幾項操作的清單。其中許多概念都是關(guān)于我們?nèi)绾螕碛薪】档挠?xùn)練過程中的信號傳播。這方面包括使用真實世界的激活或類似形狀的其他激活,以及適當?shù)某跏蓟惴ǖ氖褂谩K€包括將歸一化模塊和殘差連接引入神經(jīng)網(wǎng)絡(luò)架構(gòu)中。
![]()
很好,我已經(jīng)討論過使用卷積神經(jīng)網(wǎng)絡(luò)學(xué)習(xí) 2D 圖像的深度表征。接下來,我也會簡單講一下我們?nèi)绾螐囊痪S序列中學(xué)習(xí)深度表征。
![]()
我們進行一維序列建模的經(jīng)典模型是 循環(huán)神經(jīng)網(wǎng)絡(luò),簡稱 RNN。循環(huán)神經(jīng)網(wǎng)絡(luò)是一種非常特殊的神經(jīng)網(wǎng)絡(luò),它的連接中有循環(huán)。也就是說,給定一個循環(huán)神經(jīng)網(wǎng)絡(luò)單元,它將獲取當前時間步的輸入,比如說 xt,然后根據(jù)該輸入生成一個隱藏狀態(tài),例如 ht。這個隱藏狀態(tài)將用于確定該時間步的輸出。而這個隱藏狀態(tài)也將作為下一個時間步的輸入。
如果我們沿著時間軸展開這個循環(huán)神經(jīng)網(wǎng)絡(luò)架構(gòu),我們可以看到,它實際上是另一個權(quán)重共享模型,權(quán)重在時間維度上共享。而且,該架構(gòu)也是本地連接的表述。例如,對于每個單元, 它僅連接到該時間步的輸入,并且還連接到前一個時間步。因此,我們再次看到權(quán)重共享和本地連接仍然是循環(huán)神經(jīng)網(wǎng)絡(luò)設(shè)計中的兩個關(guān)鍵屬性。這在概念上與卷積神經(jīng)網(wǎng)絡(luò)非常相似。
![]()
我們?nèi)绾螛?gòu)建深度循環(huán)神經(jīng)網(wǎng)絡(luò)?事實證明它也非常簡單。從某種意義上說,您只需將循環(huán)神經(jīng)網(wǎng)絡(luò)單元的狀態(tài)視為新序列,然后就可以使用另一個單元來處理該序列。也就是說,你可以將許多循環(huán)神經(jīng)網(wǎng)絡(luò)單元堆疊在一起,你將擁有一個更深的神經(jīng)網(wǎng)絡(luò)。例如,在這里,我展示了三層循環(huán)神經(jīng)網(wǎng)絡(luò)的情況。在這種情況下,如果我們考慮該神經(jīng)元的輸出,它將取決于所有較淺層的輸出。它還將取決于同一層中所有先前的時間步。這只是循環(huán)神經(jīng)網(wǎng)絡(luò)架構(gòu)的一個屬性。
![]()
這是深度循環(huán)神經(jīng)網(wǎng)絡(luò)在實踐中的一個例子。這個例子來自谷歌的神經(jīng)機器翻譯系統(tǒng),這是 2016 年為其產(chǎn)品開發(fā)的。在本例中,他們堆疊了多個 LSTM 單元來構(gòu)建這個深度循環(huán)神經(jīng)網(wǎng)絡(luò)。LSTM 只是一種非常有效的 RNN 形式的特殊形式。在這項工作中,作者報告說,為了構(gòu)建這個非常深的 LSTM 模型,他們?nèi)匀恍枰褂檬S噙B接。他們報告說,在殘余連接的幫助下,他們可以訓(xùn)練多達 16 層的深度 LSTM,并享受更深層次的好處。如果他們不使用剩余連接,他們在四層之后就觀察到了降解問題。
有趣的是,這個觀察結(jié)果與我們在卷積神經(jīng)網(wǎng)絡(luò)上所做的觀察非常相似。這再次證明了深度學(xué)習(xí)方法的強大功能和通用性。也就是說,如果我們從一個應(yīng)用程序開發(fā)出一個非常有效且非常通用的組件,那么您很可能會享受到其他一些應(yīng)用程序的好處。所以在這種情況下,就開發(fā)了原來的殘差連接在卷積神經(jīng)網(wǎng)絡(luò)進行2D圖像處理的場景中。但它的行為也可以在完全不同的場景中觀察到,使用遞歸神經(jīng)網(wǎng)絡(luò)進行一維序列建模。
![]()
那么,循環(huán)神經(jīng)網(wǎng)絡(luò)并不是我們對一維序列進行建模的唯一方法。我們?nèi)匀豢梢允褂媒?jīng)典的卷積神經(jīng)網(wǎng)絡(luò)來實現(xiàn)或多或少相同的目標。我們只需在一維維度上應(yīng)用滑動窗口,然后就可以對一維序列進行卷積。如果我們想要進行因果推理,可能需要在此處做一些微小的調(diào)整,也就是說,我們可能希望通過卷積來執(zhí)行一些因果計算。對于卷積核來說,它只能看到當前時間步或任何先前的時間步,而無法看到任何未來的時間步長。
在卷積神經(jīng)網(wǎng)絡(luò)的情況下,局限性是非常明顯的。如果你想捕捉更長的上下文,你需要建立一個更深的神經(jīng)網(wǎng)絡(luò)架構(gòu)。這是因為對于每個單層,上下文長度將受到內(nèi)核大小的限制。例如,對于某個神經(jīng)元,它的上下文僅取決于當前時間步和前一個時間步。因此,為了擁有更長的上下文,你可能需要更多層。這個神經(jīng)元將取決于最多三個時間步的距離。這就是當我們使用卷積神經(jīng)網(wǎng)絡(luò)進行序列建模時,你可以獲得更長的上下文的方式。
![]()
接下來,我將討論另一個具體例子。這個例子來自 DeepMind 的 WaveNet 架構(gòu),這里的應(yīng)用程序是音頻生成。在這種情況下,他們不僅使用了因果卷積,而且還將其推廣到另一種操作,稱為擴張。擴張卷積意味著卷積核不需要依賴于前一步。它可能取決于可能相隔許多時間步的時間步。膨脹操作可以幫助我們大大增加卷積核的大小,并且它可以幫助我們捕獲更長的上下文。但即便如此,作者仍然需要堆疊很多卷積層來構(gòu)建一個非常深的卷積神經(jīng)網(wǎng)絡(luò)以捕獲長上下文。因此,他們?nèi)匀恍枰獨堄噙B接的幫助以便享受訓(xùn)練更深層神經(jīng)網(wǎng)絡(luò)的好處。
![]()
這里從概念上總結(jié)了不同的序列建模范例。在循環(huán)神經(jīng)網(wǎng)絡(luò)的情況下,對于每個單層和每個時間步長,它可以看到完整的上下文。也就是說,如果我們考慮這個神經(jīng)元,它的計算將取決于同一層中所有先前時間步的計算。如果你希望在應(yīng)用程序中進行一些遠程推理,這可能是一個理想的屬性。然而,另一方面,也因為這個屬性,循環(huán)神經(jīng)網(wǎng)絡(luò)的計算不是前饋的。也就是說,為了計算這個神經(jīng)元的輸出,你需要等待前面所有神經(jīng)元的輸出完成。所以這種行為對于GPU中的并行實現(xiàn)并不友好。因此在實踐中,循環(huán)神經(jīng)網(wǎng)絡(luò)在 GPU 實現(xiàn)上效率不高。
作為比較,卷積神經(jīng)網(wǎng)絡(luò)具有完全不同的行為。一方面,該模型是完全前饋的。因此,對于同一層中的每個神經(jīng)元,你不需要等待其他神經(jīng)元完成其計算。所以這對于GPU中的并行實現(xiàn)非常友好。所以通常情況下,卷積神經(jīng)網(wǎng)絡(luò)在 GPU 實現(xiàn)上非常高效。另一方面,正如我們所討論的,上下文長度將受到卷積核大小的限制。這不是一個理想的屬性。
那么我們怎樣才能兩全其美呢?這就是引入注意力機制的原因。簡單地說,在注意力機制中,我們允許每個神經(jīng)元或每個時間步驟看到序列中的每個其他時間步驟。因此,對于每一個神經(jīng)元,它將能夠看到上一層的完整上下文。因此,如果你想要對長期推理進行建模,那么這是神經(jīng)網(wǎng)絡(luò)架構(gòu)中所需的屬性。另一方面,在注意力機制中,所有計算都是前饋的。所以你不需要等待。你不需要等待同一層上一個時間步的計算完成。所以這種前饋計算對于GPU實現(xiàn)來說也是非常友好的。
![]()
注意力機制是一種非常流行的架構(gòu)(稱為 Transformer)背后的核心思想。由于時間有限,我不打算深入研究Transformer的技術(shù)細節(jié)。但我將分享Transformer設(shè)計的一些有趣的特性。第一個屬性是在Transformer中,我們允許每個節(jié)點看到其他每個節(jié)點,正如我們所討論的。還有另一個有趣的特性,令許多從業(yè)者感到驚訝的是,實際上注意力計算是無參數(shù)的。所以不需要引入任何參數(shù)。也就是說,如果給你三個序列,比如說 Q、K、V,它是查詢、鍵和值的縮寫,那么注意力計算不需要引入任何可訓(xùn)練的參數(shù)。所以這與經(jīng)典的全連接層不同,其中每個連接都可以代表一個可訓(xùn)練的參數(shù)。在注意力計算的情況下,每個連接都代表沒有可訓(xùn)練的參數(shù)。這只是意味著這兩件事是相互關(guān)聯(lián)的。
那么參數(shù)在哪里呢?有趣的是,在 Transformer 架構(gòu)中,所有參數(shù)層都是前饋的。參數(shù)層將用于我們獲得稱為 Q、K、V 的序列,它們還將用于 MLP 塊中,即在表征空間中變換這些序列。從某種意義上說,所有這些參數(shù)層都只是一種一對一的卷積層。再說一遍,所有這些層都是本地連接的,因為它們只連接到當前時間步,所有這些層都有跨時間維度共享的方式。再次,我們可以看到本地連接和共享方式仍然是神經(jīng)網(wǎng)絡(luò)架構(gòu)中的兩個關(guān)鍵屬性。而且,Transformer架構(gòu)是一個非常深入的模型,所以我們需要依賴某種類型的標準化操作以及我們訓(xùn)練這些非常深的模型的剩余連接。
![]()
Transformer架構(gòu)有許多成功的應(yīng)用,也許最受歡迎和最著名的一種是生成式預(yù)訓(xùn)練 Transformer,簡稱 GPT。簡單來說,GPT模型是自然語言處理的表征學(xué)習(xí)模型。GPT 模型是為“下一個世界預(yù)測”的任務(wù)而設(shè)計的。在此任務(wù)中,模型被賦予一個句子的前綴,并要求預(yù)測該前綴之后的下一個單詞是什么。在這種情況下,該句子可以是,例如,學(xué)生打開一些東西,模型被要求預(yù)測一些東西,模型可能會說,有一定概率,書。而這個模型,GPT模型,是在從互聯(lián)網(wǎng)收集的更大規(guī)模的數(shù)據(jù)集上進行訓(xùn)練的,因此它能夠?qū)W習(xí)關(guān)于自然語言的非常好的表示。它還將學(xué)習(xí)該語言數(shù)據(jù)中包含的知識。GPT 模型是許多語言應(yīng)用程序背后的基礎(chǔ),包括ChatGPT。事實上,為了享受這種好處,我們?nèi)匀恍枰蕾囘w移學(xué)習(xí)范式。也就是說,我們在更大規(guī)模的數(shù)據(jù)上預(yù)訓(xùn)練這個模型,然后我們需要在一些較小規(guī)模的數(shù)據(jù)集中微調(diào)或遷移這個模型。
![]()
Transformer 的另一個成功應(yīng)用是 AlphaFold 應(yīng)用。簡單來說,AlphaFold 是一種表征學(xué)習(xí)方法,用于蛋白質(zhì)折疊的應(yīng)用。在這種情況下,神經(jīng)結(jié)構(gòu)的輸入是氨基酸序列,架構(gòu)的輸出只是蛋白質(zhì)結(jié)構(gòu)。這個架構(gòu)有 48 個Transformer塊,該架構(gòu)將在更大規(guī)模的蛋白質(zhì)結(jié)構(gòu)數(shù)據(jù)集上進行訓(xùn)練,這是過去幾十年來通過人體實驗收集到的。有趣的是,盡管其中許多組件,例如Transformer塊或剩余連接的使用,最初是為許多其他應(yīng)用程序開發(fā)的,例如自然語言處理或圖像識別,這組完全相同的構(gòu)建模塊可以應(yīng)用于完全不同的蛋白質(zhì)折疊問題。這再次證明了深度學(xué)習(xí)方法的通用性。如果你開發(fā)了一套非常有效的工具,那么你也許能夠享受這些工具的好處,也許是在完全不同的領(lǐng)域。
![]()
然后我們準備好回到計算機視覺,我們接下來要介紹的另一個非常成功的作品,它叫做Vision Transformer,或者ViT。從概念角度來看,視覺Transformer(ViT)只是Transformer在二維圖像處理中的應(yīng)用。實踐證明,這個想法的實現(xiàn)過程可以非常簡單。我們只需準備一個輸入圖像,將其劃分為一系列不重疊的補丁。然后,我們可以將Transformer架構(gòu)應(yīng)用到這個一維序列上,就像處理任何其他一維序列一樣。這個簡單的想法被證明非常成功且有效,如今它已經(jīng)成為我們在計算機視覺中進行圖像識別的首選之一。
(城主注:ViT技術(shù)就是當前大熱的Sora大模型的核心基礎(chǔ)!)
VIT架構(gòu)的意義并不僅僅在于計算機視覺領(lǐng)域,因為它首次證明了Transformer架構(gòu)可以成為解決許多問題的統(tǒng)一架構(gòu),包括自然語言處理、計算機視覺、音頻識別、3D處理,以及許多其他序列處理問題。這再次證明了深度學(xué)習(xí)方法的通用性。
![]()
這是本教程的結(jié)論,也是本部分的一些要點。在本教程中,我介紹了什么是表征學(xué)習(xí)以及為什么它是一個重要問題。表征學(xué)習(xí)可能是我們在不同領(lǐng)域和不同應(yīng)用程序中可能遇到的常見問題。而深度學(xué)習(xí)和深度神經(jīng)網(wǎng)絡(luò)正是我們解決表征學(xué)習(xí)問題的非常有效的工具。
再次強調(diào),深度學(xué)習(xí)的關(guān)鍵思想是將一組簡單的通用模塊組合成高度復(fù)雜的函數(shù)。深度學(xué)習(xí)的思想可以為我們提供通用的工具來解決不同領(lǐng)域的不同問題,我希望您將來能夠在您的領(lǐng)域使用這些工具。
特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.