色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

從預訓練語言模型看MLM預測任務

深度學習自然語言處理 ? 來源:老劉說NLP ? 作者:老劉說NLP ? 2022-11-14 14:56 ? 次閱讀

Prompt Learning是當前NLP的一個重要話題,已經有許多文章進行論述。

從本質上來說,Prompt Learning 可以理解為一種下游任務的重定義方法,將幾乎所有的下游任務均統一為預訓練語言模型任務,從而避免了預訓練模型和下游任務之間存在的 gap。

如此一來,幾乎所有的下游 NLP 任務均可以使用,不需要訓練數據,在小樣本數據集的基礎上也可以取得超越 Fine-Tuning 的效果,使得所有任務在使用方法上變得更加一致,而局限于字面意義上的理解還遠遠不夠,我們可以通過一種簡單、明了的方式進行講述。

為了解決這一問題,本文主要從預訓練語言模型看MLM預測任務、引入prompt_template的MLM預測任務、引入verblize類別映射的Prompt-MLM預測、基于zero-shot的prompt情感分類實踐以及基于zero-shot的promptNER實體識別實踐五個方面,進行代碼介紹,供大家一起思考。

一、從預訓練語言模型看MLM預測任務

MLM和NSP兩個任務是目前BERT等預訓練語言模型預訓任務,其中MLM要求指定周圍詞來預測中心詞,其模型機構十分簡單,如下所示:

importtorch.nnasnn
fromtransformersimportBertModel,BertForMaskedLM
classBert_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)#加載預訓練模型權重
defforward(self,input_ids,attention_mask,token_type_ids):
outputs=self.bert(input_ids,attention_mask,token_type_ids)#maskedLM輸出的是mask的值對應的ids的概率,輸出會是詞表大小,里面是概率
logit=outputs[0]#池化后的輸出[bs,config.hidden_size]
returnlogit

下面一段代碼,簡單的使用了hugging face中的bert-base-uncased進行空缺詞預測,先可以得到預訓練模型對指定[MASK]位置上概率最大的詞語【詞語來自于預訓練語言模型的詞表】。

例如給定句子"natural language processing is a [MASK] technology.",要求預測出其中的[MASK]的詞:

>>>fromtransformersimportpipeline
>>>unmasker=pipeline('fill-mask',model='bert-base-uncased')
>>>unmasker("naturallanguageprocessingisa[MASK]technology.")
[{'score':0.18927036225795746,'token':3274,'token_str':'computer','sequence':'naturallanguageprocessingisacomputertechnology.'},
{'score':0.14354903995990753,'token':4807,'token_str':'communication','sequence':'naturallanguageprocessingisacommunicationtechnology.'},
{'score':0.09429361671209335,'token':2047,'token_str':'new','sequence':'naturallanguageprocessingisanewtechnology.'},
{'score':0.05184786394238472,'token':2653,'token_str':'language','sequence':'naturallanguageprocessingisalanguagetechnology.'},
{'score':0.04084266722202301,'token':15078,'token_str':'computational','sequence':'naturallanguageprocessingisacomputationaltechnology.'}]

從結果中,可以顯然的看到,[MASK]按照概率從大到小排序后得到的結果是,computer、communication、new、language以及computational,這直接反饋出了預訓練語言模型能夠有效刻畫出NLP是一種計算機、交流以及語言技術。

二、引入prompt_template的MLM預測任務

因此,既然語言模型中的MLM預測結果能夠較好地預測出指定的結果,那么其就必定包含了很重要的上下文知識,即上下文特征,那么,我們是否可以進一步地讓它來執行文本分類任務?即使用[MASK]的預測方式來預測相應分類類別的詞,然后再將詞做下一步與具體類別的預測?

實際上,這種思想就是prompt的思想,將下游任務對齊為預訓練語言模型的預訓練任務,如NPS和MLM,至于怎么對齊,其中引入兩個概念,一個是prompt_template,即提示模版,以告訴模型要生成與任務相關的詞語。因此,將任務原文text和prompt_template進行拼接,就可以構造與預訓練語言模型相同的預訓練任務。

