小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

解密 BERT

 520jefferson 2019-10-25



來源:AI開發(fā)者

BERT簡介

毫不夸張的講,谷歌AI實驗室的BERT深刻影響了NLP的格局。

  

想象一下這樣一個在大量未標(biāo)注數(shù)據(jù)集中訓(xùn)練的模型,你僅僅只需要做一點的微調(diào),就可以在11個不同的NLP任務(wù)上取得 SOTA結(jié)果。沒錯,BERT就是這樣,它徹底改變了我們設(shè)計NLP模型的方式。

BERT之后,許多NLP架構(gòu)、訓(xùn)練方法與語言模型如雨后春筍般涌現(xiàn),比如谷歌的TransformerXL、OpenAI’s GPT-2、 XLNet、ERNIE2.0、 RoBERTa等。

注:在這篇文章中,我會提及許多Transformer的內(nèi)容,如果你對Transformer不了解的話,可以先看看這篇文章——How do Transformers Work in NLP? A Guide to the Latest State-of-the-Art Models.

什么是BERT?

你一定聽說過BERT,也知道了它是多么不可思議以致改變了NLP的領(lǐng)域格局,但BERT究竟是什么?

以下是BERT團隊對該框架的描述:

BERT全稱Bidirectional Encoder Representations from Transformers(Transformers的雙向編碼表示),對未標(biāo)注的文本,通過上下文約束預(yù)訓(xùn)練深層雙向表示。訓(xùn)練完成后,只需要對BERT預(yù)訓(xùn)練模型進行fine-tune,再加上針對特定任務(wù)的輸出層就可以取得SOTA結(jié)果。

對新人來說這樣的解釋不夠明白,但這確實很好的總結(jié)了BERT的機制。接下來,我們一點點的進行剖析。

首先可以明確的是,BERT全稱Bidirectional Encoder Representations from Transformers,名字中的每一個單詞都有其意義,我們會在后面的段落一一介紹。從BERT的名字中,我們能得到最重要信息就是:BERT是基于Transformer架構(gòu)的。

其次,BERT是在大量的未標(biāo)注文本上預(yù)訓(xùn)練得到,包括整個Wikipedia(有25億單詞)和圖書語料庫(8億單詞)。

預(yù)訓(xùn)練這一步對BERT來講是至關(guān)重要的。正是由于如此龐大的語料庫的支撐,模型在訓(xùn)練過程中才能對語言的工作原理進行更深入、更準(zhǔn)確的提取,通過此過程提取到的知識對所有NLP任務(wù)來說都是‘萬滑油’。

然后,BERT是“深度雙向”模型,雙向就意味著BERT在訓(xùn)練過程中關(guān)注當(dāng)前位置的上下文信息。

上下文信息對準(zhǔn)確理解語義很重要的。看下面這個例子,兩句話中都包含了同一個單詞“bank”:


BETR捕獲上下文信息

如果我們想僅依靠上文或者下文的信息去理解“bank”的含義,那么對這兩句話中的“bank”,我們是無法區(qū)分它們的不同含義的。

解決方法就是在預(yù)測之前同時考慮上下文信息,BERT就是這樣做的。

最后,BERT最吸引人的在于,我們僅僅通過在模型后根據(jù)自己的需求加上輸出層部分就可以在各類NLP任務(wù)取得SOTA結(jié)果。

從Word2Vec到BERT:NLP對語言表示的探索

“自然語言處理領(lǐng)域最大的挑戰(zhàn)之一就是訓(xùn)練數(shù)據(jù)的短缺。NLP是一個多元領(lǐng)域,任務(wù)繁多,大多數(shù)特定領(lǐng)域的數(shù)據(jù)集僅僅包含幾千或幾十萬人工標(biāo)注的數(shù)據(jù)。”——谷歌AI

Word2Vec和GloVe

預(yù)訓(xùn)練模型從大量未標(biāo)注文本數(shù)據(jù)中學(xué)習(xí)語言表示的思想來源于詞嵌入,如Word2Vec and GloVe

詞嵌入改變了進行NLP任務(wù)的方式。通過嵌入,我們能夠捕獲單詞的上下文關(guān)系。


