gale church对齐算法的原理_带你看懂CTC算法

ff323ca9284a06b8fcab537a1b1a475a.png

在文本识别模型CRNN中,涉及到了CTC算法的使用,由于算法的原理涉及内容较多,所以特另开一篇文章对其原理进行叙述。

自己在学习CTC过程中也是看了诸多资料才大概理解其中的思想,其中最著名的是一篇英文博客,其对CTC算法进行了通俗又详尽地讲解,链接在文末给出。本文的内容也是以其为大纲,同时参考其他优秀的资料,并加上了自己一些的理解,希望能让读者对CTC的原理有一个大致的了解。

文章涉及内容较多,难免有疏漏之处,如有错误,还望指出。

1. 前言

CTC全称Connectionist temporal classification,是一种常用在语音识别、文本识别等领域的算法,用来解决输入和输出序列长度不一、无法对齐的问题。在CRNN中,它实际上就是模型对应的损失函数。

再进行进一步叙述前,这里需要做几点说明。不管是在语音识别还是文本识别领域,CTC通常接在RNN的后面,与RNN结合使用,就像CRNN中一样。所以后面除非特别说明,否则提到的CTC均是将RNN和CTC当整体看待。

RNN在CRNN模型中代表的就是BiLSTM,它接受经过CNN提取的特征向量,大小为

equation?tex=%5B%5Cmathrm%7Bseq%5C_len%7D%2C%5Cmathrm%7Bchannels%7D%5D
equation?tex=%5Cmathrm%7Bseq%5C_len%7D 即上文提到的特征图的宽度,由于高度为1,所以被去掉了,
equation?tex=%5Cmathrm%7Bchannels%7D 即为特征图的通道数。为了便于理解,后面将
equation?tex=%5Cmathrm%7Bseq%5C_len%7D 也记作
equation?tex=%5Cmathrm%7Btime%5C_step%7D ,也可以简写为
equation?tex=T ,即CTC中常涉及的概念——时间步。输出序列的大小为
equation?tex=%5B%5Cmathrm%7Btime%5C_step%7D%2C%5Cmathrm%7Bout%5C_size%7D%5D ,序列长度与输入一致。而每个分量(向量)的维度均为
equation?tex=%5Cmathrm%7Bout%5C_size%7D ,在这里等于字符字典的个数,表示字典个数的概率分布。概率分布经过变换便可以得到最终的预测结果。

为方便叙述,假设输入的序列为

equation?tex=x%3D%5Cleft%5Bx_%7B1%7D%2C+x_%7B2%7D%2C+%5Cldots%2C+x_%7BT%7D%5Cright%5D+ ,对应的输出序列为
equation?tex=y%3D%5Cleft%5By_%7B1%7D%2C+y_%7B2%7D%2C+%5Cldots%2C+y_%7BU%7D%5Cright%5D+ ,在这里希望找到
equation?tex=x
equation?tex=y 的映射关系。

如果使用一般的监督学习算法,会面临诸多的问题,主要可以概括为以下几点:

  • equation?tex=x
    equation?tex=y 的长度是可变的。
  • equation?tex=x
    equation?tex=y 的长度比例也是可变的。
  • equation?tex=x
    equation?tex=y 对应元素之间不能找到严格的对齐关系。

而CTC正是一种可以解决这些问题的算法。对于一个给定的输入

equation?tex=x ,它可以计算对应所有可能的
equation?tex=y 的概率分布。通过该概率分布,可以预测最大概率对应的输出或者某个特定输出的概率

由此可以引出损失函数的定义。对于一个给定的输入

equation?tex=x ,转录层需要最大化对应
equation?tex=y 的后验概率
equation?tex=p%28y%5Cmid+x%29 。当然为了能够正常地训练模型,
equation?tex=p%28y%5Cmid+x%29 应该是可导的。由于训练模型通常以最小化损失函数为目标,所以将优化目标转为最小化
equation?tex=p%28y%5Cmid+x%29 的负对数似然值,即:

equation?tex=%5Csum%5Climits_%7B%28x%2Cy%29+%5Cin+D%7D++-+log%28p%28y%5Cmid+x%29%29%5C%5C

