天天看點

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

智能系統與技術叢書 點選檢視第二章 點選檢視第三章

TensorFlow自然語言處理

Natural Language Processing with TensorFlow

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

[澳] 圖珊·加内格達拉(Thushan Ganegedara) 著

馬恩馳 陸 健 譯

第1章

自然語言處理簡介

自然語言處理(NLP)是了解和處理當今世界中大量非結構化資料的重要工具。最近,深度學習已被廣泛用于許多NLP任務,因為深度學習算法在諸如圖像分類、語音識别和現實文本生成等衆多具有挑戰性的任務中表現出顯著的性能。另一方面,TensorFlow是目前最直覺、最有效的深度學習架構之一。本書将向有志于深度學習的開發人員提供幫助,使他們能夠使用NLP和TensorFlow處理大量資料。

在本章中,我們對NLP以及本書其餘部分的内容提供基本介紹。将回答“什麼是自然語言處理?”這個問題。此外,也将介紹一些自然語言處理最重要的用途。還将介紹傳統方法和最新的基于深度學習的NLP方法,包括全連接配接神經網絡(FCNN)。最後,在概述本書其餘部分的内容以後,我們将介紹本書會使用的技術工具。

1.1 什麼是自然語言處理

根據IBM的資料,2017年每天都會生成2.5艾位元組(1艾位元組= 1?000?000?000千兆位元組)的資料,在本書的編寫過程中,這個量級還在不斷增加。從這個角度來看,如果這些資料全都要被處理,我們每個人每天将要處理大約300MB。因為人們每天都會産生數量龐大的電子郵件、社交媒體内容以及語音電話,而在所有這些資料中,很大一部分是非結構化的文本和語音。

這些統計資料為我們确定NLP是什麼提供了良好的基礎。簡而言之,NLP的目标是讓機器了解我們說的話和書面語言。此外,NLP無處不在,已經成為人類生活的重要組成部分。比如,Google智能助理、Cortana和Apple Siri這類虛拟助手(VA)主要是NLP系統。當一個人詢問VA時,會發生許多NLP任務,比如有人問:“你能告訴我附近有好吃的意大利餐館嗎?”首先,VA需要将話語轉換為文本(即語音到文本)。接下來,它必須了解請求的語義(例如,使用者正在尋找一個提供意大利美食的餐廳),并将請求結構化(例如,美食=意大利菜,評級= 3-5,距離<10千米)。然後,VA必須以美食和地點為篩選條件來搜尋餐廳,之後,根據收到的評級對餐廳進行排序。為了計算餐館的整體評級,一個好的NLP系統可能會檢視每個使用者提供的評級和文字描述。最後,一旦使用者到達該餐廳,VA可能會幫助使用者将各種菜名從意大利語翻譯成英語。這個例子表明,NLP已經成為人類生活中不可或缺的一部分。

我們需要明白,NLP是一個極具挑戰性的研究領域,因為單詞和語義具有高度複雜的非線性關系,并且将這些資訊變為魯棒的數字表示更加困難。更糟糕的是,每種語言都有自己的文法、句法和詞彙。是以,處理文本資料涉及各種複雜的任務,比如文本解析(例如,分詞和詞幹提取)、形态分析、詞義消歧以及了解語言的基礎文法結構。例如,在“I went to the bank”和“I walked along the river bank”這兩句話中,詞語bank有兩個完全不同的含義。為了區分或(弄清楚)這個單詞,我們需要了解單詞的使用環境。機器學習已成為NLP的關鍵推動因素,它通過各種模型幫助我們完成上述任務。

1.2 自然語言處理的任務

在現實世界中,NLP有很多實際的應用。一個好的NLP系統可以執行許多NLP任務。當你在Google上搜尋今天的天氣或使用谷歌翻譯将“how are you?”翻譯成法語時,你依賴NLP中的此類任務的一個子集。這裡列出一些最普遍的任務,本書涵蓋這些任務中的大部分:

  • 分詞:該任務将文本語料庫分隔成原子單元(例如,單詞)。雖然看似微不足道,但是分詞是一項重要任務。例如,在日語中,詞語不以空格或标點符号分隔。
  • 詞義消歧(WSD):WSD是識别單詞正确含義的任務。例如,在句子“The dog barked
  1. the mailman”和“Tree bark is sometimes used as a medicine”中,單詞bark有兩種不同的含義。WSD對于諸如問答之類的任務至關重要。
  • 命名實體識别(NER):NER嘗試從給定的文本主體或文本語料庫中提取實體(例如,人物、位置群組織)。例如,句子“John gave Mary two apples at school on Monday”将轉換為[John]name gave [Mary]name [two]number apples at [school]organization on [Monday.]time。NER在諸如資訊檢索和知識表示等領域不可或缺。
  • 詞性(PoS)标記:PoS标記是将單詞配置設定到各自對應詞性的任務。它既可以是名詞、動詞、形容詞、副詞、介詞等基本詞、也可以是專有名詞、普通名詞、短語動詞、動詞等。
  • 句子/概要分類:句子或概要(例如,電影評論)分類有許多應用場景,例如垃圾郵件檢測、新聞文章分類(例如,政治、科技和運動)和産品評論評級(即正向或負向)。我們可以用标記資料(即人工對評論标上正面或負面的标簽)訓練一個分類模型來實作這項任務。
  • 語言生成:在語言生成中,我們使用文本語料庫(包含大量文本文檔)來訓練學習模型(例如,神經網絡),以預測後面的新文本。例如,可以通過使用現有的科幻故事訓練語言生成模型,來輸出一個全新的科幻故事。
  • 問答(QA):QA技術具有很高的商業價值,這些技術是聊天機器人和VA(例如,Google Assistant和Apple Siri)的基礎。許多公司已經采用聊天機器人來提供客戶支援。聊天機器人可用于回答和解決客戶的直接問題(例如,更改客戶的每月學習計劃),這些任務無須人工幹預即可解決。QA涉及NLP的許多其他方面,例如資訊檢索和知識表示。結果,所有這些任務都使得開發QA系統變得非常困難。
  • 機器翻譯(MT):MT是将句子/短語從源語言(例如,德語)轉換為目智語言(例如,英語)的任務。這是一項非常具有挑戰性的任務,因為不同的語言具有不同的形态結構,這意味着它不是一對一的轉換。此外,語言之間的單詞到單詞關系可以是一對多、一對一、多對一或多對多,這在MT文獻中被稱為單詞對齊問題。

