自然語言處理(原理、方法與應(yīng)用)_第1頁
自然語言處理(原理、方法與應(yīng)用)_第2頁
自然語言處理(原理、方法與應(yīng)用)_第3頁
自然語言處理(原理、方法與應(yīng)用)_第4頁
自然語言處理(原理、方法與應(yīng)用)_第5頁
已閱讀5頁,還剩221頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

自然語言處理(原理、方法與應(yīng)用)目錄\h第1章導論\h1.1基于深度學習的自然語言處理\h1.2本書章節(jié)脈絡(luò)\h1.3自然語言處理算法流程\h1.4小結(jié)\h第2章Python開發(fā)環(huán)境配置\h2.1Linux服務(wù)器\h2.1.1MobaXterm\h2.1.2使用MobaXterm連接遠程服務(wù)器\h2.1.3在服務(wù)器上安裝Python開發(fā)環(huán)境\h2.1.4使用Anaconda國內(nèi)源\h2.1.5pip設(shè)定永久阿里云源\h2.2Python虛擬環(huán)境\h2.3PyCharm遠程連接服務(wù)器\h2.4screen任務(wù)管理\h2.5Docker技術(shù)\h2.6小結(jié)\h第3章自然語言處理的發(fā)展進程\h3.1人工規(guī)則與自然語言處理\h3.2機器學習與自熱語言處理\h3.2.1詞袋模型\h3.2.2\hn\h-gram\h3.2.3頻率與逆文檔頻率\h3.3深度學習與自然語言處理\h3.4小結(jié)\h第4章無監(jiān)督學習的原理與應(yīng)用\h4.1淺層無監(jiān)督預(yù)訓練模型\h4.2深層無監(jiān)督預(yù)訓練模型\h4.2.1BERT\h4.2.2Self-AttentionLayer原理\h4.2.3Self-AttentionLayer的內(nèi)部運算邏輯\h4.2.4Multi-HeadSelf-Attention\h4.2.5LayerNormalization\h4.2.6BERT預(yù)訓練\h4.2.7BERT的微調(diào)過程\h4.3其他預(yù)訓練模型\h4.3.1RoBERTa\h4.3.2ERNIE\h4.3.3BERT_WWM\h4.3.4ALBERT\h4.3.5Electra\h4.3.6NEZHA\h4.3.7NLP預(yù)訓練模型對比\h4.4自然語言處理四大下游任務(wù)\h4.4.1句子對分類任務(wù)\h4.4.2單句子分類任務(wù)\h4.4.3問答任務(wù)\h4.4.4單句子標注任務(wù)\h4.5小結(jié)\h第5章無監(jiān)督學習進階\h5.1生成式對抗網(wǎng)絡(luò)\h5.2元學習\h5.2.1Metric-BasedMethod\h5.2.2Model-BasedMethod\h5.2.3Pretrain-BasedMethod\h5.3小結(jié)\h第6章預(yù)訓練\h6.1賽題任務(wù)\h6.2環(huán)境搭建\h6.3代碼框架\h6.4數(shù)據(jù)分析實踐\h6.4.1數(shù)據(jù)預(yù)處理\h6.4.2預(yù)訓練任務(wù)模型構(gòu)建與數(shù)據(jù)生成\h6.4.3模型訓練\h6.5小結(jié)\h第7章文本分類\h7.1數(shù)據(jù)分析\h7.2環(huán)境搭建\h7.3代碼框架\h7.4文本分類實踐\h7.4.1數(shù)據(jù)預(yù)處理\h7.4.2模型構(gòu)建\h7.4.3數(shù)據(jù)迭代器\h7.4.4模型訓練\h7.4.5模型預(yù)測\h7.5小結(jié)\h第8章機器閱讀理解\h8.1機器閱讀理解的定義\h8.1.1完形填空\h8.1.2多項選擇\h8.1.3片段抽取\h8.1.4自由回答\h8.1.5其他任務(wù)\h8.2評測方法\h8.3研究方法\h8.3.1基于規(guī)則的方法\h8.3.2基于神經(jīng)網(wǎng)絡(luò)的方法\h8.3.3基于深層語義的圖匹配方法\h8.4經(jīng)典結(jié)構(gòu)\h8.4.1BiDAF模型\h8.4.2QANet模型\h8.4.3基于BERT模型的機器閱讀理解\h8.5多文檔機器閱讀理解實踐\h8.5.1疫情政務(wù)問答助手\h8.5.2信息檢索\h8.5.3多任務(wù)學習\h8.5.4實踐\h8.6小結(jié)\h第9章命名實體識別\h9.1NER技術(shù)的發(fā)展現(xiàn)狀\h9.2命名實體識別的定義\h9.3命名實體識別模型\h9.3.1預(yù)訓練模型\h9.3.2下接結(jié)構(gòu)\h9.3.3條件隨機場\h9.4命名實體識別實驗\h9.4.1數(shù)據(jù)介紹\h9.4.2評估指標\h9.4.3數(shù)據(jù)預(yù)處理\h9.4.4模型構(gòu)建\h9.4.5數(shù)據(jù)迭代器\h9.4.6模型訓練\h9.4.7模型預(yù)測\h9.5小結(jié)\h第10章文本生成\h10.1文本生成的發(fā)展現(xiàn)狀\h10.1.1文本生成模板\h10.1.2變分自編碼器\h10.1.3序列到序列技術(shù)\h10.2基于預(yù)訓練模型的文本生成模型\h10.3文本生成任務(wù)實踐\h10.3.1數(shù)據(jù)介紹\h10.3.2評估指標\h10.3.3模型構(gòu)建\h10.3.4數(shù)據(jù)迭代器\h10.3.5模型訓練\h10.3.6模型預(yù)測\h10.4小結(jié)\h第11章?lián)p失函數(shù)與模型瘦身\h11.1損失函數(shù)\h11.2常用的損失函數(shù)\h11.2.1回歸\h11.2.2分類\h11.3損失函數(shù)的進階\h11.3.1樣本不均衡\h11.3.2FocalLoss\h11.3.3DiceLoss\h11.3.4拒識\h11.3.5帶噪學習\h11.4模型瘦身\h11.4.1知識蒸餾\h11.4.2模型剪枝\h11.5小結(jié)第1章導論自然語言處理是文本挖掘的研究領(lǐng)域之一,是人工智能和語言學領(lǐng)域的分支學科,是研究人與計算機交互的學科,是處理及運用自然語言的新興技術(shù)。隨著現(xiàn)代化技術(shù)的不斷發(fā)展,當前自然語言處理已經(jīng)逐漸邁向了人機交互的問題探索:如何保證人與計算機更高效地通信。自然語言處理主要分為4個階段:縝密的數(shù)學形式化模型表征人類的自然語言;數(shù)學化模型轉(zhuǎn)換成能在計算機上表示的算法模型;根據(jù)所定義的計算機算法模型,編寫計算機語言程序,使模型得以應(yīng)用化實現(xiàn);對所得到的自然語言處理模型優(yōu)化改進,應(yīng)用于更多領(lǐng)域,然而,人機交互的情況非常復(fù)雜。究其原因,除了計算機性能因素外,更重要的原因在于自然語言的復(fù)雜性。人類自然語言除了字、詞、句、篇等結(jié)構(gòu)劃分外,還涉及音、形、義。同一語句,可能因為語調(diào)不同而意義完全不同。美國學者Daniel將復(fù)雜的語言行為總結(jié)為6方面的知識:語音學與音系學、形態(tài)學、句法學、語義學、語用學和話語學。這6方面的復(fù)雜性為計算機處理自然語言帶來了極大的障礙。1.1基于深度學習的自然語言處理目前,深度學習是人工智能領(lǐng)域中的熱門研究方向。深度學習的迅速發(fā)展受到了學術(shù)界和工業(yè)界的廣泛關(guān)注。由于深度學習優(yōu)秀的特征選擇和提取能力,其在自然語言處理、計算機視覺、語音識別等領(lǐng)域得到廣泛應(yīng)用,因此自然語言處理是人工智能皇冠上的一顆明珠。人們在自然語言處理領(lǐng)域長期以來的追求便是如何保證自然語言與計算機之間的有效通信,然而自然語言是高度抽象的符號化系統(tǒng),文本間存在數(shù)據(jù)離散、稀疏及一詞多義等問題,因此,當前自然語言處理的研究熱點和難點是如何使用深度學習技術(shù)推動自然語言處理中各個任務(wù)的發(fā)展。Hinton在2006年提出深度學習的概念:深度學習是一種從海量數(shù)據(jù)中自動提取多層特征表示的技術(shù)。通過數(shù)據(jù)驅(qū)動的方式,深度學習采用不同組合的非線性變換,提取原始數(shù)據(jù)的低層到高層及具體到抽象等特征。首先,相較傳統(tǒng)的淺層學習,深度學習更加強調(diào)模型結(jié)構(gòu)的深度,通過增加模型深度,深度學習模型能夠獲取原始數(shù)據(jù)中更深層次含義;其次,深度學習明確數(shù)據(jù)特征表示的重要性,通過逐層特征變換,深度學習模型將原始數(shù)據(jù)的特征表示空間轉(zhuǎn)換到一個新特征表征空間,從而使模型的預(yù)測更容易。深度學習強大的特征提取和學習能力可以更好地處理高維稀疏數(shù)據(jù),在自然語言處理領(lǐng)域的諸多任務(wù)中取得了長足發(fā)展。深度學習的出現(xiàn),使文本的表征從離散的整型矩陣轉(zhuǎn)換成了稠密高維的浮點矩陣,浮點矩陣所蘊含的信息更多,而且每個字符表征之間也存在一定的語義關(guān)聯(lián),因此,本書的核心是基于深度學習的自然語言處理。通過深度學習與自然語言處理的結(jié)合,本書能夠幫助讀者快速掌握當前自然語言處理的熱門技術(shù),鍛煉實踐能力。1.2本書章節(jié)脈絡(luò)全書共11章,每個章節(jié)聯(lián)系緊密,并且配套相應(yīng)的原理與案例。筆者建議初學者按順序閱讀,這樣能有效地建立起一套完備的基于深度學習的自然語言處理學習體系。接下來,筆者就圖1.1所示的學習路線給各位讀者介紹一下本書的知識體系。圖1.1全書架構(gòu)第1章導論分為4部分內(nèi)容:自然語言處理的定義、基于深度學習的自然語言處理、全書章節(jié)脈絡(luò)及自然語言處理的算法流程。第1章是全書的總起章,將會給每位讀者重點介紹本書每個章節(jié)的核心技術(shù)。第2章Python開發(fā)環(huán)境配置介紹了本書使用的操作系統(tǒng)與編程環(huán)境,即Linux操作系統(tǒng)下的Python開發(fā)環(huán)境搭建。與此同時,第2章還介紹了算法開發(fā)的常用工具與當前比較流行的Docker容器技術(shù)的使用。第3章自然語言處理的發(fā)展歷程按時間順序介紹自然語言處理領(lǐng)域發(fā)展過程中比較經(jīng)典的模型與思想。第3章從最簡單的人工規(guī)則處理自然語言開始,逐步邁向機器學習處理更加復(fù)雜的任務(wù),最后到利用深度學習技術(shù)推動當前自然語言處理任務(wù)的發(fā)展。第4章無監(jiān)督學習的原理與應(yīng)用是整本書的精華所在,筆者將會給讀者詳細介紹自然語言處理領(lǐng)域跨時代的語言預(yù)訓練模型BERT,并配套相應(yīng)的案例,以幫助讀者掌握深度學習與自然語言處理相結(jié)合的重點。更進一步,筆者以本章為基礎(chǔ),衍生出第5~11章,幫助讀者更進一步地了解預(yù)訓練模型BERT如何處理當前自然語言處理任務(wù)及掌握使用BERT模型的實踐能力。第5章無監(jiān)督學習進階則是基于第4章的深入探索,著重介紹生成對抗網(wǎng)絡(luò)與元學習的知識。讀者可以從中體會生成對抗網(wǎng)絡(luò)中的博弈之美,學習到一個嶄新的處理問題的思路,與此同時,也能在元學習的知識中學會如何利用少量樣本完成“一次學習”甚至“零次學習”。第6章預(yù)訓練是BERT預(yù)訓練模型誕生的關(guān)鍵章節(jié),講解如何生成一個預(yù)訓練模型,以及如何利用海量的無標注數(shù)據(jù)甚至脫敏數(shù)據(jù)生成一個性能優(yōu)秀的預(yù)訓練模型。第7章文本分類是當前業(yè)界研究的重點,其對輿情分析、新聞分類與情感傾向分析等應(yīng)用場景都有著至關(guān)重要的影響。預(yù)訓練模型很大程度地提升了自然語言處理模型的泛化能力與準確性。本章將以分類任務(wù)為切入點,講解如何利用預(yù)訓練模型構(gòu)建自然語言處理分類模型技術(shù)。另外,本書后續(xù)章節(jié)的自然語言處理下游任務(wù)的案例代碼將基于第7章的案例代碼進行改寫,案例代碼具有很強的復(fù)用性與解耦性,學習成本非常低,力圖幫助每位讀者快速提升自然語言處理技術(shù)的實踐能力,并基于當前的代碼框架進行二次拓展,完善自然語言處理的知識體系。第8章機器閱讀理解是一種計算機理解自然語言語義并回答人類一系列問題的相關(guān)技術(shù)。該任務(wù)通常被用來衡量機器自然語言理解能力,可以幫助人類從大量文本中快速聚焦相關(guān)信息,降低人工信息獲取成本,在文本問答、信息抽取、對話系統(tǒng)等領(lǐng)域具有極強的應(yīng)用價值。隨著深度學習的發(fā)展,機器閱讀理解各項任務(wù)的性能顯著提升,受到工業(yè)界和學術(shù)界的廣泛關(guān)注。同時,第8章配備了相應(yīng)的機器閱讀理解代碼案例,幫助讀者掌握如何從海量文檔中抽取出符合問題的答案片段的技術(shù)。第9章命名實體識別是一種識別文本中預(yù)先定義好類別的實體技術(shù)。命名實體識別技術(shù)在文本搜索、文本推薦、知識圖譜構(gòu)建及機器智能問答等領(lǐng)域都起著至關(guān)重要的作用。近年來,隨著深度學習的快速發(fā)展,命名實體識別技術(shù)的準確性也得到了很大的提升,因此,第9章配備了相應(yīng)的命名實體識別實踐,以幫助讀者掌握該熱門技術(shù)。第10章文本生成是一種可以利用既定信息與文本生成模型生成滿足特定目標的文本序列的技術(shù),其主要應(yīng)用場景有生成式閱讀理解、人機對話或智能寫作等。當前深度學習的快速發(fā)展同樣推動了該項技術(shù)的蓬勃發(fā)展,越來越多可用的文本生成模型誕生,提高了自然語言處理領(lǐng)域的效率,服務(wù)智能化社會。第10章同樣配備了文本生成的相應(yīng)實踐,以幫助讀者更好地理解該項技術(shù),并使用它來完成相應(yīng)的任務(wù)。第11章?lián)p失函數(shù)與模型瘦身是基于模型優(yōu)化的重點章節(jié)。損失函數(shù)可以為神經(jīng)網(wǎng)絡(luò)提供很多實用的靈活性,它定義了網(wǎng)絡(luò)輸出與網(wǎng)絡(luò)其余部分的連接方式,也決定著模型設(shè)計各項參數(shù)的收斂速度,甚至在特殊的數(shù)據(jù)分布下,如樣本不均衡的長尾分布、訓練樣本少的冷啟動問題,以及數(shù)據(jù)集在臟、亂、差的帶噪學習中,特殊的損失函數(shù)能發(fā)揮出讓人意想不到的作用。另外,隨著深度學習的模型層次結(jié)構(gòu)越來越深,模型含有的神經(jīng)元常常數(shù)以億計,這給模型線上部署的高響應(yīng)要求帶來了極大的阻礙。為此,本章將介紹相應(yīng)的模型壓縮技術(shù),以滿足模型線上部署高響應(yīng)且性能消耗較小的要求。1.3自然語言處理算法流程本書的自然語言算法以Python為基礎(chǔ),采用開源的深度學習預(yù)訓練模型,并基于Facebook開源的PyTorch深度學習框架,構(gòu)建自然語言處理模型。整體算法流程如圖1.2所示。數(shù)據(jù)集切分為測試集、訓練集和驗證集。測試集用于模型的預(yù)測;訓練集用于訓練深度學習模型;驗證集用于評估模型結(jié)果,進而輔助模型調(diào)參。一般而言,測試集、訓練集與驗證集的比例為1:7:2。圖1.2自然語言處理算法流程1.數(shù)據(jù)預(yù)處理數(shù)據(jù)預(yù)處理模塊的主要工作是將文本與實體標簽轉(zhuǎn)換成計算機能夠處理的格式。與此同時,數(shù)據(jù)預(yù)處理模塊還包含數(shù)據(jù)清洗與數(shù)據(jù)增強兩部分,數(shù)據(jù)清洗的目的是讓模型在學習過程中排除噪聲的干擾,如HTML字符、表情字符等,避免影響模型的性能;數(shù)據(jù)增強的目的是讓模型在學習過程中能夠多維度地接觸有用信息,如過長文本的處理方法,從而提升模型的性能。本書對于過長文本的處理,首先設(shè)定文本的切割長度閾值,并利用正則表達式清洗過長文本中的HTML標簽噪聲等;其次,對清洗后的數(shù)據(jù)按照句子切割,利用Python的列表進行裝載;最后,對列表里的句子按順序組裝,當文本長度大于512時,停止組裝,將當前句子用作新數(shù)據(jù)的首句,一直循環(huán)至當前列表的最后一個句子。通過按句切割的方式,算法最大程度地保證了文本的信息不丟失,如圖1.3所示。圖1.3過長文本預(yù)處理示意圖2.模型構(gòu)建模型構(gòu)建模塊采用開源的預(yù)訓練模型NEZHA,并結(jié)合深度學習方法中相應(yīng)的自然語言處理模型。由于自然語言處理的每個任務(wù)都有所不同,所以筆者對該模塊只做宏觀的概括,讀者可以翻閱后續(xù)章節(jié)了解相關(guān)技術(shù)的細節(jié)。3.模型預(yù)測模型預(yù)測模塊主要涉及超參數(shù)的設(shè)置及調(diào)優(yōu)。超參數(shù)的設(shè)置與調(diào)優(yōu)基于當前任務(wù)數(shù)據(jù)的特性(如文本長度等)與硬件設(shè)備資源(如16GB內(nèi)存的Tesla顯卡等)。類似地,讀者可以翻閱后續(xù)章節(jié)的實踐案例了解相應(yīng)的超參數(shù)細節(jié)。4.模型評估模型評估模塊設(shè)計評價指標評估模型的性能。模型評估指標有很多種,因此根據(jù)問題去選擇合適的評估指標是衡量結(jié)果好壞的重要方法,所以算法開發(fā)人員需要知道評估指標的定義,從而選擇正確的模型評估方式,這樣才能知道模型的問題所在,進而對模型進行參數(shù)調(diào)優(yōu)。自然語言處理任務(wù)的評估指標仍然基于當前任務(wù)特性來設(shè)計,包括但不限于正確率、精確率、召回率、F1分數(shù)、ROUGE分數(shù)及BLEU分數(shù)等,這些指標都會在后續(xù)章節(jié)進行詳細介紹。1.4小結(jié)本章的內(nèi)容并不多,總體是為了介紹自然語言處理的定義、整本書的學習路線及自然語言處理算法的整體流程,以幫助讀者對自然語言處理有個全局的認識。自然語言處理技術(shù)是一項非常重要的計算機技術(shù),其在各個領(lǐng)域發(fā)揮著無可替代的作用。隨著計算機自然語言處理技術(shù)的日趨成熟,自然語言處理模型會在社會的各個領(lǐng)域解決問題,為人們提供便利,從而在人類的智能社會中擔任至關(guān)重要的角色。第2章Python開發(fā)環(huán)境配置工欲善其事,必先利其器。搭建開發(fā)環(huán)境是學習本書原理與實踐必不可少的環(huán)節(jié)。本章主要向讀者介紹一些大型開發(fā)軟件的使用,如MobaXterm與集成開發(fā)環(huán)境(IntegratedDevelopmentEnvironment,IDE)軟件,以及如何給Linux服務(wù)器部署開發(fā)環(huán)境。與此同時,本章還將講述如何安裝和使用Docker容器技術(shù),幫助讀者減少配置環(huán)境帶來的煩惱。2.1Linux服務(wù)器算法程序開發(fā)人員的代碼開發(fā)環(huán)境幾乎離不開Linux操作系統(tǒng),而當今世界的服務(wù)器也基本是以Linux操作系統(tǒng)為主,不外乎兩個原因:免費、易用。為此,本書的代碼都將基于Linux服務(wù)器進行開發(fā)。接下來,筆者將介紹幾款幫助讀者提升開發(fā)效率的軟件。2.1.1MobaXtermMobaXterm是一款Windows操作系統(tǒng)的軟件,它是IT人員在Windows平臺上遠程連接Linux服務(wù)器的終極工具箱。在單個Windows應(yīng)用程序中,它為程序員、網(wǎng)站管理員、IT管理員及絕大多數(shù)需要以更簡單的方式處理遠程作業(yè)的用戶提供了量身定制的功能。MobaXterm提供了所有重要的遠程網(wǎng)絡(luò)工具(SSH、X11、RDP、VNC、FTP和MOSH),從UNIX命令(bash、Is、cat、sed、grep、awk和rsync等)到Windows桌面都可以在一個可移植的exe文件中使用,該文件可以直接使用。MobaXterm軟件是開源且免費的。2.1.2使用MobaXterm連接遠程服務(wù)器創(chuàng)建Session連接遠程服務(wù)器,如圖2.1所示。圖2.1Session選擇SSH連接,如圖2.2所示。圖2.2SSH連接輸入Linux服務(wù)器IP地址與用戶名,單擊OK按鈕后,輸入服務(wù)器密碼即可,如圖2.3所示。圖2.3賬戶與密碼2.1.3在服務(wù)器上安裝Python開發(fā)環(huán)境Anaconda指的是一個開源的Python發(fā)行版本,包含了Conda、Python等180多個科學包及其依賴項。Anaconda3是Python3.x的意思,選用Anaconda是因為能避免Python包之間的版本依賴錯誤,并且從2020年開始,官方停止維護Python2.x,因此直接下載Anaconda3即可。下載Linux版本的Anaconda,然后上傳至服務(wù)器,如圖2.4所示。圖2.4Anaconda3.7Linux版本代碼如下:2.1.4使用Anaconda國內(nèi)源Anaconda的發(fā)行版默認采用國外源,因此下載一些Python包會比較慢,國內(nèi)的軟件開發(fā)人員需要更換成國內(nèi)的源,一般使用清華源或者中科大源。Linux用戶在bash命令行輸入更換命令,代碼如下:2.1.5pip設(shè)定永久阿里云源有時Anaconda不包含某些Python包的鏈接,導致無法安裝這些包,因此,軟件開發(fā)人員需要用pipinstallxxx_package來安裝。同樣地,為了下載更迅速,可將pip的下載源換成國內(nèi)的阿里云源。Linux用戶在自己平臺的命令行下輸入以下更換命令即可,代碼如下:2.2Python虛擬環(huán)境一般來講,軟件開發(fā)人員只擁有Linux服務(wù)器的運行代碼權(quán)限,也就是說只能用這個服務(wù)器運行程序,而不能對服務(wù)器進行一些特定的修改。不過有時軟件開發(fā)人員需要安裝一些特定的包來運行軟件程序,這時為了不修改當前環(huán)境,需要創(chuàng)建一個Python虛擬環(huán)境。軟件開發(fā)人員可以在上面自由安裝軟件,而不影響當前環(huán)境,用完退出虛擬環(huán)境即可。本節(jié)使用Anaconda的命令來創(chuàng)建虛擬環(huán)境。使用condacreate-nyour_env_namepython=x.x(如2.7、3.6)命令創(chuàng)建Python版本為x.x且名字為your_env_name的虛擬環(huán)境。your_env_name文件可以在Anaconda安裝目錄envs文件下找到,代碼如下:在虛擬環(huán)境中使用命令condainstallyour_package即可將package安裝到y(tǒng)our_env_name中。conda會自動幫用戶安裝相關(guān)的從屬包。2.3PyCharm遠程連接服務(wù)器PyCharm是一款專業(yè)的編程開發(fā)軟件。讀者可以在官網(wǎng)使用校園郵箱注冊,在安裝過程中使用注冊的賬號進行登錄,這樣就可以免費使用PyCharm專業(yè)版,如圖2.5所示。圖2.5PyCharm下載頁面選擇File→Settings→ProjectInterpreter,單擊Add按鈕,如圖2.6所示,然后選擇SSHInterpreter,輸入遠程服務(wù)器的賬戶與密碼,如圖2.7所示。圖2.6連接虛擬環(huán)境圖2.7輸入賬戶與密碼正確填寫密碼,單擊Next按鈕,如圖2.8所示。輸入密碼成功后,選擇剛剛創(chuàng)建好的虛擬環(huán)境,單擊OK按鈕即可連接虛擬環(huán)境,如圖2.9所示。配置本地代碼與服務(wù)器同步目錄,選擇Tools→Deployment→Configuration,如圖2.10所示。圖2.8密碼填寫圖2.9選擇虛擬環(huán)境圖2.10配置代碼同步目錄選擇剛剛創(chuàng)建好的SSHInterpreter,并選擇服務(wù)器同步路徑,此時便可同步本地與服務(wù)器之間的代碼了,如圖2.11所示。圖2.11選擇SSHInterpreter2.4screen任務(wù)管理當程序在當前Linux窗口運行時間較長時,程序或許會因為網(wǎng)絡(luò)問題而異常終止。軟件開發(fā)人員可以使用screen來解決本地突然離線的問題,因為screen相當于在服務(wù)器創(chuàng)建了一個后臺窗口,本地連接中斷并不會影響正在運行的程序。在命令行輸入screen-ls命令,效果如圖2.12所示。代碼如下:圖2.12輸入screen-ls命令最后,讀者在使用深度學習框架運行模型時需要指定GPU,否則程序會把所有的GPU都占了,嚴重影響他人使用GPU,代碼如下:2.5Docker技術(shù)當前,開發(fā)應(yīng)用程序所需要的不僅是編寫代碼。在每個項目的生命周期階段,軟件開發(fā)人員使用的各種工具存在多種語言、框架、體系結(jié)構(gòu)及不連續(xù)的接口,極大地提高了軟件開發(fā)人員使用代碼的復(fù)雜性。2013年,Docker推出了后來成為容器行業(yè)標準的產(chǎn)品。容器(Container)是標準化的軟件單元,它使開發(fā)人員能夠?qū)⑵鋺?yīng)用程序與環(huán)境隔離,從而解決了“代碼在我的機器上運行沒問題”的麻煩。作為一項優(yōu)秀的容器技術(shù),Docker的出現(xiàn)簡化并加速了軟件開發(fā)人員的工作流程,方便開發(fā)人員在無須配置環(huán)境的前提下,自由地使用每個項目的工具和應(yīng)用程序,從而提高生產(chǎn)效率。Docker技術(shù)架構(gòu)如圖2.13所示,讀者可以將其理解為它在宿主機的操作系統(tǒng)上建立了一層Docker操作系統(tǒng)。在Docker操作系統(tǒng)上運行的每個容器都是獨立的應(yīng)用程序環(huán)境,容器之間相互隔離,但所有容器共享Docker操作系統(tǒng)中的一些公共庫。圖2.13Docker技術(shù)架構(gòu)眾所周知,初始學習一門計算機技能的最大時間成本是代碼環(huán)境配置,然而Docker技術(shù)可以將代碼的環(huán)境進行打包,使用者只需將打包的鏡像拉取到本地,便可使用發(fā)布者的代碼環(huán)境,從而避免配置環(huán)境出現(xiàn)的種種問題。對于本書代碼的運行環(huán)境,筆者也提供了Docker的選項,幫助讀者減少配置環(huán)境的煩惱,接下來筆者將通過一系列的命令來講解Docker的應(yīng)用。1.安裝Docker安裝Docker需要sudo權(quán)限,而服務(wù)器上的用戶幾乎沒有sudo權(quán)限,因此,安裝Docker這一步需要使用者去咨詢服務(wù)器的管理員。不過,本書仍然會引導讀者學習安裝Docker的流程,代碼如下:2.創(chuàng)建Docker用戶組同樣地,這一步也需要服務(wù)器的管理員進行操作。創(chuàng)建Docker用戶組的目的是避免服務(wù)器的普通用戶在使用Docker過程中使用sudo權(quán)限,也避免root用戶使用Docker服務(wù)時頻繁地輸入密碼,代碼如下:測試dockerrunhello-world命令,如果輸出如圖2.14所示的信息,則說明Docker已經(jīng)安裝成功。圖2.14Docker安裝成功3.拉取與查看鏡像現(xiàn)在,假設(shè)需要一個PyTorch代碼運行環(huán)境鏡像,則需要先拉取互聯(lián)網(wǎng)上已經(jīng)發(fā)布的PyTorch鏡像。當前,阿里云提供了以下基礎(chǔ)鏡像源,選擇PyTorch:1.4-CUDA10.1-py3版本的鏡像進行拉取即可,代碼如下:程序運行的結(jié)果如圖2.15所示。圖2.15拉取鏡像可以看到之前已經(jīng)拉取下來的PyTorch鏡像,如圖2.16所示。圖2.16已拉取的鏡像4.啟動容器軟件開發(fā)人員可以通過下載好的PyTorch鏡像啟動容器,相當于啟動運行PyTorch代碼的運行環(huán)境,代碼如下:5.進入容器至此已進入運行PyTorch代碼的環(huán)境,類似于使用Anaconda創(chuàng)建的虛擬環(huán)境,只不過在這個容器中,軟件開發(fā)人員擁有root權(quán)限,代碼如下:6.數(shù)據(jù)互傳容器一般與外界隔離,因此,容器與宿主機之間進行數(shù)據(jù)交互時需要使用Docker技術(shù)。值得注意的是,容器與宿主機之間的數(shù)據(jù)交互都是在宿主機上進行的,需要事先退出當前所在的容器,代碼如下:7.運行程序容器運行程序有兩種方法:(1)通過2.2.4節(jié)介紹的數(shù)據(jù)互傳命令,將數(shù)據(jù)和代碼都上傳至容器中,而后進入容器,運行代碼。(2)無須將數(shù)據(jù)和代碼上傳至容器,通過Docker掛載命令,借助Docker容器運行代碼,前提是需要保證本地代碼和數(shù)據(jù)都在同一個本地文件夾下,而程序運行產(chǎn)生的數(shù)據(jù)文件都保存在宿主機的目錄中,軟件開發(fā)人員只是借助容器進行運算而已,代碼如下:8.打包容器有時候,軟件開發(fā)人員所開發(fā)的軟件需要被其他人應(yīng)用。為了減少代碼環(huán)境配置的時間成本,可以將當前運行的容器進行打包,并輸出鏡像文件,傳給使用者即可,代碼如下:9.其他命令Docker還存在很多日常能用到的命令,以下命令都可在宿主機中進行操作。2.6小結(jié)本章主要介紹了本書代碼開發(fā)環(huán)境的搭建和常見工具及命令的使用,目的是讓讀者在學習自然語言處理的原理與應(yīng)用之前,先掌握操作深度學習的工具,因為人類能力的加成均來源于工具,因此,雖然本章相對煩瑣,但讀者也需耐心閱讀,力求掌握。本章從如何利用MobaXterm來連接遠程服務(wù)器,到如何在服務(wù)器上安裝所需要的開發(fā)環(huán)境,進行了詳細講解。此外筆者還分享了如何利用Anaconda國內(nèi)的一些鏡像,例如清華源和中科大源,并且對如何一次性利用這些源或者永久設(shè)定相應(yīng)的源作為自己Python依賴包的下載源進行了詳細說明。在完成開發(fā)環(huán)境的基本配置之后,對創(chuàng)建自己的虛擬環(huán)境,以及項目的開發(fā)工具PyCharm的應(yīng)用也進行了比較通俗易懂的介紹,例如PyCharm的安裝及如何連接到遠程服務(wù)器。在本章的最后還介紹了Docker,它作為一種容器技術(shù),在簡化和加速軟件開發(fā)的工作流程上有非常不錯的效果,也得到了廣大用戶的肯定。第3章自然語言處理的發(fā)展進程本章重點介紹自然語言處理的發(fā)展歷程,以及自然語言發(fā)展的趨勢:規(guī)則→統(tǒng)計→深度學習。筆者就發(fā)展趨勢方面利用時間軸的方法來介紹這一領(lǐng)域在發(fā)展過程中一些比較經(jīng)典的方法和模型,從最初利用人工規(guī)則來處理自然語言的一些任務(wù)講起,之后講解如何“進化”到利用機器學習的方法來處理社會發(fā)展帶來的更多復(fù)雜的任務(wù),到發(fā)展到現(xiàn)在利用深度學習的方法應(yīng)用在各種領(lǐng)域去處理各式各樣的任務(wù)。3.1人工規(guī)則與自然語言處理俗話說“巧婦難為無米之炊”。在機器學習中,數(shù)據(jù)和特征便是“米”,模型和算法則是“巧婦”。沒有充足的數(shù)據(jù)、合適的特征,再強大的模型結(jié)構(gòu)也無法得到滿意的輸出。正如一句業(yè)界經(jīng)典所說,Garbagein,garbageout。對于一個機器學習問題,數(shù)據(jù)和特征往往決定了結(jié)果的上限,而模型、算法的選擇及優(yōu)化則在逐步接近這個上限,可見特征工程的重要性。在1970年以前,自然語言處理的研究主要分為兩大陣營:一個是基于規(guī)則方法的符號派;另一個是采用概率方法的隨機派。這一時期,雖然兩種方法都取得了長足的發(fā)展,但由于當時多數(shù)學者注重研究推理和邏輯問題,所以可以說在當時基于規(guī)則的方法用來處理任務(wù)的比例更高。例如早在20世紀50年代初,Kleene就研究了有限自動機和正則表達式。1956年,Chomsky又提出了上下文無關(guān)語法,并把它運用到了自然語言處理中,而且隨著社會的發(fā)展,基于規(guī)則解決自然語言處理的問題也有長足的發(fā)展,例如詞頻、聚合度、自由度、編輯距離、主題和特征轉(zhuǎn)換。下面就使用頻率較高的特征處理方法(如詞頻、聚合度、自由度和編輯距離)做一個簡要的介紹。1.詞頻詞頻是多用于中文常用詞分詞的一種統(tǒng)計方法,這種方法旨在統(tǒng)計某個常用詞在某個語境下或者某個數(shù)據(jù)集中出現(xiàn)的次數(shù),從而判斷這個詞本身是否可以有獨立成詞的條件,即單獨拿出這個詞是否具有一定的含義。從人類語言學的角度來講,能夠具備成為詞的要求的詞語,一般在數(shù)據(jù)上會比較聚集地出現(xiàn)多次。2.聚合度詞頻并不能作為判斷是否具備獨立成詞條件的唯一標準,下面用一個例子引出更多元化的標準來評估一個詞語是否具備獨立成詞條件。例如,在一篇文章中用“電影院”成詞這個例子來講聚合度,筆者統(tǒng)計了在整個2400萬字的數(shù)據(jù)中“電影”一詞出現(xiàn)了2774次,出現(xiàn)的概率為0.000113,“院”字出現(xiàn)了4797次,出現(xiàn)的概率為0.0001969,如果兩者間真的毫無關(guān)系,則它們拼接在一起P(電影院)的概率為P(電影)×P(院)/2,但其實“電影院”一共出現(xiàn)175次,要遠遠高于兩個詞的概率的乘積,是P(電影)×P(院)/2的600多倍,還統(tǒng)計了“的”字出現(xiàn)的概率為0.0166,并且文章中出現(xiàn)的“的電影”的真實概率P(的電影)與P(的)×P(電影)/2很接近,所以表明“電影院”更可能是一個有意義的搭配,而“的電影”則更像是“的”和“電影”兩個成分偶然拼接到一起的。通過這樣的方式找到成詞稱為聚合度。計算過程及其舉例如下:(1)計算當前詞語S的在詞語庫中的出現(xiàn)概率P(S)。(2)對詞語S進行二分切法,切分出若干組詞語組(SL,SR),并分別計算每個詞語的出現(xiàn)概率P(SL)和P(SR)。(3)對于切分出來的詞語組計算聚合度,取最小值作為詞語S的聚合度。其中,對得出的結(jié)果取對數(shù)是為了防止概率過低導致計算結(jié)果溢出,并把值域映射到了更加平滑的區(qū)間。例如,“天氣預(yù)報說周五會下雨”,使用dop表示聚合度,并令單字的聚合度為0,則dop(天)=0。dop(天氣)=P(天)×P(氣)dop(天氣預(yù))=P(天)×P(氣預(yù))+P(天氣)×P(預(yù))dop(天氣預(yù)報)=P(天)×P(氣預(yù)報)+P(天氣)×P(預(yù)報)+P(天氣預(yù))×P(報)dop(天氣預(yù)報說)=P(天)×P(氣預(yù)報說)+P(天氣)×P(預(yù)報說)+P(天氣預(yù))×P(報說)+P(天氣預(yù)報)×P(說)……對詞進行二切分,然后計算切分后的概率乘積,在這里除了每個二切分的概率乘積的和,其實也可以用另一種方法計算聚合度:“電影院”的聚合度則是P(電影院)分別除以P(電)×P(影院)和P(電影)×P(院)所得的商的較小值,這樣處理甚至會有更好的效果,因為用最小值來代表這個詞的聚合度,更能有力地證明該詞的成詞性,如果該詞的聚合度在最小的情況下都成詞,則這個詞肯定成詞。3.自由度只看文本片段的聚合度是不夠的,還需要從整體看它在外部的表現(xiàn)??紤]“被子”,可以說“這被子”,“被子”是一個詞語而且該詞語的聚合度很高,而“這被子”并不是一個人類直觀認為有意義的詞語,但“這被子”的聚合度也很高,此時成詞的標準就受到了挑戰(zhàn)。為此筆者引入自由度來解決此類問題,自由度的思想來源于信息熵,信息熵是一個定義事情信息量大小的單位。信息熵越高,含有的信息量越小,這件事情的不確定性也就越高;相反,信息熵越低,含有的信息量也就越大,則這件事情的確定性也就越高。算法人員可以用信息熵來衡量一個文本片段的左鄰字集合和右鄰字集合有多隨機。自由度的計算過程如下:(1)計算當前詞語S的出現(xiàn)次數(shù)N,則詞語S的左邊總共出現(xiàn)N個漢字。(2)對N個漢字的出現(xiàn)次數(shù)進行統(tǒng)計,計算詞語S的左邊每個字出現(xiàn)的概率。(3)根據(jù)信息熵公式計算左鄰熵,同理計算右鄰熵。其中,Pi為詞語S的左邊每個字出現(xiàn)的概率。(4)信息熵越小對應(yīng)著自由度越低,則該詞語越穩(wěn)定,因此選擇信息熵最小的作為詞語S的自由度。考慮這么一句話“吃葡萄不吐葡萄皮不吃葡萄倒吐葡萄皮”“葡萄”一詞出現(xiàn)了4次,其中左鄰字分別為{吃,吐,吃,吐},右鄰字分別為{不,皮,倒,皮}。根據(jù)式(3.1),“葡萄”一詞的左鄰字的信息熵為-(1/2)×log(1/2)-(1/2)×log(1/2)≈0.693,它的右鄰字的信息熵則為-(1/2)×log(1/2)-(1/4)×log(1/4)-(1/4)×log(1/4)≈1.04。由此可見,在這個句子中,“葡萄”一詞的右鄰字更加豐富一些。4.編輯距離編輯距離又稱Levenshtein距離(萊文斯坦距離也叫作EditDistance),指兩個字符串之間,由一個轉(zhuǎn)換成另一個所需的最少編輯操作次數(shù),它們的編輯距離越大,字符串越不同。許可的編輯操作包括將一個字符替換成另一個字符,插入一個字符和刪除一個字符。這個概念是由俄羅斯科學家VladimirLevenshtein在1965年提出來的。它可以用來做DNA分析、拼字檢測和抄襲識別等。總之,算法人員可以考慮使用編輯距離比較文本段的相似度。編輯操作只有3種:插入、刪除和替換。例如有兩個字符串,將其中一個字符串經(jīng)過這3種操作之后,得到兩個完全相同的字符串付出的代價是什么,是當前要討論和計算的。例如,有兩個字符串kitten和sitting,現(xiàn)在要將kitten轉(zhuǎn)換成sitting可以進行如下一些操作:kitten→sitten將k替換成s;sitten→sittin將e替換成i;sittin→sitting添加g。在這里算法設(shè)置每經(jīng)過一次編輯,也就是變化(插入、刪除或替換),花費的代價都是1。3.2機器學習與自熱語言處理在機器學習中,利用一些規(guī)則,算法人員可以很好地使數(shù)據(jù)特征更加明顯,使機器學習起來更加“輕松”,就如同有了很好的食材,或者說經(jīng)過處理后的食材,可以被更好地處理成最好吃的食物,但是再好的食材如果廚師的廚藝很差,仍然會造成食材的浪費。模型和算法的應(yīng)用對促進完成一些任務(wù)有很好的效果,可以說模型可以使數(shù)據(jù)的價值最大化。3.1節(jié)介紹了人們利用一些規(guī)則去處理數(shù)據(jù),本節(jié)主要介紹一些傳統(tǒng)算法的發(fā)展和應(yīng)用。3.2.1詞袋模型詞袋(BoW)模型是一種使用機器學習算法,也是數(shù)學中最簡單的文本表示形式。該方法非常簡單和靈活,可用于從文檔中提取各種功能的各種方法。詞袋是描述文檔中單詞出現(xiàn)的文本的一種表示形式。因為文檔中的單詞是以沒有邏輯的順序放置的,所以稱為單詞的“袋子”。該模型只關(guān)注文檔中是否出現(xiàn)已知的單詞,并不關(guān)注文檔中出現(xiàn)的單詞。例如,以筆者之前看過的一部電影的評論作為例子:評論1:Thismovieisveryscaryandlong評論2:Thismovieisnotscaryandslow評論3:Thismovieisspookyandgood首先根據(jù)以上3個評論中所有獨特的單詞來構(gòu)建詞匯表。詞匯表由以下11個單詞組成:This、movie、is、very、scary、and、long、not、slow、spooky和good。將上述每個單詞用1和0標記在上面的3個電影評論中。這將為3條評論提供3個向量,具體表示如表3.1所示。表3.1句子轉(zhuǎn)換為向量的表示評論1的向量:[111111110000]評論2的向量:[11200110100]評論3的向量:[111000110011]這是詞袋模型背后的核心思想。使用詞袋模型的缺點在于,當前可以有長度為11的向量,但是當遇到新句子時就會遇到問題:第一,如果新句子包含新詞,則詞匯量將增加,因此向量的長度也將增加;第二,向量也將包含許多0,從而導致稀疏矩陣(這是要避免的);第三,不保留有關(guān)句子語法或文本中單詞順序的信息。3.2.2n-gram在用谷歌或者百度搜索引擎時,輸入一個或幾個詞,搜索框通常會以下拉菜單的形式給出幾個備選,這些備選其實是在推測你想要搜索的那個詞串。那么,原理是什么呢?也就輸入“我們”的時候,后面的“都要好好的”“戀愛吧”等這些詞語是怎么出來的,怎么排序的?實際上是根據(jù)語言模型得出的。假如使用二元語言模型預(yù)測下一個單詞,則排序的過程如圖3.1所示。圖3.1n-gram應(yīng)用示例P(“都要好好的”|“我們”)>P(“都在用力地活著是什么歌名”|“我們”)>P(“都要好好的電視劇免費觀看”|“我們”)>……>P(“戀愛吧”|“我們”),數(shù)據(jù)的來源可以是用戶搜索日志。到底什么是n-gram呢?n-gram是一個由n個連續(xù)單詞組成的塊,它的思想是一個單詞出現(xiàn)的概率與它的n-1個出現(xiàn)的詞有關(guān)。也就是每個詞依賴于第n-1個詞。下面是一些常見的術(shù)語及示例,可以幫助你更好地理解n-gram語言模型。Unigrams:一元文法,由一個單詞組成的token,例如,the、students、opened和their。Bigrams:二元文法,也叫一元馬爾可夫鏈。由連續(xù)兩個單詞組成的token,例如,thestudents、studentsopened和openedtheir。Trigrams:三元文法,由連續(xù)3個單詞組成的token,例如,thestudentsopened和studentsopenedtheir。4-grams:四元文法,由連續(xù)4個單詞組成的token,例如,thestudentsopenedtheir。如何估計這些n-gram概率呢?估計概率的一種直觀方法叫作最大似然估計(MLE)??梢酝ㄟ^從正態(tài)語料庫中獲取計數(shù),并將計數(shù)歸一化,使其位于0~1,從而得到n-gram模型參數(shù)的最大似然估計。例如,要計算一個給定前一個單詞為x,后一個單詞為y的bigram概率。計算bigramC(xy)的計數(shù),并通過共享第1個單詞x的所有bigram的總和進行標準化。其中,分子為bigramC(xy)在語料庫中的計數(shù),分母為前一個詞x,后一個詞為任意詞的bigram計數(shù)的總和。為了簡單可以寫成下面的形式:這樣就可以通過最大似然估計求得概率值,但是有個問題,在其他語料庫中出現(xiàn)次數(shù)很多的句子可能在當前語料庫中沒有,所以很難進行泛化。n-gram模型的稀疏性問題有以下幾點。(1)如果要求的詞沒有在文本中出現(xiàn),則分子的概率為0。解決辦法是添加一個很小的值給對應(yīng)的詞,這種方法叫作平滑,例如拉普拉斯平滑。這使詞表中的每個單詞都至少有很小的概率。(2)如果第n-1個詞沒有出現(xiàn)在文本中,則分母的概率無法計算。解決辦法是使用waterissotransparentthat替代,這種方法叫作后退,保證作為條件的分母概率值存在。(還有其他平滑技術(shù))(3)概率是一個大于0小于1的數(shù),隨著相乘會變得很小,所以通常使用log的形式:P1P2P3P4=exp(logP1+logP2+logP3+logP4)。(4)提高n的值會使稀疏性變得更糟糕,還會增加存儲量,所以n-gram一般不會超過5。(5)當n>2時,例如trigram,可能需要在頭部添加兩個start-token,讀者可自行驗證效果。3.2.3頻率與逆文檔頻率TF-IDF即術(shù)語頻率-逆文檔頻率,是一種數(shù)字統(tǒng)計,反映單詞對集合或語料庫中文檔的重要性。術(shù)語頻率(TF)用于衡量術(shù)語t在文檔d中出現(xiàn)的頻率:其中,在分子中,n是術(shù)語t出現(xiàn)在文檔d中的次數(shù),因此,每個文檔和術(shù)語將具有其自己的TF值。筆者將再次使用在詞袋模型中構(gòu)建的相同詞匯表來顯示如何計算評論2的TF:評論2:Thismovieisnotscaryandisslow詞匯:This、movie、is、very、scary、and、long、not、slow、spooky和good。評論2中的字數(shù)=8,單詞This的TF=(評論2中出現(xiàn)This的次數(shù))/(評論2中的術(shù)語數(shù))=1/8。同樣有TF(movie)=1/8TF(is)=2/8=1/4TF(very)=0/8=0TF(scary)=1/8TF(and)=1/8TF(movie)=0/8TF(not)=1/8TF(slow)=1/8TF(spooky)=0/8=0TF(good)=0/8=0所有術(shù)語和所有評論的術(shù)語頻率如表3.2所示。表3.2評論術(shù)語TF逆文檔頻率(IDF)用于衡量一個術(shù)語的重要性。算法人員需要IDF值,因為僅計算TF不足以理解單詞的重要性,下面是計算IDF的公式:計算評論2中所有單詞的IDF值:IDF(This)=log(文檔數(shù)量/包含單詞'This'的文檔數(shù)量)=log(3/3)=log(1)=0同樣:IDF(movie)=log(3/3)=0IDF(is)=log(3/3)=0IDF(not)=log(3/1)=log(3)=0.48IDF(scary)=log(3/2)=0.18IDF(and)=log(3/3)=0IDF(slow)=log(3/1)=0.48因此,整個詞匯表的IDF值如表3.3所示。表3.3評論術(shù)語IDF因此,讀者可以看到像is、This、and等詞被簡化為0,并且重要性不大,而scary、long、good等詞更重要,具有較高的價值?,F(xiàn)在,算法可以為語料庫中的每個單詞計算TF-IDF分數(shù)。得分較高的單詞更重要,得分較低的單詞則不太重要:TF-IDF(This,評論2)=TF(This,評論2)×IDF(This)=1/8×0=0TF-IDF(movie,評論2)=1/8×0=0TF-IDF(is,評論2)=1/4×0=0TF-IDF(not,評論2)=1/8×0.48=0.06TF-IDF(scary,評論2)=1/8×0.18=0.023TF-IDF(and,評論2)=1/8×0=0TF-IDF(slow,評論2)=1/8×0.48=0.06同樣,針對所有評論計算所有單詞的TF-IDF分數(shù),如表3.4所示。表3.4評論術(shù)語TF-IDF總結(jié)一下本節(jié)所涉及的內(nèi)容:詞袋只創(chuàng)建一組向量,其中包含文檔中單詞出現(xiàn)的次數(shù)(審閱),而TF-IDF模型包含較重要單詞和次重要單詞的信息。詞袋向量易于解釋,但是,TF-IDF通常在機器學習模型中表現(xiàn)更好。對于n-gram而言,利用前面的幾個詞來預(yù)測后面最有可能出現(xiàn)的幾個詞,效果也是很好的,直到今日在各個搜索引擎中的應(yīng)用廣泛。3.3深度學習與自然語言處理深度學習目前雖然處于火熱的發(fā)展階段,但是不管是從理論方面來講還是從實踐方面來講都有許多問題待解決。不過,我們處在一個大數(shù)據(jù)時代,而且隨著計算資源的大幅提升,新模型、新理論的驗證周期會更短。人工智能時代的開啟必然很大程度地改變這個世界,不管是從交通、醫(yī)療、購物、軍事等方面,還是涉及每個人生活的方方面面?;蛟S我們處于最好的時代,也或許我們處于最不好的時代,但是未來無法預(yù)知,我們要做的是不斷學習。本節(jié)將介紹在深度學習的發(fā)展過程中那些沉淀下來的經(jīng)典模型,也是后面章節(jié)要講的一些預(yù)訓練模型的組成部分。單詞嵌入是文檔詞匯表最流行的表示形式之一。它能夠最大程度地捕獲文檔中單詞的上下文、語義及句法相似性,還有與其他單詞的關(guān)系等。那么單詞嵌入底是什么?廣義上來講,它們是特定單詞在向量上的表示形式。話雖如此,但如何生成它們?更重要的是,它們?nèi)绾尾东@上下文?Word2Vec模型是使用淺層神經(jīng)網(wǎng)絡(luò)學習單詞嵌入最流行的技術(shù)之一,它是由TomasMikolov于2013年開發(fā)的。雖然Word2Vec是淺層神經(jīng)網(wǎng)絡(luò)學習,但它是深度學習極其重要的組成部分,所以把這部分內(nèi)容放在本節(jié),接下來將介紹Word2Vec這一里程碑的模型體系結(jié)構(gòu)和優(yōu)化程序,它可用于從大型數(shù)據(jù)集中學習單詞嵌入。通過Word2Vec學習的嵌入已被證明在各種下游自然語言處理任務(wù)上都是成功的??紤]以下類似的句子:Haveagoodday和Haveagreatday。它們幾乎沒有不同的含義。如果構(gòu)建一個詳盡的詞匯表(稱其為V),則其V={Have,a,good,great,day}?,F(xiàn)在,為V中的每個單詞創(chuàng)建一個One-Hot(單詞獨熱編碼向量)。單詞獨熱編碼向量的長度將等于V的大?。?)。除了索引中表示詞匯表中相應(yīng)單詞的元素外,算法將有一個零向量。該特定元素將只有一個。下面的編碼可以更好地說明這一點。Have=[1,0,0,0,0]';a=[0,1,0,0,0]';good=[0,0,1,0,0]';great=[0,0,0,1,0]';day=[0,0,0,0,1]'('代表轉(zhuǎn)置)。嘗試可視化這些編碼,可以得到一個五維空間,其中每個單詞占據(jù)一維,而與其余單詞無關(guān)。這意味著good與great一樣,這是不正確的。算法的目標是使上下文相似的單詞占據(jù)緊密的空間位置。在數(shù)學上,此類向量之間的角度的余弦值應(yīng)接近1,即角度接近0,如圖3.2所示。圖3.2相似單詞計算余旋度這里是生成分布式表示,直觀來看,筆者引入了一個單詞對另一個單詞的某種依賴性。在該詞的上下文中的詞將在這種依賴性中獲得更大的權(quán)重。如前面提到的,在一個獨熱編碼表示中,所有的字都是彼此獨立的。Word2Vec是一種構(gòu)造此類嵌入的方法。Word2Vec的實現(xiàn)可以使用兩種方法(都涉及神經(jīng)網(wǎng)絡(luò))來獲得:跳過語法(Skip-Gram)和通用單詞袋(CBoW)。CBoW模型將每個單詞的上下文作為輸入,并嘗試預(yù)測與上下文相對應(yīng)的單詞。例如Haveagreatday。假設(shè)輸入神經(jīng)網(wǎng)絡(luò)的詞為great。需要注意,這里筆者嘗試使用單個上下文輸入單詞great預(yù)測目標單詞(day)。更進一步地,筆者使用輸入字的一種獨熱編碼,并與目標字的一種獨熱編碼(day)相比,測量輸出誤差。在預(yù)測目標詞的過程中,模型學習目標詞的向量表示。詳細的結(jié)構(gòu)如圖3.3所示。圖3.3編碼結(jié)構(gòu)其中,輸入或上下文詞是一個長度為V的獨熱編碼向量。隱藏層包含N個神經(jīng)元,輸出也是V長度向量,其元素為Softmax值。隱藏層神經(jīng)元僅將輸入的加權(quán)總和復(fù)制到下一層。沒有像函數(shù)tanh或ReLU這樣的激活。唯一的非線性是輸出層中的Softmax計算,但是,以上模型使用單個上下文詞來預(yù)測目標。筆者可以使用多個上下文詞來做同樣的事情,如圖3.4所示。圖3.4所示的模型采用C個上下文詞。當Wv×n用于計算隱藏層輸入時,對這些上下文詞C輸入取平均值,因此,讀者已經(jīng)看到了如何使用上下文單詞生成單詞表示形式,但是,還有另一種方法可以做到這一點:使用目標詞(為了生成其表示形式)來預(yù)測上下文,并在此過程中生成相應(yīng)的表示形式。Skip-Gram模型的變體可以做到這一點。Skip-Gram模型如圖3.5所示??雌饋砩舷挛腃BoW模型剛剛被翻轉(zhuǎn),在某種程度上這樣理解是對的。算法將目標詞輸入網(wǎng)絡(luò),該模型輸出C個概率分布。這是什么意思?對于每個上下文位置,算法獲得C個V維度的概率分布,每個單詞都有一個。在這兩種情況下,網(wǎng)絡(luò)都使用反向傳播進行學習??傮w來講,兩者都有自己的優(yōu)點和缺點。Skip-Gram可以很好地處理少量數(shù)據(jù),并且可以很好地代表稀有單詞;CBoW速度更快,對于更頻繁的單詞具有更好的表示。圖3.4多個上下文詞處理的示意圖圖3.5利用Skip-Gram生成表示形式結(jié)構(gòu)圖3.4小結(jié)本章介紹了最初解決自然語言任務(wù)時利用的一些簡單的規(guī)則,例如詞頻、聚合度、自由度和編輯距離等,發(fā)展到后面可以利用一些機器學習方法出色地完成一些相對簡單的任務(wù),不過隨著社會的發(fā)展,算法面臨的任務(wù)也越來越復(fù)雜。如今是大數(shù)據(jù)時代,機器學習的方法所帶來的效果也遇到很多瓶頸,同時在社會快速發(fā)展的推動下,現(xiàn)如今的計算力和硬件水平也得到了快速發(fā)展,模型的驗證周期也更短,這些都是深度學習模型快速發(fā)展的“催化劑”,同時本章還介紹了目前流行的淺層深度學習模型。第4章無監(jiān)督學習的原理與應(yīng)用第3章介紹了自然語言處理的歷史進程,從其整體的發(fā)展史上明確了無監(jiān)督學習對自然語言處理的重要性。無監(jiān)督學習在自然語言處理(NatureLanguageProcessing,NLP)領(lǐng)域是一種強大的技術(shù),由這種技術(shù)訓練出來的模型,稱為預(yù)訓練模型。預(yù)訓練模型首先要針對數(shù)據(jù)豐富的任務(wù)進行預(yù)訓練,然后針對下游任務(wù)進行微調(diào),以達到下游任務(wù)的最佳效果。預(yù)訓練模型的有效性引起了理論和實踐的多樣性,人們通過預(yù)訓練模型與下游任務(wù)結(jié)構(gòu)相結(jié)合,可以高效地完成各種NLP的實際任務(wù)。4.1淺層無監(jiān)督預(yù)訓練模型使語言建模和其他學習問題變得困難的一個基本問題是維數(shù)的“詛咒”。在人們想要對許多離散的隨機變量(例如,句子中的單詞或數(shù)據(jù)挖掘任務(wù)中的離散屬性)之間的聯(lián)合分布建模時,這一點尤其明顯。舉個例子,假如有10000個單詞的詞匯表,算法人員要對它們進行離散表示,用獨熱編碼整個詞匯表就需要10000×10000的矩陣,而獨熱編碼矩陣存在很多0值,顯然浪費了絕大部分的內(nèi)存空間。為了解決維度“詛咒”帶來的問題,人們開始使用低維度的向量空間表示單詞,從而減少運算資源的損耗,這也是無監(jiān)督預(yù)訓練模型思想的開端。第3章提及了Word2Vec等淺層無監(jiān)督模型。淺層無監(jiān)督模型對NLP任務(wù)的處理效果有顯著的提升,并且能夠利用更長的上下文。對于淺層無監(jiān)督模型具體的原理,第3章已經(jīng)進行了詳細講解,在此不再贅述。4.2深層無監(jiān)督預(yù)訓練模型4.2.1BERT在2018年,什么震驚了NLP學術(shù)界?毫無疑問是JacobDevlin等[1]提出的預(yù)訓練模型(BidirectionalEncoderRepresentationsfromTransformers,BERT)。BERT模型被設(shè)計為通過在所有層的雙向上下文上共同進行條件化來預(yù)訓練未標記文本的深層雙向表示。算法人員可以在僅使用一個附加輸出層的情況下對經(jīng)過預(yù)訓練的BERT模型進行微調(diào),以創(chuàng)建適用于各種任務(wù)(例如,問題解答和語言推斷)的最新模型,進而減少對NLP任務(wù)精心設(shè)計特定體系結(jié)構(gòu)的需求。BERT是第1個基于微調(diào)的表示模型,可在一系列句子級和字符級任務(wù)上實現(xiàn)最高性能,優(yōu)于許多特定任務(wù)的體系結(jié)構(gòu)。通俗來講,讀者只需把BERT模型當成一個深層次的Word2Vec預(yù)訓練模型,對于一些特定的任務(wù),只需要在BERT模型之后接一些網(wǎng)絡(luò)結(jié)構(gòu)就可以出色地完成這些任務(wù)。另外,2018年底提出的BERT推動了11項NLP任務(wù)的發(fā)展。BERT模型結(jié)構(gòu)來自Transformers模型的編碼器(Encoder),Transformers模型的結(jié)構(gòu)如圖4.1所示。讀者從圖4.1中可以看到Transformers的內(nèi)部結(jié)構(gòu)都由AshishVaswani等[2]提出的自注意層(Self-AttentionLayer)和層歸一化(LayerNormalization)的堆疊而產(chǎn)生。圖4.1Transformers結(jié)構(gòu)(左圖為編碼器,右圖為解碼器)[2]4.2.2Self-AttentionLayer原理Self-AttentionLayer是為了解決RNN、LSTM等常用于處理序列化數(shù)據(jù)的網(wǎng)絡(luò)結(jié)構(gòu)無法在GPU中并行加速度計算的問題。如圖4.2所示,Self-Attention將輸入(Input)轉(zhuǎn)化成TokenEmbedding+SegmentEmbedding+PositionEmbedding。因為有時訓練樣本由兩句話組成,因此[CLS]用來分類輸入的兩句話是否有上下文關(guān)系,而[SEP]是用來分開兩句話的標志符。其中,因為這里輸入的是英文單詞,所以在灌入模型之前,需要用BERT源碼的Tokenization工具對每個單詞進行分詞,分詞后的形式如圖4.2中輸入的playing轉(zhuǎn)換成play+##ing。因為英文詞匯表是通過詞根與詞綴的組合來新增單詞語義的,所以筆者選擇用分詞方法減少整體的詞匯表長度。圖4.2Self-Attention的輸入[1]如果是中文字符,則輸入不需要分詞,整段話的每個字用空格隔開即可。值得注意的是,模型是無法處理文本字符的,所以不管是英文還是中文,算法都需要通過預(yù)訓練模型BERT自帶的字典vocab.txt將每個字或者單詞轉(zhuǎn)換成字典索引(id)輸入。SegmentEmbedding的目的:有些任務(wù)是兩句話一起放入輸入X,而Segment便是用來區(qū)分這兩句話的。輸入使用[SEP]作為標志符號,[CLS]用來分類輸入的兩句話是否有上下文關(guān)系。PositionEmbedding的目的:因為網(wǎng)絡(luò)結(jié)構(gòu)沒有RNN或者LSTM,所以算法無法得到序列的位置信息,需要構(gòu)建一個PositionEmbedding。構(gòu)建PositionEmbedding有兩種方法:第1種是BERT初始化一個PositionEmbedding,然后通過訓練將其學習出來;第2種是Transformers通過制定規(guī)則來構(gòu)建一個PositionEmbedding,即使用正弦函數(shù),位置維度對應(yīng)曲線,方便序列之間的選對位置,使用正弦比余弦好的原因是可以在訓練過程中將原本的序列外拓成比原來序列還要長的序列,如式(4.1)和式(4.2)所示。4.2.3Self-AttentionLayer的內(nèi)部運算邏輯首先,將矩陣Q與K相乘并規(guī)?;榱朔乐菇Y(jié)果過大,除以它們維度的均方根);其次,將其灌入Softmax函數(shù)得到概率分布;最后與矩陣V相乘,得到Self-Attention的輸出,如式(4.3)和式(4.4)所示。其中,(Q,K,V)均來自同一輸入X,它們是X分別乘以WQ,WK,WV初始化權(quán)值矩陣所得,而后這3個權(quán)值矩陣會在訓練的過程中確定下來,如圖4.3所示。圖4.3初始化(Q,K,V)4.2.4Multi-HeadSelf-Attention通過線性(Linear)投影來初始化不同的(Q,K,V),將多個單頭的結(jié)果融合會比單頭Self-Attention的效果好??梢詫⒊跏蓟煌模≦,K,V)理解為單頭從不同的方向去觀察文本,這樣使Self-Attention更加具有大局觀。整體的運算邏輯是Multi-HeadSelf-Attention將多個不同單頭的Self-Attention輸出成一條,然后經(jīng)過一個全連接層降維輸出,如圖4.4所示。圖4.4Multi-HeadSelf-Attention[1]4.2.5LayerNormalizationSelf-Attention的輸出會經(jīng)過層歸一化,為什么選擇層歸一化而不是批歸一化(BatchNormalization)?此時,應(yīng)先對模型輸入的數(shù)據(jù)形狀有個直觀的認識,當一批(Batch)數(shù)據(jù)輸入模型時,形狀是長方體,如圖4.5所示,大小為(batch_size,max_len,embedding),其中batch_size為批數(shù),max_len為每批數(shù)據(jù)的序列最大長度,embedding則為每個單詞或者字的權(quán)重維度大小。因此,批歸一化是對每批數(shù)據(jù)的每列做歸一化,相當于對批數(shù)據(jù)里相同位置的字或者單詞的字向量做歸一化;而層歸一化則是對批數(shù)據(jù)的每行做歸一化,相當于對每句話的字向量做歸一化。顯然,層歸一化更加符合處理文本的直覺。圖4.5歸一化4.2.6BERT預(yù)訓練BERT預(yù)訓練如圖4.6所示。預(yù)訓練過程是生成BERT模型的過程。圖4.6預(yù)訓練與微調(diào)過程[1]一般來講,個人用不著自己訓練一個BERT預(yù)訓練模型,而是直接調(diào)用模型的權(quán)重,進行微調(diào)(Fine-Tune)以適應(yīng)當前特定任務(wù),但讀者可以了解一下BERT是怎么訓練出來的。輸入X是自注意層的輸入,利用字典將每個字或者單詞用數(shù)字表示,并轉(zhuǎn)換成TokenEmbedding+SegmentEmbedding+PositionEmbedding。序列的長度一般為512或者1024,若不足,則用[PAD]補充。句子開頭第1個位置用[CLS]表示,如果輸入兩句話,則用[SEP]隔開。(1)MaskLM策略:對于輸入X,15%的字或者英文單詞采用隨機掩蓋策略。對于這15%的字或者英文單詞,80%的概率用[mask]替換序列中的某個字或者英文單詞,10%的概率替換序列中的某個字或者英文單詞,10%的概率不做任何變換,模型通過預(yù)測被掩蓋的字或者英文單詞(MaskLM)的方式來獲得字符的文本信息。(2)NSP策略:預(yù)測兩句話之間是否有順序關(guān)系(NextSentencePrediction,NSP)。預(yù)訓練采用兩種預(yù)訓練方式:MaskLM策略和NSP策略,兩者同時進行,并且預(yù)訓練語料總量為330億語料。這里需要補充說明的是,NLP的預(yù)訓練模型與計算機視覺的預(yù)訓練模型有些許不同,NLP的預(yù)訓練方式采用的是無監(jiān)督學習,即不需要人工打標簽,而計算機視覺則需要對圖像進行人工分類。因為NLP的預(yù)訓練正如筆者所說,只是預(yù)測被掩蓋的字或者英文單詞,以及判斷兩段話是否有順序關(guān)系,這些只需寫個小程序就可以輕松得到相應(yīng)的標簽,無須人工進行大量標記。最后經(jīng)過大量語料的無監(jiān)督學習,算法人員得到了BERT預(yù)訓練模型,BERT自帶字典vocab.txt的每個字或者英文單詞都被768維度的權(quán)重所表示。當算法人員需要完成特定任務(wù)時,若對它們的權(quán)重進行微調(diào),則能更好地適應(yīng)任務(wù)。4.2.7BERT的微調(diào)過程微調(diào)過程如圖4.6所示??梢赃x擇是否微調(diào),如果不選擇微調(diào),則表示簡單地使用BERT的權(quán)重,把它完全當成文本特征提取器使用;如果使用微調(diào),則相當于在訓練過程中微調(diào)BERT的權(quán)重,以適應(yīng)當前的任務(wù)。文章提及如果選擇下面這幾個參數(shù)進行微調(diào),則任務(wù)的完成度會比較好。(1)BatchSize:16,32;(2)LearningRate:5e-5,3e-5,2e-5;(3)Epochs:2,3,4。4.3其他預(yù)訓練模型無監(jiān)督學習給預(yù)訓練模型帶來了顯著提升,但要確定方法的哪些方面貢獻最大是具有挑戰(zhàn)性的。因為訓練在計算上是昂貴的,限制了可以完成的調(diào)整量,并且經(jīng)常使用大小不同的私人訓練數(shù)據(jù)進行,從而限制了測量建模進展影響的能力。為此,很多人針對BERT模型的相關(guān)缺陷進行了優(yōu)化,提出了在某一任務(wù)領(lǐng)域優(yōu)于BERT的預(yù)訓練模型。4.3.1RoBERTaLiuYinhan等[3]認為超參數(shù)的選擇對最終結(jié)果有重大影響,為此他們提出了BERT預(yù)訓練的重復(fù)研究,其中包括對超參數(shù)調(diào)整和訓練集大小影響的仔細評估。最終,他們發(fā)現(xiàn)了BERT預(yù)訓練的不足,并提出了一種改進的模型來訓練BERT模型(ARobustlyOptimizedBERTPre-trainingApproach,RoBERTa),該模型可以媲美或超過所有Post-BERT的性能,而且對超參數(shù)與訓練集的修改也很簡單,包括:(1)訓練模型時間更長,批數(shù)據(jù)的大小更大,數(shù)據(jù)更多。(2)刪除下一句預(yù)測目標(NextSentencePrediction)。(3)對較長序列的訓練。(4)動態(tài)掩蓋應(yīng)用于訓練數(shù)據(jù)的掩蓋模式。在BERT源碼中,隨機掩蓋和替換在開始時只執(zhí)行一次,并在訓練期間保存,可以將其看成靜態(tài)掩蓋。BERT的預(yù)訓練依賴于隨機掩蓋和預(yù)測被掩蓋的字或者單詞。為了避免在每個迭代中對每個訓練實例使用相同的掩蓋,文獻[4]的作者將訓練數(shù)據(jù)重復(fù)10次,以便在40個迭代中以10種不同的方式對每個序列進行掩碼,因此,每個訓練序列在訓練過程中都會看到4次相同的掩蓋。他們將靜態(tài)掩蓋與動態(tài)掩蓋進行了比較,證明了動態(tài)掩蓋的有效性。(5)他們還收集了一個大型新數(shù)據(jù)集(CC-NEWS),其大小與其他私有數(shù)據(jù)集相當,以更好地控制訓練集的大小。(6)使用Sennrich等提出的Byte-PairEncoding(BPE)字符編碼,它是字符級和單詞級表示之間的混合體,可以處理自然語言語料庫中常見的大詞匯,避免訓練數(shù)據(jù)出現(xiàn)更多的[UNK]標記符,影響預(yù)訓練模型的性能。其中,[UNK]標記符表示當在BERT自帶字典vocab.txt中找不到某個字或者英文單詞時用[UNK]表示。4.3.2ERNIE受到BERT掩蓋策略的啟發(fā),YuSun等[5]提出了一種新的語言表示模型ERNIE(EnhancedRepresentationthroughkNowledgeIntEgration)。ERNIE旨在學習通過知識掩蓋策略增強模型的性能,其中包括實體級掩蓋和短語級掩蓋,兩者的對比如圖4.7所示。圖4.73種掩蓋策略對比[5]實體級策略通??裳谏w由多個單詞組成的實體。短語級策略可掩蓋由幾個單詞組合成一個概念單元的整個短語。實驗結(jié)果表明,ERNIE優(yōu)于其他基準方法,在5種中文自然語言處理上獲得了最新的任務(wù),包括自然語言推理、語義相似性、命名實體識別、情感分析和問題解答。他們還證明了ERNIE在完形填空測試中具有更強大的知識推理能力。知識掩蓋策略如圖4.8所示。圖4.8知識掩蓋策略[5]4.3.3BERT_WWMBERT已在各種NLP任務(wù)中進行改進,因此基于BERT的改進模型接踵而至,帶有全字掩蓋(WholeWordMasking,WWM)的BERT升級版本BERT_WWM便是其中之一,它減輕了預(yù)訓練過程中掩蓋部分WordPiece字符的弊端。其中,WordPiece字符其實是筆者在4.2.1節(jié)介紹的英文單詞分詞,在將英文單詞輸入模型之前,需要將其轉(zhuǎn)換成詞根+詞綴的形式,如Playing轉(zhuǎn)換成Play+##ing。如果使用原生BERT的隨機掩蓋,可能會掩蓋Play或者##ing或者同時掩蓋兩者,但如果使用全字掩蓋,則一定掩蓋兩者。CuiYiming等[6]對中文文本也進行了全字掩碼,這會掩蓋整個詞組,而不是掩蓋中文字符。實驗結(jié)果表明,整個中文詞組被掩蓋可以帶來顯著的收益。BERT_WWM的掩蓋策略本質(zhì)上和ERNIE是相同的,所以在此不進行過多分析。BERT_WWM掩蓋策略如圖4.9所示。圖4.9BERT_WWM掩蓋策略[6]4.3.4ALBERTALBERT[7]的整體原理與BERT的原理差不多。最大的特點是它減少了參數(shù)量,并維持了BERT的性能,但它只是降低了空間復(fù)雜度,把參數(shù)量從108兆降到了12兆,但并沒有降低時間復(fù)雜度。用ALBERT進行預(yù)測的速度并沒有加快,甚至在同等性能的模型對比中還慢了。也就是說,ALBERT降低了參數(shù)量,但并不減少計算量。那么,ALBERT是怎么降低參數(shù)量的呢?主要通過矩陣分解(FactorizedEmbeddingParameterization)和跨層參數(shù)共享(Cross-layerParameterSharing)兩大機制。1.矩陣分解BERT的權(quán)重大小為詞匯表的長度V乘以每個字/單詞權(quán)重隱藏層大小H:V×H。ALBERT通過參數(shù)E來分解這個權(quán)重矩陣,讓整體權(quán)重參數(shù)變小,將V×H轉(zhuǎn)換成V×E+E×H,當E遠遠小于H時,模型所需的參數(shù)將大大減少。實驗證明參數(shù)E=128時,效果最佳。2.跨層參數(shù)共享通過分析,矩陣分解并不是降低模型參數(shù)量的最大貢獻者,跨層參數(shù)共享是ALBERT的重中之重,因為它的存在減少了BERT模型的絕大部分參數(shù)??鐚訁?shù)共享的機制非常簡單,單獨用一個自注意層循環(huán)12次,每層的參數(shù)都一樣。這樣算法就可以用1層的參數(shù)量來表示12層的參數(shù),為此,模型的參數(shù)大大降低。為什么這個機制能有效?筆者曾經(jīng)給BERT的每層參數(shù)做了分析,發(fā)現(xiàn)每層的參數(shù)基本相似,因此將它們直接共享了。在保持模型性能下降不太厲害的同時,選擇所有層次參數(shù)共享,降低的參數(shù)量是最多的,所以,ALBERT默認所有層次參數(shù)共享。很多BERT類的模型在預(yù)訓練的過程中放棄了NSP任務(wù),因為NSP任務(wù)不僅沒給下游任務(wù)的效果帶來提升,反而降低了整體的性能。為此,ALBERT同樣也放棄了NSP任務(wù),改用SOP(SentenceOrderPrediction)任務(wù)作為預(yù)訓練任務(wù)。SOP任務(wù)也很簡單,它的正例和NSP任務(wù)一致(判斷兩句話是否有順序關(guān)系),反例則是判斷兩句話是否為反序關(guān)系。舉個例子。正例:1.朱元璋建立的明朝。2.朱元璋處決了藍玉。反例:1.朱元璋處決了藍玉。2.朱元璋建立的明朝。雖然ALBERT降低了參數(shù)量,但它并沒有提高預(yù)測速度。出現(xiàn)這種情況的原因很簡單,BERT由12個自注意層堆疊而成,ALBERT同樣也由12個自注意層堆疊而成,在預(yù)測時,張量(Tensor)都需要經(jīng)過12個自注意層,所以速度并沒有提升。4.3.5ElectraElectra[8]采用的預(yù)訓練方式是GAN思想主導的預(yù)訓練,BERT直接采用15%的[MASK]掩蓋某些字符(Token),讓模型在預(yù)訓練過程中預(yù)測被掩蓋的字符。而Electra則將這個思想用在GAN的生成器中,先隨機掩蓋一些字符,然后用一個生成器(Generator)對被掩蓋的字符生成相應(yīng)的偽字符(FakeToken),而判別器(Discriminator,也就是Electra)用來判斷哪些字符被更換過,文獻[8]的作者將這個預(yù)訓練任務(wù)稱為RTD(ReplacedTokenDetection),如圖4.10所示。文獻[8]的主要貢獻是提出了一種最新的BERT類模型的預(yù)訓練方式——RTD。關(guān)鍵思想是訓練文本判別

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論