其中

equation?tex=D 表示训练集。

而在预测阶段,每给定一个输入

equation?tex=x ,CRNN要找到最大概率对应的输出,即

equation?tex=y%5E%7B%2A%7D%3D%5Cunderset%7By%7D%7B%5Coperatorname%7Barg%5C+max%7D%7D%5C+p%28y+%5Cmid+x%29%5C%5C

不难想到,如果序列长度稍长,所有概率分布的计算量是及其巨大的,因此这里需要一个速度更快的算法。

前面说过,对于给定的输入

equation?tex=x ,转录层需要计算所有可能的
equation?tex=y 的概率分布,而关键的问题在于如何处理
equation?tex=x
equation?tex=y 间的对齐问题。所以下面先分析CTC的对齐方式。

2. 对齐

要说明的是,CTC是不需要输入输出进行对齐的。但是对于给定的输入,为了计算对应

equation?tex=y 的概率,仍需要对所有可能对齐的概率进行求和,因为可能同一个输出有多个输出路径对应。下面举例进行说明。

例如CRNN的输入

equation?tex=x 是一张包含单词“cat”的图片,所以对应的输出序列应该为
equation?tex=y+%3D+%5Bc%2Ca%2Ct%5D 。那么一种对齐
equation?tex=x
equation?tex=y 的方式是先对输入的每个分量
equation?tex=x_i 对应一个输出字符,然后将相邻的重复字符进行合并,具体如下图所示。

3954dcfa9c29967295647df2e01581e9.png
图1 单词cat对齐过程 [1]

当然这里很容易发现这种对应方式是不合理的。第一个问题是输入的图片可能根本不包含任何字符,即输出的结果应该为空,而强制每个输入分量

equation?tex=x_i 对应一个字符显然得不到这样的结果。第二个问题是如果将所有相邻重复字符都进行合并处理的话,将不能产生连续相同字符,导致结果可能是错误的。比如如果将单词tooth进行合并处理,那么最终的输出将是toth而不是tooth。

所以考虑上述问题,CTC算法又引入了一个特殊的字符——占位符,记作

equation?tex=%5Cepsilon
equation?tex=- 。它表示一个占位,不对应任何字符,因此在最终的输出时要将其删除。这样以后这里仍可以采用上述的对齐规则,并同时避免以上的问题,当然最后不要忘了在输出中去掉 。单词hello的对齐过程如下图所示。

e6eece4a91d580468bc1b944f144fd61.png
图2 单词hello对齐过程 [1]

可以看出,如果单词存在两个相同的字符,为了能够处理这种情况,需要在这两个字符间插入

equation?tex=%5Cepsilon 。这样就能区分诸如“toth”和“tooth”的对齐方式了。

这样的规则具有以下几种特征。第一,输入

equation?tex=x 与输出
equation?tex=y 的对齐是单调的,即当
equation?tex=x 前进至下一个时间片对应的输入分量
equation?tex=x_%7Bi%2B1%7D 时,
equation?tex=y 既可以保持不动,也可以移动至下一个时间片对应的输出分量
equation?tex=y_%7Bu%2B1%7D 。第二,输入与最终的输出是一对多的关系,即多个输入分量可能只对应一个输出分量。

所以,输出

equation?tex=y 的长度一定不大于
equation?tex=x

3. 后验概率

回顾CTC的优化目标,对于一个给定的输入

equation?tex=x ,需要最大化
equation?tex=y 对应
equation?tex=x 的后验概率
equation?tex=p%28y%5Cmid+x%29 ,所以显然需要先得到后验概率的值。通过上面定义的对齐规则,已经解决了最后序列合并的对齐问题。接下来说明具体如何根据每个时间片的概率,推算出最终输出序列的后验概率
equation?tex=p%28y%5Cmid+x%29

具体地,对于一个输入