最後,為了開發一個可以幫助人們完成日常任務的系統(例如,VA或聊天機器人),許多這些任務需要合并執行。正如在前面的例子中看到的那樣,當使用者問:“你能告訴我附近有不錯的意大利餐館嗎?”需要完成幾個不同的NLP任務,比如語音轉換到文本、語義和情感分析、問答和機器翻譯。在圖1.1中,我們對不同的NLP任務進行層級分類,将它們分為不同的類型。首先有兩大類:分析(分析現有文本)和生成(生成新文本)任務。然後将分析分為三個不同的類别:句法(基于語言結構的任務)、語義(基于意義的任務)和實用(難以解決的公開問題):

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

了解了NLP中的各種任務後,讓我們繼續了解如何借助機器解決這些任務。

1.3 傳統的自然語言處理方法

NLP問題的傳統或經典的解決方法是幾個關鍵步驟組成的順序工作流,它是一種統計方法。當仔細研究傳統的NLP學習模型時,我們将能夠看到一系列明顯不同的任務,例如,通過删除不需要的資料來預處理資料,使用特征工程來獲得文本資料的良好數值表示,借助于訓練資料來使用機器學習算法,以及預測新的不熟悉資料的輸出。其中,如果要在給定NLP任務上獲得良好性能,特征工程是最耗時且最關鍵的步驟。

1.3.1 了解傳統方法

解決NLP任務的傳統方法涉及一組不同的子任務。首先,需要對文本語料庫進行預處理,重點是減少詞彙量和幹擾。所謂幹擾,指的是會幹擾算法,使其無法捕獲完成任務所需的重要語言資訊的那些東西(例如,标點符号和停止詞被删除)。

接下來,介紹幾個特征工程步驟。特征工程的主要目标是使算法的學習更容易,這些特征通常是手工設計的,并且偏向于人類對語言的了解。特征工程對于經典NLP算法非常重要,是以,性能最佳的系統通常具有最佳的工程特征。例如,對于情感分類任務,你可以用解析樹表示一個句子,并為樹中的每個節點/子樹标上正、負或中性标簽,以此将該句子分類為正面或負面。此外,特征工程階段可以使用外部資源(如詞彙資料庫WordNet)來發現更好的特征。我們很快就會看到一種簡單的特征工程技術,稱為詞袋。

接下來,該學習算法将使用所獲得的特征和可選的外部資源,來學習如何在給定任務中表現良好。例如,對于文本摘要任務,包含單詞同義詞的同義詞庫是很好的外部資源。最後,執行預測。預測非常簡單,隻需将新的資料輸入學習模型,然後獲得對應的預測标簽。傳統方法的整個過程如圖1.2所示。

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

傳統方法示例:生成足球比賽摘要

為了深入了解傳統的NLP方法,讓我們從足球比賽的統計資料中考慮自動生成文本的任務。我們有幾組遊戲統計資料(例如,得分、罰球和黃牌)和記者的比賽報道,将它們作為訓練資料。假設對于給定的比賽,有一個從每個統計參數到該參數的摘要中最相關短語的映射。我們的任務是,對于一場新的比賽,我們需要生成一個關于這場比賽的看上去自然的摘要。當然,可以簡單地從訓練資料中找到與新比賽最比對的統計資料,并找到相應的摘要,但是,這裡采用更智能和更優雅的文本生成方式。

如果要結合機器學習技術來生成自然語言,那麼可能會執行一系列諸如預處理文本,分詞、特征工程、學習和預測等操作。

