最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

BERT 論文逐段精讀【論文精讀】

2021-12-21 17:57 作者:如果我是泡橘子  | 我要投稿

BERT


pre-training of deep bidirectional transformers for language understanding


自然語言中中近三年最重要的文章


在計算機(jī)視覺里面很早就能夠在一個大的數(shù)據(jù)集(比如說ImageNet)上訓(xùn)練出一個CNN模型,用這個模型可以用來處理一大片的機(jī)器視覺任務(wù),來提升他們的性能


但是在自然語言處理里面,在BERT之前一直沒有一個深的神經(jīng)網(wǎng)絡(luò)使得它訓(xùn)練好之后能夠幫處理一大片的NLP任務(wù),在NLP中很多時候還是對每個任務(wù)構(gòu)造自己的神經(jīng)網(wǎng)路,然后再做訓(xùn)練


BERT的出現(xiàn)使得我們能夠在一個大的數(shù)據(jù)集上面訓(xùn)練好一個比較深的神經(jīng)網(wǎng)絡(luò),然后應(yīng)用在很多的NLP任務(wù)上面,這樣既簡化了NLP任務(wù)的訓(xùn)練,又提升了它的性能,所以BERT和它之后的一系列工作使得自然語言處理在過去三年中有了質(zhì)的飛躍





1、標(biāo)題 + 作者


pre-training:在一個數(shù)據(jù)集上訓(xùn)練好一個模型,這個模型主要的目的是用在另外一個任務(wù)上面,所以如果另外一個任務(wù)叫training的話,那么在大的數(shù)據(jù)集上訓(xùn)練的這個任務(wù)(模型)就叫做pre-training,即training之前的任務(wù)


deep:更深的神經(jīng)網(wǎng)絡(luò)


bidirectional:雙向的


transformers


language understanding:transformer主要是用在機(jī)器翻譯這個小任務(wù)上,這里使用的是一個更加廣義的詞,就是對語言的理解


這篇文章是關(guān)于BERT模型,它是一個深的雙向的transformer,是用來做預(yù)訓(xùn)練的,針對的是一般的語言的理解任務(wù)


作者來自Google AI語言團(tuán)隊





2、摘要


BERT是一個新的語言表示模型,BERT的名字來自于:

  • Bidirectional
  • Encoder
  • Representation
  • Transformer

它的意思是transformer這個模型雙向的編碼器表示,這四個詞跟標(biāo)題是不一樣的


它的想法是基于ELMo

  • ELMo來自于芝麻街中人物的名字,芝麻街是美國的一個少兒英語學(xué)習(xí)節(jié)目
  • BERT是芝麻街中另外一個主人公的名字
  • 這篇文章和之前的ELMo開創(chuàng)了NLP的芝麻街系列文章


BERT和最近的一些語言的表示模型有所不同

  • Peters 引用的是ELMo
  • Radfor 引用的是GPT


BERT和ELMo、GPT的區(qū)別:

  • BERT是設(shè)計用來訓(xùn)練深的雙向表示,使用的是沒有標(biāo)號的數(shù)據(jù),再聯(lián)合左右的上下文信息
  • 因為這樣的設(shè)計導(dǎo)致訓(xùn)練好的BERT只用加一個額外的輸出層,就可以在很多NLP的任務(wù)(比如問答、語言推理)上面得到一個不錯的結(jié)果,而且不需要對任務(wù)做很多特別的架構(gòu)上的改動

GPT考慮的是單向(用左邊的上下文信息去預(yù)測未來),BERT同時使用了左側(cè)和右側(cè)的信息,它是雙向的(Bidirectional)

ELMO用的是一個基于RNN的架構(gòu),BERT用的是transformer,所以ELMo在用到一些下游任務(wù)的時候需要對架構(gòu)做一點點調(diào)整,但是BERT相對比較簡單,和GPT一樣只需要改最上層就可以了


分別用兩句話講清楚了BERT和GPT、ELMo的區(qū)別,在摘要的前面講清楚了文章和哪兩個工作相關(guān),以及和這兩個工作的區(qū)別是什么,在一定程度上表示了本文的工作是基于上述的兩個工作之上然后做了一些改動



