Sequence Modeling With CTC

简介

Connectionist Temporal Classification(CTC) 是一种用来在语音识别、手写体识别等序列问题中训练深度神经网络的算法。 

考虑下语音识别。 我们有一个音频剪辑片段数据集和相应的转录,但不幸的是,我们不知道转录中的字符如何与音频对齐,这让训练一个语音识别器的难度比初看起来的要大。

失去这种对齐,简单的方法对我们来说不能用了。 我们可以制定一个规则,比如“一个字符对应十个输入”。 但是人们的语速在变化,所以这种规则总是可以被打破。 

这个问题不只是在语音识别中出现。 我们在其他许多地方看到它。 比如手写体识别、 视频行为标注。

Handwriting recognition: The input can be (x,y) coordinates of a pen stroke or pixels in an image.


Speech recognition: The input can be a spectrogram or some other frequency based feature extractor.


连接主义时间分类器(CTC)是一种避开输入和输出之间的对齐的方式。 我们会看到,它特别适合语音和手写识别等应用。

考虑从输入序列X=[x1, x2,...,xt]映射到输出序列Y=[y1, y2,...yu],比如音频的转录。我们希望找到一个从X‘s到Y’s的准确的映射。

存在一些挑战让我们不能使用更简单的有监督学习算法,尤其是:

  • X和Y的长度可以变。
  • X和Y的长度比例可变
  • 我们没有一个X和Y之间的准确的对齐(对应元素)。

CTC算法可以克服这些挑战。对于一个给定的X,它给我们一个所有可能Y值的输出分布。我们可以使用这个分布来推断可能的输出或者评估一个给定输出的概率。

并不是所有的计算损失函数和执行推理的方法都是易于处理的。 我们要求CTC可以有效地做到这两点。

损失函数:对于给定的输入,我们希望训练模型来最大化分配到正确答案的概率。 为此,我们需要有效地计算条件概率p(Y | X)。 函数p(Y | X)也应该是可微的,可以使用梯度下降。

推理:在我们训练好模型后,我们希望使用它来推断给定X的最可能的Y。就是解

Y^* \enspace =\enspace {\mathop{\text{argmax}}\limits_{Y}} \enspace p(Y \mid X).

理想情况下,Y*可以被有效地找到。有了CTC,我们就可以找到一个近似的解,这个解不太难找。

算法

给定一个X,CTC算法可以为任意Y分配一个概率。计算这个概率的关键是CTC如何考虑输入和输出之间的对齐。我们先看看这些对齐,然后展示如何使用它们来计算损失函数并执行推理。

对齐

CTC算法是无需对齐的-它不需要输入和输出之间的对齐。然而,为了得到给定输入的一个输出的概率,CTC通过总结两者之间所有可能的对齐的概率来进行工作。 为了理解损失函数最终是如何计算的,我们需要了解这些对齐是什么。
为了激发CTC对齐的具体形式,首先考虑一种初级的做法。 我们举个例子,假设输入长度为6, Y=[c,a,t]。 对齐X和Y的一种方法是将输出字符分配给每个输入步骤并折叠重复的部分。

这种方法存在两个问题。

  • 通常,强制每个输入步骤与某些输出对齐是没有意义的。 例如在语音识别中,输入可以具有无声的延伸,但没有相应的输出。
  • 我们没有办法产生连续多个字符的输出。 考虑这个对齐[h,h,e,l,l,l,o],折叠重复将产生“helo”而不是“hello”。
为了解决这些问题,CTC为一组允许的输出引入了一个新的标记。 这个新的标记有时被称为空白标记。 我们在这里将其称为ε,ε标记不对应任何东西,可以从输出中移除。
CTC允许的对齐是与输入的长度相同。 在合并重复并移除ε标记后,我们允许任何映射到Y的对齐方式:



如果Y在同一行中有两个相同的字符,那么一个有效的对齐必须在它们之间有一个ε。 有了这个规则,我们就可以区分崩“hello”和“helo”
让我们回到输入长度为6的输出[c,a,t]。 以下是一些有效和无效对齐的例子。



CTC对齐有一些显著的特性。 首先,X和Y之间允许的对齐是单调的。 如果我们前进到下一个输入,我们可以保持相应的输出相同或前进到下一个输入。 第二个属性是X到Y的对齐是多对一的。 一个或多个输入元素可以对齐到一个输出元素,但反过来不成立。 这意味着第三个属性:Y的长度不能大于X的长度。

损失函数

CTC对齐给了我们一个从每个时间步的概率到输出序列概率的自然的方法。




严格的说,对单个(X,Y),CTC的目标函数是:



使用CTC训练的模型通常使用一个递归神经网络(RNN)来估计每个时间步长的概率pt(at|X)。 RNN通常效果很好,因为它考虑了输入中的上下文环境,但是也可以自由使用任何学习算法,在给定一个固定尺寸输入片段的情况下产生一个输出类别的分布。
如果我们不小心,CTC的loss计算可能非常昂贵。 我们可以尝试简单的方法,计算每个对齐的得分并把他们累加到一起。 问题是可以存在大量的对齐,对大多数问题,这太慢了。
庆幸的是,我们可以使用动态规划算法更快的计算loss。 关键点是,如果两个对齐在同一步已经达到了相同的输出,可以合并它们。


Summing over all alignments can be very expensive.

   
         Dynamic programming merges alignments, so it’s much faster

………

现在我们可以有效地计算损失函数,下一步就是计算梯度并训练模型。 CTC损失函数对于每个时间步的输出概率是可微的,因为它只是每个时间步输出概率的总和和乘积。 鉴于此,我们可以分析计算损失函数对(非标准化)输出概率的梯度,并像通常一样从那里进行反向传播。
对于一个训练集D,微调模型的参数来最小化负log-likelihood,而不是直接最大化likelihood。

推理 

在我们训练好模型后,我们希望使用它来找到一个输入的最可能的输出。更严格的说,我们需要解:

一种启发式方法是在每个时间步使用最可能的输出。这给了我们最高概率的对齐:

然后我们可以折叠重复并删除ε标记来获得Y。
对许多应用来说,这种启发式算法表现不错,特别是当大多数大概率被分配到单个对齐时。 但是这种方法有时会错过很容易找到的更高概率的输出。 问题就在于,它没有考虑到单个输出可以有多个对齐的事实。
(未完结)

参考:https://distill.pub/2017/ctc/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值