equation?tex=x%3D%5Cleft%5Bx_%7B1%7D%2C+x_%7B2%7D%2C+%5Cldots%2C+x_%7BT%7D%5Cright%5D+ ,每一时间步对应分量
equation?tex=x_i 的特征维度,记为
equation?tex=m
equation?tex=x 经过BiLSTM输出
equation?tex=z%3D%5Cleft%5Bz_%7B1%7D%2C+z_%7B2%7D%2C+%5Cldots%2C+z_%7BT%7D%5Cright%5D+ ,每个分量
equation?tex=z_i 的维度记为
equation?tex=n ,表示
equation?tex=n 个概率。
equation?tex=n 实际上等于字符集合
equation?tex=L 的个数,假如需要预测的字符对应的字段包含52个英文字母(包括大小写),考虑之前加入的占位符,则
equation?tex=n 的值就是53。

对于每个分量

equation?tex=z_i ,都选取一个元素,便可以组成一条输出路径,记为
equation?tex=l ,输出路径的空间可表示为
equation?tex=L%5ET

定义一个映射

equation?tex=F ,表示对中间输出路径进行变换,得到最后的输出
equation?tex=y 。注意这里的路径不是最终的输出
equation?tex=y ,需要经过合并相邻字符以及删除占位符的处理,才会得到
equation?tex=y ,所以相当于中间结果。下面举例说明。

假设识别的序列为"taste",

equation?tex=T%3D12 时,那么以下几种路径均满足条件:

equation?tex=%5Cbegin%7Balign%7D++F%28%7Bl%5E1%7D%29+%26%3D+F%28+-++-+taas+-+t+-++-+e+-+%29+%3D+taste%5C%5C+++F%28%7Bl%5E2%7D%29+%26%3D+F%28tta+-+sss+-+tte+-+%29+%3D+taste%5C%5C+++F%28%7Bl%5E3%7D%29+%26%3D+F%28tta+-+ss+-+t+-++-+ee%29+%3D+taste%5C%5C+++F%28%7Bl%5E4%7D%29+%26%3D+F%28+-++-+ttass+-+tee+-+%29+%3D+taste%5C%5C++%5Cend%7Balign%7D+%5C%5C

因此求taste最终输出对输入的后验概率时 ,就是求这四条路径对应概率之和。进一步推广,给定输入

equation?tex=x ,中间结果对应的路径
equation?tex=l ,最终输出
equation?tex=y ,则
equation?tex=y
equation?tex=x 的后验概率可以表示为:

equation?tex=p%28y%5Cmid+x%29+%3D+%5Csum%5Climits_%7BF%28l%29+%3D+y%7D+p+%28l%5Cmid+x%29%5C%5C

假设不同时间步的输出变量相互独立,那么对于输出路径

equation?tex=l
equation?tex=x 的后验概率可表示为:

equation?tex=p%28l%5Cmid+x%29+%3D+%5Cprod%5Climits_%7Bt+%3D+1%7D%5ET+%7Bz_%7B%7Bl_t%7D%7D%5Et%7D+%5C%5C

equation?tex=l_t 表示路径
equation?tex=l
equation?tex=t 时间步时对应的输出字符,而
equation?tex=z_%7B%7Bl_t%7D%7D%5Et 表示在
equation?tex=t 时间步时选取的字符为
equation?tex=l_t 的概率。因此,综合上述两式可得:

equation?tex=%5C%5Cp%28y%5Cmid+x%29+%3D+%5Csum%5Climits_%7BF%28l%29+%3D+y%7D+%7B%5Cprod%5Climits_%7Bt+%3D+1%7D%5ET+%7Bz_%7B%7Bl_t%7D%7D%5Et%7D+%7D+%5C%5C

简单来说,公式表示的含义为

equation?tex=y
equation?tex=x 的后验概率等于所有对应路径的概率之和,而每条路径对
equation?tex=x 的后验概率又等于组成该路径的字符出现概率的乘积。

由于连续重复字符以及占位符的存在,每一个特定的输出

equation?tex=y 都会对应相当多的路径。如果这里逐一遍历进行求解,那么时间的复杂度可达到
equation?tex=O%28%7Bn%5ET%7D%29
equation?tex=n 为前面定义的字符集的个数,
equation?tex=T 为时间步总长。这是因为有
equation?tex=T 个步长,而每个步长输出的字符又有
equation?tex=n 种可能性。所以需要对算法进行改进,这里便借鉴了动态规划的思想。