圖中所示的這些嵌入方法被廣泛用于下游NLP任務(wù)的訓(xùn)練模型,以便獲取較好的預(yù)測結(jié)果。

之前的嵌入方法的一大缺陷在于只使用了很淺的語言模型,那就意味著它們捕獲到的信息是有限的。

另外一個缺陷就是這些嵌入模型沒有考慮單詞的上下文。就像之前提到的“bank”例子,在不同的語境下同一個單詞可能會有不同的含義。

然而,WordVec之類的模型將不同語境中的“bank”以同樣的向量表示。

于是,一些重要的信息被遺漏了。

ELMo與ULMFiT


ELMo是對語言多義性問題提出的解決方案——針對那些在不同上下文中具有不同含義的單詞。

從訓(xùn)練淺層前饋網(wǎng)絡(luò)(Word2vec)開始,我們逐步過渡到使用復(fù)雜的雙向LSTM結(jié)構(gòu)來訓(xùn)練詞嵌入。

這意味著同一單詞根據(jù)其所在的上下文可以具有多個ELMO嵌入。

從那時起,我們開始注意到預(yù)訓(xùn)練的優(yōu)勢將使其在NLP任務(wù)中發(fā)揮重要作用。


ULMFiT更進一步,在文檔分類任務(wù)中,即使只有很少的數(shù)據(jù)(少于100),對該框架訓(xùn)練的語言模型進行微調(diào)就能夠提供出色的結(jié)果。這意味著ULMFiT解決了NLP任務(wù)中的遷移學(xué)習(xí)問題。

這是我們提出的NLP遷移學(xué)習(xí)黃金公式:

NLP遷移學(xué)習(xí) = 預(yù)訓(xùn)練 + 微調(diào)

 在ULMFIT之后,許多NLP任務(wù)根據(jù)上述公式進行訓(xùn)練,并獲得了新的基準(zhǔn)。

OpenAI的GPT

OpenAI’s GPT進一步擴展了ULMFiT和ELMo中引入的pre-training和fine-tuning方法。

GPT的關(guān)鍵是用基于Transformer的結(jié)構(gòu)取代了基于LSTM的語言建模結(jié)構(gòu)。

不僅是文檔分類任務(wù),GPT模型還可以對其他NLP任務(wù)進行

fine-tuned,例如常識推理,語義相似性和閱讀理解。

OpenAI的GPT在多項任務(wù)獲得SOTA結(jié)果,驗證了Transformer架構(gòu)的魯棒性和有效性。  

就這樣,BERT在Transformer的基礎(chǔ)上橫空出世,并給NLP領(lǐng)域帶來巨大變革。

BERT出世

至此,解決NLP任務(wù)離不開這兩步:

1. 在未標(biāo)注的大型文本語料庫上訓(xùn)練語言模型(無監(jiān)督或半監(jiān)督)

2. 針對特定的NLP任務(wù)對大型語言模型進行微調(diào),以充分利用預(yù)訓(xùn)練模型的大量知識(監(jiān)督)

接下來,我們將詳細(xì)了解BERT如何訓(xùn)練模型,并在未來一段時間內(nèi)成為NLP領(lǐng)域的行業(yè)標(biāo)桿。

BERT是如何工作的?干貨講解

深入BERT,理解為什么BERT建立的語言模型如此有效。

1. BERT的結(jié)構(gòu)

BERT架構(gòu)建立在Transformer之上。 我們目前有兩個可用的變體:

  • BERT Base:12層(transformer模塊),12層注意力,1.1億參數(shù)

  • BERT Large:24層(transformer模塊),16層注意力,3.4億參數(shù)


圖源

與OpenAI的GPT模型相比,BERT Base模型大小與其相似,同時BERT Base的所有transformer層都僅包括編碼部分。

如果你對transformer結(jié)構(gòu)了解不是很清楚,建議你先讀一下這篇文章

現(xiàn)在我們已經(jīng)了解了BERT的整體架構(gòu)。在正式構(gòu)建模型之前,需要先進行一些文本處理工作。

2. 文本預(yù)處理

BERT背后的開發(fā)人員添加了一組特定的規(guī)則來表示模型的輸入文本。其中許多都是創(chuàng)造性的設(shè)計選擇可以讓模型表現(xiàn)更好。

