cs224n-Lecture-4 Word Window分类与神经网络

文章目录
  1. 1. Softmaxt的细节
  2. 2. 使用Softmax和交叉熵误差(Cross-Entropy Error)来训练
  3. 3. 背景知识:为什么叫交叉熵误差?
  4. 4. 对一个完整的数据集进行分类
  5. 5. 分类正则化
  6. 6. 常规机器学习优化细节
  7. 7. 分类与词向量的区别
  8. 8. 通过re-training让词向量失去泛化(generalization)
  9. 9. Window Classification-词窗口分类
  10. 10. 矩阵实现说明
  11. 11. 只有Softmax(=Logistic Regression)还不够强大
  12. 12. 从逻辑回归到神经网络
  13. 13. 为什么需要非线性模型
  14. 14. 单层简单神经网络
  15. 15. 前向神经网络
  16. 16. 最大间距损失函数
  17. 17. 使用反向传播进行训练

第四讲也是各种各样的数学知识,看来时候买本李航老师的统计学习来学一遍了!

Softmaxt的细节

softmax的公式:

这个公式可以分两步计算:
1.取出W的第y行与向量x相乘;

从1开始,对所有的c个类别都做这样的乘法。
2.使用softmax来计算归一化的概率:

注:归一化后所有的结果之和等于1.

使用Softmax和交叉熵误差(Cross-Entropy Error)来训练

输入x,希望预测y。
通常我们希望模型可以最大化正确类别的概率,希望通过 argmax 输出,最终可以输出正确的类别。而且最大化概率和最大化对数概率是一样的,最小化对数概率的负数也是一样的。对数概率的负数通常就是需要的目标函数。

背景知识:为什么叫交叉熵误差?

假设我们有正确标注(or gold or target)的概率分布,假设正确类别的概率是1,其余的概率是0,举个栗子,假设共有5个类别且正确类别是中间的第三个类别,那么第三个类别的概率为1,其余的全部为0。
假如把理想的概率定义为p,softmax计算得到的概率记为q,交叉熵的定义就是对所有的类别求和,公式如下:

在例子中,p是一个one-hot向量,只有在一处的值为1,其余的全部为0.所以非正确类别的求和项的值全部为0.所以最后交叉熵的结果是log(q),这正是softmax的计算结果。
从统计学上来说,可以将交叉熵理解为尽可能地最小化两个分布之间的KL散度。

对一个完整的数据集进行分类

总体目标函数,通常记为J,基于所有的参数θ,对所有正确类别的概率的负对数求和,正确类别的标号记为yi,希望最小化整个求和项J,也就是说想尽可能地最小化交叉熵。

注:f 也是输入X的函数

可以将fy重写为Wy行向量乘以x,然后写出整个求和公式。
·通常用 f 来表示举着运算,f=Wx 表示矩阵与向量的乘法。

分类正则化

几乎所有在数据集上的损失函数都包含正则化参数θ作为总体目标函数的一部分:

大多数时候,这里的θ是标准逻辑回归中的矩阵W,实际上目标函数假如这个正则项的目的是为了鼓励模型中的所有权值尽可能的小,尽可能接近0.
当有很多特征值时,正则化可以避免过拟合(或者在一个非常的deep的模型中)。
x轴:模型有多强大,有多少层,多少参数,或者每个词向量有多少维度,或者你训练的耗时,可以看到x轴对不同的变量有相同的模式。
y轴:表示误差,或者是你的目标函数,想尽可能地优化和最小化。
蓝线:训练误差。
红线:测试误差。

通常可以观测到,模型越强大,降低训练误差的效果会越好,也就是说能更好地拟合xi和yi。但是在某种情况下会开始过拟合,你的测试误差或者验证误差,或者开发集误差,将会增加。

常规机器学习优化细节

通常在机器学习中,只优化这里的 W,也就是softmax分类器的参数。

因此更新和梯度将会特别小。所以在很多情况下,只有少量的类别,而且词向量的维度是上百而已。假如有3个类别和100维的词向量,只有300个参数。

分类与词向量的区别