BERT的好處

  • 模型概念上更加簡單而且效果更好。它在11個NLP的任務(wù)上得到了新的最好的結(jié)果(包括GLUE、MultiNLI、SQvAD v1.1、SQvAD v2.0等絕對精度都有一定的提升、相對好處(具體提升了多少)


摘要整體上有兩段話,一段話是跟另外兩篇相關(guān)工作的區(qū)別,第二段話是說結(jié)果特別好。先寫改進(jìn)再寫結(jié)果比別人好在什么地方





3、導(dǎo)言


第一段一般是交代論文所研究方向的上下文關(guān)系


在語言模型中,預(yù)訓(xùn)練可以用來提升很多自然語言的任務(wù)


自然語言任務(wù)包括兩類

  • 句子層面的任務(wù)(sentence-level):主要是用來建模句子之間的關(guān)系,比如說對句子的情緒識別或者兩個句子之間的關(guān)系
  • 詞元層面的任務(wù)(token-level):包括實體命名的識別(對每個詞識別是不是實體命名,比如說人名、街道名),這些任務(wù)需要輸出一些細(xì)膩度的詞元層面上的輸出


預(yù)訓(xùn)練在NLP中已經(jīng)流行了有一陣子了,在計算機(jī)視覺里面已經(jīng)用了很多年了,同樣的方法用到自然語言上面也不會很新,但是在介紹BERT的時候,很有可能會把NLP做預(yù)訓(xùn)練歸功于BERT,BERT不是第一個提出來的而是BERT讓這個方法出圈了讓后面的研究者跟著做自然語言的任務(wù)


導(dǎo)言的第二段和之后一般是摘要的第一段的擴(kuò)充版本


在使用預(yù)訓(xùn)練模型做特征表示的時候,一般有兩類策略

  • 一個策略是基于特征的,代表作是ELMo,對每一個下游的任務(wù)構(gòu)造一個跟這個任務(wù)相關(guān)的神經(jīng)網(wǎng)絡(luò),它使用的RNN的架構(gòu),然后將預(yù)訓(xùn)練好的這些表示(比如說詞嵌入也好,別的東西也好)作為一個額外的特征和輸入一起輸入進(jìn)模型中,希望這些特征已經(jīng)有了比較好的表示,所以導(dǎo)致模型訓(xùn)練起來相對來說比較容易,這也是NLP中使用預(yù)訓(xùn)練模型最常用的做法(把學(xué)到的特征和輸入一起放進(jìn)去作為一個很好的特征表達(dá))
  • 另一個策略是基于微調(diào)的,這里舉的是GPT的例子,就是把預(yù)訓(xùn)練好的模型放在下游任務(wù)的時候不需要改變太多,只需要改動一點就可以了。這個模型預(yù)訓(xùn)練好的參數(shù)會在下游的數(shù)據(jù)上再進(jìn)行微調(diào)(所有的權(quán)重再根據(jù)新的數(shù)據(jù)集進(jìn)行微調(diào))


介紹別人的方法的目的通常來講是為了鋪墊自己的方法,別人哪些地方做的不好,自己的方法有所改進(jìn)


上述兩個途徑在預(yù)訓(xùn)練的時候都是使用一個相同的目標(biāo)函數(shù),都是使用一個單向的語言模型(給定一些詞去預(yù)測下一個詞是什么東西,說一句話然后預(yù)測這句話下面的詞是什么東西,屬于一個預(yù)測模型,用來預(yù)測未來,所以是單向的)


第三段講述了本文的主要想法:現(xiàn)在這些技術(shù)會有局限性,特別是做預(yù)訓(xùn)練的表征的時候,主要的問題是標(biāo)準(zhǔn)的語言模型是單向的,這樣就導(dǎo)致在選架構(gòu)的時候會有局限性

  • 在GPT中使用的是一個從左到右的架構(gòu)(在看句子的時候只能從左看到右),這樣的壞處在于如果要做句子層面的分析的話,比如說要判斷一個句子層面的情緒是不是對的話,從左看到右和從右看到左都是合法的,另外,就算是詞元層面上的一些任務(wù),比如QA的時候也是看完整個句子再去選答案,而不是一個一個往下走

因此如果將兩個方向的信息都放進(jìn)去的話,應(yīng)該是能夠提升這些任務(wù)的性能的


在指出了相關(guān)工作的局限性和提出了自己的想法之后,接下來就開始講作者是如何解決這個問題的:提出了BERT,BERT是用來減輕之前提到的語言模型是一個單向的限制,使用的是一個帶掩碼的語言模型(masked language model),這個語言模型是受Cloze任務(wù)的啟發(fā)(引用了一篇1953年的論文)

  • 這個帶掩碼的語言模型每一次隨機(jī)地選一些資源,然后將它們蓋住,目標(biāo)函數(shù)就是預(yù)測被蓋住的字,等價于將一個句子挖一些空完后進(jìn)行完形填空
  • 跟標(biāo)準(zhǔn)的語言模型從左看到右的不同之處在于:帶掩碼的語言模型是允許看到左右的信息的(相當(dāng)于看完形填空的時候不能只看完形填空的左邊,也需要看完形填空的右邊),這樣的話它允許訓(xùn)練深的雙向的transformer模型
  • 在帶掩碼的語言模型之外還訓(xùn)練了一個任務(wù),預(yù)測下一個句子,核心思想是給定兩個句子,然后判斷這兩個句子在原文里面是相鄰的,還是隨機(jī)采樣得來的,這樣就讓模型學(xué)習(xí)了句子層面的信息


這篇文章的貢獻(xiàn)

  1. 展示了雙向信息的重要性,GPT只用了單向,之前有的工作只是很簡單地把一個從左看到右的語言模型和一個從右看到左的語言模型簡單地合并到一起,類似于雙向的RNN模型(contact到一起),這個模型在雙向信息的應(yīng)用上更好
  2. 假設(shè)有一個比較好的預(yù)訓(xùn)練模型就不需要對特定任務(wù)做特定的模型改動。BERT是第一個在一系列的NLP任務(wù)上(包括在句子層面上和詞元層面上的任務(wù))都取得了最好的成績的基于微調(diào)的模型
  3. 代碼和模型全部放在:https://github.com/google-research/bert





4、結(jié)論


最近一些實驗表明,使用無監(jiān)督的預(yù)訓(xùn)練是非常好的,這樣使得資源不多(訓(xùn)練樣本比較少的任務(wù)也能夠享受深度神經(jīng)網(wǎng)絡(luò)),本文主要的工作就是把前人的工作擴(kuò)展到深的雙向的架構(gòu)上,使得同樣的預(yù)訓(xùn)練模型能夠處理大量的不同的自然語言任務(wù)


簡單概括一下:本文之前的兩個工作一個叫ELMo,它使用了雙向的信息但是它網(wǎng)絡(luò)架構(gòu)比較老,用的是RNN,另外一個工作是GPT,它用的是transformer的架構(gòu),但是它只能處理單向的信息,因此本文將ELMo雙向的想法和GPT的transformer架構(gòu)結(jié)合起來就成為了BERT

  • 具體的改動是在做語言模型的時候不是預(yù)測未來,而是變成完形填空


很多時候我們的工作就是把兩個東西縫合到一起,或者把一個技術(shù)用來解決另外領(lǐng)域的問題,如果所得到的東西確實簡單好用,別人也愿意使用,就樸實地將它寫出來也沒有問題





5、相關(guān)工作


非監(jiān)督的基于特征的一些工作

  • 詞監(jiān)督
  • ELMo


非監(jiān)督的基于微調(diào)的一些工作

  • 代表作是GPT


在有標(biāo)號的數(shù)據(jù)上做遷移學(xué)習(xí)

  • 在NLP中有標(biāo)號而且比較大的數(shù)據(jù)(包括自然語言的推理和機(jī)器翻譯這兩塊中都有比較大的數(shù)據(jù)集)
  • 然后在這些有標(biāo)號的數(shù)據(jù)集上訓(xùn)練好了模型然后在別的任務(wù)上使用

在計算機(jī)視覺中這一塊使用比較多:經(jīng)常在ImageNet上訓(xùn)練好模型再去別的地方使用,但是在NLP這一塊不是特別理想(可能一方面是因為這兩個任務(wù)跟別的任務(wù)差別還是挺大的,另一方面可能是因為數(shù)據(jù)量還是遠(yuǎn)遠(yuǎn)不夠的),BERT和他后面的一系列工作證明了在NLP上面使用沒有標(biāo)號的大量數(shù)據(jù)集訓(xùn)練成的模型效果比在有標(biāo)號的相對來說小一點的數(shù)據(jù)集上訓(xùn)練的模型效果更好,同樣的想法現(xiàn)在也在慢慢地被計算機(jī)視覺采用,就是說在大量的沒有標(biāo)號的圖片上訓(xùn)練出的模型也可能比在ImageNet這個100萬數(shù)據(jù)集上訓(xùn)練的模型可能效果更好





6、BERT模型


主要介紹了實現(xiàn)的一些細(xì)節(jié)


BERT中有兩個步驟:

  • 預(yù)訓(xùn)練:在預(yù)訓(xùn)練中,這個模型是在一個沒有標(biāo)號的數(shù)據(jù)集上訓(xùn)練的
  • 微調(diào):在微調(diào)的時候同樣是用一個BERT模型,但是它的權(quán)重被初始化成在預(yù)訓(xùn)練中得到的權(quán)重,所有的權(quán)重在微調(diào)的時候都會參與訓(xùn)練,用的是有標(biāo)號的數(shù)據(jù)


每一個下游的任務(wù)都會創(chuàng)建一個新的BERT模型,雖然它們都是用最早預(yù)訓(xùn)練好的BERT模型作為初始化,但是每個下游任務(wù)都會根據(jù)自己的數(shù)據(jù)訓(xùn)練好自己的模型


雖然預(yù)訓(xùn)練和微調(diào)不是BERT獨創(chuàng)的,在計算機(jī)視覺中用的比較多,但是作者還是做了一個簡單的介紹(在寫論文的時候遇到一些技術(shù)需要使用的時候,而且可能應(yīng)該所有人都知道,最好不要一筆帶過,論文是需要自洽的,后面的人讀過來可能不太了解這些技術(shù),但是這些技術(shù)又是論文中方法不可缺少的一部分的話,最好還是能夠做一個簡單的說明)



下圖中左圖表示預(yù)訓(xùn)練,右圖表示微調(diào)

  • 預(yù)訓(xùn)練的時候輸入是一些沒有標(biāo)號的句子對
  • 這里是在一個沒有標(biāo)號的數(shù)據(jù)上訓(xùn)練出一個BERT模型,把他的權(quán)重訓(xùn)練好,對下游的任務(wù)來說,對每個任務(wù)創(chuàng)建一個同樣的BERT模型,但是它的權(quán)重的初始化值來自于前面預(yù)訓(xùn)練訓(xùn)練好的權(quán)重,對于每一個任務(wù)都會有自己的有標(biāo)號的數(shù)據(jù),然后對BERT繼續(xù)進(jìn)行訓(xùn)練,這樣就得到了對于某一任務(wù)的BERT版本



模型架構(gòu)

BERT模型就是一個多層的雙向transformer編碼器,而且它是直接基于原始的論文和它原始的代碼,沒有做改動

三個參數(shù)

  • L:transformer塊的個數(shù)
  • H:隱藏層的大小
  • A:自注意力機(jī)制中多頭的頭的個數(shù)

兩個模型

  • BERT base:它的選取是使得跟GPT模型的參數(shù)差不多,來做一個比較公平的比較
  • BERT large:用來刷榜
  • BERT中的模型復(fù)雜度和層數(shù)是一個線性關(guān)系,和寬度是一個平方的關(guān)系


怎樣把超參數(shù)換算成可學(xué)習(xí)參數(shù)的大小

模型中可學(xué)習(xí)參數(shù)主要來自兩塊

  • 嵌入層:就是一個矩陣,輸入是字典的大?。僭O(shè)是30k),輸出等于隱藏單元的個數(shù)(假設(shè)是H)
  • transformer塊:transformer中有兩部分:一個是自注意力機(jī)制(它本身是沒有可學(xué)習(xí)參數(shù)的,但是對多頭注意力的話,他會把所有進(jìn)入的K、V、Q分別做一次投影,每一次投影的維度是等于64的,因為有多個頭,頭的個數(shù)A乘以64得到H,所以進(jìn)入的話有key、value、q,他們都有自己的投影矩陣,這些投影矩陣在每個頭之間合并起來其實就是H*H的矩陣了,同樣道理拿到輸出之后也會做一次投影,他也是一個H*H的矩陣,所以對于一個transformer塊,他的自注意力可學(xué)習(xí)的參數(shù)是H的平方乘以4),一個是后面的MLP(MLP里面需要兩個全連接層,第一個層的輸入是H,但是它的輸出是4*H,另外一個全連接層的輸入是4*H,輸出是H,所以每一個矩陣的大小是H*4H,兩個矩陣就是H的平方乘以8),這兩部分加起來就是一個transformer塊中的參數(shù),還要乘以L(transformer塊的個數(shù))