4. 前向后向算法

对于一个最终输出序列

equation?tex=y ,实际上也表示中间路径合并后的结果。定义
equation?tex=y%27 表示在序列
equation?tex=y 所有相邻元素之间插入占位符后的序列。比如:

equation?tex=y+%3D+state%5C%5C++y%27+%3D+-s-t-a-t-e-%5C%5C

依然拿上述例子进行说明,如下图所示。

10cb9cec9453494d858a5170315afabf.png
图3 单词state的可取路径 [3]

从上图可以看出,四条中间路径

equation?tex=l_1
equation?tex=l_2
equation?tex=l_3
equation?tex=l_4 合并处理后都可以得到state,并且他们都经过字符
equation?tex=a 。如果将路径蓝色部分记为
equation?tex=b ,红色部分记为
equation?tex=r ,则不难推出:

equation?tex=%5Cbegin%7Balign%7D+%7Bl%5E1%7D+%26+%3D+b+%3D+%7Bb_%7B1%3A5%7D%7D+%2B+%7Ba_6%7D+%2B+%7Bb_%7B7%3A12%7D%7D%5C%5C+%7Bl%5E2%7D+%26+%3D+r+%3D+%7Br_%7B1%3A5%7D%7D+%2B+%7Ba_6%7D+%2B+%7Br_%7B7%3A12%7D%7D%5C%5C+%7Bl%5E3%7D+%26+%3D+%7Bb_%7B1%3A5%7D%7D+%2B+%7Ba_6%7D+%2B+%7Br_%7B7%3A12%7D%7D%5C%5C+%7Bl%5E4%7D+%26+%3D+%7Br_%7B1%3A5%7D%7D+%2B+%7Ba_6%7D+%2B+%7Bb_%7B7%3A12%7D%7D%5C%5C+%5Cend%7Balign%7D%5C%5C

由于4条路径都经过

equation?tex=a ,所以都包含
equation?tex=z_a%5E6 项,提取公因式进行合并,令

equation?tex=%5Cbegin%7Balignat%7D%7B1%7D++forward+%26+%3D+p%28%7Bb_%7B1%3A5%7D%7D+%2B+%7Br_%7B1%3A5%7D%7D%5Cmid+x%29+%26+%3D+z_+-+%5E1+%5Ccdot+z_+-+%5E2+%5Ccdot+z_s%5E3+%5Ccdot+z_t%5E4+%5Ccdot+z_t%5E5+%2B+z_s%5E1+%5Ccdot+z_s%5E2+%5Ccdot+z_t%5E3+%5Ccdot+z_+-+%5E4+%5Ccdot+z_a%5E5%5C%5C++backward+%26+%3D+p%28%7Bb_%7B7%3A12%7D%7D+%2B+%7Br_%7B7%3A12%7D%7D%5Cmid+x%29+%26+%3D+z_+-+%5E7+%5Ccdot+z_t%5E8+%5Ccdot+z_+-+%5E9+%5Ccdot+z_+-+%5E%7B10%7D+%5Ccdot+z_+-+%5E%7B11%7D+%5Ccdot+z_e%5E%7B12%7D+%2B+z_a%5E7+%5Ccdot+z_+-+%5E8+%5Ccdot+z_t%5E9+%5Ccdot+z_e%5E%7B10%7D+%5Ccdot+z_e%5E%7B11%7D+%5Ccdot+z_+-+%5E%7B12%7D+%5Cend%7Balignat%7D+%5C%5C

则公式

equation?tex=p%28%7Bl%5E1%7D%2C%7Bl%5E2%7D%2C%7Bl%5E3%7D%2C%7Bl%5E4%7D%5Cmid+x%29 可以写成:

equation?tex=%5C%5Cp%28%7Bl%5E1%7D%2C%7Bl%5E2%7D%2C%7Bl%5E3%7D%2C%7Bl%5E4%7D%5Cmid+y%29+%3D+forward+%5Ccdot+z_a%5E6+%5Ccdot+backward+%5C%5C