在深度学习中有很多的词汇量,实际上我们不仅想学习Softmax分类器,而且还有词向量。可以反向传播到词向量,但问题是何时更新词向量。考虑到这个问题的时候必须意识到词向量非常大,现在突然有个非常大的参数集,假设你的词向量的维度是300,你的词典中有1w个词,突然有如此巨大的参数集,在这种情况下,很有可能会过拟合。

通过re-training让词向量失去泛化(generalization)

假设想要将单个词分类为积极或消极,假设训练测试集包含了单词TV和telly,同时,假设也知道这是电影评论,你说这部电影很适合TV,则这不是一个很积极的说法。
实际上,telly 和 TV 在向量空间实际上很接近,使用word2vec或者是GloVe学习,在非常大的语料库上训练这些词向量,学习到这三个单词(TV,telly,television)经常出现在相似的上下文中,所以它们在向量空间中很接近。

但由于情感分析语料中,训练集只含有 TV 和 telly,导致 re-training 之后两者移动到向量空间的其他位置:

而television仍然在它最开始的位置。现在想测试它,我们实际上将会把这个词错误分类,因为它从未改变过位置,这就意味着:


·如果训练数据集很小,不必训练词向量;
·如果数据集很大,训练词向量之后在任务中的效果会更好。

Window Classification-词窗口分类

这种分类方法是根据上下文对单词进行分类,害,直接看这页PPT就OK了。

这里使用四分类命名实体识别作为第一个例子,我们想识别人名,地点,组织以及其他,对大语料库中的每个单词存在着许多不同的可能性。
2008年Collobert和Weston第一次提出,是当时第一个有用且最先进的文本分类和词的上下文分类。要做的就是训练一个softmax分类器,给中心词分配一个标签然后用一个窗口把它前后的单词连接起来。

此处从一个长句中截取的短句举个栗子,想对中心词Paris分类,在这个窗口的上下文中,我们定义窗口长度为2,以我们想分类的当前中心词而言,重新定义新的输入x为整个窗口连接成的5个词向量。所以这里定义X为一个5D维的列向量,我们有D维的词向量并且有5个这样的词向量,把它们排成一列。

我们能想到的最简单的单词分类器,就是将这个5个词向量的拼接放入softmax分类器。这里定义了输入x,x是整个窗口拼接的x,然后上面有softmax分类器:

此处引入y_hat来表示当前的正确类别。

下面需要更新词向量:
(short answer)处理办法:求导。
(long answer)处理办法:step by step。

y_hat:softmax概率向量(即归一化之后的得分或概率)。
t:目标分布概率,type:one -hot vector.
f:f(x)是矩阵乘法。f 将是一个C维向量,大写字母C是类别的数量。

如果想对整个softmax求解关于x的导数,那么必须对包含x的所有类别求和,fy 不仅有下标y(即第y个类别)而且也是x的函数,这里也乘了右边这一项。
对左边的x求导要注意两种情况:
1.c等于正确类别y这种情况;
2.c等于所有非正确类别的情况。
最后求导得到的结果是:

这里对分类正确的类别-1,其他的什么都不用做。

y_hat -t 相当于 one-hot 中正确的部分-1。

在使用链式法则的过程中可以得到:

简化之后,我们得到了总体代价函数的导数训练集中的一个元素关于x的导数,但x是一个window,窗口有5个词,而且每个词是d维的,那么这个梯度或导数的维度应该是什么?
注:δ是从softmax中得到的一个误差信号,我们用softmax的权值W的转置与δ相乘。

A:这个梯度或导数的维度应该是5d。

现在的问题是你想更新词向量,而不是整个窗口,窗口只是一个中间步骤,所以实际上要做的是更新计算关于词向量的每个元素的导数。
只需要拆分误差δ,即整个窗口的总体梯度,它基本上只是所有不同词向量的拼接。

矩阵实现说明

