斯坦福CS224N_自然語言處理NLP深度學習DL課程筆記(一)

Lecture 1: Introduction

pdf

本節課是對自然語言處理的定義介紹和應用介紹,還順帶說了NLP的難點;
本節課使用深度學習作爲NLP的主要處理工具。

傳統的機器學習技術,需要人爲地去做特徵工程,將這些的特徵餵給機器學習算法;然後機器學習算法去訓練,來找到最擬合訓練數據+正則化損失最小的權重。教授說,我們的傳統機器學習技術,其實主要是在做數值優化的問題。

人爲設計的特徵具有如下缺點:

  • over-specified,過於具體的
  • incomplete. 不夠完整的
  • take a long time to design and validate 需要長時間的設計和驗證

深度學習是機器學習的一個子域。它使用算法,讓機器能夠自動地學習特徵;我們只需要將最原生的特徵餵給深度學習算法,它就可以自己學習特徵,自己分類,表現得很好。

經常用到的英文術語:

linguistics 語言學
taxonomy 分類

推薦的閱讀文獻:

Deep Learning in Neural Networks: An Overview

Lecture 2: Word Vectors

2018-pdf
2017-pdf

2.1 Word meaning 詞的含義

webster dictionary 韋氏字典
denotation 表示、含義
synonym sets 同義詞集
hypernyms 統稱、抽象(“is-a”關係)例:Color is a hypernym of red, red is a type of color.
nuance 細微差別
human labor 人類勞動
orthogonal 正交
dense vector 密集的矢量

在語言學中,詞的含義就是通過這個詞所傳達的具體的指代,或人的想法和意志。可以用如下公式表示:
signifier(symbol)signified(idea or thing)signifier(symbol) \Longleftrightarrow signified(idea \ or \ thing)
這樣一個轉換叫做指代denotiondenotion

在計算機中有三種方式去表示詞/詞的有用信息:

  • 類似WordNet的資源庫
  • 離散化的符號例如“one-hot encoding”
  • 利用“distributional similarity”分佈相似性

下面分別說下這三種方法。

2.1.1 Use resources like WordNet

WordNet是一個包含了詞的同義詞和上級詞的很大的資源庫。
wordnet

如果讓計算機使用wordnet的方法獲取詞義會有一些問題:

  1. 詞在不同的情況下有不同的同義詞,但計算機並不知道如何區分使用環境。例如上圖中的"good",它有表示專業上熟練的同義詞“proficient”,也有表示食物熟了的同義詞"wipe",但是"proficient"和"wipe"並不是同義詞。
  2. 人類的語言是不斷進化的,資料庫不能保證永遠up-to-date。
  3. 資料庫是主觀的,而且需要大量的人類精力來維護。
  4. 計算機不好根據資料庫來計算詞之間的相似度。

2.1.2 Use Discrete Symbols

傳統NLP中,我們會使用離散的符號表示離散的詞語。比如,獨熱編碼。
在這裏插入圖片描述

利用獨熱編碼,將每個詞彙都表示爲一個向量。向量的維度是詞彙表中詞語的數量

我們縱然可以使用這種方法來計算,包含不同詞語的語言文本之間的相似性。但是,計算機仍然不懂這些詞語的意思。由於詞與詞之間是正交的,點積的結果是0,計算機也無法計算詞語之間的相似性

那麼我們自然而然想到的解決方式有兩種:

  • 一種是利用資料庫,我們再做一個巨大的表示詞與詞相關性的矩陣
  • 第二種是,我們能否利用表示一個詞的向量本身,來去編碼詞與詞的相關性。

2.1.3 Use Distributional Similarity

根據詞彙語義理論中的相似性分佈是上一節中第二種解決方式的延伸。

在這裏插入圖片描述

它的核心想法是:一個詞語的意義是由文本內容中它鄰近的其它詞賦予的。考慮上圖中banking的例子,它的意義就是有和它一起出現的gorvenment, debt problem, Europe等詞賦予的。

在這裏插入圖片描述

2.2 Word2Vec: Introduction

corpus 語料庫
A simple but tough-to-best baseline for sentence embeddings iclr,2017

在開始的時候,我們介紹一下神經網絡詞嵌入的一個通用方法。我們希望定義一個模型。它通過詞向量,基於中心詞wtw_t,來預測中心詞的上下文詞彙:
p( content wt)p(\ content\ |w_t)
由此,我們可以定義一個損失函數JJ:
J=1p(( content wt))J = 1 - p((\ content\ |w_t))
我們需要通過一些手段,使損失函數降到最低。