預處理文本涉及一系列操作,比如詞幹化(例如,listened轉化為listen)和删除标點符号(例如,删除“!”和“;”),以減少詞彙量(即特征),進而減少所需的記憶體。明白詞幹化不是一項微不足道的操作很重要。詞幹化看似依賴于一組簡單規則的操作,比如從動詞中删除ed(例如,listened的詞幹是listen),然而,開發一個好的詞幹算法需要的不僅僅是一個簡單的規則庫,因為某些詞的詞幹可能很棘手(例如,argued的詞幹是argue)。此外,由于不同語言的複雜程度不一樣,正确詞幹化所需的工作量可能各不相同。

分詞是可能需要執行的另一個預處理步驟。分詞是将語料庫劃分為小實體(例如,單詞)的過程。對于像英語這樣的語言來說,這可能很容易,因為單詞是孤立的。但是,對于某些語言(如泰語、日語和中文)而言,情況并非如此,因為這些語言的詞語界定方式不一樣。

特征工程用于将原始文本資料轉換為數值形式,以便基于資料訓練模型,例如,稍後将讨論把文本轉換為詞袋表示,或使用n-gram表示。但請記住,有良好效果的經典模型依賴于更智能的特征工程技術。

下面是一些特征工程技術:

(1)詞袋:這是一種根據單詞出現頻率來建立特征表示的特征工程技術。例如,考慮以下句子:

  • Bob went to the market to buy some f?lowers?
  • Bob bought the f?lowers to give to Mary?

這兩句話的詞彙表是:

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

接下來,将為每個句子建立一個大小為V(詞彙表大小)的特征向量,以表示該詞彙表中每個單詞出現在句子中的次數。在這個例子中,句子的特征向量分别如下:

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

詞袋方法的一個關鍵缺陷是,由于不再保留單詞的順序,它會丢失上下文資訊。

(2)n-gram:這是另一種特征工程技術,它将文本分解為由n個字母(或單詞)組成的較小元素。例如,2-gram會将文本分成兩個字母(或兩個單詞)的實體。例如,考慮這句話:

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

這句話的字母級别n-gram分解如下:

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

這句話的單詞級别n-gram分解如下:

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

這種字母級别表示法的優點是,在大型語料上詞彙表大小比我們使用單詞作為特征的詞彙表要小得多。

接下來,需要讓我們的資料形成某種結構,以便能夠将其輸入學習模型。例如,将使用以下形式的資料元組(統計量,是用于解釋統計資訊的短語):

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

學習過程可以包括三個子子產品:隐馬爾可夫模型(HMM)、句子規劃器和話語規劃器。在我們的例子中,HMM可以通過分析相關短語的語料庫來學習語言的形态結構和文法屬性。更具體地說,我們把資料集中的每個短語連起來形成一個序列,其中,第一個元素是統計量,後跟解釋它的短語。然後,我們将根據目前序列,通過要求HMM預測下一個單詞來訓練它。具體地說,首先将統計量輸入HMM,然後得到HMM的預測,之後,将最後一個預測與目前序列連接配接起來,并要求HMM給出另一個預測,以此類推。這将使HMM能夠在給定統計量的情況下輸出有意義的短語。

接下來,我們可以用一個句子規劃器來糾正可能出現在短語中的任何語言錯誤(形态或文法錯誤)。例如,一個句子規劃器可以将“I go house”這個短語糾正為“I go home”。它可以使用規則資料庫,這個資料庫包含使含義得以正确表達的方法(例如,在動詞和“house”之間需要有介詞)。

現在,可以使用HMM為給定的統計資料集生成一組短語,然後,需要把這些短語聚合在一起,使得使用這些短語創作的文章是可閱讀的,并且是流暢的。例如,考慮三個短語:“Player 10 of the Barcelona team scored a goal in the second half”、“Barcelona played against Manchester United”和“Player 3 from Manchester United got a yellow card in the f?irrst

half”。按此順序排列這些句子沒有多大意義。我們希望按如下順序排列:“Barcelona played against Manchester United, Player 3 from Manchester United got a yellow card in the rst half, and Player 10 of the Barcelona team scored a goal in the second half”。為此,我們使用話語規劃器,話語規劃器可以對需要傳達的資訊進行排列和結構組織。

現在可以獲得一組任意的測試統計資料,并按照前面的處理流程得到一篇解釋該統計資料的文章,如圖1.3所示。

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

在這裡要注意,這是一個在很高層次上的說明,僅涵蓋傳統NLP方式中最有可能包含的主要的一般性組成部分。取決于我們有興趣解決的具體應用,細節可能會有很大差異。例如,某些任務可能需要其他特定應用的關鍵組成部分(機器翻譯中的規則庫和對齊模型)。然而,在本書中,我們并沒有強調這些細節,因為這裡的主要目标是讨論更先進的自然語言處理方法。

1.3.2 傳統方法的缺點

