self-supervised learning 皆以芝麻街人物為命名
ELMO 最早的 supervised learning →再來是 BERT →ERNIE → Big Bird
模型參數比例比較
- ELMO(94M)
- BERT(340M)
- GPT-2(1542M)
- Megatron(8B)
- T5(11B, google 做的 model)
- Turing NRG(17TB)
- GPT-3(175B)
- Switch Transfer(1.6T, google 做的 model)
什麼是 self-supervised learning?
supervised learning
有一些文章,和標注這些文章是正面或負面的 label(或是其他類型的 label),將這些文章訓練 neuron model ,輸出 y,這個 y 和 label 的差異越小越好。
而 self-supervised learning 是在沒有 label 的情況下,將資料分為兩部分,一部分當作 label(標注),一部分當作訓練 neuron model 輸入的資料,例如將資料 x,一部分作為 x’,一部分作為 x’’,將 x’ 輸入到模型中,輸出 y,我們要將 y 和 x’’(label 或標注) 越接近越好。
self-supervised learning 可看作是一種 unsupervised learning(沒有 label 的訓練方法),但因 unsupervised learning 是比較大的 family,有很多種不同的方法,為了比較明確的說明,所以稱為 self-supervised learning,這句話最早是 Yann LeCun 說的。
以 BERT 作為說明
BERT 是 transformer encoder (self-attention. residual. normalization…),也就是說輸入一排向量,輸出 sequence 長度=輸入 sequence 長度,通常用於 NLP ,但不只可以用於文字, 聲音. 圖像都可以被當作 sequence。
只是最早用於文字,這裡先用 NLP 來做介紹
step 1 : masking input
隨機決定一些文字要蓋住或是換成其他隨機的文字,蓋住也就是替換為一個非中文字,換成其他隨機文字,就是隨意填一個文字。
再來將蓋住的部份,所輸出的向量做 linear transform (也就是乘以的矩陣),再做 softmax 輸出得到一個分佈(因為有做 Softmax),輸出一個很長的向量,包含所有想要處理的文字,每字都對應到一個分數。
但我們知道蓋住的文字應該是什麼,比如說是“灣”,輸出與這個 ground truth 越接近越好(minimize cross entropy),就像是做分類,只是多少類別與感興趣的文字一樣多。
step2: next sentence prediction
通常做 BERT,同時ˇ也會做 next sentence prediction 從資料庫中拿出兩個句子,中間加入 [SEP] 表示分隔,開頭加入 [CLS] 表示起點,丟入 BERT,只看這兩個句子是否相接,但 RoBERTa 說這方法不太有用,因為看兩個句子是否是接起來的,可能太簡單了,但有另種方法和 next sentence prediction 很像,稱 SOP,文獻上說比較好用,方法是將一個句子拆兩個個部分,順序可能是顛倒的,丟入 BERT 問句子是否先後順序是怎麼樣,會將 SOP 用於 ALBERT。
這樣看來 BERT 只能做兩件事,一是做填空題,二是看句子是否接在一起,但二看起來不太有用,所以實際上只做填空題?這是不對的
BERT 會被實際運用會於無關填空題的地方,例如 downstream task,所謂 downstream task 就是我們真正實際在意的任務,也就是說,做完 BERT 後,在拿來去做各式各樣的事情,所以 BERT 就像胚胎幹細胞,之後可以分化為各式各樣的細胞,此稱為 fine-tune(將 BERT 做微調),而產生 BERT 的過程稱為 Pre-train。
BERT 的能力
因通常會將 BERT 做多種任務,其中的標竿任務集為 GLUE (General language understanding evaluation),要評估做的 BERT 好不好,就會將它分別微調到九個任務上,所以會得到九個模型,再算平均的準確率,表示 self-supervised learning 的好壞
GLUE 與人類判斷做比較,黑色線為人類,藍色虛線為 GLUE 平均,平均比較好可能只是代表這個資料集被完壞了,所以後來有其他的任務集被提出。
BERT 使用的 4 個 case 的例子
case1 sentiment analysis:
輸入一個 sequence,輸出一個類別,例如判斷一個句子是正面或負面。首先將一個 sequence 頭加入 [CLS],丟入 BERT 中,會得到 n+1 個輸出,現在只看 [CLS] 的輸出,做 linear. softmax,得到一個分類,linear 是隨機初始化的,BERT 是 init by pre-train(要得到 BERT model 之前,需要有大量標注過的資料,去訓練才能得到),會使用 init by pre-train 是因為比隨機初始化好,最後 BERT 和 Linear 都要做 gradient descent 來得到結果結果。
我們會說一個完成的 sentiment analysis model 就是 linear transformer+ BERT 的結果。
大量沒標註的資料+小量有標註的資料 = semi-supervised
比較 BERT 有去做 pre-train 和隨機初始化的差異
case 2 詞性標注:
輸入一個 sequence,輸入相同長度的 sequence。
[CLS]+sequence 輸入 BERT ,每個 token (在中文中,就是每個字)輸入到 BERT ,輸出向量,做 linear transform(乘上一個矩陣),再做 softmax,得到每個字屬於哪個詞性。此 BERT 不是隨機初始化,在 pre-train 中已經做過訓練。
case3: natural language inference (NLI)
輸入兩個 sequence,輸出一個類別。
例如:給機器前提(premise)和架設(hypothesis)的兩個句子,推出這兩個句子之間的關係。premise 是 A person on a horse jumps over a broken down airplane,hypothesis 是 A person is at a diner,推測這兩個句子是
- contradiction:衝突
- entailment:有因果關係
- neutral:不衝突也沒有因果關係
> reference: https://www.itread01.com/content/1545195728.html
結果是 contradiction 。
或是在評論系統中,判斷留言和評價是的之間的關係。
BERT 如何解 case 3 呢?
將兩個句子丟到 BERT,兩個句子中間用 [SEP] 連起來,最前面放 [CLS] 的這個符號, 將一整串丟到 BERT,BERT 輸出一整串東西,只取 [CLS] 的輸出,做 linear transform (矩陣相乘),再做 softmax 的到一個分類 ,在 NLI 中就是兩個句子是否矛盾的三種情況,我們一樣需要一些標注資料才能訓練此模型,BERT 是經過 pre-train 的,而非隨機初始化的。
case 4:Extraction-base Question Answering (QA) 也就是問答系統
給機器一篇文章,問限制性的問題(extraction-base question 就是答案一定在文章中),機器給答案,輸入有 D. Q 的 Sequence,如果是中文的話 D 和 Q 皆表示中文的字,將 D 和 Q 丟到 QA model (經過 BERT pre-train 過的)中得到 s 和 e 的正整數的答案,s 和 e 表示答案在文章中詞彙第 s 個到第 e 個字。
講個更具體一點,將問題和文章用 [SEP] 相連,前放 [CLS],放到一個 pre-train 過的 BERT,會得到一連串的向量,拿 random initialized 的橙色向量(表示 answer 的起點)去與 document 經過 BERT 所得到的向量去做 inner product,再做 softmax,得到 n 個數值 (與 document 數量相同),相同的也拿藍色向量(是 random initialized,表示 answer 的終點)做相同的事情。
BERT 輸入長度理論沒有限制,但實際上運算量很大,例如 512 個字的文章,其中要做 inner product,就是 512*512。
Training BERT is challenging!!!
google 最初處理 BERT 的 training data 就是哈利波特全集的 3000 倍,實驗室試著做相同的事情,使用 TPU 要做八天,使用 Colab 至少要跑 200 天。
有沒有辦法加快 BERT 的訓練過程? 先自己訓練一個 BERT。
上面介紹的部分皆沒有包含 sequence2sequence 的 model,如果要做 sequence2sequence 的 model 的 pre-train,先將 encoder 的輸入 corrupted (弄壞),期望 decoder 的輸出,與 encoder 的輸入的 corrupted 之前的結果相同。
如何做 Corrupted 呢?
MASS 最先提出的方法是用 mask,將 encorder 的輸入蓋掉,之後還有刪除. 顛倒句子. 旋轉. mask+delete 的方法,後來有個方法稱為 BART,將上述所有方法都弄過一遍,認為這樣效果最好。
T5 是 transfer text-to-text transformer 的縮寫,因為有 5 個T所以稱為 T5,將所有上述所有的方法都做過一遍,T5 是訓練在 C4 上的 dataset,C4 有 7T,C4 去做前處理要做 300 天以上?!
為什麼 BERT 有用呢?
BERT 如何運作的?
因一字多義,同為“果“,向量卻差很遠。
評斷兩個果的相異程度
一個字個意思取決於上下文,BERT = word embedding 的 CBOW 的 deep learning version,此時 BERT 又稱為 contextualized word embedding。
將 BERT 用在 DNA
BERT 與 rand 結果的比較。
多語言的 BERT(Multi-lingual BERT)
不同語言的語言,詞彙越相近則 MRR 越高。
範例:
說明一下 GPT 模型,GPT 要做的是 predict next token,下面範例是用一個句子做訓練,實際上會拿很多句子去做訓練。
GPT 最有名的例子是利用 GPT 寫了一個關於獨角獸的新聞
GPT 沒有做 gradient descent
GPT v3 做 42 任務結果