原文:theaisummer.com/Deep-Learni…
作者:Sergios Karagiannakos
因為文章有些長,所以會分成上下兩篇文章,分開發。
上一篇文章的連結:
本文目錄如下:
- 深度學習是什麼?
- 神經網路(Neural Networks)
- 前向神經網路(Feedforward Neural Networks, FNN)
- 卷積神經網路(Convolutional Neural Networks, CNN)
- 迴圈神經網路(Recurrent Neural Networks ,RNN)
- 遞迴神經網路(Recursive Neural Network )
- 自動編碼器(AutoEncoders)
- 深度信念網路(Deep Belief Networks)和受限制玻爾茲曼機(Restricted Boltzmann Machines)
- 生成對抗網路(Generative Adversarial Networks)
- Transformers
- 圖神經網路(Graph Neural Networks)
- 基於深度學習的自然語言處理
- 詞嵌入(Word Embedding)
- 序列模型(Sequence Modeling)
- 基於深度學習的計算機視覺
- 定位和目標檢測(Localization and Object Detection)
- Single shot detectors(SSD)
- 語義分割(Semantic Segmentation)
- 姿勢估計(Pose Estimation)
上一篇文章介紹了前面 6 小節,從深度學習的定義到介紹了神經網路、前向神經網路、卷積神經網路、迴圈神經網路以及遞迴神經網路,接下來會介紹剩餘的幾個演算法以及兩大應用方向。
7. 自動編碼器(AutoEncoders)
自動編碼器[11] 通常是作為一個非監督演算法使用,並且主要應用在降維和壓縮。它們的技巧就是嘗試讓輸出等於輸入,另外,在其他工作中,也有嘗試重構資料的做法。
自動編碼器包括一個編碼器和一個解碼器。編碼器接收一個輸入,然後將其編碼成一個低維的隱空間中的向量,然後解碼器負責將該向量進行解碼得到原始的輸入。結構如下圖所示:
從上圖中我們可以知道,能從網路中間的輸出(圖中 code 部分)得到一個更少維度的輸入的特徵表示,這就是實現了降維和壓縮的工作。
另外,也可以根據這個思路來重新得到略微有些不同的輸入資料,甚至是更好的資料,這可以用於訓練資料的增強,資料的去噪等
8. 深度信念網路(Deep Belief Networks)和受限制玻爾茲曼機(Restricted Boltzmann Machines)
受限制玻爾茲曼機[12] 是帶有生成能力的隨機神經網路,也就是它可以通過輸入來學習到一個概率分佈。相比其他網路,它的最大特點就是隻有輸入和隱藏層,不包含輸出。
在訓練的前向部分,傳入一個輸入併產生一個對應的特徵表示,然後在反向傳播中,則從這個特徵表示重構原始的輸入(這個過程非常類似自動編碼器,但是它在單個網路中實現的)。具體網路結構如下圖所示:
多個受限制玻爾茲曼機(RBMs)疊加在一起就可以組成一個深度信念網路[13]。它們看起來和全連線層非常相似,但不同點在於訓練的方式。深度信念網路的訓練是根據 RBMs 的訓練過程來以成對的方式訓練其網路層。
然而最近深度信念網路和受限制玻爾茲曼機的使用者越來越少,因為出現了生成對抗網路(GANs)以及變異的自動編碼器。
9. 生成對抗網路(Generative Adversarial Networks)
生成對抗網路[14]是在 2016 年由 Ian Goodfellow 提出的一個演算法,它基於這樣一個簡單但優雅的想法:如果你想生成圖片資料,你會怎麼做呢?
做法可能是先建立兩個模型,首先訓練第一個模型來生成假的資料(生成器),然後訓練第二個模型來辨別真假資料(判別器),然後將它們放在一起訓練,從而相互競爭。
隨著訓練,生成器會越來越擅長生成圖片資料,它的終極目標就是成功欺騙判別器。判別器則具有越來越強的辨別真假資料的能力,它的終極目標就是不會被欺騙。結果就是判別器會得到非常真實的假資料,網路結構如下圖所示:
生成對抗網路的應用包括視訊遊戲、天文學圖片,時尚等。基本上,只要是圖片資料,都可能會用到生成對抗網路,比如非常有名的 Deep Fakes,才有的就是生成對抗網路。
10. Transformers
Transformers
[15] 也是一個非常新的演算法,主要應用在語言類的應用,並且逐漸替代了迴圈神經網路。它主要基於注意力(attention)機制,即強制讓網路關注一個特定的資料點。
相比於擁有複雜的 LSTM 單元,注意力機制是根據輸入資料不同部分的重要性來賦予權重。注意力機制[16]也是一種權重層,它的目的是通過調整權重來優先關注輸入的特定部分,而暫時不關注不重要的其他部分割槽域。
Transformers
實際上包含了一些堆疊的編碼器(組成了編碼層),一些堆疊的解碼器(解碼層)以及很多注意力網路層(self-attentions 和 encoder-decoder attentions),如下圖所示:
Transformers
主要是用於解決有序序列資料,比如自然語言處理的一些任務,包括機器翻譯和文字摘要。目前 BERT
和 GPT-2
是兩個效能最好的預訓練自然語言系統,應用在很多的自然語言處理任務,它們也都是基於 Transformers
的。
11. 圖神經網路(Graph Neural Networks)
一般來說非結構化的資料並不是非常適合使用深度學習的演算法。實際上現實生活中確實有很多應用的資料都是非結構化的,然後以圖的格式組織起來的。比如社交網路、化學混合物、知識圖譜、空間資料等。
圖神經網路[17]的目標就是建模圖資料,也就是可以識別到一個圖裡結點之間的關係並生成一個數值型的表徵資料,類似於一個嵌入向量(embedding)。因此,它們可以應用到其他的機器學習模型中,用於所有型別的任務,比如聚類、分類等。
12. 基於深度學習的自然語言處理
詞嵌入(Word Embedding)
詞嵌入是通過將單詞轉成數值向量表示來獲取單詞之間的語義和語法的相似性。這個做法是很有必要的,因為神經網路只能接受數值型別的資料,所以必須將單詞和文字編碼為數值。
- Word2Vec [18] 是最常用的一種方法,它嘗試學習嵌入向量(embedding)並且可以通過上下文預測當前的單詞(CBOW)或者是基於單詞來預測上下文的單詞(Skip-Gram)。實際上
Word2Vec
也是一個兩層的神經網路,並且輸入和輸出都是單詞。單詞將通過獨熱編碼(one-hot encoding)的方式輸入到神經網路中。在CBOW
的例子中,輸入是相鄰的單詞,輸出是期望的單詞,而在Skip-Gram
的例子中,輸入和輸出正好相反,輸入是單詞,輸出是上下文單詞。 - Glove[19] 是另一種模型,它在
Word2Vec
的基礎上結合了矩陣分解的方法,比如隱藏語義分析(Latent Semantic Analysis),這是一個被證明在全域性文字分析上效果很好,但不能捕捉到區域性的上下文資訊。通過結合Word2Vec
和矩陣分解,可以很好利用它們各自的優勢。 - FastText[20] 是 Facebook 提出的演算法,它採用字元級別的表示,而不是單詞。
- 上下文單詞嵌入(Contextual Word Embeddings)通過採用迴圈神經網路來替代
Word2Vec
,用於預測一個序列中某個單詞的下一個單詞。這個方法可以捕捉到單詞之間的長期獨立性,並且每個向量都包含著當前單詞和歷史單詞的資訊。最有名的一個版本是 ELMo[21],它是一個兩層雙向 LSTM 網路。 - 注意力機制[22] 和
Transformers
正如之前介紹Transformers
所說,逐漸替代了RNN
的作用,它們可以實現賦予最相關的單詞的權重,並遺忘掉不重要的單詞
序列模型(Sequence Modeling)
序列模型是自然語言處理中不可分割的一部分,因為它在大量常見的應用中都會出現,比如機器翻譯[23],語音識別,自動完成以及情感分類。序列模型可以處理序列輸入,比如一篇文件的所有單詞。
舉例說明一下,假設你想將一句話從英文翻譯為法文。
為了實現這個翻譯,你需要一個序列模型(seq2seq)[24]。Seq2seq
模型包括一個編碼器和一個解碼器,編碼器將序列(本例子中的英語句子)作為輸入,然後將輸入在隱空間的表示作為輸出,這個表示會輸入到解碼器中,並輸出一個新的序列(也就是法語句子)。
最常見的編碼器和解碼器結構是迴圈神經網路(大部分是 LSTMs
),因為它們非常擅長捕捉到長期獨立性,而 Transformers
模型會更快並且更容易實現並行化。有時候,還會結合卷積神經網路來提升準確率。
BERT
[25] 和 GPT-2
[26] 被認為是目前最好的兩個語言模型,它們實際上都是基於序列模型的 Transformers
13. 基於深度學習的計算機視覺
定位和目標檢測(Localization and Object Detection)
圖片定位[27] 是指在一張圖片中定位到一個物體,並且用一個邊界框將其進行標記的任務,而在目標檢測中還包括了對物體的分類工作。
這幾個相關聯的工作都是通過一個基礎的模型(以及其升級版本)來進行處理,這個模型就是 RCNN
。R-CNN
以及它的升級版本 Fast RCNN
,Faster RCNN
採用了候補區域(region proposals)和卷積神經網路。
以 Faster RCNN
為例,網路的一個外部系統會給出一些以固定大小的邊界框形式展現的候補區域,這些區域可能包含目標物體。這些邊界框會通過一個 CNN
(比如 AlexNet
)進行分類和糾正,從而判斷該區域是否包含物體,物體是什麼類別,並且修正邊界框的大小。
Single shot detectors(SSD)
Single-shot detectors
以及其最著名的代表成員-- YOLO(You Only Look Once)
[28] 並沒有採用候補區域的想法,它們採用的是一組預定義好的邊界框。
這些邊界框會傳給 CNN
並分別預測得到一個置信度分數,同時檢測每個框居中的物體,並進行分類,最終會僅保留分數最高的一個邊界框。
這些年,YOLO
也有了好幾個升級版本--YOLOv2
,YOLOv3
,YOLO900
分別在速度和準確率上都得到了提升。
語義分割(Semantic Segmentation)
計算機視覺中一個基礎的工作就是基於上下文來將一張圖片中每個畫素都進行分類,也就是語義分割[29]。在這個領域裡,最常用的兩個模型就是全卷積網路(Fully Convolutional Networks, FCN)和 U-Nets
。
- **Fully Convolutional Networks(FCN)**是一個編碼器-解碼器的網路結構,也就是包含了卷積和反摺積的網路。編碼器先將輸入圖片進行下采樣來捕捉語義和上下文資訊,而解碼器是進行上取樣操作來恢復空間資訊。通過這種方法可以使用更小的時間和空間複雜度來實現恢復圖片的上下文。
- U-Nets 是基於一個獨特的想法--跨層連線(skip-connections)。它的編碼器和解碼器有相同的大小,
skip-connections
可以將資訊從第一層傳遞到最後一層,從而增加了最終輸出的維度大小。
姿勢估計(Pose Estimation)
姿勢估計[30] 是指定點陣圖片或者視訊中人物的關節點,它可以是 2D 或者是 3D 的。在 2D 中,我們估計的就是每個關節點的座標 (x, y),而 3D 中,座標就是 (x, y, z)。
PoseNet
[31] 是該領域[31]中最常用的模型,它使用的也是卷積神經網路。將圖片輸入到 CNN
中,然後採用單姿勢或者多姿勢演算法來檢測姿勢,每個姿勢都會得到一個置信度分數和一些關鍵點座標,最終是僅保留一個分數最高的。
總結
上述就是本文的所有內容,非常簡單的介紹了深度學習中幾個常用的演算法模型,包括了卷積神經網路、迴圈神經網路、自動編碼器,也有最近幾年才提出的生成對抗網路、Tranformers
,另外也分別介紹了深度學習的兩大應用,自然語言處理和計算機視覺中常見的方向。
當然,本文也僅僅是非常簡單的科普了這些演算法和應用方向的情況,後續如果想繼續深入瞭解,可以檢視參考的連結,會更詳細介紹每個具體的演算法模型。
參考
- en.wikipedia.org/wiki/Deep_l…
- karpathy.github.io/neuralnets/
- brilliant.org/wiki/backpr…
- ruder.io/optimizing-…
- theaisummer.com/Neural_Netw…
- theaisummer.com/Neural_Netw…
- theaisummer.com/Self_drivin…
- theaisummer.com/Sign-Langua…
- www.coursera.org/lecture/nlp…
- theaisummer.com/Bitcon_pred…
- theaisummer.com/Autoencoder…
- towardsdatascience.com/restricted-…
- deeplearning.net/tutorial/DB…
- theaisummer.com/Generative_…
- ai.googleblog.com/2017/08/tra…
- lilianweng.github.io/lil-log/201…
- theaisummer.com/Graph_Neura…
- pathmind.com/wiki/word2v…
- medium.com/@jonathan_h…
- research.fb.com/blog/2016/0…
- allennlp.org/elmo
- blog.floydhub.com/attention-m…
- www.tensorflow.org/tutorials/t…
- blog.keras.io/a-ten-minut…
- github.com/google-rese…
- openai.com/blog/better…
- theaisummer.com/Localizatio…
- theaisummer.com/YOLO/
- theaisummer.com/Semantic_Se…
- theaisummer.com/Human-Pose-…
- github.com/tensorflow/…
- www.fritz.ai/pose-estima…