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