当然,这只是包含4条路径的结果,实际上序列state应该对应更多的路径,如下图所示。

6df33f91c83264af4c4392823b163372.png
图4 单词state所有可能路径 [3]

所以上述公式可推广为:

equation?tex=%5Csum%5Climits_%7BF%28l%29+%3D+y%2Cl_6%5Ek+%3D+a%7D+p+%28l%5Cmid+x%29+%3D+forward+%5Ccdot+z_a%5E6+%5Ccdot+backward%5C%5C

进一步地,这里可以定义

equation?tex=%7B%5Calpha+_t%7D%28%7By%27_k%7D%29 , 表示时间步为
equation?tex=t 时经过字符
equation?tex=y_k%27 的所有路径在
equation?tex=1-t 时刻的概率和,即:

equation?tex=%7B%5Calpha+_t%7D%28%7By%27_k%7D%29+%3D+%5Csum%5Climits_%7BF%28l%29+%3D+y%2C%7Bl_t%7D+%3D+%7By%27_k%7D%7D+%7B%5Cprod%5Climits_%7Bt%27+%3D+1%7D%5Et+%7Bz_%7B%7Bl_%7Bt%27%7D%7D%7D%5E%7Bt%27%7D%7D+%7D%5C%5C

不难分析,

equation?tex=t%3D1 时字符只能占位符或
equation?tex=y_1 ,所以可得:

equation?tex=%5Cbegin%7Balign%7D+%7B%5Calpha+_1%7D%28+-+%29+%26++%3D+z_+-+%5E1%5C%5C+%7B%5Calpha+_1%7D%28%7By_1%7D%29+%26++%3D+z_%7B%7By_1%7D%7D%5E1%5C%5C+%7B%5Calpha+_1%7D%28%7By_1%7D%29+%26++%3D+0%2Ct+%3E+1+%5Cend%7Balign%7D%5C%5C

进一步观察可以发现,由于

equation?tex=%7Bl_6%7D+%3D+a 的限制,
equation?tex=t%3D5时对应的字符只能为
equation?tex=a
equation?tex=t
equation?tex=%5Cepsilon 。所以可得递推公式:

equation?tex=%5Calpha+_6%28a%29+%3D+%28%7B%5Calpha+_5%7D%28a%29+%2B+%7B%5Calpha+_5%7D%28t%29+%2B+%7B%5Calpha+_5%7D%28+-+%29%29+%5Ccdot+z_a%5E6%5C%5C

进一步推广可得一般式如下:

equation?tex=%7B%5Calpha+_t%7D%28%7By%27_k%7D%29+%3D+%28%7B%5Calpha+_%7Bt+-+1%7D%7D%28%7By%27_k%7D%29+%2B+%7B%5Calpha+_%7Bt+-+1%7D%7D%28%7By%27_%7Bk+-+1%7D%7D%29+%2B+%7B%5Calpha+_%7Bt+-+1%7D%7D%28+-+%29%29+%5Ccdot+z_%7B%7By%27_k%7D%7D%5Et%5C%5C

类似地,这里可以定义

equation?tex=%7B%5Cbeta+_t%7D%28%7By%27_k%7D%29 ,表示时间步为
equation?tex=t 时经过字符
equation?tex=y_k%27 的所有路径在
equation?tex=t-T 时刻的概率和,即:

equation?tex=%7B%5Cbeta+_t%7D%28%7By%27_k%7D%29+%3D+%5Csum%5Climits_%7BF%28l%29+%3D+y%2C%7Bl_t%7D+%3D+%7By%27_k%7D%7D+%7B%5Cprod%5Climits_%7Bt%27+%3D+t%7D%5ET+%7Bz_%7B%7Bl_%7Bt%27%7D%7D%7D%5E%7Bt%27%7D%7D+%7D+%5C%5C

不难分析,

equation?tex=t%3DT 时字符只能占位符或
equation?tex=%7By_%7B%7Cy%27%7C+-+1%7D%7D ,所以可得初始条件:

