Deep Learning

[Paper-NLP] ALBERT: A Lite BERT for Self-supervised Learning of Language Representations

ALBERT 在 2017 年 Transformer 的誕生,突破了 RNN、LSTM、GRU … 等在計算上的限制,也帶來新的觀點,爾後再 2018 年底 Google 發表了 BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding 開啟了通往偉大到航道的路線,也帶起了 pre-training model 的各種應用,不用再辛苦的從頭開始訓練,為了資料問題所苦惱。在 BERT 之後,湧出各種基於 BERT 的架構下進行優化改進,例如: GPT-2、XLNet、RoBERTa、ERNIE … 等這些耳熟能詳的模型,而這次將是為大家介紹也是基於 BERT 的架構下 Google 在 2019 年推出的輕量化版本的 BERT,ALBERT: A Lite BERT for Self-supervised Learning of Language Representations。 Introduction 如前言所述,在 BERT 後的時代透過大量的資料進行自監督(self-supervised1)的訓練,提高模型參數與更深層的結構,讓模型取得更好的表現,但也因為硬體上的限制,要訓練參數量大的模型就可能需要做到平行化處理以及記憶體內存的管控,但這樣的方式並沒有解決成本上的問題。基於這樣的情況,作者提出了下列問題: Is haveing better NLP models as easy as hvaing larger models? 也因為這個問題的討論,造就了 A Lite BERT(ALBERT) 的模型架構出來。

Transformer Part 3 - Transformer

Transformer 拖延了很久,終於有時間拉把欠的部分補齊了,來講在 NLP 已經廣為人知的 Transformer。在開始介紹前先來附上 transformer 的結構,如下圖: Image credit: Lil's Log 在這裡我會把 transformer 拆解如下面幾個主題來解說: Embedding and Softmax Positional Encoding Scaled dot-product attention Multi-head attention Postition-wise Feed-Forward Networks Encoder & Decoder Optimizeer Embedding and Softmax Embedding and softmax 這個部分應該比較少看到有人在文章中提出,其實光看字面的意思應該不難理解主要要做些什麼事情,但在論文中提到的主要差異點是說,在模型中在 embedding layer 與 pre-softmax linear transformation layer 使用共享參數矩陣的方式,而在 embedding layer 乘上一個縮放權重 $\sqrt{d_{model}}$,共享參數矩陣的想法可以參考 Using the Output Embedding to Improve Language Models 篇所提出的概念 補充說明: 在 transformer 中借鏡了 Using the Output Embedding to Improve Language Models 的 weight tying 的想法,把 embedding and pre-softmax 的 weight 共享,因為在 input 的 sequence 經過 embedding 會得到 word vector,在經過 decoder 計算後,也得到一樣維度的 vector,而在要進入 softmax 前,再乗上一個 weight (在 paper 稱這樣的 weight 為 output embedding),這樣的操作方式有效的提升 language models。

Transformer Part 2 - Attention

Attention Mechanism Attention 的概念在 2014 年被 Bahdanau et al. [Paper 1] 所提出,解決了 encoder-decoder 架構的模型在 decoder 必須依賴一個固定向量長度的 context vector 的問題。實際上 attention mechanism 也符合人類在生活上的應用,例如:當你在閱讀一篇文章時,會從上下文的關鍵字詞來推論句子所以表達的意思,又或者像是在聆聽演講時,會捕捉講者的關鍵字,來了解講者所要描述的內容,這都是人類在注意力上的行為表現。 用比較簡單的講法來說, attention mechanism 可以幫助模型對輸入 sequence 的每個部分賦予不同的權重, 然後抽出更加關鍵的重要訊息,使模型可以做出更加準確的判斷。 複習一下在之前介紹的 Seq2Seq model 中,decoder 要預測在給定 context vector 與先前預測字詞 \({y_1, \cdots, y_{t-1}}\) 的條件下字詞 $y_{t}$ 的機率,所以 decoder 的定義是在有序的條件下所有預測字詞的聯合機率: \[ \begin{align} p(\mathrm{y}) & = \prod_{t=1}^T p(y_t | \{y_1, \cdots, y_{t-1}\}, c) \tag 1 \\ \mathrm{y} & = (y_1, \cdots, y_T) \end{align} \]