所以總參數(shù)的個數(shù)就是30k乘以H(這部分就是嵌入層總共可以學(xué)習(xí)的參數(shù)個數(shù))再加上L層乘以H的平方再乘以12



輸入和輸出

對于下游任務(wù)的話,有些任務(wù)是處理一個句子,有些任務(wù)是處理兩個句子,所以為了使BERT模型能夠處理所有的任務(wù),它的輸入既可以是一個句子,也可以是一個句子對

  • 這里的一個句子是指一段連續(xù)的文字,不一定是真正的語義上的一段句子
  • 輸入叫做一個序列,可以是一個句子,也可以是兩個句子
  • 這和之前文章里的transformer是不一樣的:transformer在訓(xùn)練的時候,他的輸入是一個序列對,因為它的編碼器和解碼器分別會輸入一個序列,但是BERT只有一個編碼器,所以為了使它能夠處理兩個句子,就需要把兩個句子變成一個序列



序列的構(gòu)成

這里使用的切詞的方法是WordPiece,核心思想是:

  • 假設(shè)按照空格切詞的話,一個詞作為一個token,因為數(shù)據(jù)量相對比較大,所以會導(dǎo)致詞典大小特別大,可能是百萬級別的,那么根據(jù)之前算模型參數(shù)的方法,如果是百萬級別的話,就導(dǎo)致整個可學(xué)習(xí)參數(shù)都在嵌入層上面
  • WordPiece是說假設(shè)一個詞在整個里面出現(xiàn)的概率不大的話,那么應(yīng)該把它切開看它的一個子序列,它的某一個子序列很有可能是一個詞根,這個詞很有可能出現(xiàn)的概率比較大話,那么就只保留這個子序列就行了。這樣的話,可以把一個相對來說比較長的詞切成很多一段一段的片段,而且這些片段是經(jīng)常出現(xiàn)的,這樣的話就可以用一個相對來說比較小的詞典就能夠表示一個比較大的文本了

