参考:Alex Graves, Connectionist Temporal Classification: Labelling Unsegmented Sequence Data with Recurrent Neural Networks
模型的训练
数值稳定的前向-后向算法
由于前向-后向算法中会出现连续的概率值乘法(0,1之间),对长序列来说很容易造成浮点下溢;作者使用了归一化的前向-后向过程。为了不使得各个变量的意义发生混淆我们作一些澄清:(原论文中这几个变量含义模糊,不益理解)
1) 始终表示通常意义下的前向变量;
2) 为归一化的前向过程中每个时间步中未规范化的变量;
3) 为归一化的前向过程中每个时间步中对规范化后的变量;
即,我们这样定义归一化的前向过程中的变量:
但是注意,当时,有成立。
类似地,定义归一化的后向过程变量:
则给定输入序列的条件下,目标字符串的对数概率可以简单地用表示为:
这看起来不太明显,我们一步步从最简单的case捋一下:
到此为止,这足以让你相信我们有下面等式成立:
同理易证:
更严格点,可以用数学归纳法来完成证明,不过这里我不打算这么啰嗦了。对上式两边求和,并利用的归一化性质有:
这等价于:
进而得到目标等式:
最大似然训练
由于每条数据之间是独立的,因此我们可以单独对其求导,若使用负对数似然下降法,则我们需要求:
由于,我们已经可以高效地计算出来了。下面来看右半边,由于:
注:其中的下标是未经过扩展的长度为N的目标字符序列中某个对应的下标。
我们来对上面的推导做一些说明:
1)由于展开式中的每一项都是由满足的两项乘起来的,因此都是一条在时刻经过字符的完整路径,且其概率为完整路径的概率乘上一个多出来的项;
2)由于任何一条满足且在时刻经过字符的路径都可以被分成两部分,一部分在之中,另一部分在之中;所以上面的第一步展开式成立;
3)由于是所有路径的公因子,因而在上面的第三步可以提到求和号外面;
于是接着对上面公式变形:
两边对下标求和得:
为了对网络输出求导,进而通过经典的反向传播优化网络参数,我们需要考虑在时刻,经过字符所有的路径(注意,我们把空白符放到了网络输出层的最后一个输出单元,因而就分别对应着目标字符序列在时刻的概率)。如下图(为了简洁,省去了空白符):
因此,我们记为标注字符序列中那些等于网络第个输出节点所代表的字符(如:上图五角星对应的纵坐标);显然不是每句话都包括所有的字,所以对某句话来说,集合仅仅对那些包含在这句话中的字符才不为空。
我们来分析:,由和的定义可知,由于的展开式中每条路径在任一时刻只能处于中的一种状态;但是,它们在时刻的状态已经全部被钳住为了,所以当时,关于为常数,可以在求导中忽略。又在中,,所以下面我们直接使用代替它们。
令:,即我们将中不包括的部分单独提出来记作,因而有:
进而有:
最后多写一步:
在经典的深度学习中,我们都知道corssentropy损失是softmax分类层的最佳伴侣:corssentropy对softmax层的输入的梯度具有异常简洁的形式。但是在这里会怎么样呢?我们尝试直接求CTC损失函数关于softmax输入数据的梯度。
由基本函数的求导中得到的softmax关于其输入的导数可知我们需要分两种情况讨论:
设:,则:
根据求导的链式法则,结合上面(5)式,有:
在上面求和号中,当时:
当时:
综合以上得:
注意双重求和具有等价性(仔细看的定义):,事实上,比如“普通话识别”任务中,对大多数来说。
再考虑到,因此上式可化为:(注意下标变化)
实际中会使用归一化的前向-后向算法:
将(2)(3)式代入,并记得:
将(2)(3)(7)式代入(6)式,由于这一项在分子和分母同时出现,并且与求和下标无关,因而可以同时提出到求和号外面,并消去得: