本节课主要讲解了词分类器的不同方式,更重要的是这一节课正式跨入了Deep Learning的门槛。下面我将通过以下几点来详述本节课程:
- 分类背景
~ 1.1 自然语言处理中词分类的思想和标识
~ 1.2 softmax分类器定义
~ 1.3 softmax分类器损失函数定义
~ 1.4 正则化项在模型中的作用
~ 1.5 讨论在分类器的训练过程中重训练(retrain)词向量的必要性 - 基于窗口的词分类任务
~ 2.1 基于窗口的分类器定义
~ 2.2 一个简单的基于窗口的分类器:softmax
~ 2.3 基于窗口softmax分类器的求梯度过程 - 基于神经网络的词分类任务
~ 3.1 神经网络的优势
~ 3.2 神经网络的定义
~ 3.3 神经网络的前向传播
~ 3.4 神经网络的反向求导 - 四个不同的层面讲解反向传播
~ 4.1 反向传播的通用公式
~ 4.2 反向传播的电路解释
~ 4.3 反向传播的流程图解释
~ 4.4 神经网络中的误差信号解释 - 项目建议
1 分类背景
1.1 自然语言处理中词分类的思想和标识
通常情况下我们会有一个模型训练样本的数据集
{
x
i
,
y
i
}
N
\{x_i,y_i\}^N
{xi,yi}N.
其中
x
i
x_i
xi是输入,比如我们训练好的词向量,基于某个窗口的上下文,句子,文档等;
其中
y
i
y_i
yi是对应的分类标签,比如情感标签,实体标签。
下面是一个简单的通过逻辑回归的线性决策边界,对映射到二维空间的词向量进行分类的图例:
1.2 基于softmax的分类器的定义
我们在训练集中
x
i
,
y
i
x_i,y_i
xi,yi已知的情况下,通过学习逻辑回归的权重
W
∈
W\in
W∈
R
C
∗
d
R^{C*d}
RC∗d,即决策边界。其中W代表权重矩阵,其中C代表分类标签的个数,d代表x的维度。
所以在W已知的情况下,对于每个x,他被分为y标签的概率公式为:
其中
W
y
W_y
Wy表示取W权重矩阵的的第y行。明显我们可以观察到上式是一个softmax形式的函数。因此我们称之为基于softmax的分类器。
1.3 softmax分类器损失函数定义
对于每一个训练样本{
x
i
,
y
i
x_i,y_i
xi,yi},我们的目标是最大化
x
i
x_i
xi被正确分类成
y
i
y_i
yi的概率,即最小化这个概率的负log形式:
其中
f
y
=
W
y
x
=
∑
i
=
1
d
W
y
i
x
i
f_y=W_yx=\sum_{i=1}^d W_{yi}x_i
fy=Wyx=∑i=1dWyixi
其实此处我们的目标函数相当于一个交叉熵损失函数,如果我们把分类任务的ground truth当成一个one-hot向量,即[…,0,0,…1,…,0,0,…]
∈
R
1
∗
C
\in R^{1*C}
∈R1∗C,我们通过p(y|x)预测得到各个分类的的概率也可以拼凑成一个1*C维的向量,在此我们就可以就算两个向量的交叉熵了,交叉熵的损失函数定义为:
其中p©为真实的样本是c类的概率,q©是预测的,即通过p(y|x)计算出来的概率;通过上面描述我们可知,ground truth向量是一个one-hot向量,即当预测一个x时,只有是他真实分类的q©是1,其他都是0;所以交叉熵损失函数中
∑
\sum
∑符号和q©此时就没有了存在的意义,而去掉这两个符号的交叉熵损失函数就变成了softmax形式的损失函数。所以说他俩在此处是等价的。
由以上描述我们可以得到对于整个训练集{
x
i
,
y
i
x_i,y_i
xi,yi},损失函数的形式如下:
我们可以看出,其实上式是一个对于训练集的平均交叉熵损失函数。由于下面2.3部分也用到了softmax分类器的训练方式,所以训练方法在2.3部分介绍。
1.4 正则化项在模型中的作用
这是一个加入正则化项的损失函数,对于一个机器学习的学习者来说,正则项的作用我就不做太多赘述了,其作用其实就是降低模型参数的复杂度,防止过拟合。如果真的是小白,出门左转~
由上图我们可以看出,模型复杂度越高,模型的训练集误差会越来越小;而随着模型复杂度的增高,测试集的误差会先减小后增大;这是因为模型太复杂时,模型变得过拟合。也就是说模型参数过度拟合了训练集的样本,时模型丧失了鲁棒性。所以在过拟合后,模型在训练集上效果会越来越好,在测试集上效果越来越差。
1.5 讨论在分类器的训练过程中重训练(retrain)词向量的必要性
对于一般的机器学习任务,我们只学习参数W,而不会retrain词向量。那么如果我们在这个时候也retrain词向量会发生什么呢?
下图是只学习参数W的分类器效果:
其中,TV、telly、televison三个单词会成功的划分到一起。
下图是不仅仅学习决策边界,还retrain词向量的分类器效果:
由上图我们可以看到,当telly和TV都在训练集中时,retrain词向量后,telly和TV在空间中的位置都发生了变化;televison没有在训练集中,所以television在空间中的位置没有变化。也这因为这个原因,television相对于telly和TV的位置发生了变化,在分类时发生了偏差。
根据以上我们可以总结出:
(1) 如果训练集的规模比较小,那我们就不要retrain词向量,否则会发生上图中效果。
(2) 如果我们有规模很大的数据集,那么retrain词向量会更遵循每个单词词向量在这个任务中的分布,从而使实验效果更理想。
2. 基于窗口的词分类任务
2.1 基于窗口的分类器定义
目前,仅仅分类单个单词的任务已经很少有人做了。现在更有趣的问题是根据上下文信息对单词进行语义消歧。
比如课程中提到的下面的两个例子:
由以上两个例子我们可知,根据单个单词分类已经不可能了;因为同样的单词,在不同的语境(上下文)中可能含有不同甚至相反的含义。此时基于窗口的词分类任务应运而生,这时候我们不仅仅用单一的单词,还用到他上下文的单词,共同决定这个中心词的类别。
2.2 一个简单的基于窗口的分类器:softmax
一个基于窗口的softmax分类器定义为:以待分类单词为中心词,取其周围某个窗口大小内的单词向量,将其进行拼接,构成分类器的输入;分类器的输出即为中心词的类别。
一个窗口大小为2,对Paris进行分类的例子:
其中
X
w
i
n
d
o
w
∈
R
5
d
X_{window}\in R^{5d}
Xwindow∈R5d
所以一个基于窗口的softmax分类器相当于以
X
w
i
n
d
o
w
X_{window}
Xwindow为输入的softmax分类器。softmax分类器我们在1.2,1.3中叙述过了,其中平均交叉熵损失函数为:
其中
f
y
=
W
y
x
=
∑
i
=
1
d
W
y
i
x
i
f_y=W_yx=\sum_{i=1}^d W_{yi}x_i
fy=Wyx=∑i=1dWyixi
那么到此损失函数有了,我们怎么样训练这个分类器呢?看下一部分吧~~
2.3 基于窗口softmax分类器的求梯度过程
通过2.2我们得到了模型损失函数,那么接下来我们就以求一下对于词向量X求偏导得到的梯度(此部分假设retrain词向量)为例,权重矩阵W的梯度类似。
其中
f
y
=
W
y
x
=
∑
i
=
1
d
W
y
i
x
i
f_y=W_yx=\sum_{i=1}^d W_{yi}x_i
fy=Wyx=∑i=1dWyixi
此时我们求出了词向量的梯度,更新词向量的公式为:
x
=
x
−
∇
x
J
x=x-\nabla_xJ
x=x−∇xJ
其中x为词向量;
∇
x
J
\nabla_xJ
∇xJ为梯度;
α
\alpha
α是学习率。
权重矩阵的求梯度公式和更新公式类似,此处不再赘述。
3. 基于神经网络的词分类任务
3.1 神经网络的优势
对于少量的数据,softmax分类器这种通过线性分类边界进行分类的模型可能表现还不错,但是如果遇到复杂且大量的数据,这种简单的模型可能就很难拟合数据。此时神经网络出现了,下面是两种模型的效果图:
左边是softmax分类器,右边是基于神经网络的分类器。效果一眼便能看出,神经网络能够产生非线性的决策边界,从而拟合更加复杂的数据。
3.2 神经网络的定义
如果你能明白softmax模型是如何工作的,那么你就能明白一个基本的神经单元如何工作的。如下图是一个简单的神经单元:
在这个例子中,一个神经元含有三个输入,一个输出。神经元本质上就是一个二分的逻辑回归单元,其中参数为w,b。
其中x是输入,w是权重,b是偏置,f是激活函数,
h
w
,
b
(
x
)
h_{w,b}(x)
hw,b(x)为这个神经元的输出。其中f是一个非线性的函数,比如sigmod函数:
神经网络最关键的部分就是这个激活函数,这是因为神经网络采用了非线性的激活函数,才能使神经网络更好的拟合复杂的数据特征。
3.3 神经网络的前向传播
如果我们把一个输入向量 喂给一系列的逻辑回归单元,我们就能得到一个输出向量,如左图。如果我们将输出继续喂给一系列的逻辑回归单元,这样延伸下去就构成了多层神经网络,如右图。根据我们任务的不同,设置最后一层神经元的个数。
下面是单层神经网络中的一些矩阵符号表示:
其中,输入通过一层神经网络的传播得到
a
1
,
a
2
,
a
3
a_1,a_2,a_3
a1,a2,a3的过程表示为:
将上式表示成矩阵就是下面这样:
通过上式我们可以知道,如果我们不采用非线性的激活函数,输入经过两层神经网络后表示为
W
2
W
1
X
W_2W_1X
W2W1X,最后还是WX,依然是线性变换。因此神经网络采用非线性函数,能够更加拟合复杂的数据。
神经网络的最后一层我们可以计算一个通过softmax计算出来的概率值,也可以仅仅计算一个非规格化的分数(score)。以我们前面2.2中Paris作为中心词的分类任务为例,可以展示一个3层神经网络的前向传播的效果:
其中,
X
w
i
n
d
o
w
s
X_{windows}
Xwindows是神经网络的输入层,f是非线性的激活函数,W是一二层之间的权重矩阵,U是二三层的权重矩阵。
从输入
X
w
i
n
d
o
w
s
X_{windows}
Xwindows到得到输出S,这一个计算过程就称为神经网络的前向传播过程。
3.4 神经网络的反向求导
根据上面的分类任务,我们可以这样定义目标策略:最大化以Paris为中心词的窗口得分,最小化不是以Paris为中心词的得分(类似word2vec中负采样)。为了遵循这个策略,我们将目标函数设置为最大间隔损失函数:
其中:
计算S或者
S
c
S_c
Sc的导数,涉及到的变量有W,U,b, x。
对权重矩阵W求偏导具体过程:
其中f函数为逻辑回归函数,因此f’(z)=f(z)(1-f(z))
如果我们想求整个权重矩阵的梯度,则转化成矩阵形式
∂
s
∂
W
=
δ
x
T
\frac{\partial s}{\partial W}=\delta x^T
∂W∂s=δxT
对于偏置b求偏导具体过程为:
即
∂
s
∂
b
i
=
δ
i
\frac{\partial s}{\partial b_i}=\delta _i
∂bi∂s=δi
对于词向量x求偏导的具体过程为:
即
∂
s
∂
x
j
=
W
.
j
T
δ
\frac{\partial s}{\partial x_j}=W{^T_{.j}}\delta
∂xj∂s=W.jTδ
对于第二层的权重矩阵U求偏导的具体过程为:
4. 四个不同的层面讲解反向传播
其实我觉得反向传播最精髓的地方就是记住链式求导法则,遵循链式求导法则。
4.1 反向传播的通用公式
对于一般神经网络反向传播的过程,上翻3.4部分,此处不再赘述
4.2 反向传播的电路解释
此部分采用类似电路的模式来模拟神经网络的传播过程。
从右往左,我们可以依次计算每个节点对应的梯度,主要的计算是前一个节点的梯度乘以当前节点的梯度:
这种反向回溯的过程放到神经元中就是反向传播,反向传播时每通过一级,就用链式法则乘以这一级的导数:
4.3 反向传播的流动图解释
此部分采用流动图(其实就是有向无环图)来模拟神经网络的传播过程。
当只有一条路径到达目标的时候:
将一条路径拓展到2条甚至多条路径时:
根据上面三张图我自己总结一下就是:同一条路径上梯度相乘,不同路径上的梯度相加;以此标准来进行反向传播,更新参数。
4.4 神经网络中的误差信号解释
对于我们定义的神经网络,其符号表示为:
其中课程给出了信号误差和梯度的计算公式:
总结一下信号公式的含义:
本层的信号误差=(本层权重矩阵的转置(乘上)上层传下来的误差信号)(哈达玛积)(本层输入函数的导数)
5. 项目建议
(1) 先定义好自己的问题,明确知己的目标是做什么。
(2) 根据自己的问题,确定实验所需数据集,可以用现成前人发布的数据集,也可以自己用爬虫在网络上爬取(不建议在爬取数据上花费大量的精力)。
(3) 确定自己实验结果的评价标注。比如机器翻译常用BLEU值;一般用准确率、召回率、F1值。根据数据特点和任务的不同采用不同的评价标准。
(4) 正确的将自己的数据划分成训练集、验证集和测试集。
(5) 可以先采用一些简单的、比较基础的模型完成目标,然后分析输出结果,适当调整和改变模型
(6) 将实验数据可视化,也可以将实验过程可视化,通过图表可以很明确的了解自己模型对于超参数不同大小的敏感度。
(7) 尝试改进或者混合模型,得到更好的实验效果。