前言
本篇笔记是cs224n lecture4的记录,公式部分有少量自己的理解,对原视频的公式进行了小幅改动,仅供个人备忘。
文章目录
分类
分类设置和符号
我们的样本以
{
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是标签。
x
i
x_i
xi可以是一个单词或者向量(这并不是常见形式,但便于理解),
y
i
y_i
yi可以是标签(肯定或否定)、命名实体(NER)、单词序列(机器翻译)等。
传统分类到NLP分类
{
x
i
,
y
i
}
i
=
1
N
\{x_i,y_i\}_{i=1}^N
{xi,yi}i=1N
上式中
x
i
x_i
xi是d维向量,
y
i
y_i
yi是C维one-hot向量,C代表分类个数,N是样本总数。
传统分类任务的
x
i
x_i
xi是固定的,仅仅是通过逻辑斯蒂回归等方法对权重进行更新
p
(
y
∣
x
)
=
e
x
p
(
W
y
.
x
)
∑
c
=
1
C
e
x
p
(
W
c
.
x
)
p(y|x)=\frac{exp(W_y.x)}{\sum_{c=1}^{C}exp(W_c.x)}
p(y∣x)=∑c=1Cexp(Wc.x)exp(Wy.x)
上式就是softmax的形式,这里省略了下标i,公式中的x和y代表一个样本的输入和标签。
softmax细节
计算方法分为两步,第一步取权重矩阵W的第y行乘以输入x的一行
W
y
.
x
=
∑
i
=
1
d
W
y
i
x
i
=
f
y
W_y.x=\sum_{i=1}^{d}W_{yi}x_i=f_y
Wy.x=i=1∑dWyixi=fy
这样,对于一个样本,根据权重矩阵W计算得到C个概率值,f_1,f_2…f_C
第二步进行归一化
p
(
y
∣
x
)
=
e
x
p
(
f
y
)
∑
c
=
1
C
e
x
p
(
f
c
)
=
s
o
f
t
m
a
x
(
f
)
y
p(y|x)=\frac{exp(f_y)}{\sum_{c=1}^{C}exp(f_c)}=softmax(f)_y
p(y∣x)=∑c=1Cexp(fc)exp(fy)=softmax(f)y
训练softmax和交叉熵
在训练过程中,可以选择直接最大化正例概率,也就是最小化正确类别的概率的负对数
−
l
o
g
(
e
x
p
(
W
k
.
x
)
∑
c
=
1
C
e
x
p
(
W
c
,
x
)
)
-log(\frac{exp(W_k.x)}{\sum_{c=1}^Cexp(W_c,x)})
−log(∑c=1Cexp(Wc,x)exp(Wk.x))
原因在于这个损失函数等效于交叉熵:
H
(
y
^
,
y
)
=
−
∑
j
=
1
∣
V
∣
y
j
l
o
g
(
y
j
^
)
=
−
∑
j
=
1
C
y
j
l
o
g
(
p
(
y
j
=
1
∣
x
)
)
=
−
∑
j
=
1
C
l
o
g
(
e
x
p
(
W
j
.
x
)
∑
c
=
1
C
e
x
p
(
W
c
.
x
)
)
=
−
y
i
l
o
g
(
y
i
^
)
=
−
l
o
g
(
e
x
p
(
W
i
.
x
)
∑
c
=
1
C
e
x
p
(
W
c
,
x
)
)
\begin{aligned} H(\hat{y},y) &=-\sum_{j=1}^{|V|}y_jlog(\hat{y_j})\\ &=-\sum_{j=1}^{C}y_jlog(p(y_j=1|x))\\ &=-\sum_{j=1}^{C}log(\frac{exp(W_j.x)}{\sum_{c=1}^{C}exp(W_c.x)})\\ &=-y_ilog(\hat{y_i})\\ &=-log(\frac{exp(W_i.x)}{\sum_{c=1}^Cexp(W_c,x)}) \end{aligned}
H(y^,y)=−j=1∑∣V∣yjlog(yj^)=−j=1∑Cyjlog(p(yj=1∣x))=−j=1∑Clog(∑c=1Cexp(Wc.x)exp(Wj.x))=−yilog(yi^)=−log(∑c=1Cexp(Wc,x)exp(Wi.x))
因为y是one-hot向量,所以只有一个位置i为1,其他位置为0。
以上是对于一个样本来说的,所以总的损失函数:
−
∑
i
=
1
N
l
o
g
(
e
x
p
(
W
k
(
i
)
.
x
i
)
∑
c
=
1
C
e
x
p
(
W
c
,
x
(
i
)
)
)
-\sum_{i=1}^Nlog(\frac{exp(W_{k(i)}.x^{i})}{\sum_{c=1}^Cexp(W_c,x^{(i)})})
−i=1∑Nlog(∑c=1Cexp(Wc,x(i))exp(Wk(i).xi))
一般使用时还会加上正则项:
−
∑
i
=
1
N
l
o
g
(
e
x
p
(
W
k
(
i
)
.
x
i
)
∑
c
=
1
C
e
x
p
(
W
c
,
x
(
i
)
)
)
+
λ
∑
k
=
1
C
⋅
d
+
∣
V
∣
⋅
d
-\sum_{i=1}^Nlog(\frac{exp(W_{k(i)}.x^{i})}{\sum_{c=1}^Cexp(W_c,x^{(i)})})+\lambda\sum_{k=1}^{C\cdot d+|V|\cdot d}
−i=1∑Nlog(∑c=1Cexp(Wc,x(i))exp(Wk(i).xi))+λk=1∑C⋅d+∣V∣⋅d
这是一个常见的图,红线是测试误差,蓝线是训练误差,纵轴是训练误差,横轴是模型复杂度(多少层数、多少参数、词向量维度、训练模型的耗时等),纵轴是误差。
问题及优化
在词向量的学习中,参数矩阵很大,这样训练之后很容易出现过拟合:
比如在单词分类的任务上,一开始三个表示电视的单词是在一起的,在训练集语料中没有television,经过训练之后,telly和TV改变了位置,这样导致在测试集语料中television被分类错误。
这个实验说明,当前任务的语料很小时,不必再任务语料上重新训练词向量,否则会过拟合,产生歧义。
Window classification
只对一个单词进行分类的话会很容易产生歧义,比如“Paris”可以是巴黎的意思,也可以代表一个人的名字,所以通过上下文来对单词进行分类显得更靠谱。
接下来,通过命名实体识别的例子进行解释,比如Paris可以是地名或人名。
目标
训练一个softmax模型,通过上下文给中心词分配一个标签(person、location、organization、none)
例子
判断Paris的标签,窗口大小为2
输入:
X
w
i
n
d
o
w
X_{window}
Xwindow,由窗口内词向量组成的5*d维的列向量,即将五个单词向量进行拼接
分类器softmax
最简单的想法就是利用上一节讲到的softmax进行分类,图中x就是输入
x
w
i
n
d
o
w
x_{window}
xwindow
J对x进行求导:
Δ
x
J
=
∂
−
log
s
o
f
t
m
a
x
(
f
y
(
x
)
)
∂
x
=
∑
c
=
1
C
δ
c
W
c
T
=
W
T
⋅
δ
\begin{aligned} \Delta_xJ&=\frac{\partial^{-\log softmax(f_y(x))}}{\partial x}\\ &=\sum_{c=1}^C \delta_cW_c^T\\ &=W^T\cdot\delta \end{aligned}
ΔxJ=∂x∂−logsoftmax(fy(x))=c=1∑CδcWcT=WT⋅δ
此步骤运用了softmax的求导结论:当训练softmax分类器,且损失函数是交叉熵时,对softmax求导:
∂
J
∂
x
i
=
y
^
i
−
y
i
=
δ
i
\frac{\partial J}{\partial x_i}=\hat y_i-y_i=\delta_i
∂xi∂J=y^i−yi=δi
同样的,可以对W进行求导,进而更新权重矩阵W
这里的维度:
- W:n*5d
- x:5d*1
- δ \delta δ:n*1
- W T ⋅ δ W^T\cdot\delta WT⋅δ : 5d * 1
n代表分类个数,5d的5指窗口大小。实际训练过程中的 δ \delta δ应该是nN的,其中N是样本个数。
缺陷
softmax最终给出的是线性的决策边界,对于大数据不适用
所以需要提供非线性的决策边界
神经网络
一些简单定义
讲到的一些常见的定义,不再费笔
神经网络能够拟合更复杂的数据
前向传播
回到前面的窗口分类问题,利用神经网络进行解决,如下图所示
最大间距损失函数
定义
s
c
s_c
sc代表误分类样本得分,
s
s
s代表正确分类样本得分,其中负样本一般通过负采样获得。使用间隔最大化:
m
i
n
i
m
i
z
e
J
=
m
a
x
(
0
,
1
−
s
+
s
c
)
minimizeJ=max(0,1-s+s_c)
minimizeJ=max(0,1−s+sc)
最大化间隔机理可以参考SVM的推导过程,方便理解。
反向传播
∂
s
∂
W
i
j
=
∂
U
T
a
∂
W
i
j
=
∂
∑
k
U
k
a
k
∂
W
i
j
=
∂
U
i
a
i
∂
W
i
j
=
U
i
∂
a
i
∂
W
i
j
=
U
i
∂
a
i
∂
z
i
∂
z
i
∂
W
i
j
=
U
i
f
′
∂
W
i
x
+
b
i
∂
W
i
j
=
U
i
f
′
∂
∑
k
W
i
k
x
k
∂
W
i
j
=
U
i
f
′
∂
W
i
j
x
j
∂
W
i
j
=
δ
i
x
j
\begin{aligned} \frac{\partial s}{\partial W_{ij}}&=\frac{\partial U^Ta}{\partial W_{ij}}=\frac{\partial \sum_kU_ka_k}{\partial W_{ij}}=\frac{\partial U_ia_i}{\partial W_{ij}}\\ &=U_i\frac{\partial a_i}{\partial W_{ij}}\\ &=U_i\frac{\partial a_i}{\partial z_i}\frac{\partial z_i}{\partial W_{ij}}\\ &=U_i f'\frac{\partial W_ix+b_i}{\partial W_{ij}}\\ &=U_i f'\frac{\partial \sum_kW_{ik}x_k}{\partial W_{ij}}\\ &=U_i f'\frac{\partial W_{ij}x_j}{\partial W_{ij}}\\ &=\delta_i x_j \end{aligned}
∂Wij∂s=∂Wij∂UTa=∂Wij∂∑kUkak=∂Wij∂Uiai=Ui∂Wij∂ai=Ui∂zi∂ai∂Wij∂zi=Uif′∂Wij∂Wix+bi=Uif′∂Wij∂∑kWikxk=Uif′∂Wij∂Wijxj=δixj
向量形式,就是外积
∂
s
∂
W
=
δ
x
T
\frac{\partial s}{\partial W}=\delta x^T
∂W∂s=δxT
这里的逻辑函数
f
′
(
z
)
=
f
(
z
)
(
1
−
f
(
z
)
)
f'(z)=f(z)(1-f(z))
f′(z)=f(z)(1−f(z))
同理,对
b
i
b_i
bi进行求导
∂
s
∂
b
i
=
δ
i
\frac{\partial s}{\partial b_i}=\delta _i
∂bi∂s=δi
对x进行求导
∂
s
∂
x
=
W
T
⋅
δ
\frac{\partial s}{\partial x}=W^T\cdot \delta
∂x∂s=WT⋅δ
另外,对U的求导
∂
J
∂
U
=
1
{
1
−
s
+
s
c
>
0
}
(
−
f
(
W
x
+
b
)
+
f
(
W
x
c
+
b
)
)
\frac{\partial J}{\partial U}=1\{1-s+s_c>0\}(-f(Wx+b)+f(Wx_c+b))
∂U∂J=1{1−s+sc>0}(−f(Wx+b)+f(Wxc+b))
∂
J
∂
U
=
1
{
1
−
s
+
s
c
>
0
}
(
−
a
+
a
c
)
\frac{\partial J}{\partial U}=1\{1-s+s_c>0\}(-a+a_c)
∂U∂J=1{1−s+sc>0}(−a+ac)