第四讲 cs224n系列之Word Window分类与神经网络

1 综述

这节课介绍了根据上下文预测单词分类的问题,与常见神经网络课程套路不同,以间隔最大化为目标函数,推导了对权值矩阵和词向量的梯度;初步展示了与传统机器学习方法不一样的风格。

本文主要讲解:

  • 分类问题背景
  • 在分类任务中融入词向量
  • 窗口分类和交叉熵误差推导技巧
  • 一个单层的神经网络
  • 最大间隔损失和反向传播

2 分类问题

2.1nlp分类背景

一般情况下我们会有一个训练模型用的样本数据集

其中是输入,例如单词(标识或者向量),窗口内容,句子,文档等
是我们希望预测的分类标签,例如情绪指标,命名实体,买卖决定等
给定训练集

2.2 从分类到nlp分类

{x(i),y(i)}1N

其中x(i) 是一个 d-维向量,y(i)是一个 C-维one-hot向量,N是总数。在传统的机器学习方法中,往往通过诸如逻辑斯谛回归和SVM找到分类决策边界:

第四讲 cs224n系列之Word Window分类与神经网络

机器学习的角度来看:假设x是固定的,仅仅更新的是逻辑回归的权重W意味着仅仅修改的是决策边界

p(yj=1|x)=exp(Wjx)c=1Cexp(Wcx)

这里的C是全部的分类,也就是one-hot向量对应的元素个数

计算方法分为两个步骤:取权值矩阵的某一行乘上输入向量,归一化得到概率。
一般的机器学习问题: 仅仅更新逻辑回归的权重意味着仅仅更新的是决策边界

log(exp(Wkx)c=1Cexp(Wcx))

其实这个损失函数等效于交叉熵:

(1)H(y^,y)=j=1|V|yjlog(y^j)(2)=j=1Cyjlog(p(yj=1|x))(3)=j=1Cyjlog(exp(Wjx)c=1Cexp(Wcx))(4)=yilog(y^i)

这是因为类别是one-hot向量

对N个数据点来讲有:

i=1Nlog(exp(Wk(i)x(i))c=1Cexp(Wcx(i)))

加上正则化项有:

i=1Nlog(exp(Wk(i)x(i))c=1Cexp(Wcx(i)))+λk=1Cd+|V|dθk2

这里的θ就是权值矩阵所有参数(cd)+词向量参数(|V|d),这里相比较传统分类问题,增加了词向量所有参数,这也是和传统分类问题的最大区别

第四讲 cs224n系列之Word Window分类与神经网络

红线是test error,蓝线是training error,横轴是模型复杂度或迭代次数。直线是方差偏差均衡点。

2.2 基于词向量的分类优化

  • 一般的ML问题中,参数由权值矩阵的列组成维度不会太大。而在词向量或其他深度学习中,需要同时学习权值矩阵和词向量。参数一多,就容易过拟合
    一般的机器学习问题常常只包含了W的列数:

    第四讲 cs224n系列之Word Window分类与神经网络

    引入词向量之后的参数:
    第四讲 cs224n系列之Word Window分类与神经网络

  • 因为同时需要同时学习权值矩阵和词向量,所以基于词向量的分类问题参数拟合,还会造成re-training词向量失去泛化效果。
    比如针对电影评价情感数据(movie review sentiment)训练逻辑回归模型,在训练集里我们有单词”TV”和”telly”,在测试集里我们有单词“television”,原本它们是相似的单词(来自于已经训练的词向量模型)

    第四讲 cs224n系列之Word Window分类与神经网络

    当我们重新训练词向量模型的时候会发生什么?
    1)在训练集中的单词会被重新安排到合适的位置
    2)在已经训练的词向量模型中但是不在训练集中的单词将保留在原来的位置
    对于上例, “TV”和”telly”会被重新安排,而”television”则保留在原位,尴尬的事情就发生了:
    第四讲 cs224n系列之Word Window分类与神经网络

    于是在测试集上导致television被误分类。
    这个例子说明:
    1)如果你只有一个很小的训练集,不要训练词向量模型
    2)如果你有一个足够大的训练集,那么对于相应的任务来说训练词向量模型是有益的

基础知识小课堂:
词向量矩阵L常被称作lookup table:

第四讲 cs224n系列之Word Window分类与神经网络

Word vectors = word embeddings = word representations (mostly)
通常通过词向量矩阵L和one-hot向量e相乘得到单个的词向量:
x=Leϵd×VV×1

2.3 Window classification

2.3.1 背景

单个单词的分类任务很少,比较多的是在上下文中解决歧义问题,这是一种根据上下文给单个单词分类的任务,可以用于消歧或命名实体分类。如下例子:
第四讲 cs224n系列之Word Window分类与神经网络
第四讲 cs224n系列之Word Window分类与神经网络

2.3.2 Window classification

针对2.3.1中提到的问题,windows classification的思路为:将对一个单词进行分类的问题扩展到对其临近词和上下文窗口进行分类,就是对窗口中的单词打上标签同时把它前后的单词向量进行拼接然后训练一个分类器
第四讲 cs224n系列之Word Window分类与神经网络
这是对于一个句子上下文中的”Paris”进行分类,窗口长度为2,得到的是一个窗口向量,是一个列向量,可表示为:

Xwindow=xϵR5d

结合2.2中的思路,使用softmax:
第四讲 cs224n系列之Word Window分类与神经网络
J对x求导,注意这里的x指的是窗口所有单词的词向量拼接向量。

(449)ΔxJ=xlogsoftmax(fy(x))(450)=c=1Clogsoftmax(fy(x))fcfc(x)x(451)=[y1^y^1yC^]fc(x)x(452)=δfc(x)x(453)=c=1CδcWcT(454)=WTδR5d

这里f=f(x)=WxϵRC

!!!上面的推导没太看懂…(366)->(367)没看懂…(可参考链接

于是就可以更新词向量了:

θJ(θ)=[xmuseumsxamazing]

另一方面,对W求偏导数,将所有参数的偏导数写到一起有:

θJ(θ)=[W1Wdxaardvarkxzebra]RCd+Vd

在更新过程中计算代价最高的有矩阵运算f=Wx和指数函数,但矩阵运算比循环要快多了(在CPU上快一个数量级)

基础知识小课堂:
在softmax中有两个代价昂贵的运算: 矩阵运算 f = Wx 和 exp指数运算
在做同样的数学运算时for循环永远没有矩阵运算有效,遍历词向量 VS 将它们拼接为一个大的矩阵 然后分别和softmax的权重矩阵相乘
第四讲 cs224n系列之Word Window分类与神经网络
运行结果:
第四讲 cs224n系列之Word Window分类与神经网络
结果证明矩阵相乘更有效

2.4 基于神经网络的分类

2.4.1 背景

window classification在少量的数据上(正则化)效果会不错,在大量的数据上效果会有限,softmax仅仅给出线性决策边界举例:
第四讲 cs224n系列之Word Window分类与神经网络
但是神经网络能够提供非线性的决策边界
第四讲 cs224n系列之Word Window分类与神经网络

2.4.2 从逻辑斯蒂回归到神经网络

如果你了解softmax的运行机制,那你就已经了解了一个基本的神经元的运行机制
例子:一个神经元就是一个基础的运算单位,拥有n(3)个输入和一个输出,参数是W, b

第四讲 cs224n系列之Word Window分类与神经网络

一个神经网络等价于同时运行了很多逻辑回归单元,神经网络同时运行多个逻辑斯谛回归,但不需要提前指定它们具体预测什么

第四讲 cs224n系列之Word Window分类与神经网络

我们把预测结果喂给下一级逻辑斯谛回归单元,由损失函数自动决定它们预测什么:

第四讲 cs224n系列之Word Window分类与神经网络

然后我们就有了多层神经网络

第四讲 cs224n系列之Word Window分类与神经网络

基础知识小课堂:
神经网络中单层的矩阵符号表示
我们有:
第四讲 cs224n系列之Word Window分类与神经网络
表示成矩阵符号形式:

z=Wx+ba=f(z)

其中f应用的是element-wise规则(也就是点乘):
f([z1,z2,z3])=[f(z1),f(z2),f(z3)]

第四讲 cs224n系列之Word Window分类与神经网络

为什么需要非线性的f?没有非线性函数,深度神经网络相对于线性变换价值不大,其他的层次会被编译压缩为单个的线性变换:,有了更多的层次,它们可以逼近更复杂的函数

2.4.3 前向传播网络

以简单三层神经网络为例:

第四讲 cs224n系列之Word Window分类与神经网络

这种红点图经常在论文里看到,大致代表单元数;中间的空格分隔开一组神经元,比如隐藏层单元数为2 \times 4。U是隐藏层到class的权值矩阵:
第四讲 cs224n系列之Word Window分类与神经网络

其中a是**函数:

a=11+exp((wTx+b))

或:

a=11+exp([wT   b][x   1])

2.4.4 间隔最大化目标函数

怎么设计目标函数呢,记sc代表误分类样本的得分,s表示正确分类样本的得分。则朴素的思路是最大化(ssc)或最小化(scs)。但有种方法只计算sc>s(scs)>0时的错误,也就是说我们只要求正确分类的得分高于错误分类的得分即可,并不要求错误分类的得分多么多么小。这得到间隔最大化目标函数:

minimizeJ=max(scs,0)

但上述目标函数要求太低,风险太大了,没有留出足够的“缓冲区域”。可以指定该间隔的宽度(ssc<Δ),得到:

minimizeJ=max(Δ+scs,0)

可以调整其他参数使得该间隔为1:

minimizeJ=max(1+scs,0)

这实际上是将函数间隔转换为几何间隔,参考SVM:http://www.hankcs.com/ml/support-vector-machine.html#h3-3

在这个分类问题中,这两个得分的计算方式为:sc=UTf(Wxc+b)s=UTf(Wx+b);通常通过负采样算法得到负例。

另外,这个目标函数的好处是,随着训练的进行,可以忽略越来越多的实例,而只专注于那些难分类的实例。

2.4.5 反向传播训练

依然是老生常谈,跳过链式法则推导直接贴结果:

W(k)=[δ1(k+1)a1(k)δ1(k+1)a2(k)δ2(k+1)a1(k)δ2(k+1)a2(k)]=δ(k+1)a(k)T

其中δ(k)是第k层的误差:

δ(k)=f(z(k))(W(k)Tδ(k+1))

可见只要控制误差的计算方式,就可以smoothly地过渡到间隔最大化目标函数

未完待续!!!

参考链接