equation?tex=%5Cbegin%7Balign%7D+%7B%5Cbeta+_T%7D%28+-+%29+%26++%3D+z_T%5E1%5C%5C+%7B%5Cbeta+_T%7D%28%7By_%7B%7Cy%7C%7D%7D%29+%26++%3D+z_%7B%7By_%7B%7Cy%7C%7D%7D%7D%5ET%5C%5C+%7B%5Cbeta+_T%7D%28%7By_%7B%7Cy%7C+-+t%7D%7D%29+%26++%3D+0%2Ct+%3E+0+%5Cend%7Balign%7D%5C%5C

类似地,可得

equation?tex=%7B%5Cbeta+_t%7D%28%7By%27_k%7D%29 的递推公式为:

equation?tex=%5C%5C%7B%5Cbeta+_t%7D%28%7By_k%27%7D%29+%3D+%28%7B%5Cbeta+_%7Bt+%2B+1%7D%7D%28%7By_k%27%7D%29+%2B+%7B%5Cbeta+_%7Bt+%2B+1%7D%7D%28%7By_%7Bk+%2B+1%7D%27%7D%29+%2B+%7B%5Cbeta+_%7Bt+%2B+1%7D%7D%28+-+%29%29+%5Ccdot+z_%7B%7By_k%27%7D%7D%5Et%5C%5C

由于

equation?tex=p%28y%5Cmid+x%29
equation?tex=y_k%27 求导时,只与经过
equation?tex=z_%7By_k%27%7D%5Et 的路径有关,所以在反向传播对
equation?tex=p%28y%5Cmid+x%29 进行梯度计算时,便可以将公式进行简化:

equation?tex=p%28y%5Cmid+x%29+%3D+%5Csum%5Climits_%7BF%28l%29+%3D+y%2C%7Bl_t%7D+%3D+%7By_k%27%7D%7D+p+%28l%5Cmid+x%29+++%3D+%5Csum%5Climits_%7BF%28l%29+%3D+y%2C%7Bl_t%7D+%3D+%7By_k%27%7D%7D+%7B%5Cprod%5Climits_%7Bt+%3D+1%7D%5ET+%7Bz_%7B%7Bl_t%7D%7D%5Et%7D+%7D+%5C%5C

而由于

equation?tex=%5C%5C%7B%5Calpha+_t%7D%28%7By%27_k%7D%29+%5Ccdot+%7B%5Cbeta+_t%7D%28%7By%27_k%7D%29+%3D+%5Csum%5Climits_%7BF%28l%29+%3D+y%2C%7Bl_t%7D+%3D+%7By_k%27%7D%7D+%7Bz_%7B%7By_k%27%7D%7D%5Et%7D+%5Cprod%5Climits_%7Bt+%3D+1%7D%5ET+%7Bz_%7B%7Bl_t%7D%7D%5Et%7D+%5C%5C

所以将其带入可得:

equation?tex=p%28y%5Cmid+x%29+%3D+%5Csum%5Climits_%7BF%28l%29+%3D+y%2C%7Bl_t%7D+%3D+y_k%27%7D+%7B%5Cfrac%7B%7B%5Calpha+_t%28%7By_k%27%7D%29+%5Ccdot+%7B%5Cbeta+_t%7D%28%7By_k%27%7D%29%7D%7D%7B%7Bz_%7B%7By_k%27%7D%7D%5Et%7D%7D%7D+%5C%5C

由上面的推导可知,

equation?tex=%7B%5Calpha+_t%7D%28%7By%27_k%7D%29
equation?tex=%7B%5Cbeta+_t%7D%28%7By%27_k%7D%29 都可以利用动态规划的思想通过递推公式求出,而不用从头开始计算,复杂度从
equation?tex=O%28%7Bn%5ET%7D%29 变为了
equation?tex=O%28nT%29 ,大大简化了计算。而
equation?tex=p%28y%5Cmid+x%29 只涉及乘法和加法运算,显然是可导的,所以就可以通过上式进行反向传播计算了。

5. 预测

前面提到,在预测阶段,给定一个输入