例如,

>>>fromtransformersimportpipeline
>>>unmasker=pipeline('fill-mask',model='bert-base-uncased')
>>>text="Ireallylikethefilmalot."
>>>prompt_template="Becauseitwas[MASK]."
>>>pred1=unmasker(text+prompt_template)
>>>pred1
[
{'score':0.14730973541736603,'token':2307,'token_str':'great','sequence':'ireallylikethefilmalot.becauseitwasgreat.'},
{'score':0.10884211212396622,'token':6429,'token_str':'amazing','sequence':'ireallylikethefilmalot.becauseitwasamazing.'},
{'score':0.09781625121831894,'token':2204,'token_str':'good','sequence':'ireallylikethefilmalot.becauseitwasgood.'},
{'score':0.04627735912799835,'token':4569,'token_str':'fun','sequence':'ireallylikethefilmalot.becauseitwasfun.'},
{'score':0.043138038367033005,'token':10392,'token_str':'fantastic','sequence':'ireallylikethefilmalot.becauseitwasfantastic.'}]

>>>text="thismoviemakesmeverydisgusting."
>>>prompt_template="Becauseitwas[MASK]."
>>>pred2=unmasker(text+prompt_template)
>>>pred2
[
{'score':0.05464331805706024,'token':9643,'token_str':'awful','sequence':'thismoviemakesmeverydisgusting.becauseitwasawful.'},
{'score':0.050322480499744415,'token':2204,'token_str':'good','sequence':'thismoviemakesmeverydisgusting.becauseitwasgood.'},
{'score':0.04008950665593147,'token':9202,'token_str':'horrible','sequence':'thismoviemakesmeverydisgusting.becauseitwashorrible.'},
{'score':0.03569378703832626,'token':3308,'token_str':'wrong','sequence':'thismoviemakesmeverydisgusting.becauseitwaswrong.'},
{'score':0.033358603715896606,'token':2613,'token_str':'real','sequence':'thismoviemakesmeverydisgusting.becauseitwasreal.'}]

上面,我們使用了表達正面和負面的兩個句子,模型得到最高的均是與類型相關的詞語,這也驗證了這種方法的可行性。

三、引入verblize類別映射的Prompt-MLM預測

與構造prompt-template之外,另一個重要的點是verblize,做詞語到類型的映射,因為MLM模型預測的詞語很不確定,需要將詞語與具體的類別進行對齊,比如將"great", "amazing", "good", "fun", "fantastic", "better"等詞對齊到"positive"上,當模型預測結果出現這些詞時,就可以將整個預測的類別設定為positive;

同理,將"awful", "horrible", "bad", "wrong", "ugly"等詞映射為“negative”時,即可以將整個預測的類別設定為negative;

>>>verblize_dict={"pos":["great","amazing","good","fun","fantastic","better"],"neg":["awful","horrible","bad","wrong","ugly"]
...}
>>>hash_dict=dict()
>>>fork,vinverblize_dict.items():
...forv_inv:
...hash_dict[v_]=k
>>>hash_dict
{'great':'pos','amazing':'pos','good':'pos','fun':'pos','fantastic':'pos','better':'pos','awful':'neg','horrible':'neg','bad':'neg','wrong':'neg','ugly':'neg'}

因此,我們可以將這類方法直接加入到上面的預測結果當中進行修正,得到以下結果,

>>>[{"label":hash_dict[i["token_str"]],"score":i["score"]}foriinpred1]
[{'label':'pos','score':0.14730973541736603},{'label':'pos','score':0.10884211212396622},{'label':'pos','score':0.09781625121831894},{'label':'pos','score':0.04627735912799835},{'label':'pos','score':0.043138038367033005}]

>>>[{"label":hash_dict.get(i["token_str"],i["token_str"]),"score":i["score"]}foriinpred2]
[{'label':'neg','score':0.05464331805706024},{'label':'pos','score':0.050322480499744415},{'label':'neg','score':0.04008950665593147},{'label':'neg','score':0.03569378703832626},{'label':'real','score':0.033358603715896606}]

通過取top1,可直接得到類別分類結果,當然也可以綜合多個預測結果,可以獲top10中各個類別的比重,以得到最終結果:

{
"text":"Ireallylikethefilmalot.","label":"pos"
"text":"thismoviemakesmeverydisgusting.","label":"neg"
}

至此,我們可以大致就可以大致了解在zero-shot場景下,prompt的核心所在。而我們可以進一步的想到,如果我們有標注數據,又如何進行繼續訓練,如何更好的設計prompt-template以及做好這個詞語映射詞表,這也是prompt-learning的后續研究問題。

因此,我們可以進一步地形成一個完整的基于訓練數據的prompt分類模型,其代碼實現樣例具體如下,從中我們可以大致在看出具體的算法思想,我們命名為prompt.py

fromtransformersimportAutoModelForMaskedLM,AutoTokenizer
importtorch

classPrompting(object):

def__init__(self,**kwargs):
model_path=kwargs['model']
tokenizer_path=kwargs['model']
if"tokenizer"inkwargs.keys():
tokenizer_path=kwargs['tokenizer']
self.model=AutoModelForMaskedLM.from_pretrained(model_path)
self.tokenizer=AutoTokenizer.from_pretrained(model_path)

defprompt_pred(self,text):
"""
輸入帶有[MASK]的序列,輸出LM模型Vocab中的詞語列表及其概率
"""
indexed_tokens=self.tokenizer(text,return_tensors="pt").input_ids
tokenized_text=self.tokenizer.convert_ids_to_tokens(indexed_tokens[0])
mask_pos=tokenized_text.index(self.tokenizer.mask_token)
self.model.eval()
withtorch.no_grad():
outputs=self.model(indexed_tokens)
predictions=outputs[0]
values,indices=torch.sort(predictions[0,mask_pos],descending=True)
result=list(zip(self.tokenizer.convert_ids_to_tokens(indices),values))
self.scores_dict={a:bfora,binresult}
returnresult

defcompute_tokens_prob(self,text,token_list1,token_list2):
"""
給定兩個詞表,token_list1表示表示正面情感positive的詞,如good,great,token_list2表示表示負面情感positive的詞,如good,great,bad,terrible.
在計算概率時候,統計每個類別詞所占的比例,score1/(score1+score2)并歸一化,作為最終類別概率。
"""
_=self.prompt_pred(text)
score1=[self.scores_dict[token1]iftoken1inself.scores_dict.keys()else0
fortoken1intoken_list1]
score1=sum(score1)
score2=[self.scores_dict[token2]iftoken2inself.scores_dict.keys()else0
fortoken2intoken_list2]
score2=sum(score2)
softmax_rt=torch.nn.functional.softmax(torch.Tensor([score1,score2]),dim=0)
returnsoftmax_rt

deffine_tune(self,sentences,labels,prompt="Sinceitwas[MASK].",goodToken="good",badToken="bad"):
"""
對已有標注數據進行Fine tune訓練。
"""
good=tokenizer.convert_tokens_to_ids(goodToken)
bad=tokenizer.convert_tokens_to_ids(badToken)
fromtransformersimportAdamW
optimizer=AdamW(self.model.parameters(),lr=1e-3)
forsen,labelinzip(sentences,labels):
tokenized_text=self.tokenizer.tokenize(sen+prompt)
indexed_tokens=self.tokenizer.convert_tokens_to_ids(tokenized_text)
tokens_tensor=torch.tensor([indexed_tokens])
mask_pos=tokenized_text.index(self.tokenizer.mask_token)
outputs=self.model(tokens_tensor)
predictions=outputs[0]
pred=predictions[0,mask_pos][[good,bad]]
prob=torch.nn.functional.softmax(pred,dim=0)
lossFunc=torch.nn.CrossEntropyLoss()
loss=lossFunc(prob.unsqueeze(0),torch.tensor([label]))
loss.backward()
optimizer.step()