Transformer Part 1 - Seq2Seq

一開始接觸 Attention Is All You Need 這篇論文是從 Kaggle Reading Group 這個 channel 開始,非常推薦可以跟著一起讀!! 主持人 Rachael Atman 本身是 Kaggle 的 Data Scientist,她的導讀我覺得是流暢的,但她自己本身有說過並非是 NLP 領域的專家,所以在 kaggle reading group 裡閱讀的論文也有可能是她完全沒接觸過的,整個 channel 帶給你的就是一個啟發,讓你覺得有人跟你一起閱讀的感覺,然後過程中也些人會在 channel 的 chat room 提出一些看法或是連結,Rachael 本身也會提出自己的見解,可以多方面參考。 在跟完整個 Attention Is All You Need 的影片後,還是有太多細節是不清楚的,因為自己本身也不是這個領域的,所以開始追論文中所提到的一些關鍵名詞,就開始從 $seq2seq \rightarrow attention \rightarrow self-attention$。這中間 有太多知識需要記錄下來,所以將論文的內容分成三部曲,來記錄閱讀下來的點點滴滴: Part 1: Sequence to sequence model 起源 Part 2: Attention 與 Self-attention 的理解 Part 3: Transformer 的架構探討與深入理解 要談論 Attention Is All You Need 這篇 paper 就必須從 seq2seq 講起,seq2seq 全名為 Sequence to Sequence[1],是一個 Encoder - Decoder 架構的模型,在 2014 年被提出,被廣泛的應用於 Machine Translation, Text Summarization, Conversational Modeling, Image Captioning, and more.

Lookahead Optimizer: k steps forward, 1 step back

Introduction 在目前的 optimizer 分為兩個主要發展方向: Adaptive learning rate, such as AdaGrad and Adam Accelerated schema (momentum), such as Polyak heavyball and Nesterov momentum 以上都是透過累積過往梯度下降所得到的結果來達到收斂,然而要獲得好的結果,都需要一些超參數的調整。 Lookahead method: 是一種新的優化方法,採用兩個不同的權重,分別為 fast weights 與 slow weights。fast weights 是使用一般常見的 optimizer 當作 inner optimizer 先進行 k 次的計算後得到的結果與預先保留的 slow weights 進行線性插值(linearly interpolating)來更新權重 ,更新後的 wieight 為新的 slow weights 並推動之前的 fast weights 往前探索,以這樣的方式進行迭代。 在使用不同的 inner optimizer 下,像是 SGD 或是 Adam,減少了對超參數調整的需求,並且可以以最小的計算需求確保在不同的深度學習任務中加快收斂速度。 演算過程 : Step 1 : 先設定 $\phi$ 的初始值,以及選定 objective function $L$ Step 2 : 確定更新週期 $k$ 值、slow weight 的更新步伐 $\alpha $ 以及 optimizer $A$ Step 3 : 更新 fast weight $\theta$ ,$ \space \theta_{t,0} \leftarrow \phi_{t-1}, t=1,2,\dots $ Step 4 : 利用 optimizer $A$ 迭代 $k$ 次更新,由 $\theta_{t, i}$ 更新到 $\theta_{t, k}, i=1, 2, \dots, k$ Step 5 : 更新 slow weight $\phi_{k} \leftarrow \phi_{k-1} + \alpha\left(\theta_{t, k} - \phi_{t-1}\right)$ 重複 Step 3 - Step 5 直至收斂。

Faster R-CNN