讓我們列出傳統方法的幾個主要缺點,因為這将為讨論為什麼需要深度學習奠定良好的基礎:

  • 傳統NLP中使用的預處理步驟迫使我們對文本中嵌入的潛在有用資訊(例如,标點符号和時态資訊)進行取舍權衡,以便通過減少詞彙量來使學習成為可能。盡管在現代的基于深度學習的解決方案中我們仍然會使用預處理,但由于深度網絡具有較大的表征容量,是以預處理并不像在傳統的NLP流程中那樣重要。
  • 需要人工手動設計特征工程。為了設計可靠的系統,需要設計好的特征。由于需要廣泛探索不同的特征空間,是以這個過程非常煩瑣。此外,為了有效地探索強大的特征,需要領域專業知識,這對于某些NLP任務來說是缺乏的。
  • 傳統方法需要各種外部資源才能表現良好,并且沒有多少免費提供的資源。這樣的外部資源通常包括存儲在大型資料庫中的人工建立的資訊。為特定任務建立資源可能需要幾年時間,具體取決于任務的嚴格性(例如,機器翻譯規則庫)。

1.4 自然語言處理的深度學習方法

我認為深度學習徹底改變了機器學習,特别是在計算機視覺、語音識别和NLP領域。深層模型在機器學習的許多領域掀起了一輪範式轉換的波瀾,因為深層模型可以從原始資料中學習豐富的特征,而無須使用有限的人工設計特征。這導緻令人讨厭且成本昂貴的特征工程被淘汰。這樣一來,深層模型使得傳統方法更有效,因為深層模型可以同時執行特征學習和任務學習。此外,由于深層模型中有大量參數(即權重),這使得它可以比人工設計擁有更多的特征。然而,由于模型的可解釋性差,深層模型被認為是黑盒。例如,對于給定問題,了解深層模型“如何”學習特征和學習“什麼”特征仍然是一個懸而未決的問題。

深層模型本質上是一種人工神經網絡,它有輸入層、位于中間的許多互相連接配接的隐藏層以及輸出層(例如,分類器或回歸器)。就像你看到的那樣,這構成了從原始資料到最終預測的端到端模型。中間的這些隐藏層為深層模型提供動力,因為它們負責從原始資料中學習“好”的特征,進而最終成功解決手頭的任務。

1.4.1 深度學習的曆史

讓我們簡單地介紹一下深度學習的根源,以及它是如何演變為一種非常有前景的機器學習技術的。1960年,Hubel和Weisel進行了一項有趣的實驗,發現貓的視覺皮層由簡單細胞和複雜細胞組成,并且這些細胞以分層形式組織,而且,這些細胞對不同刺激的反應不同。例如,簡單細胞會被不同朝向的邊緣外形激活,而複雜細胞則對空間變化(例如,邊緣外形的朝向)不敏感。這刺激了人們在機器中複制類似行為,進而産生了深度學習的概念。

在随後的幾年中,神經網絡引起了許多研究者的關注。1965年,由Ivakhnenko和其他人引入了一種神經網絡,該網絡以Rosenblatt提出的著名的感覺器(Perceptron)為基礎,并通過一種稱為資料處理組方法(GMDH)進行訓練。後來,在1979年,福島引入了Neocognitron,該網絡為最著名的深層模型之一(卷積神經網絡)奠定了基礎。與始終采用一維輸入的感覺器不同,Neocognitron能夠使用卷積操作處理2D輸入。

人工神經網絡過去通常通過計算目前層和前一層的雅可比矩陣來反向傳播誤差信号,以優化網絡參數。此外,梯度消失的問題嚴重限制了神經網絡的潛在層數(深度)。靠近輸入的層的梯度非常小,這被稱為梯度消失現象,其原因是應用鍊式法則來計算較低層權重的梯度(雅可比矩陣),這又限制了經典神經網絡的可能的最大深度。

然後在2006年,人們發現通過最小化網絡的每一層的重建誤差(通過嘗試将輸入壓縮到較低次元然後将其重建回原始次元而獲得該誤差)來預訓練深度神經網絡,可以為神經網絡權重提供一個良好的初值。這使得梯度可以從輸出層一直保持到輸入層。這基本上使神經網絡模型可以有更多層,進而避免梯度消失的不利影響。此外,這些更深層的模型能夠在許多任務中超越傳統的機器學習模型,主要是在計算機視覺領域(例如,MNIST手寫數字資料集的測試準确度)。有了這一突破,深度學習成為機器學習社群的流行語。

在2012年,由Alex Krizhevsky(

http://www.cs.toronto.edu/~kriz/

)、Ilya Sutskever(

http://www.cs.toronto.edu/~lya/

)和Geoff Hinton建立的深度卷積神經網絡AlexNet赢得了2012年大規模視覺識别挑戰賽(LSVRC),誤差比從之前的最佳值下降了10%,這為神經網絡的進步提供了動力。在此期間,語音識别取得了進展,據報道,良好的語音識别準确度是因為使用了深層神經網絡。此外,人們開始意識到圖形處理單元(GPU)可以實作更多的并行性,與中央處理單元(CPU)相比,它可以更快地訓練更大和更深的神經網絡。

