---
# System prepended metadata

title: 自監督式學習 (Self-supervised Learning) - BERT、GPT
tags: [架構設計, 李宏毅, 深度學習]

---

## 自監督式學習（self-supervised） v.s. 監督式學習（supervised）
以下是 Copilot 對於兩者所給出的介紹與定義
>監督式學習（Supervised Learning）：
>1. 監督式學習是一種基於標記數據的學習方法。 
>2. 例如，分類（例如圖像分類）、回歸（例如房價預測）和序列生成（例如語言模型）。

>自監督式學習（Self-Supervised Learning）：
>1. 自監督式學習是一種無需人工標記的學習方法。 
>2. 例如，在視覺模型中將圖像切成不同塊，然後預測它們之間的關係。

![image](https://hackmd.io/_uploads/SyOvcCJ80.png)

## BERT Series
### Masking input
BERT 是 Transformer 的 Encoder，在 BERT 的訓練過程中，有一些輸入是被隨機遮蓋住，稱為 Masking input，而遮蓋的方式可以是一個 Special token 或者是替換成其他的方塊字，將這串有 Masking 的輸入丟入 BERT 中得到輸出 Vector sequence，把先前做 masking 的輸出向量做線性轉換（Linear transform），接著再經過 Softmax 輸出另一個向量（機率分布），期待與正確答案（ground truth）的 loss 愈小愈好。

這個被遮蓋住的輸入，透過 BERT 找到對應的方塊字，可以想像成是讓 BERT 學習一個填空題的任務，看到機 X 學習四個字，預期 BERT 自動學習並填上方塊字「器」。

![image](https://hackmd.io/_uploads/H1uQiRk8A.png)
### Next Sentence Prediction
除了利用 masking input 訓練 BERT 外，還有另一個是 Next Sentence Prediction，丟入兩個句子到 BERT 中，開頭的 [CLS] 與中間的 [SEP] 都是 Special token，經過 BERT 後只看 [CLS] 的輸出向量，接著做 Linear transform 輸出 Yes/No，判斷句子是否相連或是不相連，完成一個二元分類的任務。

![image](https://hackmd.io/_uploads/r1tsBMbIA.png)

但是，做完了 Next Sentence Prediction 的訓練，BERT 並沒有學到太多東西，因為 Next Sentence Prediction 的任務很簡單，從資料庫中隨意挑選出兩個句子，很容易就能夠判別出這兩個句子是否相接在一起，對於 BERT 而言並沒有太大的幫助，因此有人提出了 Sentence Order Prediction（SOP） 使用在 ALBERT（進階版的 BERT）上，有興趣者可再深入研究。

:::info
訓練一個 BERT 的模型，至今仍是非常困難，在 Google 釋出的模型需要的訓練資料高達 30 億筆，相當於哈利波特全集看了 3000 次，由於 BERT 是利用 Self-supervised Learning 不需要標註資料（labeled data），因此可以在網路上爬到相當的資料，但更困難在於訓練過程，利用 TPU 資源也需要跑了好幾天才能將 BERT 訓練完成。
:::

:::info
Pre-train a Seq2Seq model
上述只有提到如何訓練 BERT 也就是 Encoder 的架構，那 Decoder 該如何訓練呢？這裡需要將 Encoder 的輸入向量弄壞（Corrupted），經過 Encoder 將輸出資訊利用 Cross attention 傳給 Decoder，而 Decoder 必須試圖還原輸入的方塊字。

弄壞（Corrupted）的方式有很多種，例如 Masking input、Delete input、Permutation、Rotation、Text infilling 等。

![image](https://hackmd.io/_uploads/HyZ0BEbIR.png)

![image](https://hackmd.io/_uploads/BkXgvkmv0.png)
:::

### BERT 之應用
經過自監督式學習（Self-supervised Learning）的 BERT，這個過程稱為 Pre-train，歷經了 Masking input 以及 Next Sentence Prediction 的訓練後，已經學會了如何做填空題的任務，神奇的事情就在此刻發生了，再給予少量標註資料（labeld data）至模型中，也就是微調（Fine tune），就能夠將 BERT 運用在下游的任務（Downstream Tasks）上。

簡單可以想像成，BERT 其實就像是幹細胞，具有發展成許多不同細胞類型的潛力，例如肝細胞，肌肉細胞，血球細胞等，正與 BERT 經過 Fine tune 後能夠運用在其他下游任務上相似。

因此，這也可以拿來決定 Self-supervised model 例如 BERT 的好或壞，最知名的任務集為 GLUE（General Language Understanding Evaluation），會將 BERT 做微調（Fine tune）在九個不同的任務上，看它在每個任務上的表現並取平均，即可用來判斷該模型的好壞。

![image](https://hackmd.io/_uploads/BJMCKM-IC.png)

#### Case 1: Sentiment analysis
此任務為判斷評論是正面（positive）或負面（negative），這裡的 BERT 是已經學會做填空題的模型，使用 pre-train 完的參數作為初始化，而 Linear 裡的參數則是隨機初始化，後續再經過 gradient descent 更新參數。

輸入 [CLS] 以及一個句子至 BERT 中，只看 [CLS] 的輸出向量經過 Linear 轉換，再經過 Softmax 輸出類別（positive/negative）。

![image](https://hackmd.io/_uploads/S1P6kmZUC.png)

#### Case 2: POS tagging
此任務為詞性標註，跟 case 1 的條件相同，只不過這裡的輸出是句子中每一個字的詞性類別。

![image](https://hackmd.io/_uploads/HJu_7Q-UC.png)

#### Case 3: Natural Language Inference（NLI）
此任務為立場分析，輸入有兩個分別是前提（Premise）以及假設（Hypothesis），丟入至微調後的 model 中，只看 [CLS] 的輸出向量並經過 Linear，得到一個類別（contradiction/entailment/neural）。

![image](https://hackmd.io/_uploads/HJpT67WIC.png =50%x)![image](https://hackmd.io/_uploads/rysiRm-L0.png =49%x)

#### Case 4: Extraction-based Question Answering（QA）
此任務為問答系統，且答案可以在文章裡找到，簡單來說，丟入兩個輸入分別是文章（D）以及問題（Q）至模型中，輸出兩個正整數，代表答案是從第 s 個字到第 e 個字。

![image](https://hackmd.io/_uploads/SkE6k4Z8C.png)

更具體來說，將 Q 以及 D 丟入微調後的 BERT 中，輸出一串 vector sequence，再使用兩個向量皆為隨機初始化（Random initialized）的參數，第一個橘色向量與輸出向量做內積（Inner product），對應較高數值代表 s 的數字，相同的第二個藍色向量也會得到另一個代表 e 的數字，即可得知答案為文章裡的第 s 個字至第 e 個字。

![image](https://hackmd.io/_uploads/B1w0g4ZIA.png =49%x)![image](https://hackmd.io/_uploads/rJOkbNZUR.png =49%x)

:::info
BERT 雖然是 Transformer 的 Encoder，但是其輸入數量仍有上限，若輸入在沒有限制的情況下，在 BERT 中使用的 attention 運算量會過大，因此其輸入是有限制的。 
:::

### BERT 的運作原理
輸入具有 masking 的文字至 BERT 中，輸出能夠代表該方塊字的向量，為何 BERT 能夠準確地輸出該方塊字呢？最主要原因是考慮到前後文的資訊，並且理解向量間的關係或是距離遠近，最後推斷出最合適的方塊字。

較早以前有 CBOW 的模型，也是做類似填空題的任務，但比起 BERT 是較簡單的模型，BERT 為較多層的模型且考慮前後文的資訊，因此被稱為 Contextualized word embedding。

![image](https://hackmd.io/_uploads/BysuVHHI0.png)

#### Multi-lingual BERT
其中一個 BERT 在 Pre-train 過程看過了 104 種語言，但是在微調（fine tune）上有所差異，給予少量中文問答（QA）的資料，在實際中文問答的測試上有高達 88.7% 的準確率，然而給予少量英文問答的資料，在實際中文問答的測試上也有高達 78.7% 的準確率，BERT 只有看過中文問答的資料，卻自動也學會了英文問答。

這代表在看過 104 種語言後的 BERT，不論是中文、英文或是其他語言，只要這些字具有類似的意思，它們的向量分布（距離）就會愈接近。
![image](https://hackmd.io/_uploads/rJJtorBIC.png)

但是，BERT 在未經微調（fine tune）前是做填空題的任務，給予中文填空就會輸出該方塊字，給予英文填空就會輸出該英文字，而不會給予中文填空輸出英文字，雖然不同語言具有相近意思的字其向量會較接近，但 BERT 仍知道不同語言是有差異的，並沒有抹除掉語言資訊。

原本輸入為英文的句子丟入至 Multi-BERT 後，得到一串 vector sequence，再加上一個藍色向量代表中文與英文的差距，竟然輸出會是中文的句子。

![image](https://hackmd.io/_uploads/HJnOJLBL0.png)

## GPT Series
GPT 能夠預測下一個出現的 Token，輸入 <BOS> 至模型中，輸出一個 Embedding，依序經過 linear transform 以及 softmax 得到一個機率分布，最後輸出方塊字「台」，接著將輸出「台」再丟入模型中，最後將句子完成，這邊特別注意，GPT 不會看到之後的輸入，僅會看到現在的輸入以及過去的資訊。

![image](https://hackmd.io/_uploads/rJhTfLSLC.png)

在 GPT 的推論過程中，會給予任務的描述（Task description），還有一些 example，期待 GPT 能夠看前面的輸入（prompt）就能夠將句子完成，這種方式稱為 Few-shot learning，當然還有 One-shot learning 以及 Zero-shot learning，過程中不會調整 GPT 模型的參數，也就是不會做 Gradient descent 最佳化處理，此種方式稱為 In-context learning。

![image](https://hackmd.io/_uploads/rkYU48SUR.png)

## 總結，自監督式學習（self-supervised learning） 
在文章中，介紹了 BERT 的訓練過程，包含 masking input 以及 next sentence prediction，經過 Pre-train 後的 BERT 就像是幹細胞，微調（fine tune）後能夠使用在不同的下游任務上，還有 BERT 的運作原理，除了能保有語言資訊外，也能夠讓意思相近的方塊字向量較接近，最後是介紹了 GPT 的簡單概念。
    
---
:::info 
以上就是這篇文章「自監督式學習 （Self-supervised Learning） - BERT、GPT」的所有內容，第一次看的人會花比較多時間消化吸收，這是很正常的事情，若有任何問題，歡迎在下方與我聯繫、討論，接下來也會繼續分享相關文章，敬請期待。