cs224n系列博客筆記主要基於cs224n-2019,後續也會新增 CS224n-2020 裏的更新部分:CS224n-2020 並未更新 Note 部分,但課程的部分課件進行了教學順序上的調整與修改(Suggested Readings 也相應變動),需要注意的是三個 Guest Lecture 都是全新的。
本文爲 Lecture 01 Introduction and Word Vectors 與 Notes 01 Introduction, SVD and Word2Vec 的筆記。
Useful links
- 課程官網:Stanford CS224n || Stanford CS224n-2019
- 課程材料:LooperXX/CS224n-Resource || LooperXX/CS224n-Reading-Notes
- 課程視頻:YouTube
- 國內視頻資源:2019版|英文字幕(仍在更新) || 2019版|英文字幕(全)||2017版|中英字幕
Lecture 01 Introduction and Word Vectors
Lecture Plan
- The course
- Human language and word meaning
- Word2vec introduction
- Word2vec objective function gradients
- Optimization basics
- Looking at word vectors
Human language and word meaning
人類之所以比類人猿更“聰明”,是因爲我們有語言,因此是一個人機網絡,其中人類語言作爲網絡語言。人類語言具有 信息功能 和 社會功能 。
據估計,人類語言只有大約5000年的短暫歷史。語言是人類變得強大的主要原因。寫作是另一件讓人類變得強大的事情。它是使知識能夠在空間上傳送到世界各地,並在時間上傳送的一種工具。
但是,相較於如今的互聯網的傳播速度而言,人類語言是一種緩慢的語言。然而,只需人類語言形式的幾百位信息,就可以構建整個視覺場景。這就是自然語言如此迷人的原因。
How do we represent the meaning of a word?
meaning
- 用一個詞、詞組等表示的概念。
- 一個人想用語言、符號等來表達的想法。
- 表達在作品、藝術等方面的思想
理解意義的最普遍的語言方式(linguistic way) : 語言符號與語言符號的意義的轉化
denotational semantics 指稱語義
How do we have usable meaning in a computer?
WordNet, 一個包含同義詞集和上位詞(“is a”關係) synonym sets and hypernyms 的列表的辭典
Problems with resources like WordNet
- 作爲一個資源很好,但忽略了細微差別(例如“proficient”被列爲“good”的同義詞。這隻在某些上下文中是正確的。)
- 缺少單詞的新含義(難以持續更新,例如 wicked, badass, nifty, wizard, genius, ninja, bombest)
- 主觀的
- 需要人類勞動來創造和調整
- 無法計算單詞相似度
Representing words as discrete symbols
在傳統的自然語言處理中,我們把詞語看作離散的符號: hotel, conference, motel - a localist representation。單詞可以通過獨熱向量(one-hot vectors,只有一個1,其餘均爲0的稀疏向量) 表示。向量維度=詞彙量/詞典大小(如500,000)。
Problem with words as discrete symbols
所有向量是正交的(向量內積爲0)。對於獨熱向量,沒有關於相似性概念,並且向量維度過大。
Solutions
- 使用類似 WordNet 的工具中的列表,獲得相似度,但會因不夠完整而失敗
- 學習在向量本身中編碼相似性
Representing words by their context
- Distributional semantics:一個單詞的意思是由經常出現在它附近的單詞給出的
- “You shall know a word by the company it keeps” (J. R. Firth 1957: 11)
- 現代統計NLP最成功的理念之一
- 有點物以類聚,人以羣分的感覺
- 當一個單詞出現在文本中時,它的上下文是出現在其附近的一組單詞(在一個固定大小的窗口中)。
- 使用的許多上下文來構建的表示
Word2vec introduction
我們爲每個單詞構建一個 密集/稠密 的向量,使其與出現在相似上下文中的單詞向量相似
詞向量 word vectors 有時被稱爲詞嵌入 word embeddings 或詞表示 word representations
它們是分佈式表示 distributed representation:
Word2vec (Mikolov et al. 2013)是一個學習單詞向量的 框架。
IDEA:
- 我們有大量的文本/語料 (corpus means ‘body’ in Latin. 複數爲corpora)
- 固定詞彙表中的每個單詞都由一個向量表示
- 文本中的每個位置t,其中有一箇中心詞 c和上下文(“外部”)單詞 o
- 使用 c 和 o 的詞向量的相似性來計算給定 c 的 o 的 概率 (反之亦然)
- 不斷調整詞向量 來最大化這個概率
下圖爲窗口大小 時的計算過程,center word分別爲 into 和 banking:
Word2vec objective function
對於文本中的每個位置,給定中心詞 ,在大小爲m的固定窗口內預測上下文單詞:
其中,爲所有需要優化的變量(所有單詞的詞向量)
目標函數(有時被稱爲代價函數或損失函數) 是(平均)負對數似然:
其中log形式是方便將連乘轉化爲求和,負號是希望將極大化似然率轉化爲極小化損失函數的等價問題。
在連乘之前使用log轉化爲求和非常有效,特別是在做優化時(真數相乘等於對數想加):
- 最小化目標函數 <-> 最大化預測精度
- 問題:如何計算?
- 回答:對於每個單詞都有兩個向量:
- 當 w 是中心詞時
- 當 w 是上下文詞時
- 於是對於一箇中心詞 c 和一個上下文詞 o:
公式中,向量 和向量 進行點乘。向量之間越相似,點乘結果越大,從而歸一化後得到的概率值也越大。模型的訓練正是爲了使得具有相似上下文的單詞,具有相似的向量。
Word2vec prediction function
- 取冪(exp)使任何數都爲正
- 點積比較o和c的相似性,點積越大則概率越大.
- 分母:對整個詞彙表進行標準化,從而給出概率分佈
softmax function:
將任意值 映射到概率分佈(0-1).
- max:因爲放大了最大的對應的概率
- soft :因爲仍然爲較小的 賦予了一定概率
- 深度學習中常用
首先我們隨機初始化和,而後使用梯度下降法進行更新:
偏導數可以移進求和中,對應上方公式的最後兩行的推導:
我們可以對上述結果重新排列如下,第一項是真正的上下文單詞,第二項是預測的上下文單詞。使用梯度下降法,模型的預測上下文將逐步接近真正的上下文。
再對 進行偏微分計算,注意這裏的 是的簡寫,故可知 :
可以理解,當,即通過中心詞 c 我們可以正確預測上下文詞 o ,此時我們不需要調整,反之,則相應調整 。
Notes 01 Introduction, SVD and Word2Vec
Keyphrases : Natural Language Processing. Word Vectors. Singular Value Decomposition. Skip-gram. Continuous Bag of Words(CBOW). Negative Sampling. Hierarchical Softmax. Word2Vec.
概述:這組筆記首先介紹了自然語言處理(NLP)的概念及其面臨的問題。然後我們繼續討論將單詞表示爲數字向量的概念。最後,討論了常用的詞向量設計方法。
Introduction to Natural Language Processing
What is so special about NLP?
Natural language is a discrete/symbolic/categorical system。(離散的/符號的/分類的)
人類的語言有什麼特別之處?人類語言是一個專門用來表達意義的系統,而不是由任何形式的物理表現產生的。在這方面上,它與視覺或任何其他機器學習任務都有很大的不同。
大多數單詞只是一個語言學以外的的符號:單詞是一個映射到所指(signified 想法或事物)的能指(signifier)。
例如,“rocket”一詞指的是火箭的概念,因此可以引申爲火箭的實例。當我們使用單詞和字母來表達符號時,也會有一些例外,例如“whoompaa”的使用。最重要的是,這些語言的符號可以被 編碼成幾種形式:聲音、手勢、文字等等,然後通過連續的信號傳輸給大腦,大腦本身似乎也能以一種連續的方式對這些信號進行解碼。人們在語言哲學和語言學方面做了大量的工作來概念化人類語言,並將詞語與其參照、意義等區分開來。
Examples of tasks
自然語言處理有不同層次的任務,從語言處理到語義解釋再到語篇處理。自然語言處理的目標是通過設計算法使得計算機能夠“理解”語言,從而能夠執行某些特定的任務。不同的任務的難度是不一樣的
Easy
- 拼寫檢查 Spell Checking
- 關鍵詞檢索 Keyword Search
- 同義詞查找 Finding Synonyms
Medium
- 解析來自網站、文檔等的信息
Hard
- 機器翻譯 Machine Translation
- 語義分析 Semantic Analysis
- 指代消解 Coreference
- 問答系統 Question Answering
How to represent words?
在所有的NLP任務中,第一個也是可以說是最重要的共同點是我們如何將單詞表示爲任何模型的輸入。在這裏我們不會討論早期的自然語言處理工作是將單詞視爲原子符號 atomic symbols。爲了讓大多數的自然語言處理任務能有更好的表現,我們首先需要了解單詞之間的相似和不同。有了詞向量,我們可以很容易地將其編碼到向量本身中。
Word Vectors
使用詞向量編碼單詞,N維空間足夠我們編碼語言的所有語義,每一維度都會編碼一些我們使用語言傳遞的信息。簡單的one-hot向量無法給出單詞間的相似性,我們需要將維度 |V|減少至一個低緯度的子空間,來獲得稠密的詞向量,獲得詞之間的關係。
SVD Based Methods
這是一類找到詞嵌入的方法(即詞向量),我們首先遍歷一個很大的數據集和統計詞的共現計數矩陣 X,然後對矩陣 X 進行 SVD 分解得到.然後我們使用 U(左奇異矩陣) 的行來作爲字典中所有詞的詞向量。我們來討論一下矩陣 X 的幾種選擇。
關於SVD的基礎知識可以查看我的另一篇博客:奇異值分解
Word-Document Matrix
我們最初的嘗試,我們猜想相關連的單詞在同一個文檔中會經常出現。例如,“banks” “bonds” “stocks” “moneys”等等,出現在一起的概率會比較高。但是“banks” “octopus” “banana” “hockey”不大可能會連續地出現。我們根據這個情況來建立一個 Word-Document 矩陣,X是按照以下方式構建:遍歷數億的文檔,當詞i出現在文檔j,我們對加一。這顯然是一個很大的矩陣,它的規模是和文檔數量M成正比關係。因此我們可以嘗試更好的方法。
Window based Co-occurrence Matrix
同樣的邏輯也適用於這裏,但是矩陣 X 存儲單詞的共現,從而成爲一個關聯矩陣。在此方法中,我們計算每個單詞在特定大小的窗口中出現的次數。我們按照這個方法對語料庫中的所有單詞進行統計。
- 生成維度爲的共現矩陣X
- 在 X 上應用 SVD 從而得到
- 選擇U前k行得到k維詞向量
- 表示第一個k維捕獲的方差量
Applying SVD to the cooccurrence matrix
我們對矩陣 X 使用 SVD,觀察奇異值(矩陣 S 上對角線上元素),根據期望的捕獲方差百分比截斷,留下前 k 個元素:
然後取子矩陣作爲詞嵌入矩陣。這就給出了詞彙表中每個詞的 k 維(k<<|V|)表示.
對矩陣 X 使用SVD:
通過選擇前 k 個奇異向量(U矩陣的前k列)來降低維度:
這兩種方法都給我們提供了足夠的詞向量來編碼語義和句法(part of speech)信息,但伴隨許多其他問題。
- 矩陣的維度會經常發生改變(經常增加新的單詞和語料庫的大小會改變)
- 矩陣會非常的稀疏,因爲很多詞不會共現。
- 矩陣維度一般會非常高
- 基於 SVD 的方法的計算複雜度很高 ( 矩陣的計算成本是,涉及到矩陣特徵值分解),並且很難合併新單詞或文檔
- 需要在 X 上加入一些技巧處理來解決詞頻的極劇的不平衡
然而,基於計數的方法可以有效地利用統計量
對上述討論中存在的問題存在以下的解決方法:
- 忽略功能詞,例如 “the”,“he”,“has” 等等。
- 使用 ramp window,即根據文檔中單詞之間的距離對共現計數進行加權
- 使用皮爾遜相關係數並將負計數設置爲0,而不是隻使用原始計數
之後我們會看到,基於迭代的方法以一種優雅得多的方式解決了大部分上述問題。
Iteration Based Methods - Word2vec
這裏我們嘗試一個新的方法。我們可以嘗試創建一個模型,該模型能夠一次學習一個迭代(迭代式學習),並最終能夠對給定上下文的單詞的概率進行編碼,而不是計算和存儲一些大型數據集(可能是數十億個句子)的全局信息。
這個想法是設計一個模型,該模型的參數就是詞向量。然後根據一個目標函數訓練模型,在每次模型的迭代計算誤差,並遵循一些更新規則,該規則具有懲罰造成錯誤的模型參數的作用,從而可以學習到詞向量。這個方法可以追溯到 1986年,我們稱這個方法爲“反向傳播”,模型和任務越簡單,訓練它的速度就越快。
- 基於迭代的方法一次捕獲一個單詞的共現情況,而不是像SVD方法那樣直接捕獲所有的共現計數。
已經很多人按照這個思路測試了不同的方法。[Collobert et al., 2011] 設計的模型首先將每個單詞轉換爲向量。對每個特定的任務(命名實體識別、詞性標註等等),他們不僅訓練模型的參數,同時也訓練單詞向量(隨機初始化詞向量聯同具體任務一起訓練),計算出了非常好的詞向量的同時取得了很好的性能。
在這裏,我們介紹一個非常有效的概率模型:Word2vec。Word2vec 是一個軟件包實際上包含:
- 兩個算法:continuous bag-of-words(CBOW)和 skip-gram。CBOW 是根據中心詞周圍的上下文單詞來預測該詞的詞向量。skip-gram 則相反,是根據中心詞預測周圍上下文的詞的概率分佈。
- 兩個訓練方法:negative sampling 和 hierarchical softmax。Negative sampling 通過抽取負樣本來定義目標,hierarchical softmax 通過使用一個有效的樹結構來計算所有詞的概率來定義目標。
Language Models (Unigrams, Bigrams, etc.)
首先,我們需要創建一個模型來爲一系列的單詞分配概率。我們從一個例子開始:
“The cat jumped over the puddle”
一個好的語言模型會給這個句子很高的概率,因爲在句法和語義上這是一個完全有效的句子。相似地,句子“stock boil fish is toy”會得到一個很低的概率,因爲這是一個無意義的句子。在數學上,我們可以稱對給定 n 個詞的序列的概率是:
我們可以採用一元語言模型方法(Unigram model),假設單詞的出現是完全獨立的,從而分解概率:
但是我們知道這是不大合理的,因爲下一個單詞是高度依賴於前面的單詞序列的。如果使用上述的語言模型,可能會讓一個無意義的句子具有很高的概率。所以我們讓序列的概率取決於序列中的單詞和其旁邊的單詞的成對概率。我們稱之爲 bigram 模型:
但是,這個方法還是有點簡單,因爲我們只關心一對鄰近的單詞,而不是針對整個句子來考慮。但是我們將看到,這個方法會有顯著的提升。考慮在詞-詞共現矩陣中,共現窗口爲 1,我們基本上能得到這樣的成對的概率。但是,這又需要計算和存儲大量數據集的全局信息。
既然我們已經理解了如何考慮具有概率的單詞序列,那麼讓我們觀察一些能夠學習這些概率的示例模型。
Continuous Bag of Words Model (CBOW)
這一方法是把 {“The”,“cat”,“over”,“the”,“puddle”} 作爲上下文,希望從這些詞中能夠預測或者生成中心詞“jumped”。這樣的模型我們稱之爲 continuous bag-of-words(CBOW)模型。
它是從上下文中預測中心詞的方法,在這個模型中的每個單詞,我們希望學習兩個向量:
- v (輸入向量) 當詞在上下文中
- u (輸出向量) 當詞是中心詞
首先我們設定已知參數。令我們模型的已知參數是 one-hot 形式的詞向量表示。輸入的 one-hot 向量或者上下文我們用 表示,輸出用 表示。在 CBOW 模型中,因爲我們只有一個輸出,因此我們把 y 稱爲是已知中心詞的的 one-hot 向量。現在讓我們定義模型的未知參數。
首先我們對 CBOW 模型作出以下定義:
- :詞彙表V中的單詞 i
- :輸入詞矩陣
- :V的第 i列,單詞的輸入向量表示
- :輸出詞矩陣
- :U的第 i行,單詞的輸出向量表示
我們創建兩個矩陣,和。其中 n 是嵌入空間的任意維度大小(n<<|V|)。V是輸入詞矩陣,使得當其爲模型的輸入時,V的第i列是詞的 n 維嵌入向量。我們定義這個的向量爲。相似地,U是輸出詞矩陣。當其爲模型的輸入時,U的第j行是詞的n 維嵌入向量。我們定義U的這行爲.注意實際上對每個詞,我們需要學習兩個詞向量(即輸入詞向量 和輸出詞向量).
我們將這個模型分解爲以下步驟:
- 我們爲窗口大小爲 m 的輸入上下文,生成 one-hot 詞向量
- 得到上下文單詞的嵌入向量(通過輸入詞矩陣):
- 對上述的向量求平均值:
- 生成一個分數向量.當相似向量的點積越高,就會令相似的詞更爲靠近,從而獲得更高的分數。將分數轉換爲概率.
- 這裏 softmax 是一個常用的函數。它將一個向量轉換爲另外一個向量,其中轉換後的向量的第 i 個元素是.因爲該函數是一個指數函數,所以值一定爲正數;通過除以來歸一化向量(使得)得到概率。
- 我們希望生成的概率與實際的概率匹配。使得其剛好是實際的詞,就是這個 one-hot 向量。
下圖是 CBOW 模型的計算圖示:
如果有V和U,我們知道這個模型是如何工作的,那我們如何學習這兩個矩陣呢?這需要創建一個目標函數。一般我們想從一些真實的概率中學習一個概率,信息論提供了一個 度量兩個概率分佈的距離 的方法。這裏我們採用一個常見的距離/損失方法,交叉熵 .
在離散情況下使用交叉熵可以直觀地得出損失函數的公式:
上面的公式中,y 是 one-hot 向量。因此上面的損失函數可以簡化爲:
c 是正確詞的 one-hot 向量的索引。我們現在可以考慮我們的預測是完美並且 的情況。然後我們可以計算 .因此,對一個完美的預測,我們不會面臨任何懲罰或者損失。現在我們考慮一個相反的情況,預測非常差並且 .和前面類似,我們可以計算損失 。因此,我們可以看到,對於概率分佈,交叉熵爲我們提供了一個很好的距離度量。因此我們的優化目標函數公式爲:
我們使用 SGD 來更新所有相關的詞向量 和 。SGD 對一個窗口計算梯度和更新參數:
Skip-Gram Model
Skip-Gram模型與CBOW大體相同,但是交換了我們的 x(輸入) 和 y(輸出),即 CBOW 中的 x 現在是 y,y 現在是 x。輸入的 one-hot 向量(中心詞)我們表示爲 x,輸出向量爲 。我們定義的 V 和 U 是和 CBOW 一樣的。
- 中心詞的 one-hot 向量
- 我們對中心詞得到詞嵌入向量(通過輸入詞矩陣)
- 生成分數向量(通過輸出詞矩陣)
- 將分數向量轉化爲概率,注意 是每個上下文詞觀察到的概率(分佈向量)。
- 我們希望我們生成的概率向量匹配真實one-hot概率向量,
下圖是 Skip-Gram 模型的計算圖示:
和 CBOW 模型一樣,我們需要生成一個目標函數來評估這個模型。與 CBOW 模型的一個主要的不同是我們引用了一個樸素的貝葉斯假設來拆分概率。這是一個很強(樸素)的條件獨立假設。換而言之,給定中心詞,所有輸出的詞是完全獨立的。(即公式1至2行):
通過這個目標函數,我們可以計算出與未知參數相關的梯度,並且在每次迭代中通過 SGD 來更新它們。
注意:
其中 是向量的(預測)概率和 one-hot (真實)向量之間的交叉熵。
只有一個概率向量 是被計算的。Skip-Gram 對每個上下文單詞一視同仁:該模型計算每個單詞在上下文中出現的概率,而與它到中心單詞的距離無關。
Negative Sampling
讓我們再回到目標函數上。注意對 |V| 的求和計算量是非常大的。任何的更新或者對目標函數的評估都要花費 O(|V|) 的時間複雜度。一個簡單的想法是不去直接計算,而是去求近似值。
在每一個訓練的時間步,我們不去遍歷整個詞彙表,而僅僅是抽取一些負樣例。我們對噪聲分佈 “抽樣”,這個概率是和詞頻的排序相匹配的。爲加強對問題的表述以納入負抽樣,我們只需更新其
- 目標函數
- 梯度
- 更新規則
Mikolov 在論文《Distributed Representations of Words and Phrases and their Compositionality.》中提出了負採樣。雖然負採樣是基於 Skip-Gram 模型,但實際上是對一個不同的目標函數進行優化。
考慮一對中心詞和上下文詞 .這詞對是來自訓練數據集嗎?我們通過 表示 是來自語料庫。相應地,表示 不是來自語料庫。
首先,我們對用 sigmoid 函數建模:
現在,我們建立一個新的目標函數,如果中心詞和上下文詞確實在語料庫中,就最大化概率 ,如果中心詞和上下文詞確實不在語料庫中,就最大化概率 。我們對這兩個概率採用一個簡單的極大似然估計的方法(這裏我們把作爲模型的參數,在我們的例子是V和U)
注意最大化似然函數等同於最小化負對數似然:
注意 \widetilde{D} 是“假的”或者“負的”語料。例如我們有句子類似“stock boil fish is toy”,這種無意義的句子出現時會得到一個很低的概率。我們可以從語料庫中隨機抽樣出負樣例 \widetilde{D} 。
對於 Skip-Gram 模型,我們對給定中心詞 c 來觀察的上下文單詞 c-m+j 的新目標函數爲:
對 CBOW 模型,我們對給定上下文向量來觀察中心詞 的新的目標函數爲:
在上面的公式中,是從 中抽樣。有很多關於如何得到最好近似的討論,從實際效果看來最好的是指數爲 3/4 的 Unigram 模型。那麼爲什麼是 3/4?下面有一些例子可能讓你有一些直觀的瞭解:
“Bombastic”現在被抽樣的概率是之前的三倍,而“is”只比之前的才提高了一點點。
Hierarchical Softmax
Mikolov 在論文《Distributed Representations of Words and Phrases and their Compositionality.》中提出了 hierarchical softmax,相比普通的 softmax 這是一種更有效的替代方法。在實際中,hierarchical softmax 對低頻詞往往表現得更好,負採樣對高頻詞和較低維度向量表現得更好。
Hierarchical softmax 使用一個二叉樹來表示詞表中的所有詞。樹中的每個葉結點都是一個單詞,而且只有一條路徑從根結點到葉結點。在這個模型中,沒有詞的輸出表示。相反,圖的每個節點(根節點和葉結點除外)與模型要學習的向量相關聯。單詞作爲輸出單詞的概率定義爲從根隨機遊走到單詞所對應的葉的概率。計算成本變爲 而不是 。
在這個模型中,給定一個向量 下的單詞 w 的概率 ,等於從根結點開始到對應 w 的葉結點結束的隨機漫步概率。這個方法最大的優勢是計算概率的時間複雜度僅僅是 ,對應着路徑的長度。
下圖是 Hierarchical softmax 的二叉樹示意圖:
讓我們引入一些概念。令爲從根結點到葉結點w的路徑中節點數目。例如,上圖中的 .我們定義爲與向量 相關的路徑上第 i 個結點。因此是根結點,而是 w 的父節點。現在對每個內部節點 n,我們任意選取一個它的子節點,定義爲(一般是左節點)。然後,我們可以計算概率爲:
其中:
這個公式看起來非常複雜,讓我們細細梳理一下。
首先,我們將根據從根節點 到葉節點 w 的路徑的形狀來計算相乘的項。如果我們假設 ch(n) 一直都是 n 的左(子)節點,然後當路徑往左時的值返回 1,往右則返回 -1。
此外, 提供了歸一化的作用。在節點 n 處,如果我們將去往左和右節點的概率相加,對於的任何值則可以檢查:
歸一化也保證了,和在普通的 softmax 是一樣的。
最後我們計算點積來比較輸入向量 對每個內部節點向量 的相似度。下面我們給出一個例子。以上圖中的 爲例,從根節點要經過兩次左邊的邊和一次右邊的邊纔到達 ,因此:
我們訓練模型的目標是最小化負的對數似然 。不是更新每個詞的輸出向量,而是更新二叉樹中從根結點到葉結點的路徑上的節點的向量。
該方法的速度由構建二叉樹的方式確定,並將詞分配給葉節點。Mikolov 在論文《Distributed Representations of Words and Phrases and their Compositionality.》中使用的是哈夫曼樹,在樹中分配高頻詞較短的路徑(高頻詞在二叉樹的上方)。
Gensim word vectors example
Gensim提供了將 Glove 轉化爲Word2Vec格式的API,並且提供了 most_similar,doesnt_match等API。我們可以對most_similar進行封裝,輸出三元組的類比結果
Reference
以下是學習本課程時的可用參考書籍:
《Speech and Language Processing》
《基於深度學習的自然語言處理》
《神經網絡與深度學習》
以下是學習本課程時的可用參考博客:
斯坦福CS224N深度學習自然語言處理2019冬學習筆記目錄 (課件核心內容的提煉,幷包含作者的見解與建議)
斯坦福大學 CS224n自然語言處理與深度學習筆記彙總 (這是針對note部分的翻譯)
Notes on Stanford CS224n