更好的模型初始化技術(例如,Xavier初始化)進一步改進了深層模型,使得耗時的預訓練變得多餘。此外,還引入了更好的非線性激活函數,如ReLU(Rectied Linear Unit),它減少了深層模型處理梯度消失的不良影響。更好的優化(或學習)技術(如Adam)可以在神經網絡模型所擁有的數百萬個參數中自動調整每個參數的學習率,這一技術在許多不同的機器學習領域中重新整理了最好的成績,如物體分類和語音識别。這些進步還允許神經網絡模型具有大量隐藏層,而可以增加隐藏層數(進而使神經網絡更深)是神經網絡模型明顯比其他機器學習模型效果更好的主要原因之一。此外,更好的層間歸一化(例如,批量歸一化層)已經在很多任務中提高了深度網絡的性能。

後來,人們引入了更深層的模型,如ResNets、HighwayNets和LadderNets,它們有數百層和數十億個參數。借助各種由經驗和理論所激發的技術,神經網絡可以具有龐大的層數。例如,ResNets通過捷徑連接配接技術在相距很遠的層之間建立連接配接,這可以最大限度地減少之前提到的層之間的梯度消失問題。

1.4.2 深度學習和NLP的目前狀況

自2000年年初以來,許多不同的深層模型已經開始嶄露頭角。即使它們有相似之處(例如所有這些模型都對輸入和參數進行非線性變換),但細節仍然有很大差異。例如,卷積神經網絡(CNN)可以從原始二維資料(例如,RGB圖像)中進行學習,而多層感覺器模型需要将輸入變為一維向量,這會導緻損失重要的空間資訊。

在處理文本時,由于對文本最直覺的解釋之一是将其視為字元序列,是以,學習模型應該能夠對時間序列進行模組化,進而需要有過去的記憶。要了解這一點,可以想象有這樣一個語言模組化任務,單詞cat的下一個單詞應該與單詞climbed的下一個單詞不同。遞歸神經網絡(RNN)是具有這種能力的流行模型中的一種。我們将在第6章中看到RNN如何通過互動式訓練來實作這一點。

應該注意,記憶不是學習模型固有的微不足道的操作,相反,持久記憶的方式是需要仔細設計的。此外,記憶不應與僅關注目前輸入的無序深度網絡學習到的權重相混淆,序列模型(例如,RNN)将同時關注學習到的權重和序列中前一個元素,以此預測下一個輸出。

RNN的一個突出缺點是它不能記住超過若幹(大約為7個)時間步長的元素,是以它缺乏長期記憶能力。長短期記憶(LSTM)網絡是具有長期記憶的RNN擴充模型。是以,如今LSTM模型通常優于标準RNN模型。我們将在第7章深入探讨,以便更好地了解它。

總之,我們可以将深度網絡主要分為兩類:在訓練和預測時每次隻處理單個輸入的無序模型(例如,圖像分類),和處理任意長度序列的輸入的順序模型(例如,在文本生成中,單個單詞是一個輸入)。然後,可以将無序(也稱為前饋)模型分類為深(大約少于20層)和非常深(可以大于數百層)的網絡。序列模型分為隻能記憶短期模式的短期記憶模型(例如,RNN)和可記憶更長模式的長期記憶模型。在圖1.4中,我們大緻描述了以上讨論的分類,你不必完全按照這種方式了解不同的深度模型,它隻是說明深度學習模型的多樣性。

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

1.4.3 了解一個簡單的深層模型—全連接配接神經網絡

現在讓我們仔細研究深度神經網絡,以便更好地了解它。雖然深層模型有許多不同的變體,但最早的模型之一可追溯到1950~1960年,它被稱為全連接配接神經網絡(FCNN),有時也被稱為多層感覺器,圖1.5描繪了标準的三層FCNN。

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

FCNN的目标是将輸入(例如,圖像或句子)映射到特定标簽或注釋(例如,圖像的類别)。這可以使用h = sigma(W

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

x + b)之類的變換,通過計算x的隐藏表示h來實作。這裡,W和b分别是FCNN的權重和偏差,sigma是S形(sigmoid)激活函數。接下來,将分類器(例如,softmax分類器)放置在FCNN的頂部,該分類器能夠利用隐藏層中的學習特征來對輸入進行分類。分類器是具有權重Ws和偏差bs的另一個隐藏層,它本質上是FCNN的一部分。然後,可以用公式output = softmax(Ws

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

h + bs)計算FCNN的輸出。例如,softmax分類器提供分類器層輸出分數的歸一化表示,該标簽被認為是具有最高softmax值的輸出節點。然後,根據這個結果,我們可以計算預測的輸出标簽和實際的輸出标簽之間的差異,将它定義為分類損失。均方損失是這種損失函數的一個例子。你不必擔心不了解損失函數的實際細節,我們将在後面的章節中讨論很多損失函數。接下來,使用标準随機優化器(例如,随機梯度下降)來優化神經網絡參數W,b,Ws和bs,以減少所有輸入的分類損失。圖1.5描述了本段中針對三層FCNN的解釋過程。我們将在第3章逐漸介紹如何将這種模型用于NLP任務的細節。

讓我們看一個如何将神經網絡用于情感分析任務的示例。想象一下我們有一個資料集,其中,輸入是一個表達對電影的正面或負面意見的句子,以及一個相應的标簽,說明該句子實際上是正面(1)還是負面(0)。然後,針對一個測試資料集,其中隻包含電影評論(沒有評論标簽),我們的任務是将這些新句子分類為正面或負面的。