切好詞之后如何將兩個句子放在一起

  • 序列的第一個詞永遠(yuǎn)是一個特殊的記號[CLS],CLS表示classification,這個詞的作用是BERT希望最后的輸出代表的是整個序列的信息(比如說整個句子層面的信息),因為BERT使用的是transformer的編碼器,所以它的自注意力層中每一個詞都會去看輸出入中所有詞的關(guān)系,就算是詞放在第一的位置,它也是有辦法能夠看到之后的所有詞

把兩個句子合在一起,但是因為要做句子層面的分類,所以需要區(qū)分開來這兩個句子,這里有兩個辦法:

  1. 在每一個句子后面放一個特殊的詞:[SEP]表示separate
  2. 學(xué)一個嵌入層來表示這個句子到底是第一個句子還是第二個句子

下圖中紅線畫出來的粉色方框表示輸入的序列,[CLS]是第一個特殊的記號表示分類,中間用一個特殊的記號[SEP]分隔開,每一個token進(jìn)入BERT得到這個token的embedding表示(對BERT來講,就是輸入一個序列,然后得到另外一個序列),最后transformer塊的輸出就表示這個詞元的BERT表示,最后再添加額外的輸出層來得到想要的結(jié)果



對于每一個詞元進(jìn)入BERT的向量表示,它是這個詞元本身的embedding加上它在哪一個句子的embedding再加上位置的embedding,如下圖所示

  • 上圖演示的是BERT的嵌入層的做法,即由一個詞元的序列得到一個向量的序列,這個向量的序列會進(jìn)入transformer塊
  • 上圖中每一個方塊是一個詞元
  • token embedding:這是一個正常的embedding層,對每一個詞元輸出它對應(yīng)的向量
  • segment embedding:表示是第一句話還是第二句話
  • position embedding:輸入的大小是這個序列的最大長度,它的輸入就是每個詞元這個序列中的位置信息(從零開始),由此得到對應(yīng)的位置的向量
  • 最終就是每個詞元本身的嵌入加上在第幾個句子的嵌入再加上在句子中間的位置嵌入
  • 在transformer中,位置信息是手動構(gòu)造出來的一個矩陣,但是在BERT中不管是屬于哪個句子,還是具體的位置,它對應(yīng)的向量表示都是通過學(xué)習(xí)得來的



