Prompt-Learning
Prompt-Learning
? ? Prompt Learning(提示學習)是指對輸入文本信息按照特定模板進行處理,把任務重構成一個更能充分利用預訓練語言模型處理的形式。Prompting使得預訓練模型和下游任務之間更加接近,這一點兒與fine-tuning不同,fine-tuning是使用預訓練模型做下游任務,prompt learning是各種下游任務適應預訓練模型,根據不同的預訓練模型重構下游任務。
不同的prompt learning學習任務
這里重點介紹基于清華大學公開的openprompt框架進行文本分類學習以及重點介紹幾個api的學習理解。
prompt learning包括Template,Verbalizer,PromptModel等。prompt learning將不同的nlp任務轉化為文本分類問題,但是和之前的bert finetuning的文本分類不一致。例如:
文本分類:
輸入:看這個娛樂節目不停的笑
輸出:正面或者負面
prompt learning下的文本分類,預測mask位置處的詞,向完形填空
輸入:看這個娛樂節目不停的笑,這個節目是一個mask的節目
輸出:有趣的或者無聊的
ManualTemplate
template_text = ‘{“placeholder”:“text_a”},該句子的意圖是:{“mask”}。’
prompt 的template 經過ManualTemplate后會生成一個text,類型為list,
[{‘add_prefix_space’: ‘’, ‘placeholder’: ‘text_a’}, {‘add_prefix_space’: ‘’, ‘text’: ‘,該句子的意圖是:’}, {‘add_prefix_space’: ‘’, ‘mask’: None},
{‘add_prefix_space’: ‘’, ‘text’: ‘。’}]
輸入的句子‘股票想變成標的證券要達到的條件很高吧’在模板下的text表示如下
‘text’的value為 [‘股票想變成標的證券要達到的條件很高吧’, ‘,該句子的意圖是:’, ‘’, ‘。’]
loss_ids:是標記mask的位置,[0,0,1,0]
shortenable: 1是input token,0是squence token,1是標記的placeholder或者shortenable的位置
在tokenizer中的對Template下的text的值進行tokenizer encoder,并在模版的開始和結束位置這兩個特殊符號,例如bert預訓練模型的特殊符號為cls和sep
loss_ids中的值根據tokenizer encoder的length進行擴充,1是表示mask的位置,加入的特殊編碼對應的值為–100,這里默認是-100
備注:
1.在tokenizer的過程中把shortenable_ids這個內容項刪掉了;loss_ids在后面的ManualVerbalize中計算label的概率會使用到,即預測mask的詞的概率
2.常用的template有:
sentence1 It was [MASK].
sentence1 ? [MASK], sentence2
sentence1 . [MASK], sentence2
sentence1 sentence2 [MASK]
sentence2 ? [MASK], sentence1
ManualVerbalizer
這個是對label的擴展相近的詞或者字進行編碼,tokenizer分別對這些擴展字詞進行tokenizer,統計tokenizer后的每個字詞的最大個數,以及每一個標準問擴展詞的tokenizer的最大長度,從而確定了擴展字詞的矩陣大小,這里是對label進行擴充,在模型分類中會使用這個矩陣,這里是與之前的fine tuning分類有區別的。
例如標準問的擴展字詞為[’ 支持’, ’ T’, ’ 類’, ’ 基’, ’ T0’, ’ 種類’, ’ 0’, ’ 申’, ’ 種’, ’ 持’, ’ 贖’, ’ 基金’, ’ 金’, ’ 支’],其中確定的每個詞的最大長度為4,擴展詞的最大長度為32,得到的padding結果為[[3118, 2898, 0, 0], [100, 0, 0, 0], [5102, 0, 0, 0], [1825, 0, 0, 0], [100, 0, 0, 0], [4905, 5102, 0, 0], [121, 0, 0, 0], [4509, 0, 0, 0], [4905, 0, 0, 0], [2898, 0, 0, 0], [6604, 0, 0, 0], [1825, 7032, 0, 0], [7032, 0, 0, 0], [3118, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]],
mask 矩陣為[[1, 1, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 1, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [1, 1, 0, 0], [1, 0, 0, 0], [1, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]]
label擴展矩陣的mask矩陣[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
這里邊把字詞的編碼,mask,整個label的mask都作為了參數,tensor shape為[batch_size, 擴展詞的最大長度, 每個詞的最大長度],
- 對BertForMaskedLM中的logtis進行計算[batch_size, max_seq_len, vocab_size],
- 根據句子中mask的個數,得到mask位置處word的logits,如果只有一個mask,得到的shape為[batch_size,vocab_szie],如果是多個mask,得到的mask位置的logits為[batch_size,mask個數,vocab_size],這里maks的個數為1
- 將mask的vocab 概率轉化為label擴展詞的logits[batch_size, label_num,擴展詞的最大長度, 每個詞的最大長度],然后根據label的擴展詞的mask矩陣在每個詞的最大長度這一個維度上進行計算,得到[batch_size, label_num, 擴展詞的最大長度],
進行softmax得到概率[batch_size, label_num, 擴展詞的最大長度],再取log得到logtis(這個logits可以理解為對label的擴展詞的logits) - 聚合得到label的logits,根據label擴展詞的mask矩陣得到每一個label的logits[batch_size, label_num]
這里預測mask詞是label中擴展詞,從而得到label,從預訓練模型預測mask位置是vocab,轉化為預測label擴展詞,從而得倒label,這個是與直接分類的區別,這里使用的是mlm的方式
備注:
筆者最近在學習prompt learning,如有理解錯誤的地方,請指正,謝謝
總結
以上是生活随笔為你收集整理的Prompt-Learning的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: prompt命令 oracle,英语ur
- 下一篇: 什么是 prompt learning?