---
# System prepended metadata

title: GAI 2024 Project 2.B Report

---

# GAI 2024 Project 2.B Report
資訊114 F74106026 李星辰

[Project Requirements](https://hackmd.io/@w-cKMxhqRAGOleYimY6D3Q/ryYZBxgyA)
[Jupyter Notebook](https://github.com/xing5740/GenerativeAIPractice/blob/main/generativeAI_Project2B.ipynb)

## Model
T5 and GPT2 model is used in this project

以下為2個model的比較：

### 目標
T5主要目標是**有指定任務的text-to-text轉換**，希望模型能夠廣泛應用於不同領域

text-to-text指的是輸入和輸出都是文字，相對於輸入和輸出都是數字序列的seq-to-seq，如同下圖所示，在輸入之前開頭會有任務的名稱，告訴模型所要進行的任務

![image](https://hackmd.io/_uploads/HJf8j-2lA.png)

來源: [T5論文](https://arxiv.org/pdf/1910.10683.pdf)

GPT2的主要目標是透過非監督式學習，讓模型能夠廣泛地應用於自然語言處理的領域，處理各種複雜任務

除此之外，GPT2論文還有一段描述如下:
> GPT-2 is trained with a simple objective: predict the next word, given all of the previous words within some text

也就是說GPT2的長處在於**對輸入的文本進行生成**

### 模型架構
T5: 完整的Transfomer (Encoder + Decoder)

GPT2: 基於Transformer的Decoder，將多個Decoder堆疊起來
![image](https://hackmd.io/_uploads/BkUo1z2eA.png)
來源:[The Illustrated Transformer](https://jalammar.github.io/illustrated-gpt2/)

兩個模型皆有使用:
1. masked self-attention
    在輸出時只能看到當前位置之前的資料，就像人在說話時通常是前後文相關，這個機制讓模型可以透過過去的資訊，推論後面可能會出現的字，而不會受到未來的資訊干擾
2. autoregression
    以之前的輸出作為輸入的一部分，讓生成內容的語意可以更為連貫，從而提升生成內容的品質


### Pre-train
T5: C4 (Colossal Clean Crawled Corpus)資料集，約750GB

GPT2: WebText資料集，約40GB

兩者皆是透過網路爬蟲擷取大量資料，尤其T5在模型架構上沒有特別的改善，但是用了數量極為龐大的的資料去進行預訓練，最終達到相當好的成效





## Dataset

### Load Data
利用torch.utils.data中的Dataset和Dataloader進行資料讀取

由於原資料中的data數量龐大(約2.6M)，全部使用的話會花費許多時間與資源，所以我只取20000筆訓練資料與10000筆驗證資料，未使用測驗資料

由於本次project目標是進行文本摘要，所以我在資料前都加上`"文本摘要："`的字串

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

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

#### get_tensor()

get_tensor的函式在T5與GPT2當中不一樣，因為GPT2需要attention mask作為輸入參數，所以我更改了get_tensor函式，讓他可以返回input, attention mask, output三項

for T5
![image](https://hackmd.io/_uploads/ry5a4e3l0.png)

for GPT2
![image](https://hackmd.io/_uploads/HylFSeheR.png)



### Tokenizer
我使用的是bert-base-chinese
因為T5原本的tokenizer在中文轉換上有問題，所以選了一個為中文設計的tokenizer
![image](https://hackmd.io/_uploads/ryFG4l2lR.png)

GPT2的tokenizer中需要額外加入特殊token
![image](https://hackmd.io/_uploads/HyEpSg3xR.png)



## Train
兩個模型的訓練流程大致相同

- 總共會訓練`epochs`個epoch
- tqdm用以可視化，顯示進度條與loss值
- 迴圈內的操作：
    1. 用`optimizer.zero_grad()`清空gradient
    2. 將input放入model並計算loss
    3. 用`loss.backward()`將loss回傳求gradient
    4. 用`optimizer.step()`以gradient descent進行參數更新

其中optimzer使用AdamW

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


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

我選擇的LMHead比起原本的GPT2會輸出更多內容，比如hidden state, loss, logits等等，更便於進行模型訓練
需要注意的是LMHead在訓練時需要放入attention_mask的參數


生成結果:
T5
![image](https://hackmd.io/_uploads/SJvKMzne0.png)


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


兩者的結果都不盡理想，其中可以看到T5生成的結果相比之下較接近summarization，GPT2只是把讀到的文本再輸出而已

推測可能是因為訓練的資料還不夠多，導致fine tune失敗


## Evaluation
使用ROUGE作為model evaluation


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


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