Faster R-CNN 是由 object detection 的大神 Ross Girshick 於 2015 年所提出的一個非常經典的目標檢測(object detection)的方法,當中提出了 Region Proposal Networks 的方法應用在提取候選區域(reigon proposals) 取代了傳統的 Selective Search 的方式,大幅提升了目標檢測的精準度,也提升了整體計算的速度,另外 Kaiming He 博士也是共同作者。 在介紹 Faster R-CNN 之前需要先了解何為 one stage 與 two stage,目前 object detection 的主流都是以 one stage 為基礎的演算法,建議可以參考下列兩篇很棒的文章: 什麼是one stage,什麼是two stage 物件偵測 物件偵測上的模型結構變化 Faster R-CNN 主要是由四個部分來完成: Feature Extractor Region Proposal Network (RPN) Regoin Proposal Filter ROI Pooling 下圖為 Faster R-CNN 的簡易架構圖: Image credit: original paper 下圖是我參考了許多相關的部落格文章後,覺得在呈現 Faster R-CNN 的架構上最容易讓人了解的一張圖,可以搭配著上圖來對照一下!

Word2Vec

最近剛好看到一篇關於 Skip-gram word2vec的介紹,內文寫的淺顯易懂,衍生的閱讀也十分詳細,決定動手寫篇記錄下來。 人對於文字的理解,可以很簡單的就能了解字面的意義,但是對於機器來說,要如何理解文字是一個很困難的問題。 要如何讓機器來理解文字的意義? 透過將文字轉換成向量,來讓機器能夠讀的懂,所以其實文字對於機器來說只是數字,而我們在做的就只是數字的遊戲。 Word embeddings 在將字詞轉換成向量的實作中,大家常用的方法肯定是 one-hot-encoding,但是 one-hot-encoding 在計算上卻是非常沒有效率的方式,如果一篇文章中總共有50,000的單詞,用 one-hot-encoding 來表示某個單詞的話,將會變成1與49999個0的向量表示。就如同下圖表示,如果要做 matrix multiplication 的話,那將會浪費許多的計算資源。 透過 Word Embedding1 可以有效的解決上述的問題。 Embedding 可以想成與 full connected layer 一樣,將這個 layer 稱做為 embedding layer , weight 則稱為 embedding weights。藉由這樣的概念,可以省略掉 multiplication 的過程,直接透過 hidden layer 的 weigth matrix 來當作輸入字詞的 word vector。之所以可以這樣來執行是因為在處理 one-hot-encoding 與 weight matrix 相乘的結果,其實就是 matrix 所對應"詞"的索引值所得到的結果。 舉例來說: "heart" 的在 one-hot-encoding 的索引位置為958,我們直接拿取 heart 所對應 hidden layer 的值,也就是 embedding weights 的第958列(row),這樣的過程叫做 embedding lookup,而 hidden layer 的神經元數量則為 embedding dimension。

DropBlock

Dropout 相關方法: Dropout: 完全隨機丟棄 neuron Sparital Dropout: 按 channel 隨機丟棄 Stochastic Depth: 按 res block 隨機丟棄 DropBlock: 每個 feature map 上按 spatial square 隨機丟棄 Cutout: 在 input layer 按 spatial square 隨機丟棄 DropConnect: 只在連接處丟,不丟 neuron DropBlock Idea 一般的 Dropout 都是用在 fully connection layer,而在 convolutional network 上使用 dropout 的意義並不大,該文章則認為因為在每一個 feature maps 的位置都具有一個 receptive field,僅對單一像素位置進行 dropout 並不能降低 feature maps 學習特徵範圍,也就是說,network 能夠特過相鄰位置的特徵值去學習,也不會特別加強去學習保留下來的訊息。既然對於單獨的對每個位置進行 dropout 並無法提高 network 本身的泛化能力,那就以區塊的概念來進行 dropout,反而更能讓 network 去學習保留下來的訊息,而加重特徵的權重。 Method 不同 feature maps 共享相同的 dropblock mask,在相同的位置丟棄訊息 每一層的 feature maps 使用各自的 dropblock mask Parameters block size: 控制要讓 value of feature maps 歸為 0 的區塊大小 $ \gamma $: 用來控制要丟棄特徵的數量 keep_prob: 與 dropout 的參數相同 Code implement https://github.