aboutDL

CTC简记(Sequence Modeling With CTC

2019-02-24  本文已影响2人  madeirak

Sequence Modeling With CTC——Awni Hannun (2017.11)

在语音识别中,我们的数据集是音频文件和其对应的文本,让模型更有效地收敛。不幸的是,由于人的语速的不同,或者字符间距离的不同,音频文件和文本很难再单词的单位上对齐。

传统语音识别模型中,数据的预处理操作需要人工将标签文本与语音进行严格对齐。很费时间,而且预测的结果不是整个序列的输出结果,还需人工操作。CTC(Connectionist Temporal Classification)是一种避开输入与输出的一种方式,是非常适合语音识别或者OCR这种应用的。

 给定一个X,CTC能基于所有可能是准确映射的Y给出输出分布。根据这个分布,我们可以推理最可能的输出,或计算分布内各字符的可能性概率。

CTC概览

CTC算法的输入X和输出Y对齐方式有下列属性: 

1、输入与输出的对齐方式是单调的,即如果输入前进到下一时间片,输出会保持不变或者也会移动到下一个时间片段 (本质上就指的是“多对一”)

2、输入与输出是多对一的关系 

3、输出的长度不能大于输入 

CTC损失函数:

对应标签Y,其关于输入X的后验概率可以表示为所有映射为Y的路径之和,我们的目标就是最大化Y关于x=y的后验概率P(Y\vert X)。CTC假设每个时间片的输出是相互独立的,则路径的后验概率是每个时间片概率的累积。

用CTC训练的模型通常用RNN来预测每个时间步长概率p_t(a_t∣X)t表示的是RNN里面的时间步的概念。\prod乘法表示一条路径\pi 的所有字符概率相乘,\Sigma 加法表示累加多条路径。

路径:例如“he\epsilon l\epsilon lo\epsilon ”“hee\epsilon l\epsilon lo\epsilon ”对应的都是“hello”,这就是输出的其中两条路径,要将所有的路径相加才是输出的条件概率。)

对于一个时间片长度为TN分类任务,所有可能的路径数为T^N,往往会很大,用来计算Loss不现实。在CTC中采用动态规划的思想来快速计算loss,动态规划算法的核心思想是如果两种路径\pi _1\pi _2用相同步长映射到同一输出,那它们就能被合并。

左:总结所有路径会占用大量资源;右:动态规划算法合并了路径,计算更快

下图中,横轴的单位是X的时间片,纵轴单位是Y插入\epsilon 后的序列Z。例如对单词“ZOO”,现在每个字符之间,还有字符串的首位插入空白占位符\epsilon 后为:

                                      Z={\{}\epsilon,Z,\epsilon,O,\epsilon,O,\epsilon{\}}

假定输入有9个时间片,标签内容是“ZOO”。根据CTC的对齐方式的三个特征, P(Y\vert X)的所有可能的合法路径如下图

CTC中单词ZOO的所有合法路径,outputY=[z、o、\epsilon ]  

上图分成两种情况,设\alpha 为相同对齐路径合并后的CTC得分(概率) ,更准确的说,\alpha _{s,t}是输入时间步t后子序列Z_{1:s}的得分(概率)。可以发现,如果要获得P(Y|X),我们可以从\alpha 最后那个时间步长开始计算。只要能算出最后时间步长时\alpha 的值,我们就能得到\alpha _{s,t}

Case1:

1)\alpha _{s,t}=\epsilon ,则\alpha _{s,t}只能由前一个空格\alpha _{s-1,t-1}或者上一个时间步的其本身\alpha _{s,t-1}得到,

2)\alpha _{s,t}不等于\epsilon ,但是\alpha _{s,t}为连续字符的第二个,即\alpha _s=\alpha _{s-2},(比如“ZOO”中的第二个O),则\alpha _{s,t}只能由前一个空格\alpha _{s-1,t-1},或其本身\alpha _{s,t-1}得到,而不能由前一个字符得到,因为这样做会将连续的两个字符合并成一个(例如连续字符“ll”中间不用\epsilon 隔开的话,“hh\epsilon eello\epsilon ”就会合并成“helo”p_t(z_s\vert X)表示在时刻t输出字符z_s的概率,\alpha (s,t)表示上图中坐标为(s,t)节点的概率。

           \alpha (s,t)=(\alpha (s,t-1)+\alpha (s-1,t-1))\cdot p_t(z_s\vert X)

         即\alpha (s,t)=(第t-1个输入时间步后对齐路径的CTC得分和)\cdot (第t个输入时字符z_s的概率)

Case2:

如果\alpha _{s,t}为Case1中的情况,则\alpha _{s,t}可以由\alpha _{s,t-1},\alpha _{s-1,t-1}以及\alpha _{s-2,t-1}得来,可以表示为:

        \alpha (s,t)=(\alpha (s,t-1)+\alpha (s-1,t-1)+\alpha (s-2,t-1))\cdot p_t(z_s\vert X)

从上图可以发现,合法路径有两个起始点,两个终止点。合法路径的总概率P(Y\vert X)是两个最终节点(final nodes)的概率\alpha 之和。

现在,我们已经可以高效的计算损失函数,下一步是工作便是计算梯度用于训练模型。由于P(Y|X)的计算只涉及加法和乘法,因此CTC损失函数对于每个时间步长输出概率是可微的,进而我们可以使用梯度下降优化模型。

对于训练数据集D,模型参数先要调整以使负对数似然值最小化,而不是直接使似然值最大化。

                                           \sum_{(X,Y)\epsilon D }-log_{p}(Y|X)

预测:

训练好模型后,我们就需要根据给定输入X计算可能的输出,也就是计算

                                             Y^*=argmax_Y[  p(Y|X)]

求解大概率输出有两种方案,一种是贪心搜索(Greedy Search),一种是集束搜索(beam search)

关于两种搜索可参照:seq2seq 模型(机器翻译模型、集束搜索、贪心搜索)简记,其中贪婪搜索没有考虑到一个输出可能对应多个路径。我们使用集束搜索的一种变形来解决这个问题。

对于贪婪搜索没有考虑单个输出可能有多个对齐,可以举个例子。假设输出[a, a, ϵ]和[a, a, a]的概率比[b,b,b]低,但它们的概率之和高于后者。在这种情况下,启发式方法会给出Y=[b]这样的错误结论,因为它忽视了[a, a, ϵ]和[a, a, a]可以折叠为一个输出,而真正的答案应该是Y=[a]。  


先去重,再去\epsilon

变形集束搜索:(去重,去\epsilon ,多对一映射,一对多扩展)

如果要处理多个对齐映射到同一输出这种情况,我们可以修改原始集束搜索,即不保留束中的对齐列表,而是存储折叠重复字符并移除ϵ后的输出前缀。在搜索的每一步,我们都会基于映射到给定前缀的所有对齐为该前缀累计分数(概率)。

T=3,出现[b,a,a]映射[b,a]的去重操作;T=2,出现[a,\epsilon ]映射[a]的去\epsilon 操作;T=2,时有多个对齐映射同一输出的操作,[a]、[a,\epsilon ]同时映射[a]

当出现重复字符时,提议扩展可以映射到两个输出,如下图T=3, 其中红'a'是前缀蓝[a]的提议扩展,对该扩展而言,[a]和[a, a]都是有效输出。

因为连续字母中间必须有若干\epsilon ,否则会被合并,所以当我们将[a]扩展为[a, a]时,我们只需统计之前以空白标记\epsilon 结尾的所有路径的概率(位于连续字符中间的\epsilon 也要统计)。同样的,如果是扩展到[a],那我们计算的就是不以\epsilon 结尾的所有路径概率。

鉴于此,我们需要跟踪当前输出在搜索树中前两处输出。无论是以\epsilon 结尾还是不以\epsilon 结尾,如果我们在剪枝时为每一种假设做好得分排序,我们就能在计算中使用组合分数。 

追踪假设序列被\epsilon 扩展到的概率将“a\epsilon ”区别于“aa”和“\epsilon a

CTC的不足之处

1、条件独立:模型假设对给定输入而言,每个输出与其他输出条件独立,这是一个非常不好的假设。在OCR或者语音识别中,各个时间片之间是含有一些语义信息的,所以如果能够在CTC中加入语言模型的话效果应该会有提升。

2、单调对齐:CTC的另外一个约束是输入X与输出Y之间的单调对齐,在OCR和语音识别中,这种约束是成立的。但是在一些场景中例如机器翻译,这个约束便无效了。

3、多对一映射:CTC的又一个约束是输入序列X的长度大于标签数据Y的长度,但是对于 的长度大于X的长度的场景,CTC便失效了。 

参考文章:Sequence Modeling With CTC

                  Sequence Modeling With CTC 译文

上一篇 下一篇

猜你喜欢

热点阅读