按照以下工作流程,可以使用神經網絡(深層或淺層,取決于任務的難度)來處理這項任務:

  • 對句子進行分詞
  • 如有必要,使用特殊标記填充句子,使所有句子都是固定長度
  • 将句子轉換為數值表示(例如,詞袋表示)
  • 将數值表示輸入到神經網絡并預測輸出(正面或負面)
  • 使用所需的損失函數優化神經網絡

1.5 本章之外的學習路線

本節描述本書其餘部分的細節,雖然很簡短,但是它囊括了本書各章内容的詳細資訊。在本書中,我們将研究NLP的衆多令人興奮的領域,從在沒有任何類型的注釋資料情況下尋找單詞相似性的算法,到可以自己編寫故事的算法,均會涉及。

從下一章開始,我們将深入探讨幾個流行且有趣的NLP任務的細節。為了更深入地了解獲得的知識并增加學習的互動性,我們還提供了各種練習。我們将使用Python和TensorFlow(一個用于分布式數值計算的開源庫)來實作所有任務。TensorFlow封裝了先進的技術,例如,使用CUDA(Compute Unied Device Architecture)優化GPU代碼,這可能具有挑戰性。此外,TensorFlow提供内置函數來實作深度學習算法,例如激活函數、随機優化方法和卷積,這使得實作過程更輕松。

本書将開始一個涵蓋NLP的許多熱門話題以及它們如何實作的旅程,同時使用TensorFlow來了解最先進的算法。下面是我們将在本書中看到的内容:

  • 第2章介紹如何編寫用戶端程式并在TensorFlow中運作它們。這一點非常重要,特别是在你不熟悉TensorFlow的情況下,因為TensorFlow與傳統的編碼語言(如Python)的運作方式不同。本章首先深入解釋TensorFlow如何執行用戶端程式,這将有助于你了解TensorFlow的執行工作流程,并習慣TensorFlow的術語。接下來,本章将引導你了解TensorFlow用戶端程式的各種元素,例如定義變量、定義操作/函數、向算法提供輸入以及擷取結果。最後将讨論如何用所有這些TensorFlow知識實作一個複雜的神經網絡以對手寫圖像進行分類。
  • 第3章的目的是介紹Word2vec,這是一種用于學習單詞的數值表示的方法,這種表示可以反映單詞的語義。但在深入研究Word2vec技術之前,我們将首先讨論一些用于表示單詞語義的經典方法。早期的方法之一是依賴WordNet這個大型詞彙資料庫,WordNet可用于衡量不同單詞之間的語義相似性。但是,要維護這麼大的詞彙資料庫,其成本是很昂貴的,是以,還有其他更簡單的表示技術,例如獨熱編碼表示以及tf-idf方法,這些技術不依賴于外部資源。接下來,我們将介紹學習單詞向量化的現代方法,稱為Word2vec,在這種方法中,我們使用神經網絡來學習單詞表示。該章将讨論兩種流行的Word2vec技術:skip-gram和連續詞袋(CBOW)模型。
  • 第4章首先比較幾個算法(包括skip-gram和CBOW算法),看看是否有明确的赢家。然後,将讨論在過去幾年中對原始Word2vec技術的幾項擴充。例如,忽略文本中高機率的常見單詞(例如“the”和“a”)可以提高Word2vec模型的性能。另一方面,Word2vec模型僅考慮單詞的局部上下文,而忽略整個語料庫的全局統計資訊。是以,将讨論稱為GloVe的單詞嵌入學習技術,它在學習單詞向量的過程中會結合全局和局部統計資訊。
  • 第5章介紹卷積神經網絡(CNN)。卷積網絡是一個強大的深層模型系列,它可以利用輸入的空間結構來從資料中進行學習。換句話說,CNN能夠以二維形式處理圖像,在此過程中,多層感覺器需要将圖像展開為一維向量。我們将首先詳細讨論CNN中的各種操作,例如卷積和池化操作。然後,将通過一個例子介紹如何用CNN對手寫數字圖像進行分類。之後,将過渡到NLP中的CNN應用。準确地說,我們将研究如何用CNN來對涉及人、位置、物體等内容的句子進行分類。
  • 第6章重點介紹遞歸神經網絡(RNN)和使用RNN進行語言生成。RNN具有記憶功能,是以與前饋神經網絡(例如,CNN)不同,它可以将記憶作為持續更新的系統狀态進行存儲。我們将從前饋神經網絡的表示開始,然後修改這種表示,以便可以從資料序列而不是單個資料點進行學習,此過程會将前饋網絡轉換為RNN。接下來,我們從技術角度描述RNN内部計算的方程式。然後,将讨論用于更新RNN權重的RNN的優化過程。此後,将逐一介紹不同類型的RNN,例如一對一RNN和一對多RNN。接着,将介紹一個令人興奮的RNN應用,其中,RNN通過學習現有故事的語料庫,嘗試講述新故事。我們通過訓練RNN在故事中給定前一個單詞序列的情況下預測下一個單詞,來實作此目的。最後,将讨論标準RNN的變體,我們将其稱為RNN-CF(具有上下文特征的RNN),并将其與标準RNN進行比較,看看哪個更好。
  • 第7章首先直覺地介紹長期短期記憶網絡模型是如何工作的,然後逐漸深入技術細節,讓你可以自己應用它們。标準RNN的嚴重限制在于不能記憶長期資訊,其改進模型是可以記住大量時間步長序列的先進的RNN模型,例如,長短期記憶網絡(LSTM)和門控循環單元(GRU)。我們還将考查LSTM如何緩解記憶長期資訊的問題(稱為梯度消失問題)。然後,将讨論可以進一步提高LSTM模型性能的若幹改進,例如,一次向前預測幾個時間步長,并向前和向後讀取序列資訊。最後,我們将讨論LSTM模型的幾種變體,例如,帶有窺孔連接配接的GRU和LSTM。
  • 第8章解釋如何使用第7章中讨論的帶有窺孔連接配接的LSTM、GRU和LSTM。此外,将在品質和數量上比較這些擴充的性能。我們還将讨論如何實作第7章中提到的一些擴充,例如,預測前面的幾個時間步長(稱為集束搜尋),并使用詞向量而非獨熱編碼作為輸入。最後,将讨論如何使用TensorFlow的子庫RNN API,它簡化了模型的實作。
  • 第9章着眼于另一個激動人心的應用,即讓模型學習如何使用LSTM和CNN生成圖像的标題(描述)。這個應用程式很有趣,因為它向我們展示了如何組合兩種不同類型的模型,以及如何學習多模态資料(例如,圖像和文本)。具體實作方法是,首先利用CNN學習圖像表示(類似于單詞向量),然後把該圖像向量和相應的圖像描述單詞作為序列來訓練LSTM。我們将首先讨論如何使用預訓練的CNN來獲得圖像表示,之後讨論如何學習詞嵌入。接下來,将讨論如何把圖像向量與字詞嵌入一起送入網絡來訓練LSTM,随後是對評估圖像描述系統的不同度量方法的描述。之後,我們将定性和定量地評估模型生成的标題。在本章結束時會介紹如何使用TensorFlow的RNN API實作相同的系統。
  • 第10章介紹神經機器翻譯。由于翻譯自動化的必要性和任務的固有難度,機器翻譯已經引起了很多關注。我們将在本章開頭簡要介紹機器翻譯在早期的實作方式,最後會讨論神經機器翻譯(NMT)系統。我們将看到目前NMT系統與舊系統(如統計機器翻譯系統)相比的表現如何,這将激勵我們了解NMT系統。之後,将讨論NMT系統設計背後的靈感,并繼續介紹技術細節。然後,将讨論用于評估翻譯系統的名額。在此之後,将研究如何從頭實作德語到英語的翻譯系統。接下來,将了解改進NMT系統的方法。會将詳細介紹其中一個擴充,稱為注意力機制。注意力機制已經成為序列到序列學習問題的必要條件。最後,将比較通過引入注意力機制獲得的性能提升,并分析性能提升背後的原因。本章最後一小節将介紹如何把NMT系統的概念擴充到聊天機器人,聊天機器人是可以與人交流并解答各種客戶請求的系統。
  • 第11章介紹目前趨勢和自然語言處理的未來。自然語言處理已廣泛擴充到各種不同任務。本章将讨論NLP的一些目前趨勢和未來NLP發展前景。首先讨論最近出現的各種詞嵌入的擴充方法,還将研究一種稱為tv-embedding的詞嵌入學習技術的實作。接下來,将研究神經機器翻譯領域的各種趨勢。然後,将看看NLP如何與其他領域(如計算機視覺和強化學習)相結合,以解決一些有趣的問題,比如教計算機設計自己的語言進行交流。如今,另一個蓬勃發展的領域是泛人工智能,它是用單個系統完成多項任務(分類圖像、翻譯文本、字幕圖像等)的系統。我們将介紹幾個這樣的系統。之後,将讨論挖掘社交媒體中的NLP。本章結束時會介紹一些新任務(例如,語言基礎-開發廣義NLP系統)和新模型(例如,短語LSTM)。
  • 附錄将向讀者介紹各種數學資料結構(例如,矩陣)和操作(例如,矩陣的逆),我們還将讨論機率中的幾個重要概念,然後介紹Keras,這是一個底層使用TensorFlow的進階庫。Keras通過隐藏TensorFlow中的一些具有挑戰性的細節,使得神經網絡的實作更簡單。具體而言,我們将看到如何使用Keras實作CNN,以了解如何使用Keras。接下來,将讨論如何在TensorFlow中使用seq2seq庫來實作一個神經機器翻譯系統,這比我們在第11章中使用的代碼要少很多。最後,将向你介紹如何使用TensorBoard可視化詞嵌入的指南。TensorBoard是TensorFlow附帶的便捷可視化工具,可用于可視化和監視TensorFlow程式中的各種變量。

1.6 技術工具簡介