首先,每個輸入嵌入都是三個嵌入的組合:

1.位置嵌入:BERT學(xué)習(xí)并使用位置嵌入來表達(dá)單詞在句子中的位置。添加該嵌入是為了克服Transformer的局限性,與RNN不同,Transformer無法捕獲“序列”或“順序”信息

2.段嵌入:BERT也可以將句子作為任務(wù)的輸入(問題-解答)。因此,它為第一句話和第二句話學(xué)習(xí)了獨特的嵌入,以幫助模型區(qū)分它們。在上面的示例中,所有為EA的標(biāo)記都屬于句子A(對于EB一樣)

3.令牌嵌入:這些是從WordPiece令牌詞匯表中為特定令牌學(xué)習(xí)的嵌入

對于給定的令牌,其輸入表示形式是通過將相應(yīng)的令牌,段和位置嵌入相加而構(gòu)造的。

這種全面的嵌入方案包含許多有用的模型信息。

這些預(yù)處理步驟的組合使BERT如此通用。

3. 預(yù)訓(xùn)練任務(wù)

BERT對兩項NLP任務(wù)進行預(yù)訓(xùn)練:

  • 遮掩語言模型

  • 下句預(yù)測

讓我們更詳細(xì)地理解這兩個任務(wù)!

a. 遮掩語言模型(雙向)

BERT是深層的雙向模型,該網(wǎng)絡(luò)從第一層到最后一層始終關(guān)注當(dāng)前單詞的上下文進行信息捕獲。


單詞序列預(yù)測

傳統(tǒng)的語言模型要么是利用從右到左的文本信息進行訓(xùn)練預(yù)測下一個單詞(例如GPT),要么是使用從左到右的文本信息進行訓(xùn)練,這使模型不可避免的丟失一些信息,從而導(dǎo)致錯誤。

ELMo試圖通過訓(xùn)練兩個LSTM語言模型(一個利用從左到右的文本信息,一個利用從右到左的文本信息),并將它們進行連接來解決這個問題。這樣雖然在一定程度上取得進步,但還遠(yuǎn)遠(yuǎn)不夠。


相對于GPT與ELMo,BERT在利用上下文信息這一方面取得重要突破,如上圖所示。

圖中的箭頭表示一層到下一層的信息流,頂部的綠色框表示每個輸入單詞的最終表示。

從以上圖片可以明顯看到:BERT是雙向的,GPT是單向的(從左到右的信息流),ELMo是淺層雙向的。

關(guān)于遮掩語言模型——這是BERT雙向編碼的奧秘。

對這樣一個句子——“I love to read data science blogs on Analytics Vidhya”,我們怎樣用它訓(xùn)練雙向語言模型呢。

我們首先將“Analytics”替換為“[MASK]”, “[MASK]”  表示將該位置的單詞掩蓋。

然后我們需要訓(xùn)練一個模型,使其能夠預(yù)測mask掉的單詞:“I love to read data science blogs on [MASK] Vidhya.”

這就是遮掩語言模型的關(guān)鍵。BERT的作者還介紹了一些遮掩語言模型的注意事項:

  • 為了防止模型過于關(guān)注特定位置或被遮掩的標(biāo)記,研究人員隨機遮掩15%的單詞

  • 被遮掩的單詞并不總是[MASK]取代,在針對特定任務(wù)的微調(diào)階段是不需要[MASK]標(biāo)記的

  • 為此,研究人員的一般做法是:(對 15%需要[MASK] 單詞 )

  • (15%的)80%的單詞被[MASK]遮掩

  • 其余10%的單詞被其他隨機單詞取代

  • 其余10%的單詞保持不變

在我之前的一篇文章中,我詳細(xì)介紹了如何在Python中實現(xiàn)遮掩語言模型:Introduction to PyTorch-Transformers: An Incredible Library for State-of-the-Art NLP (with Python code)

b. 下句預(yù)測

遮掩語言模型(MLMs)學(xué)習(xí)單詞之間的關(guān)系。

此外,BERT還對下句預(yù)測任務(wù)進行訓(xùn)練以學(xué)習(xí)句子之間的關(guān)系。

