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) 的模型架構出來。
Chinese word segmentation (CWS) NLP 領域在近年的突破性發展,各項研究應用與相關論文不斷的推層出新,對於如何讓機器能更了解文章、句子所表達的內容,進而解決各項在 NLP 領域上的問題,在 OpenAI 近期推出的 GPT-3 已經將 NLP 研究推向高峰,但當中還是有一些 NLP 的相關議題是比較少被拿來討論的,尤其是對於中文的處理,大部分的 NLP 都還是環繞在英文為主,畢竟大部分的新方法都是由歐美的學者所提出。
字詞的斷詞方法一直都是 NLP 相關任務的重點,尤其是目前為主流的 pretrain model 研究發展走向,好的斷詞可讓機器理解整句話所要表達的意思也可以推論語句的結構,反之不好的斷詞可能會讓機器理解錯誤也連帶影響後續的下游任務表現。
在本次要節錄的論文是由香儂科技(Shannon AI) 發表在ACL上的一篇論文,主要是探討基於深度學習的中文 NLP 任務中對於中文字斷詞的處理方式,是要以詞(word-base) 還是字(char-base) 的處理方式比較。
Introduction Word-base 的處理方式有幾項缺點:
由於字詞的組合過多,且有些詞出現的頻濾可能相當低,所以容易造成資料過於稀疏的狀況,所以無法避免 out-of-vocabulary(OOV) 的問題產生,進而限制了模型的學習能力,根據 Zipf’s law 其表示詞的出現的頻率與語料中的排名成反比。
在論文中以 Chinese Treebank dataset(CTB) 為例,使用 Jieba 作為斷詞的處理方式,最終總共有 615,194 個字詞,當中包含了 50,266 個不重複詞,而在其中又只有 24,458 個字詞只出現過一次,佔比 48.7%,對於整體字詞來說佔了 4% 。如果將字詞出現的次數提高到4 次以下來觀察,就佔了詞的 77.4%,佔整體字詞約 10.1%。其統計結果如下圖:
Image credit: Paper 由統計結果可以得知 word base 的處理在資料上是非常稀疏的。
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。
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} \]
一開始接觸 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.
最近剛好看到一篇關於 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。