斯坦福CS224n笔记系列4--Word Window分类与神经
1. Classification background
1.1 Classification setup and notation
首先给定训练集
-
是输入,比如是一个单词或者向量,一个包含了部分上下文的窗口(对应前面word2vec的窗口)、一句话或者是一个文件等等
-
是我们想预测的一个标签,比如这句话对应的情感是什么,具体预测出的名字,买卖商品的决定,总之是一个批量单词的序列。
实际上这个训练集很常见,比如现在有这样一组数据,是一个键值对类型{猫:1},{狗:2},{小猫:1},所以这个训练集就是我们日常生活中已经分类好的数据(可能进行部分数据清洗)。
2. Updating word vectors for classification
2.1 Classification intuition
- 训练数据:
一个简单图解的示例:
- 固定到二维去分类的图示
- 使用的是逻辑回归
-
中间的分界线是一个决策的边界
传统的机器学习是:假定x被确定,通过逻辑回归等去确定权重,然后去修改决策的边界。
目标是预测每个x出现的概率。
问题一:softmax是逻辑回归吗?
首先softmax是逻辑回归,传统的逻辑回归是指处理二分类问题,softmax正是逻辑回归推广到多分类问题的一种形式。
可以参考这个帖子:Logistic and Softmax Regression (逻辑回归和Softmax回归)
问题二:公式里面的W是哪来的?为什么和原公式不一样?
原公式是:
但是在我们之前讲过的单层神经网络中,有:
其中是权重矩阵中的一行,然后和x这个ont-hot单列矩阵(也可能不是ont-hot向量)相乘,最后得到y
2.2 Details of the softmax
上述是一个softmax 函数,我们可以从两个部分来梳理一下:
- 取权重中的第y行,然后乘以x,得到的公式就是:
note:注意这里得到的y实际上是一个值,是将1xN的行矩阵和Nx1的列矩阵相乘,最后得到的一个数。 -
然后用softmax函数取进行归一化处理:
2.3 The softmax and cross-entropy error
note:此处error翻译成误差。
对于每一个数据集,我们的目标就是最大化预测的y正确的概率。
因此,我们最小化概率的负对数,也就是下面这个公式:
note:所以对于整个训练集来讲,我们要最大化所有的y预测正确的概率,也就是最小化所有y对应的负对数,所有负对数之和就可以作为一个损失函数。
Background: Why “Cross entropy” error ?
首先我们假设有一个真实的概率分布,其中用one-hot向量来表示,假设有一个词为p = [0,…,0,1,0,…0],但是我们计算的出来的向量可能为q(也就是我们的预测值),那么我们的交叉熵公式就是:
![](https://img.haomeiwen.com/i10857530/5aca61db81472c5e.png)
交叉熵可以被写成:
![](https://img.haomeiwen.com/i10857530/e305c46b3b54a144.png)
note:这其中的实际上公式是:
我们可以看到,这个实际上就是我们所说的,信息熵,
实际上就是我们所说的相对熵,交叉熵=信息熵+相对熵。
由于Hp常常是一个常数,那么由上面这个公式我们可以知道,最小化交叉熵,实际上就是最小化。
并不是一个距离,而是对两个概率分布(p和q)之差的非对称度量。
![](https://img.haomeiwen.com/i10857530/57a74308eed40f8e.png)
再一个完整的数据集上的分类,交叉熵的损失函数一般是:
![](https://img.haomeiwen.com/i10857530/dc7799a84046e575.png)
note:这就是刚刚所说的,所有负对数之和作为损失函数,当然,需要除以一个N,来平均化。
而不是:
![](https://img.haomeiwen.com/i10857530/1d0a8249531ac42e.png)
问题一:为什么不是上面这个函数作为损失函数?
上面这个函数实际上求出的是某个预测的具体的值,是我们要最大化的值,一方面他没有经过softmax函数归一化处理,另一方面,损失函数我们经常希望的是去求最小值,这也符合损失函数的定义,即让损失(代价)最小。
真正的正则化方程应当是:
![](https://img.haomeiwen.com/i10857530/0363aedb34ac4c93.png)
问题二:我们为什么要正则化?
如下所说,正则化可以帮助我们防止过拟合。
问题三:为什么正则化可以帮助我们防止过拟合?上面公式加上的那一坨又是什么意思呢?
关于正则化的原理解释推荐,可以参考知乎上的回答机器学习中常常提到的正则化到底是什么意思?
那么根据这个回答,我们可以看出来我们的公式中的后面加上的那一坨实际上就是权重矩阵W的2-范数,当然实际的2-范数形式应当是:,but any way,并不太影响,不是嘛。
正则化可以帮助我们防止过拟合(预测太贴近training data了,而不符合test data)。
下面是一张过拟合的图片,蓝色的表示再training data上的误差,红色表示再test data上的误差,横轴是模型复杂度或迭代次数。直线是方差偏差均衡点:
![](https://img.haomeiwen.com/i10857530/7ff65d333c0ee8f7.png)
正则化同时也可以泛化方程,使得得出的方程更加的平滑,更具有返回能力。
在一般的机器学习中,通常由W组成,
![](https://img.haomeiwen.com/i10857530/51dba45242f354ae.png)
一般的ML问题中,参数由权值矩阵的列组成维度不会太大。而在词向量或其他深度学习中,需要同时学习权值矩阵和词向量。参数一多(特征,也就是权重矩阵w的行数),就容易过拟合:
![](https://img.haomeiwen.com/i10857530/ed3ff4134de4f246.png)
所以我们更新决策边界只需要求梯度即可:
![](https://img.haomeiwen.com/i10857530/406a5b9f6eef66fd.png)
2.4 Losing generalization by re-training word vectors
比如有一个给单词做情感分析的小任务,在预训练的词向量中,这三个表示电视的单词都是在一起的:
![](https://img.haomeiwen.com/i10857530/30ea5a83b3f11835.png)
但是由于训练集中只含有TV和telly,导致re-trainning之后,两者跑到别处去了。
![](https://img.haomeiwen.com/i10857530/bb26d4991579f8f1.png)
这个例子说明,如果任务的语料非常小,则不必在任务语料上重新训练词向量,否则会导致过拟合。
2.5 Side note on word vectors notation
顺便介绍一下词向量的相关术语,词向量矩阵L被称作lookup table
![](https://img.haomeiwen.com/i10857530/9df727a782736746.png)
Word vectors = word embeddings = word representations (mostly)
可能有些人认为“词向量”是个很俗的翻译,但根据这门课的课件,其实与“词嵌入”是等价的。而且Rocher也几乎是一直在用word vector,而不是其他术语。
3. Window classification & cross entropy error derivation tips
3.1 Window classification
这是一种从上下文给单个单词分类的任务,可以用于消除歧义和命名实体的分类。上下文Window的向量可以通过拼接所有窗口中的词向量得到。
![](https://img.haomeiwen.com/i10857530/349fef7f123ddb3c.png)
这是一个
![](https://img.haomeiwen.com/i10857530/794c9229c17b9285.png)
的列向量。
3.2 最简单的分类器:softmax
![](https://img.haomeiwen.com/i10857530/7b674d165b6505ff.png)
note:通过上面一系列详细的推导,到这里来看这上面的两个式子就很清晰了。
J对x进行求导,注意,这里的x指的是窗口所有单词的词向量拼接的向量。
![](https://img.haomeiwen.com/i10857530/15d4660bdc7e5d00.png)
问题一:softmax函数的交叉熵如何求导?
求导详细过程,参考知乎softmax函数详细求导过程和简单易懂的softmax交叉熵损失函数求导
那么对于上式中:
![](https://img.haomeiwen.com/i10857530/069dd2e2ca04a795.png)
如何变成下面这一步:
![](https://img.haomeiwen.com/i10857530/5c978aed5ccf6384.png)
问题二:这个公式怎么继续往下推导?能够举个例子说明下?
然后就可以更新词向量了,
![](https://img.haomeiwen.com/i10857530/ebedd4935abeb042.png)
另一方面,对W求偏导数,将所有的参数的偏导数写到一起有:
![](https://img.haomeiwen.com/i10857530/3273f24eb986ac1b.png)
在更新的过程中,计算代价最高的有矩阵运算,
![](https://img.haomeiwen.com/i10857530/393a5d1b66763f71.png)
3.4 使用神经网络
神经网络可以提供非线性的决策边界:
![](https://img.haomeiwen.com/i10857530/f4268d7c9926e61f.png)
4. A single layer neural network!
4.1 从逻辑回归到神经网络
首先我们看一个神经元节点图:
![](https://img.haomeiwen.com/i10857530/25ed000ab87bddee.png)
可以按得到每个神经元是一个二分类的逻辑回归单元,有三个输入,一个偏差b,然后经过一个激活函数,最后到到一个输出。
通过下图,我们可以知道,他们都是怎么计算的:
![](https://img.haomeiwen.com/i10857530/dc55ffad18ea951f.png)
上面是神经网络的计算数学公式。
神经网络可以同时运行多个逻辑回归,但不需要提前制定他们具体预测什么:
![](https://img.haomeiwen.com/i10857530/a8f867d9ca2d5832.png)
我们把预测的结果,喂给下一层的逻辑单元,由损失函数自动决定他们预测什么。
![](https://img.haomeiwen.com/i10857530/06e93695406a2de9.png)
于是,我们可以得到一个多层网络:
![](https://img.haomeiwen.com/i10857530/306d8a5727bedd8d.png)
![](https://img.haomeiwen.com/i10857530/309238c4f79fe7c9.png)
4.2 为什么需要非线性?
很多时候,我们发现我们回去加一些激活函数去处理每个逻辑单元的结果,将其变成一个非线性的单元,那么这是为什么呢?
因为如果都是线性模型的话,那么实际上所有层都等同于一层,因为:
因为非线性模型可以捕捉很复杂的数据
![](https://img.haomeiwen.com/i10857530/2eccdd0c625dc4fb.png)
4.3 前向传播网络
一个简单的网络:
![](https://img.haomeiwen.com/i10857530/f0306de2c5cbd8f2.png)
这种红点图,经常在论文中出现,大致代表单元数,中间的空格分隔开一组神经元,比如上图的隐藏层单元数为:2 X 4。U是隐藏层到class权值矩阵:
![](https://img.haomeiwen.com/i10857530/74c5d812d31c7577.png)
其中a是激活函数:
![](https://img.haomeiwen.com/i10857530/022fa45d6fdefe7b.png)
5. Max-Margin loss and backprop
5.1 间隔最大化目标函数
怎么设计目标函数呢?
记代表误分类样本的得分,s表示正确分类样本的得分,则朴素的思路是我们最大化
或最小化
。但有种方法只计算
时的错误,也就是说我们只要求正确分类的得分高于错误分类的得分即可,并不要求分类分的多么多么小。这得到间隔最大化目标函数:
但这样目标函数的得分要求太低,风险太大了,没有留出足够的缓冲区域,可以指定该间隔的宽度 得到:
可以调整其他参数,使得该间隔为1:
这个实际上是将函数,转化成集合间隔。
在这个分类问题上,这两个得分的计算方式为:和
,通常通过负采样算法,来得到负例。
另外,这个目标函数的好处是,随着训练的进行,可以忽略越来越多的实例,而只专注于那些难分类的实例。
最大间距损失函数实际上就是SVM的原理。
5.2 反向传播
反向传播实际上就是链式求导,跳过推导过程直接求导,可得:
![](https://img.haomeiwen.com/i10857530/f4735a5c8cf149ac.png)
其中
可见,只要控制误差的计算方式,就可以平滑的过渡到间隔最大化目标函数。
6. 总结
这一章主要讲了分类问题,其中讲了两种分类:
- softmax函数为主的最简单的逻辑分类,继续推导了softmax分类交叉熵损失函数的求导过程
- 神经网络分类(其中最后的激活函数仍然是采用softmax函数)这其中的非线性处理使用的是sigmoid函数,然后讲了神经网络的前向传播和后向传播。
在这一章中还讲了两种对损失函数的处理方法:
- 正则化处理方法,这种处理方法可以让我们避免过拟合。
- 最大间隔目标函数法,这其实就是SVM的原理了。
所以在本章中重点实际上是神经网络的分类方法,以及在神经网络中如何进行前向传播和后向传播等。