日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

BERT模型—2.BERT模型预训练与微调

發(fā)布時(shí)間:2023/12/18 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 BERT模型—2.BERT模型预训练与微调 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

文章目錄

      • 引言
      • 一、預(yù)訓(xùn)練語(yǔ)言模型
        • 1.為什么要進(jìn)行預(yù)訓(xùn)練?
        • 2. BERT預(yù)訓(xùn)練-掩碼預(yù)測(cè)任務(wù)
        • 3.BERT預(yù)訓(xùn)練-下句預(yù)測(cè)任務(wù)
      • 二、BERT的文本處理—subword tokenizer
        • 1. 為什么要學(xué)習(xí)subword tokenizer?
        • 2. 詞表生成與分詞
      • 三、BERT embedding
      • 四、BERT微調(diào)—句子分類(lèi)任務(wù)
      • 五、BERT微調(diào)—序列標(biāo)注任務(wù)
      • 六、BERT微調(diào)—關(guān)系分類(lèi)任務(wù)
      • 七、BERT微調(diào)—樣本不均衡問(wèn)題Focal loss

引言

??本節(jié)將按照思維導(dǎo)圖逐步了解BERT語(yǔ)言模型(基于transformer的網(wǎng)絡(luò)結(jié)構(gòu))。

??BERT帶來(lái)了新的NLP范式。

一、預(yù)訓(xùn)練語(yǔ)言模型

??大規(guī)模的預(yù)訓(xùn)練語(yǔ)言模型的模型參數(shù)量呈幾何倍數(shù)的增長(zhǎng)趨勢(shì)。下面我們了解BERT預(yù)訓(xùn)練的原理。

1.為什么要進(jìn)行預(yù)訓(xùn)練?

??基于詞向量為基礎(chǔ)的模型并不是在BERT中首次出現(xiàn)。在Word2vec中,詞向量表示是有局限性的。這是因?yàn)樵~向量表達(dá)固定,無(wú)法表達(dá)上下文。2017年之前,NLP模型的普遍形態(tài)為詞向量+encoder。

利用LSTM或者Transformer模型通過(guò)訓(xùn)練集來(lái)學(xué)習(xí)如何提取上下文信息,最終輸出分類(lèi)標(biāo)簽。這里的訓(xùn)練集指的是具有分類(lèi)或者NER的標(biāo)注信息。這種模式有如下缺陷:

  • Encoder部分隨機(jī)初始化,沒(méi)有經(jīng)過(guò)預(yù)訓(xùn)練,對(duì)優(yōu)化器壓力大;
  • 數(shù)據(jù)集要足夠好,足夠大,encoder才能學(xué)會(huì)如何提取上下文信息

這兩個(gè)缺陷導(dǎo)致2017年以前的模型非常具有局限性。
??基于上述的缺陷,我們現(xiàn)在想要有效的預(yù)訓(xùn)練embedding+編碼器。有標(biāo)簽的文本數(shù)據(jù)獲取成本大,相比來(lái)說(shuō),獲取大量無(wú)標(biāo)簽的文本數(shù)據(jù)代價(jià)很小。所以如何進(jìn)行預(yù)訓(xùn)練呢?這就涉及到在大量無(wú)標(biāo)簽的文本上進(jìn)行自監(jiān)督學(xué)習(xí)(self-supervised training)。

2. BERT預(yù)訓(xùn)練-掩碼預(yù)測(cè)任務(wù)