四、基于zero-shot的prompt情感分類實踐

下面我們直接以imdb中的例子進行zero-shot的prompt分類實踐,大家可以看看其中的大致邏輯:

1、加入

>>fromtransformersimportAutoModelForMaskedLM,AutoTokenizer
>>importtorch
>>model_path="bert-base-uncased"
>>tokenizer=AutoTokenizer.from_pretrained(model_path)
>>frompromptimportPrompting
>>prompting=Prompting(model=model_path)

2、使用prompt_pred直接進行情感預測

>>prompt="Becauseitwas[MASK]."
>>text="Ireallylikethefilmalot."
>>prompting.prompt_pred(text+prompt)[:10]
[('great',tensor(9.5558)),
('amazing',tensor(9.2532)),
('good',tensor(9.1464)),
('fun',tensor(8.3979)),
('fantastic',tensor(8.3277)),
('wonderful',tensor(8.2719)),
('beautiful',tensor(8.1584)),
('awesome',tensor(8.1071)),
('incredible',tensor(8.0140)),
('funny',tensor(7.8785))]
>>text="Ididnotlikethefilm."
>>prompting.prompt_pred(text+prompt)[:10]
[('bad',tensor(8.6784)),
('funny',tensor(8.1660)),
('good',tensor(7.9858)),
('awful',tensor(7.7454)),
('scary',tensor(7.3526)),
('boring',tensor(7.1553)),
('wrong',tensor(7.1402)),
('terrible',tensor(7.1296)),
('horrible',tensor(6.9923)),
('ridiculous',tensor(6.7731))]

2、加入neg/pos詞語vervlize進行情感預測

>>text="notworthwatching"
>>prompting.compute_tokens_prob(text+prompt,token_list1=["great","amazin","good"],token_list2=["bad","awfull","terrible"])
tensor([0.1496,0.8504])

>>text="Istronglyrecommendthatmoview"
>>prompting.compute_tokens_prob(text+prompt,token_list1=["great","amazin","good"],token_list2=["bad","awfull","terrible"])
tensor([0.9321,0.0679])

>>text="Istronglyrecommendthatmoview"
>>prompting.compute_tokens_prob(text+prompt,token_list1=["good"],token_list2=["bad"])
tensor([0.9223,0.0777])

五、基于zero-shot的promptNER實體識別實踐

進一步的,我們可以想到,既然分類任務可以進行分類任務,那么是否可以進一步用這種方法來做實體識別任務呢?

實際上是可行的,暴力的方式,通過獲取候選span,然后詢問其中實體所屬的類型集合。

1、設定prompt-template

同樣的,我們可以設定template,以一個人物為例,John是一個非常常見的名字,模型可以直接知道它是一個人,而不需要上下文

Sentence.Johnisatypeof[MASK]

2、使用prompt_pred直接進行預測我們直接進行處理,可以看看效果:

>>prompting.prompt_pred("JohnwenttoParistovisittheUniversity.Johnisatypeof[MASK].")[:5]
[('man',tensor(8.1382)),
('john',tensor(7.1325)),
('guy',tensor(6.9672)),
('writer',tensor(6.4336)),
('philosopher',tensor(6.3823))]
>>prompting.prompt_pred("Sava?wenttoParistovisittheuniversity.Sava?isatypeof[MASK].")[:5]
[('philosopher',tensor(7.6558)),
('poet',tensor(7.5621)),
('saint',tensor(7.0104)),
('man',tensor(6.8890)),
('pigeon',tensor(6.6780))]

2、加入類別詞語vervlize進行情感預測
進一步的,我們加入類別詞,進行預測,因為我們需要做的識別是人物person識別,因此我們可以將person類別相關的詞作為token_list1,如["person","man"],其他類型的,作為其他詞語,如token_list2為["location","city","place"]),而在其他類別時,也可以通過構造wordlist字典完成預測。

>>>prompting.compute_tokens_prob("Itisatypeof[MASK].",
token_list1=["person","man"],token_list2=["location","city","place"])
tensor([0.7603,0.2397])

