循环神经网络学习笔记二(吴恩达深度学习)
1、词嵌入
之前讲过表示单词的办法one-hot方法,即建立词典,然后用向量o<sub词典中的位置表示单词,但缺点是把每个词孤立起来,对相关词的泛化能力不强
可以用特征化的方法表示单词,列出各个特征,对每个单词利用特征进行表示然后形成向量,然后用e词典中的位置表示,这样的表示方法泛化能力就更好一些。如下图所示,这种将文本中的词转换成数字向量的方法叫做词嵌入
我们可以通过t-SNE等算法将n维的数据嵌入一个二维空间里进行可视化。
用词嵌入做迁移学习:
首先在一个非常大的文本集上学习词嵌入,或者从网上下载预训练好的词嵌入模型然后可以用这些词嵌入模型把它迁移到你的新的只有少量标注训练集的任务中最后决定要不要进行微调,用新的数据调整词嵌入。
词嵌入还有一个特性就是可以帮助实现类比推理
判断向量相似的函数有余弦相似度
s
i
m
(
u
,
v
)
=
u
T
v
∣
∣
u
∣
∣
2
∣
∣
v
∣
∣
2
sim(u,v)=\frac {u^Tv}{||u||_2||v||_2}
sim(u,v)=∣∣u∣∣2∣∣v∣∣2uTv
或是平方距离和欧式距离||u-v||2
1、词嵌入算法具体化
如果按列将词典中各个单词的向量放好,便组成一个大小为特征个数*词典个数的矩阵E
e
词
典
中
的
位
置
=
E
∗
o
词
典
中
的
位
置
e_{词典中的位置}=E*o_{词典中的位置}
e词典中的位置=E∗o词典中的位置
2、词嵌入算法
给定上下文和目标词进行监督学习训练模型
1、Skip-grams算法
输入一个或n个目标词附近的词的ont-hot向量oc与嵌入矩阵E相乘得到输入的嵌入向量ec,然后通过softmax单元输出
y
^
\widehat{y}
y
,
y
^
\widehat{y}
y
其实就是词典中各个单词的预测概率(假设词典中有10000个单词,输入为c,目标词为t)。
p
(
t
∣
c
)
=
e
θ
t
T
e
c
∑
j
=
1
10000
e
θ
j
T
e
c
p(t|c)=\frac{e^{\theta_t^Te_c}}{\sum_{j=1}^{10000}e^{\theta_j^Te_c}}
p(t∣c)=∑j=110000eθjTeceθtTec
这里的
θ
t
\theta_t
θt是一个与输出t有关的参数,即某个词t和标签相符的概率是多少。
损失函数为
L
(
y
^
,
y
)
=
−
∑
i
=
1
10000
y
i
log
y
^
i
L(\hat{y},y)=-\sum_{i=1}^{10000}y_i\log{\hat{y}_i}
L(y^,y)=−i=1∑10000yilogy^i
这里的y是一个one-hot向量,
y
^
\widehat{y}
y
是所有可能目标词的概率
我们的参数包括矩阵E中的参数和softmax单元中
θ
t
\theta_t
θt的参数,通过损失函数对这些参数进行优化就得到一个较好的嵌入向量集,这个模型叫做Skip-Gram模型。
这种办法由于在计算损失函数时需要计算词典中全部的数据,因此计算量很大。
分级的softmax分类器和负采样是这解决这个问题的比较好的方法
1、分级的softmax分类器
分级的softmax分类器就是将词典中的单词形成一个树形分类器,像这样有一个树形的分类器,意味着树上内部的每一个节点都可以是一个二分类器,比如逻辑回归分类器,计算成本与词典大小的对数成正比。这就叫做分级softmax如下所示
2、负采样
我们先在句子中选取一个context,然后在context附近选择一个目标词,这时样本定义为1,即为正样本,这就是表的第一行,然后同样的context,从字典中随机选取一个词,这时样本定义为0即为负样本,从字典中随机采样这一步循环做K次,即使随机采样到的词也在context附近,也为负样本。
然后我们构造一个监督学习问题,学习算法输入x(context,目标词),去预测目标的标签即预测输出y,这个算法就是去分辨两个词是来自context与附近的词还是context与词典中的词
小数据集的话K值选取5-20,大数据集的K选取2-5,数据集越大K越小
我们定义一个logistic回归模型,求
P
(
y
=
1
∣
c
,
t
)
=
σ
(
θ
t
T
e
c
)
P(y=1|c,t)=\sigma(\theta_t^Te_c)
P(y=1∣c,t)=σ(θtTec)
我们将context的one-hot向量通过E矩阵获得嵌入向量e,然后输入神经网络就能得到10000个可能的逻辑回归分类问题,每一个输出都是词典中每个单词是否是目标词的概率,但并不是每次迭代都全部训练,而是只训练我们采样的K个词和真正的目标词,这样算法的成本便大大降低了
选择负样本时我们考虑采用下面这个式子进行采样
P
(
w
i
)
=
f
(
w
i
)
3
4
∑
j
=
1
10000
f
(
w
j
)
3
4
P(w_i)=\frac{f(w_i)^{\frac{3}{4}}}{\sum_{j=1}^{10000}f(w_j)^{\frac{3}{4}}}
P(wi)=∑j=110000f(wj)43f(wi)43
f
(
w
i
)
f(w_i)
f(wi)为观测到的在语料库中的某个单词的词频
2、GloVe词向量
我们定义
X
i
j
X_{ij}
Xij是单词i在单词j上下文中出现的次数,GloVe模型做的就是进行优化,将他们之间的差距进行最小化处理,可以使用梯度下降进行最小化计算
min
∑
i
=
1
10000
∑
j
=
1
10000
f
(
x
i
j
)
(
θ
i
T
e
j
+
b
i
+
b
j
′
−
l
o
g
X
i
j
)
2
\min\sum_{i=1}^{10000}\sum_{j=1}^{10000}f(x_{ij})(\theta_i^Te_j+b_i+b'_j-logX_{ij})^2
mini=1∑10000j=1∑10000f(xij)(θiTej+bi+bj′−logXij)2
f
(
x
i
j
)
=
0
i
f
X
i
j
=
0
f(x_{ij})=0\ ifX_{ij}=0
f(xij)=0 ifXij=0
2、情感分类问题
输入一句话,判断语句中表现的情绪,可以使用打分来进行表达,如图,情感分类的一个最大的挑战就是标记的训练集没有这么多。
算法
- 首先获得每个单词的嵌入向量,然后对所有的向量求和或求平均获得一个新的向量后,送入softmax分类器然后输出五个可能结果的概率值。这个算法适用于任何长度的句子。但是问题是没有考虑语序
- 使用RNN来做情感分类,即将每个单词的嵌入向量送入RNN中,然后在最后一步计算输出预测值(多对一的循环神经网络)
3、词嵌入消除偏见
消除偏见就是指使算法不受性别歧视、种族歧视等的影响。
首先做的事就是辨别出我们想要减少或想要消除的特定偏见的趋势。一般使用两个相反的单词的向量求差然后取平均。然后对定义不明确的单词或中立的单词去消除他与平均值的距离。
最后移动对立单词使其与均值轴之间的距离相等。