預(yù)訓(xùn)練和微調(diào)的不同之處

在預(yù)訓(xùn)練的時候,主要有兩個東西比較關(guān)鍵

  • 目標(biāo)函數(shù)
  • 用來做預(yù)訓(xùn)練的數(shù)據(jù)


帶掩碼的語言模型

對于輸入的詞元序列,如果詞元序列是由WordPiece生成的話,那么它有15%的概率會隨機(jī)替換成掩碼,但是對于特殊的詞元(第一個詞元和中間的分割詞元不做替換),如果輸入序列長度是1000的話,那么就要預(yù)測150個詞

這里也會存在問題:因為在做掩碼的時候會把詞元替換成一個特殊的token([MASK]),在訓(xùn)練的時候大概會看到15%的詞元,但是在微調(diào)的時候是沒有的,因為在微調(diào)的時候不用這個目標(biāo)函數(shù),所以沒有mask這個東西,導(dǎo)致在預(yù)訓(xùn)練和微調(diào)的時候所看到的數(shù)據(jù)會有多不同

  • 解決方法:對這15%的被選中作為掩碼的詞有80%的概率是真的將它替換成這個特殊的掩碼符號([MASK]),還有10%的概率將它替換成一個隨機(jī)的詞元(其實是加入了一些噪音),最后有10%的概率什么都不干,就把它存在那里用來做預(yù)測(附錄中有例子)