>>>prompting.compute_tokens_prob("Sava?wenttoParistovisittheparliament.Sava?isatypeof[MASK].",
token_list1=["person","man"],token_list2=["location","city","place"])//確定概率為0.76,將大于0.76的作為判定為person的概率
tensor([9.9987e-01,1.2744e-04])

從上面的結果中,我們可以看到,利用分類方式來實現zero shot實體識別,是直接有效的,“Sava?”判定為person的概率為0.99,

prompting.compute_tokens_prob("Sava?wenttoLaristovisittheparliament.Larisisatypeof[MASK].",
token_list1=["person","man"],token_list2=["location","city","place"])
tensor([0.3263,0.6737])

而在這個例子中,將“Laris”這一地點判定為person的概率僅僅為0.3263,也證明其有效性。

總結

本文主要從預訓練語言模型看MLM預測任務、引入prompt_template的MLM預測任務、引入verblize類別映射的Prompt-MLM預測、基于zero-shot的prompt情感分類實踐以及基于zero-shot的promptNER實體識別實踐五個方面,進行了代碼介紹。

關于prompt-learning,我們可以看到,其核心就在于將下游任務統一建模為了預訓練語言模型的訓練任務,從而能夠最大地挖掘出預訓模型的潛力,而其中的prompt-template以及對應詞的構造,這個十分有趣,大家可以多關注。

審核編輯 :李倩


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 語言模型
    +關注

    關注

    0

    文章

    521

    瀏覽量

    10268
  • nlp
    nlp
    +關注

    關注

    1

    文章

    488

    瀏覽量

    22033

原文標題:Prompt總結 | 從MLM預訓任務到Prompt Learning原理解析與Zero-shot分類、NER簡單實踐

