我想要一天分享一點「LLM從底層堆疊的技術」,並且每篇文章長度控制在三分鐘以內,讓大家不會壓力太大,但是又能夠每天成長一點。
- 訓練的必要模組安裝:AI說書 - 從0開始 - 135
- 載入資料集:AI說書 - 從0開始 - 136
- 資料集窺探:AI說書 - 從0開始 - 137
- 資料前處理與 Tokenization:AI說書 - 從0開始 - 138
- 資料 Padding 與訓練/驗證集切割:AI說書 - 從0開始 - 139
- Data Loader 設定:AI說書 - 從0開始 - 140
- BERT 模型窺探:AI說書 - 從0開始 - 141
- 載入 BERT 模型:AI說書 - 從0開始 - 142
- Optimizer 的 Decay Rate 群組配置:AI說書 - 從0開始 - 143
- BERT 模型的特定「層」參數窺探方法:AI說書 - 從0開始 - 144
- Optimizer 的 Decay Rate 群組窺探:AI說書 - 從0開始 - 145
- 配置 Optimizer 與訓練成效評估函數:AI說書 - 從0開始 - 146
- 訓練程式的撰寫:AI說書 - 從0開始 - 147
- 訓練結果圖示化:AI說書 - 從0開始 - 148
回顧我們在 AI說書 - 從0開始 - 136 中,載入了兩份資料,分別為 In-Domain 以及 Out-of-Domain,而我們使用 In-Domain 資料歷經 AI說書 - 從0開始 - 135 到 AI說書 - 從0開始 - 148 的努力,已經完成 Fine-Tuning,現在我要使用 Out-of-Domain 這份資料來進行驗證訓練效果好壞,首先載入資料:
df = pd.read_csv("out_of_domain_dev.tsv", delimiter='\t', header = None, names = ['sentence_source', 'label', 'label_notes', 'sentence'])
接著仿造 AI說書 - 從0開始 - 138 的作法,句子前面加上 [CLS],而句子和句子間要加上 [SEP] 區隔,於是程式為:
sentences = df.sentence.values
sentences = ["[CLS] " + sentence + " [SEP]" for sentence in sentences]
labels = df.label.values
tokenized_texts = [tokenizer.tokenize(sent) for sent in sentences]
接著仿造 AI說書 - 從0開始 - 139 的作法,進行 Padding,同時仿造 AI說書 - 從0開始 - 140 的作法,製作 Data Loader,程式為:
MAX_LEN = 128
input_ids = [tokenizer.convert_tokens_to_ids(x) for x in tokenized_texts]
input_ids = pad_sequences(input_ids, maxlen = MAX_LEN, dtype = "long", truncating = "post", padding = "post")
attention_masks = []
for seq in input_ids:
seq_mask = [float(i > 0) for i in seq]
attention_masks.append(seq_mask)
prediction_inputs = torch.tensor(input_ids)
prediction_masks = torch.tensor(attention_masks)
prediction_labels = torch.tensor(labels)
batch_size = 32
prediction_data = TensorDataset(prediction_inputs, prediction_masks, prediction_labels)
prediction_sampler = SequentialSampler(prediction_data)
prediction_dataloader = DataLoader(prediction_data, sampler = prediction_sampler, batch_size = batch_size)