softmax有两个非常消耗计算的操作,矩阵乘法和指数运算。
使用矩阵乘法要比loop节省时间(吴恩达老师课程中有提及)。假设有500个窗口需要分类,同时假设每个窗口的维度为300,假设softmax中有五个类别,在计算过程中的某个时刻,我们有两个选项,W是softmax的权值,W有C行和d列,这里为每个窗口拼接得到的词向量或者也可以是一个很大的矩阵,矩阵维度是d*n。d是每个窗口的维度,n是窗口的数目。
我们有500个窗口,所以one_matrix矩阵有500列,可以将W分别与每个向量相乘,或者我们也可以做这样一次矩阵乘法。

只有Softmax(=Logistic Regression)还不够强大

softmax只能得到线性决策边界,当数据集很大的时候softmax的分类效果往往就不尽人意。

在使用神经网络之后,分类的结果就不那么糟心了,因为它可以提供非线性的决策边界。

从逻辑回归到神经网络

神经元本质上是一个二元逻辑回归单元,进入神经元内部,有一组值用来和输入进行相乘,所以我们有这个神经元的输入wx,再加上一个偏置项。

这一项定义了神经元激活的可能性,激活的意思是有一个接近于1的非常高的概率,这里的f其实就是sigmoid函数,将乘法加上偏置项的求和映射到0和1之间。

一个神经网络其实就是同时运行多个逻辑回归,但不需要提前制定其具体预测什么。

Softmax与标准机器学习和深度学习的主要区别是:我们实际上不强制它直接给出输出结果,他,它们自己也会是另一个神经元的输入,预测结果是基于这个神经元的损失函数,比如交叉熵,用来控制这些中间隐藏的神经元,或隐藏层中它们想要达到的目标。

模型可以决定它自己应该代表什么,它如何将隐藏单元的输入转换,为了让我们在最后的输出中有更小的误差,它实际上只是这些隐藏神经元的连接。
这些小的二元逻辑回归单元可以帮助构建非常深的神经网络架构。

为什么需要非线性模型

因为非线性模型可以捕捉更复杂的数据,不像线性模型,所有的层等效与一层。

单层简单神经网络

一个单层神经网络是一个线性层和一个非线性层组成的:

神经激活函数a能用来计算一些输出,接着,通过softmax计算可能性:

前向神经网络

使用一个三层的神经网络来计算一个窗口的得分,s=score:

这里的窗口x是所有词向量的拼接,这里提出一个问题,计算所有参数的维度?
这里的每一个词向量是四维的,有5个单词,所以x是20维向量,再次将它定义为列向量。
假设第一个隐藏层,有8个隐藏单元,所以需要一层又8个神经元的隐藏层。
然后最后得分只是一个简单得数值,那么现在W的维度是多少?

well,这个可以通过这个矩阵来理解一下:

额外一层的作用,对于NLP来说,它将允许学习这些不同的输入词之间的非线性相互作用,以前我们只能说如果单词 in 出现在这个位置,总会增加下一个词是地点的概率。现在可以学习这样的模式,即如果单词 in 在第二个位置会提高这个是地点的可能性,只有在单词 meseum 也是第一个词的情况下,所以可以学习这些不同的输入之间的相互作用。

最大间距损失函数

训练目标函数的思想是:假如想让中心词是一个点点的窗口得分高或者是想让不正确的窗口得分低,不正确窗口的中心词不是一个命名实体位置。
s=score(museums in Paris are amazing)[正确样本]
sc=score(Not all museums in Paris)[错误样本]

最大间距的训练目标本质上是为了让正确的窗口得分,比错误窗口的得分更大,让错误窗口的得分更低,直到他们足够好为止。
把足够好定义为差值为1,这里的1是一个边界,经常看到它作为一个超参数,把它赋值给m并尝试不同的值,但在多数情况下数值1的效果很好。
因为它是连续的,所以可以使用随机梯度下降函数。

使用反向传播进行训练


一般从顶层开始向下求导数,因为会重复使用不同的元素将导数简单地组合,重复使用变量的导数会把我们引导到反向传播。
对单个权重进行求导(Wij)

Wij实际上只出现在隐藏层的第i个激活层,比如W23是被用来计算a2。

对Wij进行求导:

求导过程如下:

简化以后:

对于偏置项 b:

对两个激活函数进行求导:

对U求梯度: