附上斯坦福cs224n-2019鏈接:https://web.stanford.edu/class/archive/cs/cs224n/cs224n.1194/
文章目錄
1.課程簡單介紹
1.1 本課程目標
- An understanding of the effective modern methods for deep learning
- Basics first, then key methods used in NLP: Recurrent networks, attention, etc.
- A big picture understanding of human languages and the difficulties in understanding and producing them
- An understanding of and ability to build systems (in PyTorch) for some of the major problems in NLP:
- Word meaning, dependency parsing, machine translation, question answering
1.2 今年的課程與以往的不同
- Lectures (including guest lectures) covering new material: character models, transformers, safety/fairness, multitask learn.
- 5x one-week assignments instead of 3x two-week assignments
- Assignments covering new material (NMT with attention, ConvNets, subwordmodeling)
- Using PyTorchrather than TensorFlow
- Gentler but earlier ramp-up
- First assignment is easy, but due one week from today!
1.3 作業計划
- HW1 is hopefully an easy on ramp –an IPythonNotebook
- HW2 is pure Python (numpy) but expects you to do (multivariate) calculus so you really understand the basics
- HW3 introduces PyTorch
- HW4 and HW5 use PyTorch on a GPU (Microsoft Azure)
-
Libraries like PyTorch, Tensorflow(and Chainer, MXNet, CNTK, Keras, etc.) are becoming the standard tools of DL
5.For FP, you either -
Do the default project, which is SQuAD question answering
Open-ended but an easier start; a good choice for most
-
Propose a custom final project, which we approve
You will receive feedback from a mentor(TA/prof/postdoc/PhD)
2.人類語言和詞義
2.1 我們應該如何表示一個單詞的詞義(word meaning)
首先我們來看一下韋伯斯特詞典對於meaning的定義:
- the idea that is represented by a word, phrase, etc.
- the idea that a person wants to express by using words, signs, etc.
- the idea that is expressed in a work of writing, art, etc.
然后看一下最常見的思考meaning的語言學方式:
denotational semantics是指稱語義的意思,在視頻中教授解釋說,指稱語義的想法是把meaning視為事物的代表(也就是signifier“能指”,一種符號),比如我們說到“椅子”,那么椅子這個詞的meaning就指示了我們現實世界中的椅子這種物體(signified“所指”,想法或者事物)
我們現在知道了詞義的概念,下一步就是想我們如何在計算機中得到一個可用的詞義。
2.2 我們如何在計算機中得到一個可用的詞義(word meaning)
2.2.1 常見的解決方案:例如,使用WordNet
2.2.1.1 WordNet含義
WordNet是一個包含同義詞集列表和上義詞(“is a”關系)的庫。
2.2.1.2 WordNet等這類資源存在的問題
- Great as a resource but missing nuance(細微差別)
- e.g. “proficient” is listed as a synonym for “good”. This is only correct in some contexts.
- Missing new meanings of words
- e.g., wicked, badass, nifty, wizard, genius, ninja, bombest
- Impossible to keep up-to-date!
- Subjective
- Requires human labor to create and adapt
- Can’t compute accurate word similarity
2.2.2 使用離散符號表示詞,比如one-hot表示
2.2.2.1 one-hot表示
在傳統的NLP中,我們視單詞為離散的符號。one-hot的意思就是一個詞向量中只有1個位置為1,剩下的位置全部為0,因此也可以翻譯作獨熱。
詞向量的維度 = 詞表(不含重復詞)中單詞的數量(比如, 500,000)。
比如hotel,conference,motel的一個本地表示(localist representation)是:
motel = [0 0 0 0 0 0 0 0 0 0 1 0 0 0 0]
hotel = [0 0 0 0 0 0 0 1 0 0 0 0 0 0 0]
2.2.2.2 使用離散符號表示詞存在的問題
Example: in web search, if user searches for “Seattle motel”, we would like to match documents containing “Seattle hotel”.
但是我們上面也看到了motel和hotel的表示,可以發現:
- 這兩個向量是正交的,也就是說點積為0;
- 因此,在one-hot向量中沒有一個自然的相似的概念。也就是說使用one-hot向量很難度量詞之間的相似度。
2.2.2.3 可以嘗試的解決辦法
- 可以依靠WordNet的同義詞集列表去得到相似度?
- 但眾所周知,很失敗:比如同義詞集不完整等等,其實我覺得還是因為上面提到的WordNet存在的問題,比如很難及時更新等。
- 試着在向量本身中去編碼相似度。
2.2.3 使用詞的上下文(context)來表示詞
2.2.3.1 分布式語義(Distributional semantics)
- 分布式語義:一個單詞的詞義是由頻繁出現在它附近的詞給出的(A word’s meaning is given by the words that frequently appear close-by);
對於分布式語義的評價:
- “You shall know a word by the company it keeps”(J. R. Firth 1957: 11)
- One of the most successful ideas of modern statistical NLP!
- 當一個詞w出現在一段文本中,它的上下文(context)就是這段文本中在它附近一個固定窗口(window)內出現的詞的集合(When a word w appears in a text, its context is the set of words that appear nearby (within a fixed-size window).)
- 基於以上理論,我們就可以使用w的多個上下文來建立w的表示。比如:
2.2.3.2 詞向量
我們為每個單詞構建一個稠密的向量,使其與出現在類似上下文中的單詞的向量相似。
Note:
- 詞向量有時也稱作是詞嵌入 或者 詞表示。他們都是一種分布式表示。
- one-hot表示,有時也稱作離散/稀疏 表示;
- 分布式表示(distributed representation),稱作稠密 表示(dense representation)
2.2.3.3 Word meaning as a neural word vector –visualization
3.Word2vec介紹
3.1 Word2vec概述
3.1.1 簡介
Word2vec (Mikolovet al. 2013)是一個學習詞語向量表示(詞向量)的框架。
Word2vec的主要想法(Idea):
- 我們有一個大型的的文本語料庫
- 在一個固定詞匯表中的每個單詞都由一個向量表示(is represented by a vector)
- 遍歷文本中的每個位置t,其中有一個中心詞(center word)c和上下文(outside,“外部”)單詞o
- 使用單詞向量c和o的相似度來計算P(o|c),反之亦然
- 不斷調整單詞向量來最大化這個概率
3.1.2 窗口和P(wt+j∣wt)P(w_{t+j}|w_t)P(wt+j∣wt)計算過程示例
3.2 目標函數(objective function)
3.2.1 目標函數推導
對於每個位置t=1,…,T,給定一個中心詞wtw_twt,預測一個固定大小的窗口(大小為m)內的上下文單詞:
Likelyhood=L(θ)=∏t=1T∏−m⩽j⩽m,j≠0P(wt+j∣wt;θ)Likelyhood=L(\theta)=\prod_{t=1}^T\prod_{-m\leqslant j\leqslant m,j\neq 0}P(w_{t+j}|w_t;\theta)Likelyhood=L(θ)=t=1∏T−m⩽j⩽m,j=0∏P(wt+j∣wt;θ)
- 最大化上面這個函數就可以達到我們的目的,即最大化預測精度
- θ\thetaθ代表所有待優化的變量
但是上面這種形式(連乘)不適合求導,因此需要做一定的轉換,log轉換可以把連乘變成累加,並且不改變原函數的單調性。於是最終的目標函數為:
J(θ)=−1TlogL(θ)=−1T∑t=1T∑−m⩽j⩽m,j≠0logP(wt+j∣wt;θ)J(\theta)=-\frac{1}{T}logL(\theta)=-\frac{1}{T}\sum_{t=1}^{T}\sum_{-m\leqslant j\leqslant m,j\neq 0}logP(w_{t+j}|w_t;\theta)J(θ)=−T1logL(θ)=−T1t=1∑T−m⩽j⩽m,j=0∑logP(wt+j∣wt;θ)
- 這樣最大化預測精度的問題就轉變成了最小化目標函數的問題,即最小化目標函數等價於最大化預測精度
3.2.2 目標函數
- 現在我們要最小化目標函數J(θ):
J(θ)=−1T∑t=1T∑−m⩽j⩽m,j≠0logP(wt+j∣wt;θ)J(\theta)=-\frac{1}{T}\sum_{t=1}^{T}\sum_{-m\leqslant j\leqslant m,j\neq 0}logP(w_{t+j}|w_t;\theta)J(θ)=−T1t=1∑T−m⩽j⩽m,j=0∑logP(wt+j∣wt;θ) - 還有一個問題,我們如何計算P(wt+j∣wt;θ)P(w_{t+j}|w_t;\theta)P(wt+j∣wt;θ)。因為在遍歷過程中,每個單詞有時是中心詞,有時是上下文。
- 解決方案:對每個單詞w使用兩個向量表示:
- 當w是中心詞的時候,用向量vwv_wvw表示
- 當w是上下文詞的時候,用向量uwu_wuw表示
- 然后對於一個中心詞c和一個上下文詞o,計算公式:
P(o∣c)=exp(uoTvc)∑w∈Vexp(uwTvc)P(o|c)=\frac{exp(u_{o}^{T}v_c)}{\sum_{w\in V}exp(u_{w}^{T}v_c)}P(o∣c)=∑w∈Vexp(uwTvc)exp(uoTvc) - 向量示例如下:
Note: - 上述計算公式是softmax函數,一般形式是:
softmax(xi)=exp(xi)∑j=1nexp(xj)softmax(x_i)=\frac{exp(x_i)}{\sum_{j=1}^{n}exp(x_j)}softmax(xi)=∑j=1nexp(xj)exp(xi) - softmax函數將任意值xix_ixi映射到一個概率分布pip_ipi
- “max”:是因為會放大較大的xix_ixi的概率
- “soft”:是因為也會給較小的xix_ixi賦一些概率值
- softmax函數經常用在深度學習中
3.3 如何訓練模型
3.3.1 模型訓練示例
通常訓練一個模型的時候,我們需要調整參數,最小化損失函數。
- 例子:下面是對於一個簡單凸函數的兩個參數的優化,等高線表示目標函數的值
3.3.2 模型訓練:計算所有詞向量的梯度
- 前面說了,θ是一個長向量,代表了模型中的所有參數
- 在這里,詞向量是d維,共有V個詞:
- 注意,每個詞有兩個向量,分別是作為中心詞、上下文詞時的向量
- 沿着梯度的反方向,優化以上參數
4.Word2vec目標函數梯度
4.1 補充知識
4.1.1 鏈式法則
用於復合函數求導,有y=f(u),u=g(x)y=f(u),u=g(x)y=f(u),u=g(x),則:
dydx=dydududx\frac{dy}{dx}=\frac{dy}{du}\frac{du}{dx}dxdy=dudydxdu
4.1.2 向量求導
∂xTa∂x=∂aTx∂x=a\frac{\partial x^Ta}{\partial x}=\frac{\partial a^Tx}{\partial x}=a∂x∂xTa=∂x∂aTx=a
- 其中,x、a默認為列向量
- 上式求導為標量對向量求導,分子布局:n維行向量,分母布局:n維列向量(默認布局)[2]^{[2]}[2](關於具體的推導步驟:見評論區鏈接)
4.2 白板推導
有了上述補充知識之后,就開始進行求偏導數的白板推導,視頻中教授只對一個中心詞進行了求導演示,以下是我跟着視頻推導的過程(感興趣的可以看看這部分視頻,講解非常清晰):
- 上面演示了損失函數對一個中心詞的求導,另外還需要推導損失函數對於上下文詞的求導,感興趣的可以自己試一下。最終推出對θ中每個向量元素的偏導數。
- 我的推導如下:
4.3 計算梯度
- 遍歷每一個在一個固定窗口內的中心詞的梯度
- 同樣也需要上下文詞的梯度
- 通常,在每個窗口內,我們會更新這個窗口內用到的所有參數,比如:
4.4 關於Word2vec的細節
為什么同一個詞需要兩個向量?
- 更易進行優化
- 在訓練完成后將兩者取平均,即為該詞的詞向量
有兩種模型:
- Skip-gram(SG):通過中心詞預測上下文詞
- Continuous Bag of Words(CBOW):使用窗口內的所有上下文詞預測中心詞
- 本文上面講述的是Skip-gram模型
其他令訓練更有效的手段:
- 負采樣(negative sampling)
- 本文上面講的是很簡單的訓練方法
5.優化基礎
5.1 梯度下降法介紹
5.1.1 示例
- 假設我們有一個損失函數J(θ)J(\theta)J(θ),要最小化
- 梯度下降法就是一種可以最小化J(θ)J(\theta)J(θ)的算法
- 主要想法:
- 對於當前的θ值,計算J(θ)對於θ的梯度,然后將θ沿着梯度的反方向走一小步。重復此步驟,直至滿足停止條件。
- 對於當前的θ值,計算J(θ)對於θ的梯度,然后將θ沿着梯度的反方向走一小步。重復此步驟,直至滿足停止條件。
5.1.2 梯度更新
- 矩陣形式更新:
θnew=θold−α∇θJ(θ)\theta^{new}=\theta^{old}-\alpha \nabla \theta J(\theta)θnew=θold−α∇θJ(θ) - 單個參數更新,要注意參數必須同時更新:
θjnew=θjold−α∂∂θjoldJ(θ)\theta^{new}_j=\theta^{old}_j-\alpha \frac{\partial}{\partial \theta_j^{old}}J(\theta)θjnew=θjold−α∂θjold∂J(θ) - α稱為學習率(learning rate)
5.2 梯度下降法分類
根據每次迭代時使用的樣本量大致分為:
- 批量梯度下降法(Batch GD,BGD):每次迭代使用全部的樣本對參數進行更新
- 隨機梯度下降法(Stochastic,SGD):每次迭代使用一個樣本對參數進行更新
- 小批量梯度下降法(Mini-Batch GD,MBGD):每次迭代使用batch_size個樣本對參數進行更新
更加詳細的介紹見批量梯度下降(BGD)、隨機梯度下降(SGD)以及小批量梯度下降(MBGD)的理解
6.詞向量的簡單演示
教授利用Glove詞向量做了一些簡單展示:
- 相似詞:找和某個詞向量最相似的那個詞,model.most_similar(“banana”)
- 詞類比:比如king之於man,等於queen之於woman,也是詞在向量空間king-man+woman=queen
- 可視化:將詞向量利用PCA降到二維,並進行可視化,可以發現相似概念的詞距離很接近,最終結果如下所示:
參考資料:
1.2019斯坦福公開課CS224N-P1
2.矩陣向量求導-求導定義與求導布局