文章目錄[隱藏]
Prompt介紹
Prompt是NLP的一個(ge) 新領域。在Prompt中任務的描述被嵌入到輸入中,提供了一種新的方式來控製機器學習(xi) 模型輸出。
Prompt是利用預訓練語言模型在大量文本數據上獲得的知識,來解決(jue) 各種下遊任務。Prompt的優(you) 勢是它可以減少或者避免對預訓練模型進行微調,節省計算資源和時間,同時保持或者提高模型的性能和泛化能力。
Prompt的方法是根據不同的任務和數據,設計合適的輸入格式,包括問題,上下文,前綴,後綴,分隔符等。
BERT與Prompt使用
Prompt可用於(yu) 提高BERT的句子表示能力,通過在BERT的輸入中加入一些特定的詞語作為(wei) Prompt,引導BERT生成更好的句子向量
- 方法1:在句子的開頭或結尾加入Prompt
- 方法2:在句子的中間加入Prompt
Prompt搜索方法
Prompt的搜索方法找到最優(you) 的Prompt,能最大化BERT表示能力的Prompt。目前有三種主要的搜索方法:
- 隨機搜索:隨機生成一些Prompt,然後用它們作為BERT的輸入,計算BERT的輸出向量與目標向量的相似度,選擇相似度最高的Prompt作為最優的Prompt。
- 貪心搜索:從一個空的Prompt開始,每次在Prompt的末尾加入一個詞,然後用它作為BERT的輸入,計算BERT的輸出向量與目標向量的相似度,選擇相似度最高的詞作為Prompt的一部分,直到達到一個預設的長度或者相似度閾值。
- 強化學習搜索:將Prompt的生成視為一個序列決策問題,使用強化學習的算法,來優化一個策略網絡,根據一個獎勵函數來更新網絡的參數。
Prompt方法局限性
BERT + Prompt的優(you) 勢是能夠利用Prompt來引導BERT生成更好的句子向量,從(cong) 而提高句子表示的質量和多樣性
句子相似度,文本分類,文本檢索等,BERT + Prompt可能會(hui) 比原始BERT模型有效。文本生成的任務,如文本摘要,文本複述,文本續寫(xie) 等,BERT + Prompt可能不一定比原始BERT模型有效。
Prompt適合進行多任務進行建模,比如多個(ge) 文本任務一起進行訓練。因此在單個(ge) 任務中,Prompt並不會(hui) 增加模型精度。在現有文本分類比賽中暫時還沒看到Prompt的使用案例。
案例:Prompt文本分類
輸入文本:
It was [mask]. 文本輸入樣例
將[MASK]輸出接全連接層,進行分類。
步驟1:定義模型
class Bert_Model(nn.Module): def __init__(self, bert_path ,config_file ): super(Bert_Model, self).__init__() self.bert = BertForMaskedLM.from_pretrained(bert_path,config=config_file) # 加載預訓練模型權重 def forward(self, input_ids, attention_mask, token_type_ids): outputs = self.bert(input_ids, attention_mask, token_type_ids) #masked LM 輸出的是 mask的值 對應的ids的概率 ,輸出 會(hui) 是詞表大小,裏麵是概率 logit = outputs[0] # 池化後的輸出 [bs, config.hidden_size]
return logit
步驟2:定義(yi) 數據集
class MyDataSet(Data.Dataset):
def __init__(self, sen , mask , typ ,label ):
super(MyDataSet, self).__init__()
self.sen = torch.tensor(sen,dtype=torch.long)
self.mask = torch.tensor(mask,dtype=torch.long)
self.typ =torch.tensor( typ,dtype=torch.long)
self.label = torch.tensor(label,dtype=torch.long)
def __len__(self): return self.sen.shape[0]
def __getitem__(self, idx): return self.sen[idx], self.mask[idx],self.typ[idx],self.label[idx]
步驟3:對文本加入Prompt
prefix = 'It was [mask]. '
for i in range(len(x_train)):
text_ = prefix+x_train[i][0]
encode_dict = tokenizer.encode_plus(text_,max_length=60,padding="max_length",truncation=True)
步驟4:模型訓練與(yu) 預測
optimizer = AdamW(model.parameters(),lr=2e-5,weight_decay=1e-4) #使用Adam優(you) 化器 loss_func = nn.CrossEntropyLoss(ignore_index=-1)
for idx,(ids,att_mask,type,y) in enumerate(train_dataset):
ids,att_mask,type,y = ids.to(device),att_mask.to(device),type.to(device),y.to(device)
out_train = model(ids,att_mask,type)
loss = loss_func(out_train.view(-1, tokenizer.vocab_size),y.view(-1))
optimizer.zero_grad()
loss.backward()
optimizer.step()
train_loss_sum += loss.item()
參考文獻
PromptBERT: Improving BERT Sentence Embeddings with Prompts
評論已經被關(guan) 閉。