預(yù)訓(xùn)練中的第二個任務(wù)就是預(yù)測下一個句子

在QA和自然語言推理中都是句子對,如果讓它學(xué)習(xí)一些句子層面的信息也不錯,具體來說,一個輸入序列里面有兩個句子:a和b,有50的概率b在原文中間真的是在a的后面,還有50%的概率b就是隨機(jī)從別的地方選取出來的句子,這就意味著有50%的樣本是正例(兩個句子是相鄰的關(guān)系),50%的樣本是負(fù)例(兩個句子沒有太大的關(guān)系),加入這個目標(biāo)函數(shù)能夠極大地提升在QA和自然語言推理的效果(附錄中有例子)

  • 上圖中高亮部分的##:在原文中 flightless 是一個詞,但是由于這個詞出現(xiàn)的概率不高,所以在WordPiece中把它砍成了兩個詞 flight 和 less ,他們都是比較常見的詞,##表示后面的詞在原文中其實是跟在前面那個詞后面的意思



預(yù)訓(xùn)練數(shù)據(jù)

使用了兩個數(shù)據(jù)集

  • BooksCorpus
  • English Wikipedia

應(yīng)該使用文本層面的數(shù)據(jù)集,即數(shù)據(jù)集里面是一篇一篇的文章而不是一些隨機(jī)打亂的句子,因為transformer確實能夠處理比較長的序列,所以對于整個文本序列作為數(shù)據(jù)集效果會更好一些