??掩碼預(yù)測(cè)任務(wù)與Word2vec中CBOW非常神似,但略有不同。

  • 一方面,CBOW語(yǔ)言模型輸入的是一個(gè)時(shí)間窗口,并不一定是一個(gè)句子;掩碼預(yù)測(cè)任務(wù)輸入的是一個(gè)句子(sentence)
  • 另一方面,CBOW當(dāng)中被預(yù)測(cè)的詞是不做輸入的;但掩碼預(yù)測(cè)任務(wù)會(huì)遮掩某個(gè)詞(用”[MASK]"字符替換原詞)然后用于輸入
  • CBOW中是一句話預(yù)測(cè)一個(gè)詞,掩碼預(yù)測(cè)任務(wù)一句話可以遮掩多個(gè)字

??掩碼預(yù)測(cè)任務(wù)中,輸入是句子當(dāng)中遮掩掉幾個(gè)詞(用”[MASK]"字符替換原詞),經(jīng)過(guò)BERT網(wǎng)絡(luò)輸出每個(gè)字的向量表征。在遮掩的這個(gè)字的位置上要經(jīng)過(guò)一個(gè)線性層來(lái)預(yù)測(cè)這個(gè)位置是哪個(gè)字的概率。掩碼預(yù)測(cè)任務(wù)存在的問(wèn)題:在下游任務(wù)中,eg:預(yù)測(cè)一個(gè)句子的情感是不會(huì)有[Mask]的。因此,在實(shí)現(xiàn)掩碼任務(wù)時(shí),需要遮掩的字只占語(yǔ)料全體的字?jǐn)?shù)的一小部分(15%);在這15%里面:

  • 一部分(80%)被遮掩,也就是替換為[MASK];
  • 一部分(10%)隨機(jī)替換為其他詞(仍然需要預(yù)測(cè)此處的token應(yīng)該是什么);
  • —部分(10%)保留原詞(仍然需要預(yù)測(cè)此處的token);

這樣做的目的是使得模型能夠區(qū)分這個(gè)詞放在這里是否合理,使得模型具有判斷這句話是否合理的能力,加深了模型對(duì)語(yǔ)言的理解。BERT模型在經(jīng)過(guò)預(yù)訓(xùn)練之后天生就能夠做一些下游任務(wù),比如:糾錯(cuò)任務(wù)。

3.BERT預(yù)訓(xùn)練-下句預(yù)測(cè)任務(wù)

??下句預(yù)測(cè)指的是:判斷句子B是否是句子A的下文。此時(shí),BERT句子的輸入會(huì)是[CLS] A sent [SEP] B sent [SEP]的格式

??我們經(jīng)常通過(guò)句首的第一個(gè)token來(lái)表示句子整體的語(yǔ)義關(guān)系,在上下句預(yù)測(cè)的任務(wù)當(dāng)中,上下句的關(guān)系是保存在輸入的[CLS]符號(hào)的當(dāng)中,在預(yù)測(cè)時(shí)使用BertPooler提取整個(gè)輸入序列的表征:

這里要注意:不是直接拿[CLS]的向量表征;而是要經(jīng)過(guò)BertPooler這個(gè)模塊,其中包含MLP,tanh操作得到一個(gè)向量表示,再輸入到2分類(lèi)層,BertPooler也是參與預(yù)訓(xùn)練的,預(yù)訓(xùn)練會(huì)更新整個(gè)bert的模型參數(shù),微調(diào)時(shí)候其實(shí)是可以更新部分參數(shù),后面會(huì)有介紹。

用了 Masked LM 和 Next Sentence Prediction 兩種方法分別捕捉詞語(yǔ)和句子級(jí)別的 representation

二、BERT的文本處理—subword tokenizer

1. 為什么要學(xué)習(xí)subword tokenizer?

??subword tokenizer就是將長(zhǎng)的復(fù)雜的單詞分成成短的簡(jiǎn)單的單詞,eg:句子” play the song little robin redbreast”在輸入模型時(shí)變?yōu)椤盵CLS] play the song red ##bre ##ast [SEP]”。Tokenizer是預(yù)訓(xùn)練時(shí)候用了哪個(gè),后面微調(diào)就要用哪個(gè)。使用subword tokenizer的原因是:

  • 傳統(tǒng)詞表示方法:是先對(duì)各個(gè)句子進(jìn)行分詞,然后再統(tǒng)計(jì)并選出頻數(shù)最高的前N個(gè)詞組成詞表·詞表一般較大,一是尾部詞訓(xùn)練不充分,二是顯存占用較大
  • 傳統(tǒng)詞表示方法無(wú)法很好的處理未知或罕見(jiàn)的詞匯(OOV問(wèn)題)
  • 傳統(tǒng)詞tokenization方法不利于模型學(xué)習(xí)詞綴之間的關(guān)系
    E.g.模型學(xué)到的“old”, “older”,and “oldest”之間的關(guān)系無(wú)法泛化到“smart”, “smarter”,and“smartest”。
  • Character embedding作為OOV的解決方法粒度太細(xì),且推理時(shí)候顯存開(kāi)銷(xiāo)較大:
    一個(gè)原本長(zhǎng)度為12的句子,采用character embedding,則輸入的大小變?yōu)?2*16 (假設(shè)設(shè)置詞字母長(zhǎng)度最
    大為16)
  • Subword粒度在詞與字符之間,能夠較好的平衡OOV問(wèn)題

