【文本识别】CTC_Loss原理

目录

传统RNN序列学习任务:

CTC:一种RNN的端到端训练方法

1、CTC原理简介:

3、问题定义

4、RNN输出层扩展

5、CTC Loss函数定义:

6、CTC Loss函数计算

7、CTC的特征

8、百度warp-CTC


传统RNN序列学习任务:

  • 输入序列和输出序列之间的映射关系已经事先标注好了。
  • 由于输入序列和输出序列是一一对应的,所以RNN模型的训练和预测都是端到端的,即可以根据输出序列和标注样本间的差异来直接定义RNN模型的Loss函数,传统的RNN训练和预测方式可直接适用。

缺点:

  • 在语音识别、手写字识别等任务中,由于音频数据和图像数据都是从现实世界中将模拟信号转为数字信号采集得到,这些数据天然就很难进行“分割”,这使得我们很难获取到包含输入序列和输出序列映射关系的大规模训练样本(人工标注成本巨高,且启发式挖掘方法存在很大局限性)。因此,在这种条件下,RNN无法直接进行端到端的训练和预测。

CTC:一种RNN的端到端训练方法

1、CTC原理简介:

CTC(Connectionist Temporal Classification)算法:一种RNN(Recurrent Neural Networks)的端到端训练方法。

  • 它可以让RNN直接对序列数据进行学习,而无需事先标注好训练数据中输入序列和输出序列的映射关系。使得RNN模型在语音识别等序列学习任务中取得更好的效果。
  1. 它扩展了RNN的输出层,在输出序列和最终标签之间增加了多对一的空间映射,并在此基础上定义了CTC Loss函数
  2. 它借鉴了HMM(Hidden Markov Model)的Forward-Backward算法思路,利用动态规划算法有效地计算CTC Loss函数及其导数,从而解决了RNN端到端训练的问题
  3. 最后,结合CTC Decoding算法RNN可以有效地对序列数据进行端到端的预测

进一步分析:

  • 对音频“分割”并标注映射关系的数据依赖是不切实际的,实际情况是对音频按照时间窗口滑动来提取特征,比如按照每10毫秒音频提取特征得到一个N维数组。如下图所示

  • 由于人说话发音是连续的,且中间也会有“停顿”,所以输出序列中存在重复的元素,比如“wo3 wo3”,也存在表示间隔符号“_”。需从输出序列中去除掉重复的元素以及间隔符,才可得到最终的音节序列,比如,“wo3 wo3 ai4 _ ni3 _ zhong1 guo2 _” 归一处理后得到“wo3 ai4 ni3 zhong1 guo2”。因此,输出序列和最终的label之间存在多对一的映射关系,如下图

        RNN模型本质是对𝒑(𝒛│𝒙)建模,其中x表示输入序列,o表示输出序列,z表示最终的label结果,o和z存在多对一的映射关系,即:𝒑(𝒛│𝒙)=sum of all P(o|x),其中o是所有映射到z的输出序列。因此,只需要穷举出所有的o,累加一起即可得到𝒑(𝒛│𝒙),从而使得RNN模型对最终的label进行建模

        经过以上的映射转换,解决了端到端训练的问题,RNN模型实际上是对映射到最终label的输出序列的空间建模。然而,对每一个z都“穷举所有的o”,这个计算的复杂度太大,会使得训练速度变得非常慢,因此怎么更高效地进行端到端训练成为待解决的关键问题。

3、问题定义

  • CTC的目标是使概率P最大化。
  • 本质上是最大似然预估, S是训练数据集,X是输入空间(由音频信号向量序列组成的集合),Z是目标空间(由声学模型建模单元序列组成的集合),L是由输出的字符集(声学建模单元的集合),且x的序列长度小于或等于z的序列长度

4、RNN输出层扩展

  • 1)字符集(即label_map)扩充:以英文字母识别为例,原本的字符集为{a-z}26个字母,这里会对字符集{a-z}进行扩展,增加一个“_”空格(用于分隔字符)
  • 2)多对一映射:定义了从输出层到最终label序列的多对一映射函数,使得RNN输出层能映射到最终的label序列结果。多对一映射函数:1)连续相同的字符去重;2)去除空格字符;

多对一映射规则:

输出序列:"a" + "a" + "_" + "p" + "_" + "p" + "l" + "e"    ——> 最终label结果:apple

  • ①:合并连续的相同的字符,"a" + "a";
  • ②:去除空格分隔符"_";
  • ③:第4个字符"p"和第6个字符"p"之间有一个分隔符“_”,因此不会被合并掉。

计算某个输出label结果的概率:

如果要计算𝒑(𝒛│𝒙),可以累加其对应的全部输出序列(也即映射到最终label的“路径”)的概率即可,如下图。

5、CTC Loss函数定义:

※※※CTC Loss的重点:

  • 1)单条路径上,连乘每个时刻预测结果的概率.P(单条路径) = y0*y1*y2*y3......yt;
  • 2)累加所有能映射为正确结果的路径概率。P(所有正确路径)=P0+P1+P2+....Pm;假设有m条路径能映射到正确结果。
  • 3)对概率加上一个-In函数。(重点是-In的函数曲线图,概率越大,loss越小,反之概率越小,loss越大)

6、CTC Loss函数计算

暴力计算存在的问题:由于直接暴力计算 𝒑(𝒛│𝒙)(即所有正确路径)的复杂度非常高,作者借鉴HMM的Forward-Backward算法思路,利用动态规划算法求解

动态规划计算细节:

为了更形象表示问题的搜索空间,用X轴表示时间序列, Y轴表示输出序列,并把输出序列做标准化处理,输出序列中间和头尾都加上blank。

  • 横坐标:时间序列T的长度,即timestep;
  • 纵坐标:输出序列,长度 = (正确label长度 × 2) + 1每个字符中间隔了一个空格,并且开头结尾各有一个空格。(例如:正确label为apple,长度为5,那么输出序列Y轴的长度则为11)

展示apple其中的一条路径:

全部合法路径:遍历所有映射为“apple”的合法路径,最终时序T=8,标签labeling=“apple”的全部路径如下图:

通过动态规划递归计算出所有路径的概率,即当前节点处的概率总和等于前面所有子路径概率相加。

P(当前节点概率综合) = [ Pi1+ Pi2 + ...] × yt

Pi为上一个状态子路径1的概率, yt为当前节点的概率,将前面所有子路径的概率相加然后再乘以当前节点的概率。

通过动态规划求解出前向概率之后,可以用前向概率来计算CTC Loss函数,如下图:

类似地方式,我们可以定义反向概率,并用反向概率来计算CTC Loss函数,如下图:

根据任意时刻的前向概率和后向概率计算CTC Loss函数,得到以下结论:

7、CTC的特征

  1. 条件独立:CTC的一个非常不合理的假设是其假设每个时间片都是相互独立的,这是一个非常不好的假设。在OCR或者语音识别中,各个时间片之间是含有一些语义信息的,所以如果能够在CTC中加入语言模型的话效果应该会有提升。
  2. 单调对齐:CTC的另外一个约束是输入X与输出Y之间的单调对齐,在OCR和语音识别中,这种约束是成立的。但是在一些场景中例如机器翻译,这个约束便无效了。
  3. 多对一映射:CTC的又一个约束是输入序列X的长度大于标签数据Y的长度,但是对于Y的长度大于X的长度的场景,CTC便失效了。

参考:https://xiaodu.io/ctc-explained/

8、百度warp-CTC

        warp-CTC是百度开源的一个可以应用在CPU和GPU上高效并行的CTC代码库,对CTC算法进行了并行处理

  • 2
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值