神經網絡的歷史中,關於直接學習低維詞向量的目標,有一些比較經典的論文:
在這裏插入圖片描述

現在說回Word2Vec,Word2Vec是一個學習詞向量的框架,由谷歌在2013年首次提出。
它的基本想法是:

  • 有一個巨大的文本語料庫
  • 在固定的詞彙表中,每個詞都可以表示爲1個向量
  • 對文本的每個位置t進行遍歷,每個t上都有中心詞c,和上下文詞o
  • 我們可以根據c和o的相似性,來計算給定c的情況下產生o的概率
  • 我們需要不斷調整詞向量來最大化概率

本節課重點介紹兩種算法:

  • skip-gram 算法
  • continuous bag of words算法

還有兩種有效的訓練方法:

  • Hierarchical softmax
  • Negative sampling

目標函數
在這裏插入圖片描述

給定超參數m作爲窗口的固定大小,對於文本的每個位置t,基於中心詞wtw_t(圖片筆誤),預測上下文詞彙。
所以目標函數就是每個位置的窗口的每個上下文詞彙概率的連乘。
L(θ)=t=1Tmjm, j0p(wt+jwt;θ) L(\theta) = \prod_{t=1}^{T} \prod_{-m \le j \le m, \ j \ne 0} p(w_{t+j}|w_{t} ; \theta)
注意θ\theta代表的參數,是我們所有的詞向量。

由於直接計算連乘概率十分不友好,我們將L(θ)L(\theta)取對數,再進行normalization,然後取負,得到L(θ)L(\theta)的負對數似然J(θ)J(\theta)

術語:loss function = objective function = cost function
似然函數的損失計算一般是:交叉熵損失

如何計算p(wt+jwt;θ)p(w_{t+j}|w_{t} ; \theta)呢?
一種簡單的方法是使用softmax函數。我們對每個詞ww,都使用兩個向量來表示。一個向量vwv_w是它作爲中心詞時的向量;另一個向量uwu_w是它作爲上下文時的向量。
那麼對於中心詞(記做c)和上下文詞(記做o),有
P(oc)=exp(uoTvc)wVexp(uwTvc)P(o|c) = \frac{exp({u_o}^Tv_c)}{\sum_{w \in V}exp(u_w^Tv_c)}

softmax 函數可以將任意的實值xix_i映射到概率分佈pip_i上,它有兩個特點:

  • “max”由於指數函數的特性,大的數映射後會更大,所以softmax對最大的xix_i有放大作用
  • “soft”是指,它仍然會分一點概率給小的值

skip-gram的流程如下:
在這裏插入圖片描述

關於θ\theta的解釋:
在這裏插入圖片描述

2.3 Derivations of gradient 梯度的推導

本節使用純數學推導梯度,原式爲:
P(oc)=log(exp(uoTvc)wVexp(uwTvc))P(o|c) =log( \frac{exp({u_o}^Tv_c)}{\sum_{w \in V}exp(u_w^Tv_c)} )
我們需要計算θ\theta中所有參數的梯度,先以計算Pvc\frac{\partial P}{\partial v_c}爲例。