equation?tex=x ,计算最大概率对应的输出序列。如果假设时间片之间相互独立,那么只需将每一时间片对应概率最大的字符作为预测值,然后组成序列,最后做去重等处理得到最终结果。不过这样并没有考虑多个序列经过对齐对应同一个输出结果。例如,假如
equation?tex=%5Bc%2Cc%2C%5Cepsilon%5D
equation?tex=%5Bc%2Cc%2Cc%5D 各自的概率都低于
equation?tex=%5Bc%2Co%2Cc%5D ,而二者的概率之和高于后者。前者对齐后的结果均为
equation?tex=%5Bc%5D ,而后者对齐的结果仍为
equation?tex=%5Bc%2Co%2Cc%5D ,显然输出
equation?tex=%5Bc%5D
equation?tex=%5Bc%2Co%2Cc%5D 更合理些。

所以为了避免这一问题的发生,又引入了另一种算法,称为Beam Search。

里面有个参数

equation?tex=B ,用来指定每次保留的前缀序列的个数。假如设置
equation?tex=B%3D3 ,则每次选取概率最大的3个前缀序列,比如
equation?tex=t%3D1 时选取概率最大的3个字符,
equation?tex=t%3D2 时也选取概率最大的3个字符,这样便有9种组合方式。当然对齐之后可能会对应相同的输出,所以要将结果相同的前缀序列进行合并(概率也要相加),然后挑出概率最大的3个作为下一次的输出,以此类推。以序列
equation?tex=%5B%5Cepsilon%2Ca%2Cb%5D 为例,具体过程如下图所示。

09beb0f18fb351c7e7fe0bfffba206e6.png
图5 Beam Search示意图 [1]

这里要注意的是,当前缀序列的末尾字符与下一个字符相同时,合并可以产生两种有效输出。

比如上图中

equation?tex=t%3D3 时前缀序列为
equation?tex=a , 而合并的字符同样为
equation?tex=a ,这样既可以输出
equation?tex=a ,也可以输出
equation?tex=aa ,二者都是可能的。因为在
equation?tex=a%3D2 时,其中一个结果占位符
equation?tex=%5Cepsilon 在对齐时被移除了,但是在这里后面又遇到了相同的字符,按照前面定义的规则,此时合并的结果应该为
equation?tex=aa
equation?tex=%5B%5Cepsilon%2Ca%2Cb%5D 的两种计算情况如下图所示。

76311ac838a7a85d80a34e7e5f19e306.png
图6 [epsilon,a,b] 的预测过程 [1]

所以,这两种结果应作为两种序列分别进行概率计算。当然,为了能够计算这两种情况对应的概率,需要分别记录以

equation?tex=%5Cepsilon 结尾的前缀序列的概率,以及不以
equation?tex=%5Cepsilon 结尾的前缀序列的概率。

6. 总结

以上便是CTC计算的所有过程。最后,总结CTC的几个特点。

  • 条件独立。回顾上面的计算过程,可以发现在进行路径概率计算时,CTC直接将每个时间片对应的概率值进行相乘,也就是说CTC默认每个时间片都是相互独立的。但是,在文本识别中,文本显然是包含上下文信息的,所以模型中才引入了RNN层。当然,结果表明这并没有妨碍到CTC在文本识别领域的优异表现。不过,假如能够在CTC中将输入数据的上下文信息考虑进去,效果应该能得到进一步的提升。
  • 单调对齐。CTC的规则决定了输入 与输出 的对齐是单调的。这也导致了CTC无法应用在机器翻译等不符合该约束的领域。
  • 多对一映射。输入与最终的输出是一对多的关系,即多个输入分量可能只对应一个输出分量。所以输出 的长度一定不大于 。所以如果遇到 的长度大于 长度的情况,CTC便无法处理了。

最后,不要光收藏不点赞嘛,点个赞再走吧,写文章不易,多多鼓励~

参考资料

[1] Sequence Modeling With CTC

[2] CTC(Connectionist Temporal Classification)介绍

[3] 一文读懂CRNN+CTC文字识别

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值