【NLP】万字梳理!BERT之后,NLP预训练模型发展史
作者?| 周俊賢
整理?|?NewBeeNLP?
本文講解下BERT推出后,預訓練模型的演變,包括BERT、RoBERTa、ALBERT、ERNIE系列、ELECTRA。下面腦圖是本系列第一篇內容,歡迎關注更多后續!
一、BERT
論文全稱及鏈接:《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》[1]
首先,BERT的全稱叫Bidirectional Encoder Representations from Transformers,從論文題目和BERT英文全稱,可以看到BERT做的是一個上下文的信息編碼。整篇論文的主要比較對象是ELMo和GPT,ELMo和GPT的最大問題在于「不是真正的雙向編碼」,
GPT利用的是Transformer結構的Decoder,所以肯定不是雙向的,
ELMo雖然把LSTM的正向向量和反向向量拼接在一起,但并不是真正的雙向(想想,拼接但是并沒有發生交互),這樣的網絡結構對下游任務非常不利的,舉個例子,做問答任務的時候,從兩個方向編碼上下文是非常重要的。
BERT用到的是transformer的encoder部分,編碼每個token的時候考慮了所有input token的交互,「所以BERT是真正的雙向編碼模型」!
feature-based and fine-tuning兩種范式
feature-based范式,代表作如EMLo,想想在17年之前,Transformer沒出的時候,大家最常解決NLP任務的方法就是「用別人訓練好的詞向量作為embedding」,然后后面接各種全新初始化的RNN/LSTM/CNN等網絡結構,也就是預訓練只提供了feature-based的embedding。
fine-tunning范式,代表作如GPT,用于下游任務時,不僅僅保留了輸入的embedding,Transformer里面的參數(如attention層、全連接層)也同樣可以保留,在fine-tuning的時候只需在原來的Transfomer上加一些簡單的層,就可以應用于具體的下游任務。
BERT當然也是屬于fine-tuning范式。
BERT模型總覽
模型架構
BERT提供了一種解決各種下游任務的統一結構。當我們要對具體的任務做微調時,我們只需要在原來的結構上面增加一些網絡層就OK了,「這樣預訓練的網絡結構和具體下游任務的網絡結構差別很小,有助于把BERT預訓練時學習到的特征盡可能保留下來」。
模型輸入
「WordPiece」
在模型輸入的時候,并非是具體的單詞,而是WordPiece,具體的,我們看谷歌發布的原生BERT的vocab詞表,有一些英文單詞是帶有##前綴的,例如##bed等等,如embedding這個單詞,通過WordPiece會拆分成em、##bed、##d、##ing,帶有##前綴的單詞表示它是單詞的一部分,而不是完成的單詞(所以在詞表里面bed、##bed,它們的含義是完全不一樣的),具體的可以搜索一下BPE,引入WordPiece作為輸入可以有效緩解OOV問題。
至于中文,個人認為還是單字作為輸入,因為中文很難像英文一樣,再進行拆分下去(當然這幾年也有人研究把字按拼音或偏旁拆,這里就不進行深入討論了)。
「Segment Pairs輸入」
BERT引入了句子對作為輸入,為什么要引入句子對作為輸入,是為了讓BERT能應對更多的下游任務(例如句子相似度任務,問答任務等都是多句輸入)。注意!這里的""句子"是「廣義的,表示的并非是單句,而是一段文章的連續片段,可以包含一個句子或多句句子」,所以輸入的時候,其實是可能不止兩個句子的。
感覺原文就不應該用Sentence pairs來表達,而應該用Segment Pairs。在后面的RoBERTa實驗里驗證,假如用單句拼接作為句子對相對于用連續片段拼接作為句子對,其實是損害性能的。
訓練任務
「任務一:Masked LM(MLM)」
把輸入的句子對進行WordPiece處理后,隨機選15%的token【MASK】掉,然后i對【MASK】掉的token進行預測,但這會引起一個問題:「預訓練和下游任務,輸入不一致,因為下游任務的時候,輸入基本上是不帶【MASK】的,這種不一致會損害BERT的性能」,這也是后面研究的改善方向之一),當然BERT自身也做出了一點緩解,就是并非15%的token都用【MASK】代替,而是15%的80%用【MASK】代替,10%用隨機的詞代替,10%用原來的詞保持不變。
「任務二:Next Sentence Prediction(NSP)」
判斷句子對是否是真正連續的句子對。
預訓練語料
BooksCorpus(800M單詞)和英語維基百科(2500M單詞)
消融實驗
「預訓練任務的影響」
對比去掉NLP任務和把原來的MLM任務改成LTR(Left-to-Right)任務,實驗結果如下表,表明原來的MLM和NSP任務缺一不可。
「模型大小的影響」
模型規模越大,性能越好。
BERT with Feature-based
這個實驗很有意思,「就是把BERT作為feature-based范式,而不是fine-funing范式」。具體的做法是把BERT的某些層的向量拿出來,作為token的embedding(這些embedding在后面的fine-tuning任務中不更新),還不明白的,類比下,用word2vec作為token的特征,然后后面接具體的任務層,只不過這里的word2vec向量用BERT的某些層的輸出作為代替,假如直接用BERT embeddings作為Feature,自然每個token的feature都是固定的(這就有點像用預訓練好的的word2vec向量作為特征),如果取后面的層(每個token的feature不一樣,有點像ELMo),實驗證明,BERT無論是作為feature-based還是fine-tuning方法都是非常有效的。
二、RoBERTa
論文全稱及鏈接:《RoBERTa: A Robustly Optimized BERT Pretraining Approach》[2]
RoBERTa的全稱叫做Robustly optimized BERT approach。RoBERTa之于BERT的改動很簡單,主要是用了更多的數據,訓練上,采用動態【MASK】、去掉下一句預測的NSP任務、更大的batch_size、文本編碼。
更多的數據
在BERT采用的數據BOOKCORPUS + English WIKIPEDIA(共16G)基礎上
增加 CC-NEWS(76GB)
增加 OPENWEBTEXT(38GB)
增加 STORIES(31GB)
也就是RoBERTa一共用了160GB語料進行預訓練。
動態【MASK】
預訓練的每一個step,是重新挑選15%token進行【MASK】的,而BERT是固定的,就是對于同一個輸入樣本,在不同的epoch,輸入是一樣的,實驗結果見下圖,有很微弱的提升吧。
去掉NSP任務
首先看一下結果圖,SEGMENT-PAIR就是BERT采用的方式,雖「然是句子對輸入,但其實一個句子不只有一句,而是文章里面的連續片段,可以包含多句」。而SENTENCE-PARI就是兩個單句拼接在一起。可以看到使用單句拼接會損害性能,還是原生的BERT一樣把連續的片段拼接成句子對的表現比較好。
FULL-SENTENCES和DOC-SENTENCES都是去掉NSP任務的,可以看到去掉NSP任務表現都比原來的要好,FULL-SENTENCES是可以跨文檔來采樣句子。DOC-SENTENCES是保證采樣的句子都在同一個文檔里面,可以看到DOC-SENTENCES表現稍微好一點。所以最后的RoBERTa是采用去掉NSP而且一個樣本是從同一個文檔里面進行采樣。
更大的batch_size
BERT的batch_size是256,一共訓練了1M步,實驗證明,采用更大的batch_size以及訓練更多步,可以提高性能,所以最后的RoBERTa采用的batch_size是8K。
文本編碼
BERT采用的是基于character level的Byte-Pair Encoding(BPE)編碼,詞表大小是30K,RoBERTa采用的是混合character level 和 word level的BPE編碼,詞表大小變成50K,作者相信這個編碼方式更通用。
實驗結果
可以看到采用更多的數據、更大的batch_size、訓練更多輪,都對模型效果有所提升。
三、ALBERT
論文全稱及鏈接:《ALBERT: A Lite BERT for Self-supervised Learning of Language Representations》[3]
ALBERT的全程是A Lite BERT,顧名思義,它是一個精簡版的BERT模型,作者提出ALBERT的動機是,通常情況下,「增加模型規模能提高模型的性能」,但我們不能無限制地增加下去,因為「資源有限」。因此,論文提出一種減少參數的方法(注意哦,減少參數跟增加模型規模是不矛盾的,減少參數的同時我們也可以增加模型規模!具體的往下看)。除了減少參數,作者還提出SOP的訓練任務。
值得注意的是,大家都說ALbert的性能比BERT要好,實質上,ALBERT-large版本的性能是比BERT-large版本的性能差的!大家所說的性能好的ALBERT版本是xlarge和xxlarge版本,而這兩者模型,雖然都比BERT-large參數量少,但由于模型規模變大了,所以訓練時間是變慢的,推斷速度也變慢了!所以ALBERT也不是如名字說的,屬于輕量級模型。
優化策略
減少參數
其實解決資源不足問題也有一些其它的方法,如模型并行和更智能的內存、顯存管理機制。但這些解決方法「都不是從通信端去解決問題」。而減少參數量是有效從通信端解決資源不足的方法。
「矩陣分解」
這是從輸入的embedding維度去減少參數,BERT采用的是WordPiece,大概有3K個token,然后原生BERT采用的embedding size是跟hidden size一樣的,都為768,所以參數量約為3000 * 768 = 2304000。假如我們通過一個矩陣分解去代替本來的embedding矩陣,如上圖所示,E取為128,則參數量變為3000 * 128+128 * 768=482304,參數量變為原來的20%!
思考一個問題:這樣的分解會影響模型的性能嗎?作者給出的角度是,WordPiece embedding是跟上下文獨立的,hidden-layer embedding(即Transformer結構每一個encoder的輸出)是跟上下文有關的,而BERT的強大主要是attention機制,即根據上下文給出token的表示,所以WordPiece embedding size不需要太大,因為WordPiece embedding不是BERT這么強的主要原因。
「參數共享」
思想就是,BERT的Transformer共用了12層的encoder,讓這12層的attention層和全連接層層共享參數,作者還發現這樣做對穩定網絡參數有一定的作用。其實看下表的實驗結果,全共享(attention層和全連接層都共享)是比單純共享attention層的效果要差的,但是全共享d減少的參數實在太多了,所以作者采用的為全共享。
SOP代替NSP
還記得NSP任務嗎?判斷句子對是否是連續的句子對,后面的研究者發現,NSP給BERT帶來不好的影響,主要原因是跟MLM任務相比,任務難度太小了。具體的,把NSP分別topic prediction(主題預測)和coherence prediction(一致性預測),很明顯NSP是比較偏向主題預測的(預測句子對是否是同一文檔的連續片段),而topic prediction相對clherence prediction是比較簡單的。SOP將負樣本換成了同一篇文章中的兩個逆序的句子,從而消除topic prediction,讓模型學習更難得coherence prediction。
n-gram MASK
預測n-gram片段,包含更完整的語義信息。每個片段的長度取值n(論文里取最大為3)。根據公式取1-gram、2-gram、3-gram的概率分別為6/11,3/11,2/11。越長概率越小。
xxlarge版本和BERT-large版本的對比
由于模型的參數變少了,所以,我們可以訓練規模更大的網絡,具體的ALBERT-xxlarge版本也是12層,但是hidden_size為4096!控制BERT-large和ALBERT-xxlarge的訓練時間一樣,可以看到ALBERT-xxlarge版本的訓練速度時間只有BERT-large的1/3左右,慢了不少,這是模型規則變大的副作用。但由于模型規則變大了,所以模型性能也得到了一定的提升,大家常說刷榜的ALBERT,其實是xxlarge版本,普通的large版本性能是比BERT的large版本要差的。
探討增加額外的數據和dropout的影響
實驗表明,增加額外的數據是能提升模型效果的(除了在SQuAD數據集上,因為SQuAD數據集是采樣于Wikipedia的,Wikipedia是BERT原生用于訓練的數據集,現在增加其它數據集,那在Wikepedia數據集上的任務自然變差)。
除此之外,還首次提出,「dropout會帶來負向的效果」,可能是是模型太大、數據太多,模型很難收斂,還沒達到需要抗擬合的時候,作者說這個還有待研究。
在具體NLU任務中的實驗結果
效果就是各種屠榜吧。
四、ERNIE
ERNIE 1.0
論文全稱及鏈接:《ERNIE: Enhanced Representation through Knowledge Integration》[4]
ERNIE1.0采用與BERT一樣的架構,與BERT有所區別的是,在于訓練任務的不同,可看下面這幅圖。
原生BERT是采用隨機【MASK】,ERIENE1.0論文里提到這會讓模型學不到語義信息,降低學習難度,具體的看圖,Harry Potter的Harry被【MASK】掉,這時候讓模型去預測,這種情況下,模型很可能是根據Potter從而預測Harry(畢竟Harry Potter在語料中共同出現頻率的比較高),在這種情況下,模型也許并不是根據Harry Potter和J.K.Rowling的關系來預測出Harry的。
改進1:Knowledge Integration
具體的,把MASK分成三部分
Basic-level Masking:與BERT一樣
Entity-level Masking:把實體作為一個整體MASK,例如J.K.Rowling這個詞作為一個實體,被一起【MASK】
Phrase-Level Masking:把短語作為一個整體MASK,如a series of作為一個短語整體,被一起【MASK】
不過論文好像沒有詳細講這幾種Masking分別的比例?
改進2:Dialogue Language Model(DLM)
增加了對話數據的任務,如下圖所示,數據不是單輪問答的形式(即問題+答案),而是多輪問答的數據,即可以是QQR、QRQ等等。同上面一樣,也是把里面的單token、實體、短語【MASK】掉,然后預測它們,另外在生成數據的時,有一定幾率用另外的句子替代里面的問題和答案,所以模型還要預測是否是真實的問答對。論文提到DLM任務能讓ERNIE學習到對話中的隱含關系,增加模型的語義表達能力。
注意看Segment Embedding被Dialogue Embedding代替了,但其它結構跟MLM模型是一樣的,所以可以和MLM任務聯合訓練。
數據集
用了四個數據集,分別是中文維基百科、百度百科、百度新聞、百度貼吧,其中百度貼的每個帖子可以認為是對話數據,所以百度貼吧的數據用于DLM任務。
實驗結果
在五個數據集上,表現都比Bert好。
ERNIE 2.0
論文全稱及鏈接:《ERNIE 2.0: A Continual Pre-Training Framework for Language Understanding》[5]
ERNIE2.0的結構與 ERNIE1.0 、BERT 的結構一樣,ERNIE2.0 主要是從修改預訓練的學習任務來提升效果。從BERT推出,到現在被廣泛使用也有近三年的時間,這幾年也有不少其它預訓練模型的出現,它們大部分干的一件事就是「提出難度更大、更多樣化的預訓練任務,從而增加模型的學習難度,讓模型有更好的詞語、語法、語義的表征能力」!ERNIE2.0正是如此,構建了三種類型的無監督任務。為了完成多任務的訓練,又提出了連續多任務學習,整體框架見下圖。
改進1:連續多任務學習
假如讓模型同時學3個任務(就是目前比較火的聯合訓練),你會怎么訓練?這里提供三種策略:
策略一,Multi-task Learning,就是讓模型同時學這3個任務,具體的讓這3個任務的損失函數權重雙加,然后一起反向傳播;
策略二,先訓練任務1,再訓練任務2,再訓練任務3,這種策略的缺點是容易遺忘前面任務的訓練結果,如最后訓練出的模型容易對任務3過擬合;
策略三:連續多任務學習,即第一輪的時候,先訓練任務1,但不完全讓他收斂訓練完,第二輪,一起訓練任務1和任務2,同樣不讓模型收斂完,第三輪,一起訓練三個任務,直到模型收斂完。
論文里采用的就是策略三的思想。
具體的,如下圖所示,每個任務有獨立的損失函數,句子級別的任務可以和詞級別的任務一起訓練,相信做過聯合訓練的同學并不陌生!
改進2:更多的無監督預訓練任務
模型的結構如下圖所示,由于是多任務學習,模型輸入的時候額外多了一個Task embedding。
具體的三種類型的無監督訓練任務是哪三種呢?每種里面又包括什么任務呢?
任務一:詞法級別預訓練任務
Knowledge Masking Task:這任務同ERNIE 1.0一樣,把一些字、短語、實體【MASK】掉,預測【MASK】詞語。
Capitalization Prediction Task:預測單詞是大寫還是小寫,大寫出現在實體識別等,小寫可用于其他任務。
Token-Document Relation Prediction Task:在段落A中出現的token,是否在文檔的段落B中出現。
任務二:語言結構級別預訓練任務
Sentence Reordering Task:把文檔中的句子打亂,識別正確順序。
Sentence Distance Task:分類句子間的距離(0:相連的句子,1:同一文檔中不相連的句子,2:兩篇文檔間的句子)。
任務三:語句級別預訓練任務
Discourse Relation Task:計算兩句間的語義和修辭關系。
IR Relevance Task:短文本信息檢索關系,搜索數據(0:搜索并點擊,1:搜素并展現,2:無關)。
請注意,這些任務全是「無監督的預訓練任務」!
各任務用到的數據集
數據集包括百科、書籍、新聞、對話、檢索數據、修辭關系數據。可以看到相對于ERNIE1.0,所用的數據更多樣化了。注意的是,并非每類型數據都用到所有任務,如百科數據,就不用于訓練語句級別的任務。
數據集的大小如下圖所示。
實驗結果
訓練完后,在9個中文數據集上分別進行fine-tunning,結果比BERT和ERNIE1.0要好。
連續多任務學習的效果
下表展示的就是連續多任務學習,看continual Multi-task Learing那一行所示,對于具體的某個任務,不是把它放在一個stage里面就讓模型學習收斂完,而是一個連續學習的過程,避免模型遺忘。可以看到,連續多任務學習相比Continual Learing和Multi-task Learning的效果都要好。
五、ELECTRA
論文全稱及鏈接:《ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators》[6]
ELECTRA是這幾年一個比較創新的模型,從模型架構和預訓練任務都和BERT有一定程度的不同。ELECTRA的全稱是Efficiently Learning an Encoder that Classifies Token Replacements Auucrately,在論文的開始指出了BERT訓練的一個缺點,就是「學習效率太慢」,因為模型從一個樣本中只能學習到15%的token信息,所以作者提出了一種新的架構讓模型能學習到所有輸入token的信息,而不僅僅是被【MASK】掉的tioken,這樣模型學習效率會更好。作者指出,ELECTRA用相同的數據,達到和BERT、RoBERTa、XLNET相同效果所需要的訓練輪數更少,假如使用相同的訓練輪數,將超越上面所說的模型。
「但看哈工大發布的中文ELECTRA模型來看,發現并沒有比BERT等要好,甚至在一些中文任務上表現反而要差了,對于這個模型,相信大家目前還是有很多爭議的。」
新的架構:Generator-Discriminator的架構
ELECTRA的結構很簡單,由一個Generator生成器和一個DIscriminator判別器組成,如下圖所示。首先對一句話里面的token進行隨機的【MASK】,然后訓練一個生成器,對【MASK】掉的token進行預測,通常生成器不需要很大(原因在后面的實驗部分有論證),生成器對【MASK】掉的token預測完后,得到一句新的話,然后輸入判別器,判別器判斷每個token,是否是原樣本的,還是被替換過的。
注意的是,假如生成器預測出的token為原來的token,那這個token在判別器的輸出標簽里還是算原樣本,而不是被替換過的(如下圖的the,生成器預測為the,則the在判別器中的真實標簽就為original,而不是replaced)。自此,整個模型架構的思想就介紹完了,是否很簡單?
權重共享
假如生成器和判別器采用同樣架構的話,則兩個模型可以權重共享,假如不是同樣架構的話,也可以共享embedding層。所以作者分別對以下三種情況做了實驗:
生成器和判別器的參數獨立,完全不共享;
生成器和判別器的embedding參數共享,而且生成器input層和output層的embedding參數共享(想想為什么可以這樣?因為生成器最后是一個全詞表的分類,所以可以跟輸入時embedding矩陣的維度一致,而判別器最后是一個二分類,所以不能共享輸入時的embedding矩陣),其他參數不共享;
生成器和判別器的參數共享。
第一種方案GLUE score為83.6,第二種方案GLUE score為84.3,第三種方案GLUE score為84.4,從結果上,首先肯定的是共享參數能帶來效果的提升,作者給出的理由是,假如不共享參數,判別器只會對【MASK】的token的embedding進行更新,而生成器則會對全詞表進行權重更新(這里有疑惑的可以想想,生成器最后可是做了一個全詞表的分類哦),「所以共享參數肯定是必要的」,至于為什么作者最后采用方案二是不是方案三呢,是因為假如采用方案三的話,限定了生成器和判別器的模型結構要一樣,極大影響了訓練的效率。
更小的生成器
如下圖所示,作者發現最佳的生成器大小為判別器規模的1/4~1/2,作者給出的理由是假如生成器太強大的話,會讓判別器難以學習。
訓練策略
作者提出了三種訓練策略,結果如下圖所示:
生成器和判別器聯合訓練;
二步訓練,先訓練生成器,再訓練判別器;
引入對抗訓練。
這里先不討論對抗訓練,先探討策略一和策略二,作者發現,假如不采用權重共享的話,二步訓練法訓練完的判別器可能什么都學不到,作者提出的理由是判別器的學習晚生成器太多。除此之外,假如是參數共享,且采用二步法,在生成器剛學完,切換到判別器開始學的時候,GLUE score有一個顯著的提升,理由可能是由于參數共享,所以判別器并不是從一個小白開始訓練起。然并卵,實驗發現聯合訓練在GLUE上的指標是最好的,所以最后也是采用聯合訓練方法。
模型效果對比
實驗效果自然是又快又好咯。具體的就是,達到相同的效果,ELECTRA所需要的訓練時間更少。同樣訓練相同的時間,ELECTRA將超越RoBERTa和XLNET等的效果。
學習效率分析
這是我認為該論文最精彩的一章,上面的實驗證明了ELECTRA確實訓練更加的高效,但究竟這是什么帶來的?是的,雖然我們說BERT每次只需要預測15%的token,但無論如何,模型輸入的同樣是所有的input tokens啊。為此,作者進行了以下的實驗(目的是嚴謹地證明判別器對每個token的二分類任務能極大的提高訓練效率)
ELECTRA 15%:判別器不對每一個token計算二分類損失,而是只對在生成器輸入時,被【MASK】掉的15%的token求損失;
Replace MLM:訓練BERT MLM,其中input里的【MASK】使用ELECTRA生成器生成的token進行替換,目的是探討只有預訓練才出現【MASK】對模型的影響(因為大家吐槽BERT最多的就是,預訓練里引入【MASK】,但在幾乎所有的下游任務中輸入都不會有【MASK】,這種預訓練和fine tuning的不一致會影響模型效果);
All-Tokens MLM:同Replace MLM一樣,用生成器生成的token來替換【MASK】,但BERT輸出的時候,對每一個token進行預測,這個模型架構有點像是BERT和ELECTRA的結合。
實驗結果如上表所示,首先比較 ELECTRA 和 ELECTRA 15%可以得出對每一個token進行二分類預測是能帶來更好的效果的。然后,我們對比Replace MLM 和 BERT,可以得出,BERT預訓練時引入【MASK】是給模型帶來一定影響的。最后,我們發現ALL-tokens MLM最接近ELECTRA的效果。「總的來說,ELECTRA效果之那么好,大部分歸功于對所有的token進行學習,其次是由于緩解了預訓練和fine tuning時輸入不一致的問題」。
除此之外,如下圖所示,作者還做實驗發現,模型的規模越小,ELECTRA比BERT的效果就更好。作者認為是模型規模越小,ELECTRA就學習得越充分,越快收斂,因為本質上,ELECTRA判別器的二分類任務就比BERT的預測詞任務要簡單。
本文參考資料
[1]
《BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding》: https://arxiv.org/pdf/1810.04805.pdf
[2]《RoBERTa: A Robustly Optimized BERT Pretraining Approach》: https://arxiv.org/pdf/1907.11692.pdf
[3]《ALBERT: A Lite BERT for Self-supervised Learning of Language Representations》: https://arxiv.org/pdf/1909.11942.pdf
[4]《ERNIE: Enhanced Representation through Knowledge Integration》: https://arxiv.org/pdf/1904.09223.pdf
[5]《ERNIE 2.0: A Continual Pre-Training Framework for Language Understanding》: https://ojs.aaai.org//index.php/AAAI/article/view/6428
[6]《ELECTRA: Pre-training Text Encoders as Discriminators Rather Than Generators》: https://arxiv.org/pdf/2003.10555.pdf
-?END?-
往期精彩回顧適合初學者入門人工智能的路線及資料下載機器學習及深度學習筆記等資料打印機器學習在線手冊深度學習筆記專輯《統計學習方法》的代碼復現專輯 AI基礎下載機器學習的數學基礎專輯溫州大學《機器學習課程》視頻 本站qq群851320808,加入微信群請掃碼:總結
以上是生活随笔為你收集整理的【NLP】万字梳理!BERT之后,NLP预训练模型发展史的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: QQ浏览器如何添加并进入书签地址?QQ浏
- 下一篇: 腾讯视频怎么设置下载视频位置