文章目录
一、循环序列模型
序列模型可以用于语音识别,音乐发生器,情感分类,DNA序列分析,机器翻译,视频动作识别,命名实体识别等方面,这些序列模型大都是无监督学习。
1.序列模型
以语音识别为例子,给定输入的音频片段X,有输出的文字Y。这个例子里输入和输出都是序列数据。因为X是一个音频片段,Y是一系列文字。
实际上,序列问题有很多不同该类型的情况,有输入和输出都是序列数据,或者只有一方是序列数据。也有可能两方都是序列数据但长度不一样。
下面以一个示例语句来介绍序列模型的命名规则。语句为:Harry Potter and Hermione Granger invented a new spell。这个句子有9个单词,假设要建立一个自动识别句中人名位置的序列模型,将人名的一部分输出为1,非人名的部分为0,每个单词的索引是
x
<
t
>
x^{<t>}
x<t>,比如第一个单词就是
x
<
1
>
x^{<1>}
x<1>。则输出向量为
y
=
1
,
1
,
0
,
1
,
1
,
0
,
0
,
0
,
0
y={1,1,0,1,1,0,0,0,0}
y=1,1,0,1,1,0,0,0,0,输出数据的索引也是
y
<
t
>
y^{<t>}
y<t>,用
T
x
,
T
y
T_x,T_y
Tx,Ty表示输出和输出序列的长度。如果有多个样本,则给标识符加上标(i)。
如何用向量表示输入中的单词?我们可以建立一个词典,然后利用one-hot方法建立向量,建立向量的目的是在输入和输出间建立一个映射,此外,我们可以在词典里添加一个替代不在字典里的单词:
2.循环神经网络模型
由上文,有了输入和输出的向量,我们可以建立它们间的映射。首先想到的是普通神经网络,但其效果并不好,首先是不能保证输入和输出向量长度相同,当然,我们可以补0设定一个既定长度的向量,但这种做法的实际效果不好。更重要的是,相比于更好的神经网络,不同的神经网络不能共享从文本上不同位置学到的相同特征,比如在之前已经认定
x
<
1
>
x^{<1>}
x<1>为人名,后续在检测到
x
<
t
>
x^{<t>}
x<t>为同一个单词时能立即认出其为人名。这种功能能够减少模型中参数的数量,增加学习效率。
循环神经网络就是专门用来处理这种问题的,这个网络的结构图如下:
循环神经网络含有三个参数,分别是
W
a
x
W_{ax}
Wax,
W
a
a
W_{aa}
Waa,和
W
y
a
W_{ya}
Wya,分别代表
x
<
t
>
x^{<t>}
x<t>到隐藏层中的权重,隐藏层到下一层的系数,输出的系数,这三个符号都代表一个矩阵。其中
a
<
t
>
a^{<t>}
a<t>是一个激活值,
a
<
0
>
a^{<0>}
a<0>通常是0向量,后者用某些方法初始化。由网络的结构可以看出,每一个预测不仅会受到当前激活函数的影响,还受到前面输入的影响。迭代函数如下所示:
激活函数通常是用tanh函数,如果是k分类问题,也可以用softmax函数。同时,我们可以将上式整合:
其中
W
a
W_a
Wa是一个矩阵。相应的单个代价函数如下所示:
反向传播的流程与标准神经网络是一样的,利用求偏导数更新参数W和b。我们可以利用深度学习框架自动求导,这种求导方式称为Backpropagation through time。
上述的RNN网络是单向RNN网络,有时只看一个单词无法判断其是否为人名,需要结合语境,因此有一种双向RNN网络可以解决这个问题。
3.不同类型的神经网络
神经网络有不同类型,这依赖于输入和输出的数量关系,除了输入和输出不等的数量关系之外,还有一对多,多对一,一对一的数量关系。相对的RNN网络如下所示:
4.语言模型和数量生成
当在语音识别时,电脑听到的语句有多种翻译方式,这时我们可以用语言模型算出这些翻译方式可能出现的概率来选出最优的翻译方式。
以“The Egyptian Mau is a bread of cat.”这句话作为例子介绍语言模型的建立方式。首先我们需要建立一个词典向量,对句子中的每一个单词作分词及one-hot处理,还需要在句尾加上结束符EOS。
然后我们开始建立RNN模型:
一开始,
a
<
0
>
a^{<0>}
a<0>和
x
<
1
>
x^{<1>}
x<1>都是零向量,输出层用softmax激活函数,
y
<
1
>
y^{<1>}
y<1>输出时预测第一个词是哪个词的概率,而
x
<
2
>
x^{<2>}
x<2>等于
y
<
1
>
y^{<1>}
y<1>,这是因为
y
<
2
>
y^{<2>}
y<2>无法确定是哪个词,因此需要结合第一个词来计算条件概率(全概率公式),同理,后面的词汇根据前面的词确定。最后一层如果预测正确的话,会预测出EOS。整个代价函数是:
整个语句出现的概率是所有元素出现条件概率的乘积。经过对模型进行训练,可以做到只需要前几个词就能预测整句话。
5.对新序列采样
新序列采样用于查看一个模型的学习成果。具体流程如图所示:
从输出
y
<
1
>
y^{<1>}
y<1>中随机选取一个输出作为第二层输入,随后将每一层输出中最大概率的词汇作为后一层的输入,直到产生EOS为止,或者设定句子上限。如果不希望生成UNK时,可以重新采样。
也可以用character level RNN,这个神经网络的词典是由所有字符组成的,这种神经网络神经网络太长,两个词之间会相隔比较远,不利于查看相关性。
6.GRU单元与LSTM单元
语句有可能会出现某个词受到离它比较远的词影响,这时我们难以建立它们的依赖性这时因为存在梯度爆炸或梯度消失的问题。这时我们可以设置一个阈值,使梯度接近爆炸或消失时向反方向前进。或者可以使用GRU单元。简化的GRU单元如图所示,左边是原一层隐藏层示意图,右边是修改后的示意图,相关公式如下。
其中
c
<
t
>
=
a
<
t
>
c^{<t>}=a^{<t>}
c<t>=a<t>,
Γ
u
\varGamma_u
Γu代表记忆单元,
Γ
u
=
1
\varGamma_u=1
Γu=1代表更新,
Γ
u
=
0
\varGamma_u=0
Γu=0代表记忆,即保留模块的输入,比如说当两个相关但相隔较远的单词,后一个单词就会记忆起前一个单词的向量(是否记忆与训练有关)。其原理与残差网络的原理相似。
这个是完整的GRU网络,添加了新门
Γ
r
\varGamma_r
Γr。
LSTM是另外一种解决梯度消失的方法,对应的结构图和公式如下:
这种模块中含有三个门,分别是update,forget和output门,整个LSTM相当于是更复杂的GRU模块。
7.双向神经网络
双向循环神经网络的示意图如图所示,这种神经网络在每一层之间添加了一个反向传播的
a
<
t
>
a^{<t>}
a<t>,整个结构图就形成一个无环图,其迭代公式如下:
这种结构能使识别单词时同时关联前面和后面的单词,性能有所提高,但是计算量比较大。
8.深层循环神经网络
DNN由多层RNN组成:
DNN的结构图如图所示,其迭代式为:
有一些深层神经网络的输出层上还有一些垂直单元。DNN的结构非常复杂,比RNN的层数要小很多。
二.自然语言处理(NLP)与词嵌入
1.词汇表征
上文有提到过使用one-hot方法来对单词进行编码,但使用这种方法编码出来的单词向量都是正交的,即无法知道两个单词之间的相关性,为了掌握不同单词间的相似程度,我们可以使用特征表征的方法对单词进行编码。特征表征的方法实例如下图所示:
特征表征表里用多个特征向量来描述单词,每个元素代表着一个单词与这个特征向量的相关度,相关度含于
[
−
1
,
1
]
[-1,1]
[−1,1],特征向量越多,对于单词的表达就越全面,表中的每个表征向量列用
e
e
e表示,比如Man一列就是
e
5391
e_{5391}
e5391。
每个特征向量的代表含义都应该是具体的。特征表征的优点是可以清晰知道几个不同的单词之间的相关性,提高了词汇的泛化能力,这种操作被称为单词嵌入。为了可视化不同单词之间的相似性,可以使用降维操作,然后将相似的词汇分组。
下面讲述特征表述的实际作用,以“Sally Johnson is an orange farmer”和“Robert Lin is an apple farmer”为例,这两个句子之间的"orange"和"apple"特征向量接近,由“Sally Johnson“可以判断出“Robert Lin”是人名。此外,当我们遇到陌生的单词,也可以通过特征表述与比较判断陌生单词的词性,这有效减少了所需要的训练样本数量。
词汇表征可以通过大量的词汇库样本训练,也可以直接在网上下载训练好的单词嵌入,然后再通过少量的训练样本令单词嵌入适合训练任务,同时调整单词嵌入的数据。
除此之外,单词嵌入可以找到不同单词之间的联系,以上述矩阵为例,将两个单词的向量作减法计算,在二维平面上这相当于是求两个点的距离:
我们可以利用这一点来预测单词,比如说利用相似函数预测
e
?
≈
e
k
i
n
g
−
e
m
a
n
+
e
w
o
m
e
n
e_?\approx e_{king}-e_{man}+e_{women}
e?≈eking−eman+ewomen,相似度计算函数如下。计算最契合不等式的
e
?
e_?
e?,得到
e
q
u
e
e
n
e_{queen}
equeen。
2.嵌入矩阵
所有单词嵌入的向量矩阵称为嵌入矩阵,符号为
E
E
E,每个单词的特征向量可以根据算式
e
w
=
E
×
O
w
e_w=E\times O_w
ew=E×Ow来计算,其中
O
O
O是通过one-hot方法获得的特征向量。但这种方法效率不高,通常是从矩阵E中直接选取。
嵌入矩阵可以通过梯度下降的方法建立。以下面的话为例:
如图所示,以"I want a gloass of orange"为例,先求出每个词的嵌入向量,再再输入神经网络内,通过softmax分类输出结果,输出结果是一个相当于词典大小的向量,如果输出正确的话,本句话的输出时单词"juice"所对应的序号。其中神经网络和softmax有其参数,E中的元素在一开始也是不确定的,利用梯度下降法可以优化这些参数。
为了使输入固定,我们一般会限制每一句话中只输入前几个单词,一般来说,我们将输入叫作context,输出叫作target,输入的选择很多,但训练出来的模型性能都不错。比较流行的选择方法是Skip-Gram,以“I want a glass of orange juice to go along with my cereal.”为例,首先先随机选择一个单词作为context,然后在这个单词相隔n位找到另一个单词作为target,这样就获得了多对学习样本。需要注意的是,如果用随机选择的方法通常会选到某些常见的介词和冠词,所以均匀随机并不是一种好的选择方法。其输出函数为:
其中
e
c
=
E
×
O
c
e_c=E\times O_c
ec=E×Oc,式子的意义是算出每个单词输出的概率,损失函数很好得到:
不过使用这种方法运算量很大,解决办法是用树形分类器:
这种树分类机构器每一层都是一个二分类,通过树节点判断找寻单词,显然,需要
l
o
g
N
logN
logN(
N
N
N为单词总数)步找到目标单词。实际上,在使用中会将常见的词放在数的顶端。
2.负采样
负采样是另一种求矩阵E的方法,它的做法是判断context word和target word是否为一组context-target对。如果是,则为正样本,如果不是,则为负样本,target label分别为1和0。输入和输出使用上一章所述的办法得到。然后在所有负样本中,选择一小部分词汇(k个)来更新对应的权重参数,如果样本比较小,则可选择5个到20个,如果样本比较大,则k选择2到5个。这种选择单词的方法大大提高了运行速度。其数学模型如下:
选择单词的方法可以根据单词出现的频率进行选择,公式是: