本节课是对自然语言处理的定义介绍和应用介绍,还顺带说了NLP的难点;
本节课使用深度学习作为NLP的主要处理工具。
传统的机器学习技术,需要人为地去做特征工程,将这些的特征喂给机器学习算法;然后机器学习算法去训练,来找到最拟合训练数据+正则化损失最小的权重。教授说,我们的传统机器学习技术,其实主要是在做数值优化的问题。
人为设计的特征具有如下缺点:
深度学习是机器学习的一个子域。它使用算法,让机器能够自动地学习特征;我们只需要将最原生的特征喂给深度学习算法,它就可以自己学习特征,自己分类,表现得很好。
经常用到的英文术语:
linguistics 语言学
taxonomy 分类
推荐的阅读文献:
Deep Learning in Neural Networks: An Overview
2018-pdf
2017-pdf
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 密集的矢量
在语言学中,词的含义就是通过这个词所传达的具体的指代,或人的想法和意志。可以用如下公式表示:
s i g n i f i e r ( s y m b o l ) ⟺ s i g n i f i e d ( i d e a o r t h i n g ) signifier(symbol) \Longleftrightarrow signified(idea \ or \ thing) signifier(symbol)⟺signified(idea or thing)
这样一个转换叫做指代 d e n o t i o n denotion denotion。
在计算机中有三种方式去表示词/词的有用信息:
下面分别说下这三种方法。
WordNet是一个包含了词的同义词和上级词的很大的资源库。
如果让计算机使用wordnet的方法获取词义会有一些问题:
传统NLP中,我们会使用离散的符号表示离散的词语。比如,独热编码。
利用独热编码,将每个词汇都表示为一个向量。向量的维度是词汇表中词语的数量。
我们纵然可以使用这种方法来计算,包含不同词语的语言文本之间的相似性。但是,计算机仍然不懂这些词语的意思。由于词与词之间是正交的,点积的结果是0,计算机也无法计算词语之间的相似性。
那么我们自然而然想到的解决方式有两种:
根据词汇语义理论中的相似性分布是上一节中第二种解决方式的延伸。
它的核心想法是:一个词语的意义是由文本内容中它邻近的其它词赋予的。考虑上图中banking的例子,它的意义就是有和它一起出现的gorvenment, debt problem, Europe等词赋予的。
corpus 语料库
A simple but tough-to-best baseline for sentence embeddings iclr,2017
在开始的时候,我们介绍一下神经网络词嵌入的一个通用方法。我们希望定义一个模型。它通过词向量,基于中心词 w t w_t wt,来预测中心词的上下文词汇:
p ( c o n t e n t ∣ w t ) p(\ content\ |w_t) p( content ∣wt)
由此,我们可以定义一个损失函数 J J J:
J = 1 − p ( ( c o n t e n t ∣ w t ) ) J = 1 - p((\ content\ |w_t)) J=1−p(( content ∣wt))
我们需要通过一些手段,使损失函数降到最低。
神经网络的历史中,关于直接学习低维词向量的目标,有一些比较经典的论文:
现在说回Word2Vec,Word2Vec是一个学习词向量的框架,由谷歌在2013年首次提出。
它的基本想法是:
本节课重点介绍两种算法:
还有两种有效的训练方法:
给定超参数m作为窗口的固定大小,对于文本的每个位置t,基于中心词 w t w_t wt(图片笔误),预测上下文词汇。
所以目标函数就是每个位置的窗口的每个上下文词汇概率的连乘。
L ( θ ) = ∏ t = 1 T ∏ − m ≤ j ≤ m , j ≠ 0 p ( w t + j ∣ w t ; θ ) L(\theta) = \prod_{t=1}^{T} \prod_{-m \le j \le m, \ j \ne 0} p(w_{t+j}|w_{t} ; \theta) L(θ)=t=1∏T−m≤j≤m, j=0∏p(wt+j∣wt;θ)
注意 θ \theta θ代表的参数,是我们所有的词向量。
由于直接计算连乘概率十分不友好,我们将 L ( θ ) L(\theta) L(θ)取对数,再进行normalization,然后取负,得到 L ( θ ) L(\theta) L(θ)的负对数似然 J ( θ ) J(\theta) J(θ)。
术语:loss function = objective function = cost function
似然函数的损失计算一般是:交叉熵损失
如何计算 p ( w t + j ∣ w t ; θ ) p(w_{t+j}|w_{t} ; \theta) p(wt+j∣wt;θ)呢?
一种简单的方法是使用softmax函数。我们对每个词 w w w,都使用两个向量来表示。一个向量 v w v_w vw是它作为中心词时的向量;另一个向量 u w u_w uw是它作为上下文时的向量。
那么对于中心词(记做c)和上下文词(记做o),有
P ( o ∣ c ) = e x p ( u o T v c ) ∑ w ∈ V e x p ( u w T v c ) P(o|c) = \frac{exp({u_o}^Tv_c)}{\sum_{w \in V}exp(u_w^Tv_c)} P(o∣c)=∑w∈Vexp(uwTvc)exp(uoTvc)
softmax 函数可以将任意的实值 x i x_i xi映射到概率分布 p i p_i pi上,它有两个特点:
本节使用纯数学推导梯度,原式为:
P ( o ∣ c ) = l o g ( e x p ( u o T v c ) ∑ w ∈ V e x p ( u w T v c ) ) P(o|c) =log( \frac{exp({u_o}^Tv_c)}{\sum_{w \in V}exp(u_w^Tv_c)} ) P(o∣c)=log(∑w∈Vexp(uwTvc)exp(uoTvc))
我们需要计算 θ \theta θ中所有参数的梯度,先以计算 ∂ P ∂ v c \frac{\partial P}{\partial v_c} ∂vc∂P为例。
首先:
∂ P ∂ v c = ∂ ∂ v c l o g ( e x p ( u o T v c ) − ∂ ∂ v c l o g ( ∑ w = 1 T e x p ( u w T v c ) ) = ∂ ∂ v c ( u o T v c ) − ∂ ∂ v c l o g ( ∑ w = 1 T e x p ( u w T v c ) ) ( 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) ∂vc∂P=∂vc∂log(exp(uoTvc)−∂vc∂log(w=1∑Texp(uwTvc))=∂vc∂(uoTvc)−∂vc∂log(w=1∑Texp(uwTvc)) (1)
求梯度时,有个很有用的tip:
∂ x T a ∂ x = ∂ a T x ∂ x = a \frac{\partial x^Ta}{\partial x} = \frac{\partial a^Tx}{\partial x} = a ∂x∂xTa=∂x∂aTx=a
so,(1)式减号左边的项简化为 u o u_o uo,右边的项需要应用链式法则。
令
Z = ∑ w = 1 T e x p ( u w T v c ) Z = \sum_{w=1}^T exp(u_w^Tv_c) Z=w=1∑Texp(uwTvc)
右边的项变为:
F = l o g ( Z ) F = log(Z) F=log(Z)
则,
∂ F ∂ v c = ∂ F ∂ Z ⋅ ∂ Z ∂ v c = 1 Z ⋅ ∂ Z ∂ v c \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} ∂vc∂F=∂Z∂F⋅∂vc∂Z=Z1⋅∂vc∂Z
∂ Z ∂ v c \frac{\partial Z}{\partial v_c} ∂vc∂Z计算如下:
∂ Z ∂ v c = ∂ ∂ v c ∑ w = 1 T e x p ( u w T v c ) = ∑ w = 1 T ∂ ∂ v c e x p ( u w T v c ) ( 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) ∂vc∂Z=∂vc∂w=1∑Texp(uwTvc)=w=1∑T∂vc∂exp(uwTvc) (2)
对(2)再应用一些链式法则:
令
Q w = u w T v c Q_w = u_w^Tv_c Qw=uwTvc
,那么
∂ Z ∂ v c = ∂ Z ∂ Q ⋅ ∂ Q ∂ v c \frac{\partial Z}{\partial v_c} = \frac{\partial Z}{\partial Q} \cdot \frac{\partial Q}{\partial v_c} ∂vc∂Z=∂Q∂Z⋅∂vc∂Q
(2)式中,
∂ Z ∂ Q = ∂ ∂ Q ∑ w = 1 T e x p ( Q w ) = ∑ w = 1 T ∂ ∂ Q e x p ( Q w ) = ∑ w = 1 T e x p ( Q w ) \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) ∂Q∂Z=∂Q∂w=1∑Texp(Qw)=w=1∑T∂Q∂exp(Qw)=w=1∑Texp(Qw)
所以,
∂ Z ∂ v c = ∂ Z ∂ Q ⋅ ∂ Q ∂ v c = ∑ w = 1 T e x p ( Q w ) ⋅ u w = ∑ w = 1 T e x p ( u w T v c ) ⋅ u w \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 ∂vc∂Z=∂Q∂Z⋅∂vc∂Q=w=1∑Texp(Qw)⋅uw=w=1∑Texp(uwTvc)⋅uw
那么,
∂ F ∂ v c = 1 Z ⋅ ∂ Z ∂ v c = ∑ w = 1 T e x p ( u w T v c ) ⋅ u w Z = ∑ w = 1 T e x p ( u w T v c ) ⋅ u w ∑ w = 1 T e x p ( u w T v c ) ( 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) ∂vc∂F=Z1⋅∂vc∂Z=Z∑w=1Texp(uwTvc)⋅uw=∑w=1Texp(uwTvc)∑w=1Texp(uwTvc)⋅uw (3)
式中,分子的w和分母的w不可消去,为避免混淆,用另一个字母代替:
∑ x = 1 T e x p ( u x T v c ) ⋅ u x ∑ w = 1 T e x p ( u w T v c ) = ∑ x = 1 T e x p ( u x T v c ) ⋅ u x ∑ w = 1 T e x p ( u w T v c ) = ∑ x = 1 T p ( x ∣ c ) ⋅ u x \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 ∑w=1Texp(uwTvc)∑x=1Texp(uxTvc)⋅ux=x=1∑T∑w=1Texp(uwTvc)exp(uxTvc)⋅ux=x=1∑Tp(x∣c)⋅ux
所以,最终梯度的推导式为:
∂ P ∂ v c = u o − ∑ x = 1 T p ( x ∣ c ) ⋅ u x \frac{\partial P}{\partial v_c} = u_o - \sum_{x=1}^T p(x|c) \cdot u_x ∂vc∂P=uo−x=1∑Tp(x∣c)⋅ux
实际上,梯度可以看作,我们观察到的上下文当前的词向量,减去所有文本的期望。
上文提到,我们不仅需要对每个center word求偏导,还要对context word求偏导。
上节演示了梯度的计算,这节我们要思考如何根据梯度优化我们的目标函数。
一般是采用梯度下降(GD)的方法优化。
写成矩阵形式:
θ n e w = θ o l d − α ∇ θ J ( θ ) \theta^{new} = \theta^{old} - \alpha \nabla_{\theta}J(\theta) θnew=θold−α∇θJ(θ)
对 θ \theta θ中的每个元素 θ j \theta_{j} θj来说,
θ j n e w = θ j o l d − α ∂ ∂ θ j o l d θ J ( θ j ) \theta_{j}^{new} = \theta_{j}^{old} - \alpha \frac{\partial}{\partial \theta_{j}^{old}}{\theta}J(\theta_j) θjnew=θjold−α∂θjold∂θJ(θj)
def func1():
while True:
theta_grad = evaluate_gradient(J,corpus,theta)
theta_new = theta_old = alpha * theta_grad
每次对 θ \theta θ中所有元素进行优化非常耗时,所以实践中每次epoch,只对随机选取的一小撮 θ j \theta_j θj进行优化,叫做随机梯度下降(SGD)。
def func2():
while True:
window = sample_window(cprpus)
theta_grad = evaluate_gradient(J,window,theta)
theta_new = theta_old = alpha * theta_grad