在本節中,你将了解在之後章節的練習中會使用的技術工具。首先,将簡要介紹所提供的主要工具。接下來,将提供有關如何安裝每個工具的粗略指南,以及官方網站提供的詳細指南的連結。此外,會有如何確定工具正确安裝的提示。

1.6.1 工具說明

我們将使用Python作為程式設計/腳本語言。Python是一種非常通用的易于設定的程式設計語言,它被科學界廣泛使用。此外,還有許多圍繞Python的科學計算庫,适用于從深度學習到機率推理,再到資料可視化等各個領域。TensorFlow就是這樣一個在深度學習社群中衆所周知的庫,它提供許多對深度學習有用的基本和進階操作。接下來,我們将在所有練習中使用Jupyter Notebook,因為與使用IDE相比,它提供了更具互動性的編碼環境。我們還将使用scikit-learn(另一種流行的Python機器學習工具包)以實作各種各樣的目的,例如資料預處理。另一個将用于各種文本相關操作的庫是NLTK(Python自然語言工具包)。最後,我們将使用Matplotlib進行資料可視化。

1.6.2 安裝Python和scikit-learn

Python可以輕松安裝在任何常用的作業系統中,如Windows、macOS或Linux。我們将使用Anaconda來設定Python,因為它可以完成設定Python以及基本庫的所有繁重工作。

按照以下步驟安裝Anaconda:

1.從

https://www.continuum.io/downloads

下載下傳Anaconda。

2.選擇合适的作業系統然後下載下傳Python 3.5。

3.按照連結

https://docs.continuum.io/anaconda/install/

中的說明安裝Anaconda。

按照以下步驟檢視Anaconda是否正确安裝:

1.打開終端視窗(Windows中的指令提示符)。

2.運作以下指令:

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

如果安裝正确,目前Anaconda發行版的版本号應在終端顯示。

接下來,按照

http://scikit-learn.org/stable/install.html

中的指導安裝scikit-learn,安裝NLTK的指導是

https://www.nltk.org/install.html

,安裝Matplotlib的指導是

https://matplotlib.org/users/installing.html

1.6.3 安裝Jupyter Notebook

可以按照

http://jupyter.readthedocs.io/en/latest/install.html

中的指導安裝Jupyter Notebook。

按照以下步驟檢視Jupyter Notebook是否安裝正确:

1.打開終端。

2.運作指令:

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

你應該看到一個新的浏覽器視窗,如圖1.6所示。

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

1.6.4 安裝TensorFlow

請按照

https://www.tensorflow.org/install/

中“Installing with Anaconda”部分下的說明安裝TensorFlow,我們将在所有練習中使用TensorFlow 1.8.x。

在按照說明提供tfBinaryURL時,請確定提供TensorFlow 1.8.x版本。之是以強調這一點,因為與以前的TensorFlow版本相比,API已有許多變化。

按照以下步驟檢視TensorFlow是否正确安裝:

1.在Windows或Linux或MacOS中打開指令提示符。

2.輸入python進入Python運作環境,之後應該可以看到Python版本号,請確定你使用的是Python 3。

3.接下來輸入以下代碼:

帶你讀《TensorFlow自然語言處理》之一:自然語言處理簡介第1章

如果一切順利,應該沒有任何錯誤(如果你的計算機沒有專用GPU,可能會有警告,但你可以忽略它們),并且應顯示TensorFlow版本1.8.x。

還可以使用許多基于雲的計算平台,在那裡你可以使用各種自定義選項(作業系統、GPU卡類型、GPU卡數量等)配置自己的計算機。許多人正在遷移到這種基于雲的服務,因為它有以下好處:

  • 更多個性化選項
  • 更少的維護成本
  • 沒有基礎設施要求

以下是一些流行的基于雲的計算平台:

1.7 總結

在本章中,通過廣泛探索NLP,我們了解了建構基于NLP的良好系統所涉及的任務類型。首先,我們解釋了為什麼需要NLP,然後讨論NLP的各種任務,以便大緻了解每項任務的目标以及在這些任務中取得成功的難度。接下來,我們研究了解決NLP的經典方法,并使用生成足球比賽的摘要作為例子,了解流程的細節。我們看到傳統方法通常涉及煩瑣乏味的特征工程。例如,為了檢查生成的短語的正确性,我們可能需要為該短語生成一個解析樹。接下來,我們讨論了深度學習所帶來的範式轉變,并看到了深度學習如何使特征工程步驟變得過時。我們回顧了深度學習和人工神經網絡的曆史,然後介紹了有數百個隐藏層的大規模現代網絡。之後,我們通過一個簡單的例子來闡明一個深層模型(多層感覺器模型)來了解在這樣一個模型中的數學原理。

有了傳統和現代NLP方法的良好基礎後,我們讨論了本書主題的路線圖,從學習詞嵌入到強大的LSTM,從生成圖像的标題到神經機器翻譯。最後,我們介紹了如何安裝Python、scikit-learn、Jupyter Notebook和TensorFlow來設定我們的環境。

在下一章中,你将學習TensorFlow的基礎知識,學習結束時,你應該學會編寫一個簡單算法,它可以接受輸入,并通過定義的函數對輸入進行轉換,最後輸出結果。