研究方法:
主流采用RNN+CTC结构
关于RNN结构不再赘述
采用CTC思想的原因:
Connectionist Temporal Classification (CTC)适合不知道输入输出是否对齐的情况使用的算法,所以CTC适合语音识别和手写字符识别的任务。
CTC思想的原理:
为了在时间序列上构造一个合法的可以梯度下降的序列,将在每一个时间分区预测一个token,这个token可能是字母也可能是空格符E。空格符之间的重复字母需要删去,空格最终删去。
产生一个单词的token序列是不唯一的,但是都可以化简为唯一的token序列,下图是所有可能得序列。
(来自@Michaelliu_dev的图)
先说图,图中有的点状态转移出三个状态,有的点状态转移出两个状态,这是由于不同类型的点状态转移的规则不同,规则如下:
这是一个必须遵守的状态转移规则,否则会生成化简之后和真实序列不同的带E的序列。
如何使得模型最后能够尽可能输出正确状态序列,就需要让这些序列的概率加和最大,是贝叶斯估计,即在X情况得到Y的概率,使其尽可能像结果靠近。
需要梯度下降就需要得出一个可导的概率结果函数,如下式:
但是计算量无疑是巨大的,这里借用动态规划的思想(不是动态规划求最优值,仅仅是将最后的状态概率值加和求出来)动态规划计算不再赘述。
本式有一处不严谨,但是也可能是我想错了,但是我也没有找到更好的式子来表达:概率中的乘法对应于相互之间不关联的事件,既然在output前使用了CNN或者是RNN,特别是RNN,就应该会出现前后事件的关联性,这种情况下将预测状态相乘得到序列概率不是很严谨,但是也没想到更好的解决方案,暂且不表,想法可在评论区讨论。
上式目标最大,要梯度下降需要加符号:
log原因略。