本节课初步介绍了神经网络与NLP的一些结合,主要内容为:
- Classification background
- Updating word vectors for classification
- Window classification & cross entropy error derivation tips
- A simple neural network
- Max-Margin loss and backprop
假设现在需要处理一个分类任务,给定的训练集中包含 N N N个样本,每个样本都有着对应的标签,训练集简记为 { x i , y i } i = 1 N \{x_{i},y_{i}\}_{i=1}^N {xi,yi}i=1N。其中样本 x i x_{i} xi可以是多种类型的数据,例如词向量、上下文窗口、句子或文档等; y i y_{i} yi是我们想要预测的标签,对于不同类型的任务可以有不同的含义,对于命名实体任务或是情感分析来说,它可能是类别信息,对于其他的任务就可能表示另外的信息。
对于这样简单的分类任务,可以使用Logistic Regression或是SVM等传统的机器学习分类算法得到线性的决策边界,尽可能将不同类别的样本分开。
例如在LR中我们需要借助Softmax函数,求解某个样本属于正类或是负类的概率大小。当求出的概率值大于某个设定的阈值时,就将其归为正类,否则就是负类。Softmax函数的定义如下所示: p ( y j = 1 ∣ x ) = exp ( W j , x ) ∑ c = 1 C exp ( W c x ) , W ∈ R C × d p\left(y_{j}=1 | x\right)=\frac{\exp \left(W_{j}, x\right)}{\sum_{c=1}^{C} \exp \left(W_{c} x\right)},W \in \mathbb{R}^{C \times d} p(yj=1∣x)=∑c=1Cexp(Wcx)exp(Wj,x),W∈RC×d其中 C C C为样本的数量, d d d为每个样本的特征维数。如果将分母括号中的部分写为 W y . x = ∑ i = 1 d W y i x i = f y W_{y .} x=\sum_{i=1}^{d} W_{y i} x_{i}=f_{y} Wy.x=∑i=1dWyixi=fy,则有 p ( y ∣ x ) = exp ( f y ) ∑ c = 1 C exp ( f c ) = softmax ( f ) p(y | x)=\frac{\exp \left(f_{y}\right)}{\sum_{c=1}^{C} \exp \left(f_{c}\right)}=\operatorname{softmax}(f) p(y∣x)=∑c=1Cexp(fc)exp(fy)=softmax(f)使用Softmax函数就是为了将概率值挤压到 [ 0 , 1 ] [0,1] [0,1]之间。对于训练集的每一个样本,目标函数的目的都是最大化它属于正确类别的概率。为了方便计算,通常在训练过程中将最大化转换为最小化负对数形式,如下所示:
− log p ( y ∣ x ) = − log ( exp ( f y ) ∑ c = 1 C exp ( f c ) ) -\log p(y | x)=-\log \left(\frac{\exp \left(f_{y}\right)}{\sum_{c=1}^{C} \exp \left(f_{c}\right)}\right) −logp(y∣x)=−log(∑c=1Cexp(fc)exp(fy))根据交叉熵的定义 H ( p , q ) = − ∑ c = 1 C p ( c ) log q ( c ) H(p, q)=-\sum_{c=1}^{C} p(c) \log q(c) H(p,q)=−∑c=1Cp(c)logq(c)可知上述的目标函数实际上就等价于交叉熵 H ( y ^ , y ) = − ∑ j = 1 ∣ V ∣ y j log ( y ^ j ) = − ∑ j = 1 C y j log ( p ( y j = 1 ∣ x ) ) = − ∑ j = 1 C y j log ( exp ( W j x ) ∑ c = 1 C exp ( W c x ) ) = − y i log ( y ^ i ) \begin{aligned} H(\hat{y}, y) &=-\sum_{j=1}^{|V|} y_{j} \log \left(\hat{y}_{j}\right) \\ &=-\sum_{j=1}^{C} y_{j} \log \left(p\left(y_{j}=1 | x\right)\right) \\ &=-\sum_{j=1}^{C} y_{j} \log \left(\frac{\exp \left(W_{j} x\right)}{\sum_{c=1}^{C} \exp \left(W_{c} x\right)}\right) \\ &=-y_{i} \log \left(\hat{y}_{i}\right) \end{aligned} H(y^,y)=−j=1∑∣V∣yjlog(y^j)=−j=1∑Cyjlog(p(yj=1∣x))=−j=1∑Cyjlog(∑c=1Cexp(Wcx)exp(Wjx))=−yilog(y^i)而且交叉熵的表达式也可以写为 H ( p , q ) = H ( p ) + D K L ( p ∥ q ) H(p, q)=H(p)+D_{K L}(p \| q) H(p,q)=H(p)+DKL(p∥q),在这里 H ( p ) = 0 H(p)=0 H(p)=0,因此最小化目标函数的过程也就是最小化 p p p和 p p p之间的KL散度。KL散度是一种非对称的度量两个分布间距离的方式,定义式如下所示 D K L ( p ∥ q ) = ∑ c = 1 C p ( c ) log p ( c ) q ( c ) D_{K L}(p \| q)=\sum_{c=1}^{C} p(c) \log \frac{p(c)}{q(c)} DKL(p∥q)=c=1∑Cp(c)logq(c)p(c)
关于KL散度的简单介绍可见:为什么在GAN中使用KL散度会出现模式坍缩的问题?
整个训练集的损失函数为 J ( θ ) = 1 N ∑ i = 1 N − log ( e f y i ∑ c = 1 C e f c ) J(\theta)=\frac{1}{N} \sum_{i=1}^{N}-\log \left(\frac{e^{f_{y_{i}}}}{\sum_{c=1}^{C} e^{f_{c}}}\right) J(θ)=N1i=1∑N−log(∑c=1Cefcefyi)通常为了避免过拟合的出现,损失函数中会添加正则化项,完整的损失函数为 J ( θ ) = 1 N ∑ i = 1 N − log ( e f y i ∑ c = 1 C e f c ) + λ ∑ k θ k 2 J(\theta)=\frac{1}{N} \sum_{i=1}^{N}-\log \left(\frac{e^{f_{y_{i}}}}{\sum_{c=1}^{C} e^{f_{c}}}\right)+\lambda \sum_{k} \theta_{k}^{2} J(θ)=N1i=1∑N−log(∑c=1Cefcefyi)+λk∑θk2
例如下面这个简图所示, x x x轴表示模型的性能强弱或是迭代的次数, y y y轴表示度量误差,蓝线表示训练误差,红线表示测试误差。一旦 x x x代表的值超过一定的阈值时,虽然训练集上误差在下降,但是测试集上的误差开始上升,此时模型发生了过拟合。
在传统的机器学习任务中,参数往往并不是很多,因此权值矩阵的维度并不大,但是在深度学习中,例如在词向量中需要同时学习很多的参数,这时就很容易出现过拟合。
特别是在re-training词向量时可能造成模型泛化能力的急剧下降。假设我们使用LR来做一个简单的情感分类任务,在训练集中有"TV"、“telly”,在测试集中有"television",三个词都是用来表示电视。因为它们的语义相近,在预训练得到的词向量中,它们之间的距离应该很小
如果在测试集中重新训练词向量,我们发现telly和TV距离很近,但是它们离television却很远。如果使用这样的词向量进行下游的分类任务,必然会带来一定的误差。
在了解window calssification之前,先来了解一些常见的术语。
- word vector = lookup table
- Word vectors = word embeddings = word representations
词向量矩阵可以表示为
Window classification
它是一种根据上下文给单个单词分类的任务,可以用于消歧或命名实体分类。上下文Window的向量可以通过拼接所有窗口中的词向量得到。例如有"museums in Paris are amazing",对应的窗口向量可以表示为
其中最简单的一个分类器就是Softmax分类器,将 x = x w i n d o w x = x_{window} x=xwindow带入到公式中有
损失函数和前面讲的一样,然后 J J J对 x x x求到更新词向量矩阵 Δ x J = ∂ ∂ x − log softmax ( f y ( x ) ) = ∑ c = 1 C − ∂ log softmax ( f y ( x ) ) ∂ f c ⋅ ∂ f c ( x ) ∂ x = [ y ^ 1 y ^ 1 ⋮ y ^ C ] ⋅ ∂ f c ( x ) ∂ x = ∑ c = 1 C δ c W c T = W T δ ∈ R 5 d \begin{aligned} \Delta_{x} J &=\frac{\partial}{\partial x}-\log \operatorname{softmax}\left(f_{y}(x)\right) \\ &=\sum_{c=1}^{C}-\frac{\partial \log \operatorname{softmax}\left(f_{y}(x)\right)}{\partial f_{c}} \cdot \frac{\partial f_{c}(x)}{\partial x} \\ &=\left[\begin{array}{c}{\hat{y}_{1}} \\ {\hat{y}_{1}} \\ {\vdots} \\ {\hat{y}_{C}}\end{array}\right] \cdot \frac{\partial f_{c}(x)}{\partial x} \\ &=\sum_{c=1}^{C} \delta_{c} W_{c}^{T} \\ &=W^{T} \delta \in \mathbb{R}^{5 d} \end{aligned} ΔxJ=∂x∂−logsoftmax(fy(x))=c=1∑C−∂fc∂logsoftmax(fy(x))⋅∂x∂fc(x)=⎣⎢⎢⎢⎡y^1y^1⋮y^C⎦⎥⎥⎥⎤⋅∂x∂fc(x)=c=1∑CδcWcT=WTδ∈R5d
即 ∇ θ J ( θ ) = [ ∇ x museum ⋮ ∇ x amazing ] \nabla_{\theta} J(\theta)=\left[\begin{array}{c}{\nabla_{x_{\text {museum}}}} \\ {\vdots} \\ {\nabla_{x_{\text {amazing}}}}\end{array}\right] ∇θJ(θ)=⎣⎢⎡∇xmuseum⋮∇xamazing⎦⎥⎤
另外对 W W W求偏导得 ∇ θ J ( θ ) = [ ∇ W ⋅ 1 ⋮ ∇ W . d ∇ x aarduar ⋮ ∇ x zebra ] ∈ R C d + V d \nabla_{\theta} J(\theta)=\left[\begin{array}{c}{\nabla_{W \cdot 1}} \\ {\vdots} \\ {\nabla_{W . d}} \\ {\nabla_{x_{\text {aarduar}}}} \\ {\vdots} \\ {\nabla_{x_{\text {zebra}}}}\end{array}\right] \in \mathbb{R}^{C d+V d} ∇θJ(θ)=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡∇W⋅1⋮∇W.d∇xaarduar⋮∇xzebra⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤∈RCd+Vd
在简单的任务上,传统的机器学习方法也许还可以满足要求,但仍然会有样本难以使用线性的方法正确分类
如果想要将所有的样本全部分对,那么就需要更加复杂的决策边界,相当于模型需要拟合更加复杂的函数,而这正是神经网络所擅长的事情,它可以做到如下的效果,它的决策边界更加复杂,但效果很好
后面关于神经网络和反向传播的部分是深度学习中最基本的内容,这里就不再赘述啦~