用BERT做微調(diào)

BERT和一些基于編碼器解碼器的架構(gòu)有什么不同

  • transformer是編碼器解碼器架構(gòu)
  • 因為把整個句子對都放在一起放進(jìn)去了,所以自注意力能夠在兩端之間相互能夠看到,但是在編碼器解碼器這個架構(gòu)中,編碼器一般是看不到解碼器的東西的,所以BERT在這一塊會更好一點,但是實際上也付出了一定的代價(不能像transformer一樣能夠做機(jī)器翻譯)


在做下游任務(wù)的時候會根據(jù)任務(wù)設(shè)計任務(wù)相關(guān)的輸入和輸出,好處是模型其實不需要做大的改動,主要是怎么樣把輸入改成所要的那個句子對

  • 如果真的有兩個句子的話就是句子a和b
  • 如果只有一個句子的話,比如說要做一個句子的分類,b就沒有了

然后根據(jù)下游的任務(wù)要求,要么是拿到第一個詞元對應(yīng)的輸出做分類或者是拿到對應(yīng)的詞元的輸出做所想要的輸出,不管怎么樣都是在最后加一個輸出層,然后用一個softnax得到想要的標(biāo)號


跟預(yù)訓(xùn)練比微調(diào)相對來說比較便宜,所有的結(jié)果都可以使用一個TPU跑一個小時就可以了,使用GPU的話多跑幾個小時也行





7、實驗


介紹了BERT怎么樣用在各個下游任務(wù)上


GLUE

它里面包含了多個數(shù)據(jù)集,是一個句子層面的任務(wù)

BERT就是把第一個特殊詞元[CLS]的最后的向量拿出來,然后學(xué)習(xí)一個輸出層w,放進(jìn)去之后用softmax就能得到標(biāo)號,這就變成了一個很正常的多分類問題了

下圖表示了在這個分類任務(wù)上的結(jié)果

  • average表示在所有數(shù)據(jù)集上的平均值,它表示精度,越高越好
  • 可以發(fā)現(xiàn)就算是BERT就算是在base跟GPT可學(xué)習(xí)參數(shù)差不多的情況下,也還是能夠有比較大的提升


SQuAD v1.1

斯坦福的一個QA數(shù)據(jù)集

QA任務(wù)是說給定一段話,然后問一個問題,需要在這段話中找出問題的答案(類似于閱讀理解),答案在給定的那段話中,只需要把答案對應(yīng)的小的片段找出來就可以了(找到這個片段的開始和結(jié)尾)

  • 就是對每個詞元進(jìn)行判斷,看是不是答案的開頭或者答案的結(jié)尾

具體來說就是學(xué)兩個向量S和E,分別對應(yīng)這個詞元是答案開始的概率和答案最后的概率,它對每個詞元(也就是第二句話中每個詞元)的S和Ti相乘,然后再做softmax,就會得到這個段中每一個詞元是答案開始的概率,公式如下圖所示,同理也可以得出是答案末尾的概率

  • Ti表示第 i 個輸入詞元對應(yīng)的最后一個隱藏向量


在做微調(diào)的時候的參數(shù)設(shè)置

  • 使用了3個epoch,掃描了3遍數(shù)據(jù)
  • 學(xué)習(xí)率是5e-5
  • batchsize是32

用BERT做微調(diào)的時候結(jié)果非常不穩(wěn)定,同樣的參數(shù)、同樣的數(shù)據(jù)集,訓(xùn)練十遍,可能會得到不同的結(jié)果。最后發(fā)現(xiàn)3其實是不夠的,可能多學(xué)習(xí)幾遍會好一點


BERT用的優(yōu)化器是adam的不完全版,當(dāng)BERT要訓(xùn)練很長時間的時候是沒有影響的,但是如果BERT只訓(xùn)練一小段時間的話,它可能會帶來影響(將這個優(yōu)化器換成adam的正常版就可以解決這個問題了)


SQuAD v2.0


SWAG數(shù)據(jù)集