這類任務(wù)的典型例子就是問答系統(tǒng)。

任務(wù)很簡單,給A和B兩個句子,判斷B是A之后的下一句,或只是一個隨機句子?

由于這是一個二分類問題,將語料庫中的句子分解為句子對就可以得到大量訓(xùn)練數(shù)據(jù)。與MLMs類似,作者也給出在進行下句預(yù)測任務(wù)時的注意事項。具體通過這個例子進行說明:

對于一個包含10萬句子的數(shù)據(jù)集,我們可以得到5萬句子對作訓(xùn)練數(shù)據(jù)。

  • 訓(xùn)練數(shù)據(jù)中的50%,第二句是真實的下句

  • 另外的50%,第二句是語料庫中的隨機句子

  • 前50%的標(biāo)簽是‘IsNext’,后50%的標(biāo)簽是‘NotNext’

在建模過程中結(jié)合遮掩語言模型(MLMs)和下句預(yù)測(NSP)兩個預(yù)訓(xùn)練任務(wù),這就使得BERT成為一個與任務(wù)無關(guān)的模型,經(jīng)過簡單fine-tuning即可適用到其他下游任務(wù)。

在python中使用BERT進行文本分類

你對BERT的可能性一定有各種期待。確實如此,我們在具體的NLP應(yīng)用中可以通過各種方式利用BERT預(yù)訓(xùn)練模型的優(yōu)勢。

最有效的方法之一就是根據(jù)自己的任務(wù)和特定數(shù)據(jù)進行微調(diào), 然后,我們可以將BERT中的嵌入用作文本文檔的嵌入。

接下來,我們將學(xué)習(xí)如何將BERT的嵌入應(yīng)用到自己的任務(wù)上。至于如何對整個BERT模型進行微調(diào),我會在另一篇文章中進行介紹。

為了提取BERT的嵌入,我們將使用一個非常實用的開源項目Bert-as-Service


BERT-As-Service

由于BERT需要大量代碼以及許多安裝包的支持,對普通用戶而言直接運行BERT是不現(xiàn)實的,為此開源項目BERT-As-Service來幫助我們便捷的使用BERT。通過該項目,我們僅僅通過兩行代碼就可以調(diào)用BRRT對句子進行編碼。

安裝BERT-As-Service

BERT-As-Service運行方式十分簡單。它創(chuàng)建了一個BERT服務(wù)器,我們可以在notebook中編寫ython代碼進行訪問。通過該方式,我們只需將句子以列表形式發(fā)送,服務(wù)器就會返回這些句子的BERT嵌入。

我們可以通過pip安裝服務(wù)器和客戶端。它們可以單獨安裝在本地計算機,也可以安裝到不同的計算機上:

$ pip install bert-serving-server # server
$ pip install bert-serving-client # client

另外,由于運行BERT對GPU要求較高,我建議你在云GPU平臺或是其他具有高計算能力的計算機上安裝bert-serving-server。

同時,bert-serving-server對python和Tensorflow的版本要求為:Python >= 3.5 ; TensorFlow >= 1.10。

然后,在終端下載圖示的預(yù)訓(xùn)練模型(選擇你需要的即可),并對下載的zip文件進行解壓。

下圖是已發(fā)布的BERT預(yù)訓(xùn)練模型:


BERT模型

我這里選擇BERT Uncased下載并解壓:

$ wget https://storage.googleapis.com/bert_models/2018_10_18/uncased_L-12_H-768_A-12.zip && unzip uncased_L-12_H-768_A-12.zip

將所有文件解壓之后,就可以啟動BERT服務(wù)了:

$ bert-serving-start -model_dir uncased_L-12_H-768_A-12/ -num_worker=2 -max_seq_len 50

現(xiàn)在,你可以在Python中通過bert-serving-client調(diào)用BERT-As-Service。看代碼吧!

打開一個新的Jupyter Notebook,我們想要獲取“I love data science and analytics vidhya”的BERT嵌入。

from bert_serving.client import BertClient

# 使用IP地址連接BERT服務(wù)器; 如果是本機服務(wù)器的話不需要IP
bc = BertClient(ip='服務(wù)器的IP地址')
# 獲取嵌入
embedding = bc.encode(['I love data science and analytics vidhya.'])
# 對返回的嵌入形狀進行確認(rèn),應(yīng)該是1x768
print(embedding.shape)

