前言
本書旨在將新手帶入自然語言處理(Natural Language Processing,NLP)和深度學習的領域,為讀者打造涵蓋這兩個領域關鍵主題的試驗臺。如今,這兩個主題領域都呈指數(shù)增長狀態(tài)。在介紹深度學習和NLP 并著重于實現(xiàn)的同時,這本書定位于重要的中間立場。寫這本書時,我們在省去哪些材料上做出了十分艱難的選擇。對于初學者而言,我們希望本書能幫助你打下堅實的知識基礎,并讓你認識到更高級實現(xiàn)的可能性。機器學習,尤其是深度學習,是一門與知識科學不同的經驗學科。每章中大量的端到端代碼示例可以讓你更好地參與到編程體驗中來。
當我們開始編寫本書時,我們從PyTorch 0.2 開始。 隨著PyTorch 從0.2 更新到0.4,我們也在修訂我們的示例。PyTorch 1.0 即將在本書發(fā)行時發(fā)布。本書中的代碼示例與PyTorch 0.4 兼容,并應與即將發(fā)布的PyTorch 1.0 版本一起使用。注1
關于本書風格的注釋。我們在大多數(shù)地方有意避免使用數(shù)學,不是因為深度學習數(shù)學特別困難(其實沒有那么難),而是因為它在許多情況下都偏離了本書的主要目標——鼓勵初學者。同樣,在許多情況下,無論是在代碼方面還是在文本方面,我們都傾向于詳細闡述而非簡潔。高級讀者和經驗豐富的編程人員可能有能力和方法簡化代碼,但是我們選擇盡可能明確,以覆蓋到接觸本書的最廣泛受眾。
本書內容約定
在本書中,按以下約定進行排版:
斜體英文(Italic)
表示新名詞、URL、電子郵件地址、文件名以及文件擴展名。
等寬英文字體(Constant width)
用于程序代碼,以及在正文中引用變量、函數(shù)名稱、數(shù)據(jù)類型、環(huán)境變量、語句、關鍵字等代碼中的元素。
粗體等寬字體(Constant width bold)
需要用戶輸入的命令或其他文本。
斜體等寬字體(Constant width italic)
需要替換成用戶自定義的值或根據(jù)上下文決定的值。
使用代碼示例
補充材料(代碼示例,練習等)可從以下網站下載:
https://nlproc.info/PyTorchNLPBook/repo/。
這本書可以幫助您完成工作。通常,如果本書提供了示例代碼,則可以在程序和文檔中使用它。除非您要復制大部分代碼,否則無需與我們聯(lián)系以獲取許可。例如,編寫使用本書中若干代碼段的程序無需許可。以CD-ROM 形式出售或發(fā)布O’Reilly 書籍中的示例需要獲得許可。引用本書并引用示例代碼來回答問題無需許可。要將本書中的大量示例代碼納入產品的文檔時需獲得許可。
我們不強制要求署名,但如果你這么做,我們深表感激。署名一般包括書名、作者、出版社和國際標準書號(ISBN)。例如:“Natural LanguageProcessing with PyTorch by Delip Rao and Brian McMahan (O’Reilly).Copyright 2019, Delip Rao and Brian McMahan, 978-1-491-97823-8. ”。如果你覺得你對示例代碼的使用行為超出了合理的方式或超出了上述的允許不獲取授權的場景,可以與我們取得聯(lián)系:permissions@oreilly.com。
O’Reilly 在線學習平臺(O’Reilly Online Learning)
近40 年來,O’Reilly Media 致力于提供技術和商業(yè)培訓、知識和卓越見解,來幫助眾多公司取得成功。
我們擁有獨一無二的專家和革新者組成的龐大網絡,他們通過圖書、文章、會議和我們的在線學習平臺分享他們的知識和經驗。O’Reilly 的在線學習平臺允許你按需訪問現(xiàn)場培訓課程、深入的學習路徑、交互式編程環(huán)境,以及O’Reilly 和200 多家其他出版商提供的大量文本和視頻資源。有關的更多信息,請訪問http://oreilly.com。
聯(lián)系我們
請將有關本書的建議和問題發(fā)送給出版社:
美國:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中國:
北京市西城區(qū)西直門南大街2號成銘大廈C座807室(100035)
奧萊利技術咨詢(北京)有限公司
我們?yōu)楸緯峁┝艘粋網頁,上面有勘誤表、示例和其他相關的信息,請訪問:http://bit.ly/nlprocbk。
有關本書的建議或者技術問題,請發(fā)郵件到bookquestions@oreilly.com。
有關其他圖書、講座、會議、新聞的信息,請訪問我們的網站:http://www.oreilly.com。
我們的Facebook:http://facebook.com/oreilly。
我們的Twitter:http://twitter.com/oreillymedia。
我們的YouTube:http://www.youtube.com/oreillymedia。
致謝
本書經歷了各種各樣的演變,本書的每個版本看上去都與以前的版本不同。每個版本涉及不同的人員(甚至不同的DL 框架)。
作者要感謝Goku Mohandas 最初參與本書的工作。在Goku 因工作原因不得不離開之前,Goku 為該項目投入了很多精力。Goku 對PyTorch 的熱情和他的積極性無與倫比,作者想念與他共事的經歷。我們期待他帶來卓越的成績!如果沒有我們的技術評論員Liling Tan 和Debasish Gosh 的高質量反饋,這本書就無法達到如此的技術層次。Liling 貢獻了他在先進的NLP 產品開發(fā)方面的專業(yè)知識,而Debasish 從開發(fā)人員的角度提供了非常有價值的反饋。我們同樣感謝Alfredo Canziani,Soumith Chintala 和其他許多來自PyTorch 開發(fā)人員論壇的杰出人員所給予的鼓勵。該社區(qū)對本書的許多見解的影響與我們自身的實踐一樣重要。
如果不感謝我們的編輯Jeff Bleiel 給予我們的出色支持,那會是我們的失職。沒有他的指導,這本書就無法呈現(xiàn)在各位讀者面前。Bob Russell 的文字編輯和Nan Barber 的產品支持將這份手稿從草稿轉變成了可印刷的書。我們還要感謝Shannon Cutt 在本書早期所給予的支持。
書中的大部分內容都是根據(jù)作者在O’Reilly 的AI and Strata 會議上所提供的NLP 培訓發(fā)展而來,該培訓為期2 天。我們要感謝Ben Lorica,Jason Perdue和Sophia DeMartini 與我們一起參與培訓。
Delip 非常感謝Brian McMahan 作為合著者。Brian 竭盡全力支持這本書的發(fā)展。這是一次與Brian 同甘共苦的旅程! Delip 還想感謝O’Reilly 的Ben Lorica 最初堅持要寫一本關于NLP 的書。
Brian 要感謝Sara Manuel 的無盡支持,并感謝Delip Rao 作為推動本書完成的中堅力量。如果沒有Delip 的堅持不懈和超凡毅力,就不會有現(xiàn)在這本書。
目錄
前言 1
第1 章 概述 7
監(jiān)督學習范式 9
隨機梯度下降法 11
樣本和目標編碼 12
獨熱表示(one-hot) 12
詞頻表示(TF) 14
TF-IDF 表示 15
目標編碼 16
計算圖 17
PyTorch 基礎 19
動態(tài)與靜態(tài)計算圖 19
安裝PyTorch 20
創(chuàng)建張量 21
張量的類型和大小 23
張量操作 25
索引、切片、連接 27
張量和計算圖 31
CUDA 張量 32
練習題 34
答案 35
小結 36
參考文獻 36
第2 章 自然語言處理 37
語料庫、詞和類型 38
特征工程 40
一元,二元,三元,…,n 元模型 41
詞形還原和詞干提取 41
文檔分類 42
單詞分類: 詞性標注 42
廣度分類: 分塊和命名實體識別 43
句子結構 44
詞義與語義 45
小結 46
參考文獻 47
第3 章 神經網絡基礎 49
感知器: 最簡單的神經網絡 49
激活函數(shù) 51
sigmoid 52
Tanh 53
ReLU 53
Softmax 54
損失函數(shù) 55
均方誤差損失 56
分類交叉熵損失 56
交叉熵損失 58
深入監(jiān)督訓練 59
構造樣例數(shù)據(jù) 59
綜合起來: 基于梯度的監(jiān)督學習 62
輔助訓練的概念 63
正確度量模型性能:評估指標 64
正確度量模型性能:分割數(shù)據(jù)集 64
知道何時停止訓練 65
找到合適的超參數(shù) 65
規(guī)范化 66
案例: 餐館評論分類 67
Yelp 評論數(shù)據(jù)集 68
理解PyTorch 的數(shù)據(jù)集表示 70
詞匯表(Vocabulary)、矢量化器(Vectorizer) 和數(shù)據(jù)轉換器(DataLoader) 73
一種感知器分類器 79
訓練程序 80
評估、推斷和檢查 86
測試數(shù)據(jù)評估 87
小結 90
參考文獻 91
第4 章 用于自然語言處理的前饋網絡 93
多層感知器 94
一個簡單的例子: 二分類 96
在PyTorch 中實現(xiàn)MLP 98
示例:用MLP 進行姓氏分類 102
姓氏數(shù)據(jù)集 103
Vocabulary、Vectorizer 和DataLoader 104
姓氏分類器模型 106
訓練程序 108
模型評估及預測 110
正則化MLP: 權重正則化和結構正則化( 或Dropout) 112
卷積神經網絡 114
CNN 超參數(shù) 115
在PyTorch 中實現(xiàn)CNN 120
示例:使用CNN 對姓氏進行分類 123
姓氏數(shù)據(jù)集類 124
詞匯表、矢量化程序和數(shù)據(jù)轉換器 125
用卷積網絡重新實現(xiàn)姓氏分類器 126
培訓程序 128
模型評估及預測 129
CNN 中的雜項主題 130
池化 130
批規(guī)范化(BatchNorm) 131
網絡中的網絡連接(1x1 卷積) 131
殘差連接/ 殘差塊 132
小結 133
參考文獻 134
第5 章 嵌入單詞和類型 135
為什么學習嵌入? 136
嵌入的效率 137
學習單詞嵌入的方法 138
預置字的實際使用 138
示例:連續(xù)詞袋模型的嵌入 145
Frankenstein 數(shù)據(jù)集 146
Vocabulary、Vectorizer 和DataLoader 148
CBOWClassifier 模型 149
訓練程序 150
模型評估及預測 151
示例:使用預先訓練的嵌入進行文檔分類 151
新聞數(shù)據(jù)集 152
Vocabulary、Vectorizer 和DataLoader 153
NewsClassifier 模型 156
訓練程序 159
模型評估及預測 160
小結 161
參考文獻 162
第6 章 自然語言處理的序列建模 165
遞歸神經網絡簡介 166
實現(xiàn)Elman RNN 169
示例:使用字符RNN 對姓氏國籍進行分類 171
SurnameDataset 類 171
矢量化數(shù)據(jù)結構 173
姓氏分類器模型 174
訓練程序和結果 177
小結 178
參考文獻 178
第7 章 自然語言處理的中級序列建模 179
普通RNN(或Elman RNN)的問題 180
用門控方法解決普通RNN 存在的問題 181
示例:用于生成姓氏的字符RNN 183
SurnameDataset 類 183
矢量化數(shù)據(jù)結構 185
從ElmanRNN 到GRU 187
模型1:無條件的姓氏生成模型 187
模型2:條件姓氏生成模型 189
訓練程序和結果 190
訓練序列模型的技巧和竅門 196
參考文獻 198
第8 章 自然語言處理的高級序列建模 199
序列到序列模型,編碼器- 解碼器模型和條件生成 199
從序列中捕獲更多信息:雙向遞歸模型 203
從序列中捕獲更多信息:注意力 205
深度神經網絡中的注意力 207
評估序列生成模型 209
示例:神經機器翻譯 211
機器翻譯數(shù)據(jù)集 212
NMT 的矢量化管道 213
NMT 模型中的編碼和解碼 218
訓練程序和結果 229
小結 231
參考文獻 232
第9 章 經典,前沿與下一步發(fā)展 235
到目前為止,我們學到了什么? 235
NLP 中的永恒主題 236
對話與交互系統(tǒng) 236
話語 237
信息提取與文本挖掘 239
文件分析與檢索 239
NLP 前沿 239
生產NLP 系統(tǒng)的設計模式 241
接下來呢? 246
參考文獻 247
作者介紹 249
封面介紹 249