它用來判斷兩個句子之間的關(guān)系

跟之前的訓(xùn)練沒有太多區(qū)別,BERT的結(jié)果比別的模型要好很多



對這些不同的數(shù)據(jù)集,BERT基本上只要把這些數(shù)據(jù)集表示成所要的句子對的形式,最后拿到一個對應(yīng)的輸出然后再加一個輸出層就可以了,所以BERT對整個NLP領(lǐng)域的貢獻(xiàn)還是非常大的,大量的任務(wù)可以用一個相對來說比較簡單的架構(gòu),不需要改太多的東西就能夠完成了



ablation study


介紹了BERT中每一塊最后對結(jié)果的貢獻(xiàn)

  • No NSP:假設(shè)去掉對下一個句子的預(yù)測
  • LTR & No NSP:使用一個從左看到右的單向的語言模型(而不是用帶掩碼的語言模型),然后去掉對下一個句子的預(yù)測
  • + BiLSTM:在上面加一個雙向的LSTM

從結(jié)果來看,去掉任何一部分,結(jié)果都會打折扣



模型大小的影響


BERT base中有1億的可學(xué)習(xí)參數(shù)

BERT large中有3億可學(xué)習(xí)的參數(shù)

相對于之前的transformer,可學(xué)習(xí)參數(shù)數(shù)量的提升還是比較大的

當(dāng)模型變得越來越大的時候,效果會越來越好,這是第一個展示將模型變得特別大的時候?qū)φZ言模型有較大提升的工作

雖然現(xiàn)在GPT3已經(jīng)做到1000億甚至在向萬億級別發(fā)展,但是在三年前,BERT確實是開創(chuàng)性地將一個模型推到如此之大,引發(fā)了之后的模型大戰(zhàn)



假設(shè)不用BERT做微調(diào)而是把BERT的特征作為一個靜態(tài)特征輸進(jìn)去會怎樣

結(jié)論是效果確實沒有微調(diào)好,所有用BERT的話應(yīng)該用微調(diào)





8、評論


寫作

  • 先寫了BERT和GPT的區(qū)別
  • 然后介紹了BERT模型
  • 接下來是在各個實驗上的設(shè)置
  • 最后對比結(jié)果,結(jié)果非常好

這篇文章認(rèn)為本文的最大貢獻(xiàn)就是雙向性(寫文章最好能有一個明確的賣點,有得有失,都應(yīng)該寫出來

  • 但是今天來看,這篇文章的貢獻(xiàn)不僅僅只有雙向性,還有其它東西
  • 從寫作上來說,至少要說選擇雙向性所帶來的不好的地方是什么,做一個選擇,會得到一些東西,也會失去一些東西:和GPT比,BERT用的是編碼器,GPT用的是解碼器,得到了一些好處,但是也有壞處(比如做機(jī)器翻譯和文本摘要比較困難,做生成類的東西就沒那么方便了)
  • 分類問題在NLP中更加常見,所以NLP的研究者更喜歡用BERT,會更容易一些


BERT所提供的是一個完整的解決問題的思路,符合了大家對于深度學(xué)習(xí)模型的期望:在一個很大的數(shù)據(jù)集上訓(xùn)練好一個很深很寬的模型,這個模型拿出來之后可以用在很多小問題上,通過微調(diào)可以全面提升這些小數(shù)據(jù)上的性能





----end----

BERT 論文逐段精讀【論文精讀】的評論 (共 條)

分享到微博請遵守國家法律
泉州市| 静海县| 股票| 保定市| 自治县| 奉贤区| 保定市| 土默特左旗| 盐源县| 华池县| 藁城市| 石柱| 濉溪县| 高碑店市| 禄劝| 临猗县| 玉龙| 廉江市| 长岛县| 郑州市| 开平市| 久治县| 乌拉特后旗| 克山县| 嘉定区| 浙江省| 民和| 迭部县| 牡丹江市| 宁远县| 七台河市| 长垣县| 洪江市| 工布江达县| 辽宁省| 伊宁市| 澄迈县| 上犹县| 琼结县| 乃东县| 隆化县|