IP地址是BERT服務(wù)器或云平臺的IP; 如果是本機服務(wù)器的話不需要填寫IP

由于該句被BERT架構(gòu)中的768個隱藏單元表示,最終返回的嵌入形狀是(1,768)。

問題描述:對Twitter上仇恨言論進行分類

接下來使用真實數(shù)據(jù)集測試BERT的效果。我們將使用Twitter的“仇恨言論”分類數(shù)據(jù)集,該數(shù)據(jù)集中的推文被標(biāo)注為是或者否。

你可以從此鏈接problem statement on the DataHack platform了解或下載該數(shù)據(jù)集。

為簡單起見,如果一條推文帶有種族主義或性別歧視情緒,我們就認(rèn)為該推文包含仇恨言論。 于是,本次任務(wù)就是將種族主義或性別歧視推文與其他推文進行分類。

我們將使用BERT對數(shù)據(jù)集中的每條推文進行嵌入,然后使用這些嵌入訓(xùn)練文本分類模型。


任務(wù)流程

接下來看代碼部分:

import pandas as pdimport numpy as np


   # 導(dǎo)入訓(xùn)練數(shù)據(jù)

train = pd.read_csv('BERT_proj/train_E6oV3lV.csv', encoding='iso-8859-1')train.shape


相信你對推特并不陌生,在很多推文中總有一些隨機符號和數(shù)字(又名聊天語言!)。我們的數(shù)據(jù)集也是這樣,為此,需要對數(shù)據(jù)集進行預(yù)處理,然后再傳入BERT:


現(xiàn)在,我們需要將清理后的數(shù)據(jù)集劃分為訓(xùn)練集與驗證集:

from sklearn.model_selection import train_test_split


# 劃分訓(xùn)練集與驗證集

X_tr, X_val, y_tr, y_val = train_test_split(train.clean_text, train.label, test_size=0.25, random_state=42)
print('X_tr shape:',X_tr.shape)

接下來,對測試集與驗證集的所有推文進行BERT嵌入:

from bert_serving.client import BertClient


# 使用IP連接BERT服務(wù)器

bc = BertClient(ip='YOUR_SERVER_IP')


# 獲得訓(xùn)練集與測試集的嵌入

X_tr_bert = bc.encode(X_tr.tolist())X_val_bert = bc.encode(X_val.tolist())

該構(gòu)建模型了!我們先來訓(xùn)練分類模型:

from sklearn.linear_model import LogisticRegression# LR模型model_bert = LogisticRegression()# 訓(xùn)練model_bert = model_bert.fit(X_tr_bert, y_tr)# 預(yù)測pred_bert = model_bert.predict(X_val_bert)


查看分類準(zhǔn)確率:

from sklearn.metrics import accuracy_score print(accuracy_score(y_val, pred_bert))

可以看到,即使只有很小的數(shù)據(jù)集,我們也很容易達(dá)到95%左右的準(zhǔn)確率。實在是不可思議!

你最好在其他任務(wù)上親自實踐一下BERT嵌入,并將你的結(jié)果分享到下面的評論區(qū)。

下一篇文章,我會在另外一個數(shù)據(jù)集上使用Fine-tune的BERT模型,并比較其性能。

超越BERT:NLP的最新技術(shù)

BERT激起了人們對NLP領(lǐng)域的極大興趣,尤其是Transformer的廣泛應(yīng)用。 這也導(dǎo)致越來越多的實驗室和組織開始研究pre-training, transformers 和 fine-tuning等任務(wù)。

BERT之后,一些新的項目在NLP各項任務(wù)中取得了更好的結(jié)果。 比如RoBERTa,這是Facebook AI對BERT和DistilBERT的改進,而后者其實就是BERT的更輕巧,便捷的版本。

你可以在regarding State-of-the-Art NLP in this article了解更多BERT之后的改進模型。

via: https://www. ,2019/9/25.

(完)


?【升職加薪必備】全套零基礎(chǔ)學(xué)AI資料免費領(lǐng)!



??關(guān)注“Python與人工智能社區(qū)


    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多