文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    KerasHub統一、全面的訓練模型

    深度學習領域正在迅速發展,在處理各種類型的任務中,訓練模型變得越來越重要。Keras 以其用戶友好型 API 和對易用性的重視而聞名,始終處于這一動向的前沿。Keras 擁有專用的內
    的頭像 發表于 12-20 10:32 ?69次閱讀

    什么是大模型、大模型是怎么訓練出來的及大模型作用

    ,基礎模型。 ? 大模型是一個簡稱,完整的叫法,應該是“人工智能訓練模型”。
    的頭像 發表于 11-25 09:29 ?1231次閱讀
    什么是大<b class='flag-5'>模型</b>、大<b class='flag-5'>模型</b>是怎么<b class='flag-5'>訓練</b>出來的及大<b class='flag-5'>模型</b>作用

    直播預約 |數據智能系列講座第4期:訓練的基礎模型下的持續學習

    神經網絡,特別是訓練的基礎模型研究得到了廣泛的應用,但其仍然主要依賴于在大量樣本上的批量式訓練。本報告將探討實現模型的增量式
    的頭像 發表于 10-18 08:09 ?215次閱讀
    直播預約 |數據智能系列講座第4期:<b class='flag-5'>預</b><b class='flag-5'>訓練</b>的基礎<b class='flag-5'>模型</b>下的持續學習

    【《大語言模型應用指南》閱讀體驗】+ 基礎知識學習

    收集海量的文本數據作為訓練材料。這些數據集不僅包括語法結構的學習,還包括對語言的深層次理解,如文化背景、語境含義和情感色彩等。 自監督學習:模型采用自監督學習策略,在大量無標簽文本數據上學習
    發表于 08-02 11:03

    語言模型訓練

    能力,逐漸成為NLP領域的研究熱點。大語言模型訓練是這一技術發展的關鍵步驟,它通過在海量無標簽數據上進行訓練,使
    的頭像 發表于 07-11 10:11 ?422次閱讀

    LLM訓練的基本概念、基本原理和主要優勢

    在人工智能和自然語言處理(NLP)領域,大型語言模型(Large Language Model,簡稱LLM)的興起極大地推動了技術的進步和應用的發展。LLM通過在大規模文本數據上進行
    的頭像 發表于 07-10 11:03 ?1064次閱讀

    訓練模型的基本原理和應用

    訓練模型(Pre-trained Model)是深度學習和機器學習領域中的一個重要概念,尤其是在自然語言處理(NLP)和計算機視覺(CV)等領域中得到了廣泛應用。
    的頭像 發表于 07-03 18:20 ?2770次閱讀

    語言模型:原理與工程時間+小白初識大語言模型

    語言模型進行訓練,此處訓練為自然語言處理領域的
    發表于 05-12 23:57

    【大語言模型:原理與工程實踐】大語言模型的應用

    操作。所謂零樣本提示(Zero-Shot Prompt),指的是在提示詞中不包含與指令任務相似的任何示例。 當大語言模型訓練完成后,它便具備了分析情緒和識別命名實體等常見
    發表于 05-07 17:21

    【大語言模型:原理與工程實踐】大語言模型訓練

    語言模型的核心特點在于其龐大的參數量,這賦予了模型強大的學習容量,使其無需依賴微調即可適應各種下游任務,而更傾向于培養通用的處理能力。然而,隨著學習容量的增加,對
    發表于 05-07 17:10

    【大語言模型:原理與工程實踐】大語言模型的基礎技術

    特定任務模型進行微調。這種方法的成功不僅是自然語言處理發展的一個轉折點,還為許多現實世界的應用場帶來了前所未有的性能提升。廣為人知的GPT到BERT,
    發表于 05-05 12:17

    【大語言模型:原理與工程實踐】核心技術綜述

    的復雜模式和長距離依賴關系。 訓練策略: 訓練是LLMs訓練過程的第一階段,模型在大量的
    發表于 05-05 10:56

    【大語言模型:原理與工程實踐】揭開大語言模型的面紗

    獲得良好效果。 語言模型作為自然語言處理的核心,不斷進化以捕捉人類語言的精髓。起初,這些模型依賴于統計方法,如n-gram
    發表于 05-04 23:55

    名單公布!【書籍評測活動NO.30】大規模語言模型理論到實踐

    等多種形式和任務。這個階段是語言模型向對話模型轉變的關鍵,其核心難點在于如何構建訓練數據,包括
    發表于 03-11 15:16

    語言模型推斷中的批處理效應

    隨著開源訓練大型語言模型(Large Language Model, LLM )變得更加強大和開放,越來越多的開發者將大語言
    的頭像 發表于 01-04 12:32 ?628次閱讀
    大<b class='flag-5'>語言</b><b class='flag-5'>模型</b>推斷中的批處理效應
    主站蜘蛛池模板: 国产人妻人伦精品无码.麻豆| 777米奇色狠狠俺去啦| 亚洲成色爱我久久| 亚洲欧美日韩人成| 在线观看qvod| WWW夜片内射视频在观看视频| 超碰在线97久久视频观看| 国产精品久久久久久52AVAV| 含羞草免费完整视频在线观看 | 精品无码人妻一区二区免费AV| 精品久久久噜噜噜久久7| 门鱼电影完整版免费版| 日韩免费一区| 亚洲精品国产一区二区贰佰信息网| 在线观看国产精美视频| 本庄优花aⅴ全部在线影片| 国产精品一区二区亚瑟不卡| 久久视频在线视频| 日韩精品熟女一区二区三区中文 | 色欲AV精品人妻一区二区三区| 亚洲AV永久无码精品老司机蜜桃| 永久精品免费影院在线观看网站| videossexotv极度另类| 国产真实露脸乱子伦| 男人和女人一级黄色大片| 网红刘婷hd国产高清| 伊人网站在线| 国产av久久免费观看| 久久视频在线视频| 午夜精品久久久久久99热蜜桃| 在线视频中文字幕| 国产h视频在线观看免费| 久久亚洲高清观看| 无人区尖叫之夜美女姐姐视频| 永久午夜福利视频一区在线观看| 成人精品视频在线观看| 久久re6热在线视频精品| 十分钟免费视频大全在线| 中文视频在线观看| 国产精品一区二区AV97| 女人一级毛片免费观看|