首先:
Pvc=vclog(exp(uoTvc)vclog(w=1Texp(uwTvc))=vc(uoTvc)vclog(w=1Texp(uwTvc))  (1)\frac{\partial P}{\partial v_c} = \frac{\partial}{\partial v_c} log(exp({u_o}^Tv_c) - \frac{\partial}{\partial v_c} log(\sum_{w=1}^T exp(u_w^Tv_c)) \\ = \frac{\partial}{\partial v_c} ({u_o}^Tv_c) - \frac{\partial}{\partial v_c} log(\sum_{w=1}^T exp(u_w^Tv_c)) \ \ (1)

求梯度時,有個很有用的tip:
xTax=aTxx=a\frac{\partial x^Ta}{\partial x} = \frac{\partial a^Tx}{\partial x} = a

so,(1)式減號左邊的項簡化爲uou_o,右邊的項需要應用鏈式法則。

Z=w=1Texp(uwTvc) Z = \sum_{w=1}^T exp(u_w^Tv_c)
右邊的項變爲:
F=log(Z)F = log(Z)
則,
Fvc=FZZvc=1ZZvc\frac{\partial F}{\partial v_c} = \frac{\partial F}{\partial Z} \cdot \frac{\partial Z}{\partial v_c} = \frac{1}{Z} \cdot \frac{\partial Z}{\partial v_c}

Zvc\frac{\partial Z}{\partial v_c}計算如下:
Zvc=vcw=1Texp(uwTvc)=w=1Tvcexp(uwTvc) (2)\frac{\partial Z}{\partial v_c} = \frac{\partial}{\partial v_c} \sum_{w=1}^T exp(u_w^Tv_c) \\ = \sum_{w=1}^T \frac{\partial}{\partial v_c} exp(u_w^Tv_c) \ (2)
對(2)再應用一些鏈式法則:

Qw=uwTvcQ_w = u_w^Tv_c
,那麼
Zvc=ZQQvc\frac{\partial Z}{\partial v_c} = \frac{\partial Z}{\partial Q} \cdot \frac{\partial Q}{\partial v_c}

(2)式中,
ZQ=Qw=1Texp(Qw)=w=1TQexp(Qw)=w=1Texp(Qw)\frac{\partial Z}{\partial Q} = \frac{\partial}{\partial Q} \sum_{w=1}^T exp(Q_w) \\ = \sum_{w=1}^T \frac{\partial}{\partial Q} exp(Q_w) \\ = \sum_{w=1}^T exp(Q_w)
所以,
Zvc=ZQQvc=w=1Texp(Qw)uw=w=1Texp(uwTvc)uw\frac{\partial Z}{\partial v_c} = \frac{\partial Z}{\partial Q} \cdot \frac{\partial Q}{\partial v_c} \\ = \sum_{w=1}^T exp(Q_w) \cdot u_w \\ = \sum_{w=1}^T exp(u_w^Tv_c) \cdot u_w

那麼,
Fvc=1ZZvc=w=1Texp(uwTvc)uwZ=w=1Texp(uwTvc)uww=1Texp(uwTvc) (3) \frac{\partial F}{\partial v_c} = \frac{1}{Z} \cdot \frac{\partial Z}{\partial v_c} \\ = \frac{\sum_{w=1}^T exp(u_w^Tv_c) \cdot u_w}{Z} \\ =\frac {\sum_{w=1}^T exp(u_w^Tv_c) \cdot u_w}{\sum_{w=1}^T exp(u_w^Tv_c) } \ (3)
式中,分子的w和分母的w不可消去,爲避免混淆,用另一個字母代替:
x=1Texp(uxTvc)uxw=1Texp(uwTvc)=x=1Texp(uxTvc)uxw=1Texp(uwTvc)=x=1Tp(xc)ux \frac {\sum_{x=1}^T exp(u_x^Tv_c) \cdot u_x}{\sum_{w=1}^T exp(u_w^Tv_c) } \\ = \sum_{x=1}^T \frac {exp(u_x^Tv_c) \cdot u_x}{\sum_{w=1}^T exp(u_w^Tv_c) } \\ = \sum_{x=1}^T p(x|c) \cdot u_x
所以,最終梯度的推導式爲:
Pvc=uox=1Tp(xc)ux\frac{\partial P}{\partial v_c} = u_o - \sum_{x=1}^T p(x|c) \cdot u_x

在這裏插入圖片描述

實際上,梯度可以看作,我們觀察到的上下文當前的詞向量,減去所有文本的期望。

上文提到,我們不僅需要對每個center word求偏導,還要對context word求偏導。

2.4 Cost/Objective functions

上節演示了梯度的計算,這節我們要思考如何根據梯度優化我們的目標函數。
一般是採用梯度下降(GD)的方法優化。

寫成矩陣形式:
θnew=θoldαθJ(θ) \theta^{new} = \theta^{old} - \alpha \nabla_{\theta}J(\theta)
θ\theta中的每個元素θj\theta_{j}來說,
θjnew=θjoldαθjoldθJ(θj) \theta_{j}^{new} = \theta_{j}^{old} - \alpha \frac{\partial}{\partial \theta_{j}^{old}}{\theta}J(\theta_j)

def func1():
  while True:
    theta_grad = evaluate_gradient(J,corpus,theta)
    theta_new = theta_old = alpha * theta_grad

每次對θ\theta中所有元素進行優化非常耗時,所以實踐中每次epoch,只對隨機選取的一小撮θj\theta_j進行優化,叫做隨機梯度下降(SGD)

def func2():
  while True:
    window = sample_window(cprpus)
    theta_grad = evaluate_gradient(J,window,theta)
    theta_new = theta_old = alpha * theta_grad
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章