常見(jiàn)的subword模型:Byte Pair Encoding (BPE), WordPiece

2. 詞表生成與分詞

??BPE算法生成詞表過(guò)程如下:

  • 準(zhǔn)備一個(gè)語(yǔ)料庫(kù);確定期望的Subword詞表大小;
  • 將單詞拆分為成最小單元。比如英文中26個(gè)字母加上各種符號(hào),這些作為初始詞表;
  • 在語(yǔ)料上統(tǒng)計(jì)單詞內(nèi)相鄰單元對(duì)的頻數(shù),選取頻類(lèi)最高的單元對(duì)合并成新的Subword單元;
  • 重復(fù)第3步直到:達(dá)到第1步設(shè)定的Subword詞表大小或下一輪迭代中token最高頻數(shù)為1
  • 假設(shè)現(xiàn)在語(yǔ)料庫(kù)中有如下詞匯(及其頻率):

    觀察詞匯表大小在每一步如何變化

    ??BPE算法編碼:得到Subword詞表后,針對(duì)每一個(gè)單詞,我們可以采用如下的方式來(lái)進(jìn)行編碼:

    • 將詞典中的所有子詞按照長(zhǎng)度由大到小進(jìn)行排序;
    • 對(duì)于要進(jìn)行分詞的單詞w,依次遍歷排好序的詞典。查看當(dāng)前子詞是否是該單詞的子字符串(貪婪的最長(zhǎng)匹配),如果是,則輸出當(dāng)前子詞,并對(duì)剩余單詞字符串繼續(xù)匹配;
    • 如果遍歷完字典后,仍不匹配,則將剩余字符串替換為特殊符號(hào)輸出,如””;

    ??WordPiece算法生成詞表的步驟與BPE類(lèi)似;加上”##”前綴表示token不作為一個(gè)完整單詞的開(kāi)始部分。與BPE的最大區(qū)別在于,如何選擇兩個(gè)子詞進(jìn)行合并∶BPE選擇頻數(shù)最高的相鄰子詞合并,而WordPiece選擇能夠提升語(yǔ)言模型概率最大的相鄰子詞加入詞表;

    • 假設(shè)句子S=(t1,t2,tn)S =(t_1, t_2,t_n)S=(t1?,t2?,tn?)由n個(gè)子詞組成,表示子詞,且假設(shè)各個(gè)子詞之間是獨(dú)立存在的
    • 句子的語(yǔ)言模型似然值等價(jià)于所有子詞概率的乘積:logP(S)=∑i=1nP(ti)logP(S)= \sum_{i=1}^nP(t_i)logP(S)=i=1n?P(ti?)
    • 假設(shè)把相鄰位置的iiijjj兩個(gè)子詞進(jìn)行合并,合并后產(chǎn)生的子詞記為zzz,此時(shí)句子似然值的變化可表示為:
      logP(tz)?(logP(tx)+logP(ty))=logP(tz)P(tx)P(ty)logP(t_z)- (logP(t_x)+ logP(t_y)) =log\frac{P(t_z)}{P(t_x)P(t_y)}logP(tz?)?(logP(tx?)+logP(ty?))=logP(tx?)P(ty?)P(tz?)?
      很容易發(fā)現(xiàn),似然值的變化就是兩個(gè)子詞之間的互信息。

    簡(jiǎn)而言之,WordPiece每次選擇合并的兩個(gè)子詞,他們具有最大的互信息值,也就是兩子詞在語(yǔ)言模型上具有較強(qiáng)的關(guān)聯(lián)性,它們經(jīng)常在語(yǔ)料中以相鄰方式同時(shí)出現(xiàn)。
    Wordpiece舉例:

    • 英文:采用BERT-base-uncased tokenizer
      30522個(gè)單詞;英文轉(zhuǎn)化為小寫(xiě)
      eg:
      句子“play the song little robin redbreast”經(jīng)過(guò)BERT的wordpiece tokenizer后變?yōu)椤盵‘play’, ‘the’, ‘song’, ‘little’, ‘robin’, ‘red’, ‘##bre’, '##ast ]”
    • 中文:采用Google Chinese BERT-base-uncased
      21128個(gè)單詞;不區(qū)分大小寫(xiě);
      中文漢字拆開(kāi)(split_Chinese_character);
      eg:
      句子”我很喜歡一首歌: yesterday once more.”處理為['我,‘很’,‘喜’, ‘歡’,'一,'首, ‘歌’, ‘:’,‘yes’, ‘##ter’, ‘##day’, ‘on’, ‘##ce’, ‘more’, ‘.’]

    三、BERT embedding

    ??BERT的嵌入層包含三種embedding

    • Token embedding
      對(duì)應(yīng)著Subword詞表分詞后的每一個(gè)單詞
    • Segmentation embedding
      將句子的上一句與下一句進(jìn)行區(qū)分對(duì)待,涉及到預(yù)訓(xùn)練任務(wù)當(dāng)中的下句預(yù)測(cè)
    • Position embedding
      位置編碼,為了能夠讓模型反映句子的順序信息,位置編碼研究前沿如今是相對(duì)位置編碼

    四、BERT微調(diào)—句子分類(lèi)任務(wù)

    ??句子分類(lèi)任務(wù)就是把文本按照一定的規(guī)則分門(mén)別類(lèi),文本分類(lèi)有以下應(yīng)用場(chǎng)景:

    ??那么,在下游任務(wù)中,如何進(jìn)行BERT句子分類(lèi)任務(wù)的微調(diào)?不妨以單個(gè)句子分類(lèi)為例(還有句子對(duì)分類(lèi),判定句子對(duì)是否同義),比如,我們現(xiàn)在想要對(duì)“想看黑寡婦”進(jìn)行情感分類(lèi),首先將“想看黑寡婦”轉(zhuǎn)換成BERT模型的輸入形式,在句前加[CLS]符號(hào),句尾加[SEP]符號(hào),使用subword tokenizer進(jìn)行分詞,將這樣處理好的文本輸入到BERT模型中,得到句子的向量表征(句子中的每個(gè)字均有向量表征),通過(guò)BertPooler模塊,取[CLS]的向量表征,經(jīng)過(guò)MLP,tanh操作后得到一個(gè)整句的向量表征,再經(jīng)過(guò)分類(lèi)層得到分類(lèi)結(jié)果。

    由于NLP中句子是不定長(zhǎng)的,所以可以通過(guò)Pooling層將變長(zhǎng)的向量轉(zhuǎn)換成特定的size。除了使用BertPooler模塊,還可以增加一個(gè)Pooling操作,將句子表征轉(zhuǎn)化成句子級(jí)別的向量。這里的Pooling操作指:

    • Max-Pooling
    • Average-Pooling
    • Attention-Pooling


    ??分類(lèi)任務(wù)微調(diào)的損失函數(shù):假設(shè)模型對(duì)分類(lèi)任務(wù)的訓(xùn)練樣本為(x,y)(x,y)(x,y),預(yù)測(cè)類(lèi)別為ccc的概率為pcp_cpc?,則損失函數(shù)為
    CE(PC,X)=?I(y=c)?log(pc)CE(P_C,X)=-I(y=c)*log(p_c)CE(PC?,X)=?I(y=c)?log(pc?)

    有了損失函數(shù)就可以利用梯度的更新做網(wǎng)絡(luò)的訓(xùn)練。
    ??分類(lèi)任務(wù)微調(diào)的原理與一般的網(wǎng)絡(luò)訓(xùn)練沒(méi)有區(qū)別。微調(diào)時(shí),如果不固定參數(shù),所有層的參數(shù)會(huì)更新。你可以選擇固定某些層的參數(shù),比如:embedding層。

    五、BERT微調(diào)—序列標(biāo)注任務(wù)

    ??序列標(biāo)注任務(wù)指的是對(duì)于待標(biāo)注的一段序列x={x1,x2,...,xn}x=\{x_1, x_2,..., x_n\}x={x1?x2?...xn?},我們需要給每個(gè)xix_ixi?預(yù)測(cè)一個(gè)標(biāo)簽(tag)yi(tag)y_i(tag)yi?,標(biāo)簽(tag)(tag)(tag)集合是T={t1,t2,...,tm}T=\{t_1,t_2,...,t_m\}T={t1?,t2?,...,tm?}。在不同的序列標(biāo)注任務(wù)中對(duì)應(yīng)的標(biāo)簽不一樣。

    • 中文分詞任務(wù)
      定義的標(biāo)簽(tag)(tag)(tag)集合是{BeginMiddleEndSingle}\{Begin \ Middle\ End\ Single\}{Begin?Middle?End?Single}
      eg:“風(fēng)險(xiǎn)基因協(xié)同的神經(jīng)生物學(xué)作用”被分詞為
      風(fēng)險(xiǎn) 基因 協(xié)同 的 神經(jīng) 生物學(xué) 作用,轉(zhuǎn)化為序列標(biāo)注任務(wù)為:風(fēng)/B險(xiǎn)/E基/B因/E協(xié)/B同/E的/s神/B經(jīng)/E生/B物/M學(xué)/E作/B用/E。
    • 命名實(shí)體識(shí)別:標(biāo)出句子中的實(shí)體;使用BIO標(biāo)注模式;
      定義的標(biāo)簽(tag)(tag)(tag)集合是實(shí)體類(lèi)型包括{PER,ORG}\{PER,ORG\}{PER,ORG}
      eg:喬/B-PER布/I-PER斯/I-PER 就/O職/O于/O蘋(píng)/B-ORG 果/I-ORG 公/I-ORG司/I-ORG
    • 詞性標(biāo)注(Part-of-speech, POS tagging):標(biāo)注出詞語(yǔ)的詞性;使用BIO標(biāo)注模式
      ??BERT序列標(biāo)注任務(wù)微調(diào)方法有兩種:
    • 方法一:每個(gè)token的向量表示經(jīng)過(guò)線性層+softmax
      具體過(guò)程為:將BERT模型格式將句子輸入到BERT模型當(dāng)中,然后給出每個(gè)詞的向量表征,經(jīng)過(guò)線性層+softmax,然后給出每個(gè)詞的NER標(biāo)簽
    • 方法二:BERT+CRF層
      在BERT模型還沒(méi)有出現(xiàn)以前,解決這個(gè)問(wèn)題的通用方式是’BiLSTM-CRF’模型。CRF層通過(guò)學(xué)習(xí)標(biāo)簽之間轉(zhuǎn)移的模式來(lái)規(guī)避’B-PER,I-ORG’這樣的問(wèn)題;

    六、BERT微調(diào)—關(guān)系分類(lèi)任務(wù)

    ??關(guān)系分類(lèi)任務(wù)就是從非結(jié)構(gòu)化文本中抽取出結(jié)構(gòu)化知識(shí);具體為:區(qū)分出頭實(shí)體與尾實(shí)體之間的語(yǔ)義關(guān)系,比如:

    ??關(guān)系分類(lèi)任務(wù)最直接的應(yīng)用是構(gòu)建知識(shí)圖譜。

    ??BERT關(guān)系分類(lèi)任務(wù)微調(diào)方法有三種:

    • 方法一:將句子輸入到BERT模型中,然后分別拿到頭實(shí)體與尾實(shí)體的向量表征(實(shí)體多個(gè)詞的表征經(jīng)過(guò)pooling得到),然后將頭尾實(shí)體向量拼接,再經(jīng)過(guò)線性層分類(lèi)
    • 方法二:BERT的embedding層中加入關(guān)系位置編碼。在方法一的基礎(chǔ)上加上關(guān)系位置編碼,告訴BERT模型何處為頭實(shí)體何處為尾實(shí)體。
    • 方法三:在句子中加入新定義的字符(unusedtoken),標(biāo)識(shí)出頭尾實(shí)體位置;

    七、BERT微調(diào)—樣本不均衡問(wèn)題Focal loss

    ??在自然語(yǔ)言處理應(yīng)用場(chǎng)景中,經(jīng)常出現(xiàn)樣本不均衡場(chǎng)景的問(wèn)題,這是因?yàn)樵谧匀徽Z(yǔ)言的語(yǔ)料庫(kù)中,一個(gè)單詞出現(xiàn)的頻率與它在頻率表里的排名成反比,即頻率越高的單詞,出現(xiàn)的次數(shù)越多。碰到樣本不均衡問(wèn)題時(shí),需要對(duì)訓(xùn)練方法做一定的改變。

    • 方法一:重采樣
      假設(shè)CCC是數(shù)據(jù)集類(lèi)別數(shù),nnn是類(lèi)別iii的樣本數(shù)量,則從類(lèi)別iii中采樣一個(gè)樣本的概率:
      instance-balanced sampling:每個(gè)樣本被等概率的抽到,即
      pi=ni∑j=1Cnjp_i=\frac{n_i}{{\sum_{j=1}^Cn_j}}pi?=j=1C?nj?ni??
      Class balanced sampling:每個(gè)類(lèi)別被抽到的概率都相等
      pi=1∑j=1C1p_i=\frac{1}{{\sum_{j=1}^C1}}pi?=j=1C?11?
      一般重采樣,假設(shè)q∈(0,1)q∈(0,1)q(0,1)
      niq∑j=1Cnjq\frac{n_i^q}{{\sum_{j=1}^Cn_j^q}}j=1C?njq?niq??
    • 方法二:重加權(quán)(re_weighting):以二分類(lèi)為例
      正常的交叉熵?fù)p失為:
      CE(PC,X)=?I(y=c)?log(pc)CE(P_C,X)=-I(y=c)*log(p_c)CE(PC?,X)=?I(y=c)?log(pc?)
      通過(guò)增加一個(gè)系數(shù)(添加的系數(shù)與難度相關(guān)),來(lái)控制少數(shù)類(lèi)別的樣本對(duì)總loss的貢獻(xiàn)
      CE(PC,X)=?α(c)?I(y=c)?log(pc)CE(P_C,X)=-\alpha(c)*I(y=c)*log(p_c)CE(PC?,X)=?α(c)?I(y=c)?log(pc?)
      Focal loss:
      CE(PC,X)=?(1?pc)γI(y=c)?log(pc)CE(P_C,X)=-(1-p_c)^{\gamma}I(y=c)*log(p_c)CE(PC?,X)=?(1?pc?)γI(y=c)?log(pc?)
      Focal loss+類(lèi)別的重加權(quán):
      CE(PC,X)=?α(c)(1?pc)γI(y=c)?log(pc)CE(P_C,X)=-\alpha(c)(1-p_c)^{\gamma}I(y=c)*log(p_c)CE(PC?,X)=?α(c)(1?pc?)γI(y=c)?log(pc?)

    如果對(duì)您有幫助,麻煩點(diǎn)贊關(guān)注,這真的對(duì)我很重要!!!如果需要互關(guān),請(qǐng)?jiān)u論或者私信!


    總結(jié)

    以上是生活随笔為你收集整理的BERT模型—2.BERT模型预训练与微调的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。