CTC 是对于未分割的时序进行分类的一种经典,并且非常有效的算法,目前针对语音识别,orc都是不可或缺的技术,虽然有很多人解释了ctc,但仍然不懂,经过长时间论文以及阅读大牛们的解释,算是有所收获,借此对论文重新解释,加深印象。
摘要:
现实生活中我们需要从有噪声、未分割的数据中来学习预测labels的任务。例如在语音识别把语音转化为单词或者字符的任务,作者以深度学习为例。神经网络rnn具有很好的学习能力,但是由于它们需要预先分割序列数据,然后把他们的输出转化为序列标记,这就限制了精确度,并且需要大量人工,本文就提出一种在未分割数据的情况下,利用rnn进行序列分类的方法,实验结果显示,要优于hmm。
引言:
未分割的序列数据是一个无处不在的学习任务,尤其是在perceptual 任务中(手写识别,语音识别,手势识别)其中,含有噪声并且用单词或者letter进行离散的标注。
目前最主要的就是hmm,crf和他们的一些变种是序列标注的主要框架(2006年,现在不是了),但是他们仍然有几个缺点:
1、他们需要大量指定任务的知识,例如为了设计hmm模型或者选择crf的输入特征,
2、他们需要明确的依赖假设使得推断变得可行,例如:在hmm中假设观察变量之间是相互独立的。
3、对于标准的训练hmm,traing is generative,even though sequence labeling is discriminative ,这一个缺点不太懂,hmm本身是生成模型,这句话是说即使序列标记已经是判别变量,但是hmm仍然是生成模型?,请大牛解释。
rnn不需要先验知识,也不需要选择输入和输出表示,他们可以有条不紊的进行训练,他的内部机制提供了一个泛化的机制对于时间序列模型,往往很健壮,并且没有空间噪声(spatial noise)。
直接利用rnn是不可能的在未分割时序数据,关键所在是rnn的优化函数是针对训练时序的每一个点预测的类别,RNN只能训练一系列独立的label分类。这就意味着训练数据必须预先分割,神经网络的输出是后处理之后给定的最后分类类别。
在之前是利用RNN与HMM结合的方法,用hmm构建长范围的 顺序结构化数据,网络提供了一个本地的分类,hmm在训练阶段能够自动分割序列,把神经网络分类转变为label标记,然而继承了hmm的缺点,这种结合并不能完全展示rnn的内在优势。
在本文提出一个新方法能够去除预先分割和输出后处理过程,用一个网络构建所有的序列模型。基本的想法就是在给定一个输入序列,例如语音mffcc特征,把神经网络输出作为一个所有可能label序列的概率分布,在给定这个分布之后,目标优化函数就是可以最大化正确的那个label序列。由于目标优化函数是可微分的,所以能够利用标准的反馈训练模型。
主要参考了把未分割的数据作为时间分类,结合称为connectionist temporal classification(CTC),相比之下,我们参考了每一个时间步或者每一帧是一个独立的作为独立的标记,作为逐帧分类。
以下是工作重点。
2.temporal classification
使用从一个固定的分布
的训练数据集。输入空间为
是所有含有m维度的向量输入序列。target空间
是字母集合
所有组合的序列label ,在
中的每一对(x,z),目前、标序列
对应的x序列为
,其中
,,由于输入序列与目标序列一般长度都不相等,所以之前没有先前方法把他们对齐。
我们的目标是利用训练一个时序分类器:
,来分类未参与训练的输入序列,以最小化损失的情况下,也就是,预测序列尽可能与实际序列保持一致。
2.1 label error rate(标记损失)
我们主要关注的以下损失给定集合,不在
内定义一个label error rate(LER),实际就是正常实际标记与预测标记之间的编辑距离例如如下:
(1)
其中是p和q序列的编辑距离。最小编辑距离的意思是利用插入、删除、替换等操作使得p变成q的最小操作数。这是一个衡量标准针对例如语音或者手写识别。最小化这个编辑距离。
3.connectionist temporal classification
时序分类,这个一张就是利用ctc来做循环神经网络,最重要的一步就是了怎么把循环神经网络的输出转换为label序列的条件概率分布。神经网络选择最优可能的labeling作为输出。
3.1 from network outputs to labelling
ctc神经网络有一个softmax输出层,比实际labels多一个单元,把
最大值作为激活单元,表示为在特定times下观测变量对应的labels的概率。激活额外的单元是‘blank’的概率,总的加起来这个输出就定义了输入序列的所有概率预测与labels对齐的可能概率。那么任何一个label序列的概率就是对不同对应的输出预测线路求和得到。
更正式的,有一个长度为T的输入x,定义一个循环神经网络,输入为m维度,输出为n维度,对应的连续映射:
,使得
,是序列网络的输出,那么
表示t时刻输出label为k的概率,那么长度为T的概率分布
,覆盖了字母表
,那么对于一个输入序列列x为T长度的整个概率预测序列为:
(2)
这个概率可以解释为对于每一个时刻t预测label为,所有时刻的联合概率,这个也仅是一条x输入输出序列labels的概率输出路径。也就是现在是
个元素组成的path,相当于神经网络针对语音每一帧对应的标记输出,但是如果是卷积神经网络,那么输出就有可能小于帧数。对于一个路径表示为
。
公式(2) 假设神经网络的输出是条件独立的,在给定网络内部状态之后。下一步就是定义多对一的映射:,其中
是所有可能的标记labels,小于等于T,做这个映设就是把blank和对应重复的字符去除掉,例如:
,这对应了一个神经网络从没有label到转换生成一个新标记,或者预测从一个label到另外一个,最后给定一个label
,利用
定义它的条件概率,把
对应所有序列的概率求和就是
的条件概率。如下公式:
可以比较容易理解,就是神经网络所有输出序列经过映射是
序列的概率求和就是
的概率
。
3.2 Constructing the Classififier(构造分类器)
给定以上公式,那么输入对应最有可能的label就是概率最大的那一个,
那么利用hmm的术语,就是任务就是解码decoding,但是并没有通用可用的解码算法,接下来的两个近似的方法能够获得很好好的答案。
第一方法(最优路径decoding)基于这样的假设:最优的可能path对应最优后可能的labeling,如下公式:
最优decoding需要琐碎的计算,由于仅仅是在每一个时间步最大概率的激活输出的连接,但是他并不能保证找到最优可能的label,原因就是他不是联合概率最大化,其实质每一个时间步之间是有上下文关系的。
4. Training the Network
加下来就是设计一个优化函数来训练CTC网络,最优化函数来源于最大似然估计,也就是最小化log似然目标,这和标准的神经网络优化函数一样,那么参数的权重调节可以和反馈下降
4.1. The CTC Forward-Backward Algorithm
这个是所有工作的重点,我们要利用一个有效的方式 来计算条件概率,公式3给了一个问题:就是要对给定的labelling 对所有的对应路径概率求和就是这个labelling的概率。一般情况这个labelling对应的路径有很多。
但是可以利用动态规划的算法来解决这个问题,类似于hmm的前后向算法,关键的信息就是把labelling所有对应路径概率求和分解成迭代式的对所有路径求解前缀的概率求和,这里接下来就会详细讲解,首先复习一下hmm的前后向算法,就不难理解这句话。
首先的需要了解前后向算法:具体连接链接为https://www.cnblogs.com/pinard/p/6955871.html为了能够更好的与本例子结合说明,就链接进行说明,在隐马尔科夫链过程是为了求解也就是在已知模型
,求解观测概率
,才会用到前后想算法,在本算法上我们已知的是时间序列T的神经网络输出
,作为隐藏状态,那么实际labeling
就是hmm观察序列概率。这个具有相似的场景,接下来如果用暴力求解,我们可以列举出长度威T的所有隐状态序列
,在ctc中可以暴力罗列出所有
的
的路径。但是hmm多了一个发射概率,也就是基于当前状态下的观测概率,也就是分布求出这些隐藏序列与观测序
的联合概率
,就容易求出边缘分布概率
,也就是对固定观测序列O对应每一个隐状态序列的概率求和既是
。针对ctc就是固定每一个实际标签
对应每一个神经网络输出的序列
的概率求和。
首先介绍暴力求解方法,确定任意隐藏序列出现的概率为:,出现的概率为:
,如果在ctc中就是
,对于hmm固定的隐状态序列
,要求的观测序列
出现的概率是
,也就是基于隐状态的条件下的观测概率,在ctc中对应的观测序列就是
,而隐状态
到
是通过
映射过来的,具体看论文,已经讲述过了。
接下来就是前想算法,是一个动态规划的思想,定义为序列t时刻隐状态为,并且观测序列
的概率为前向概率表示为:
()
在ctc中
区别在于可以认为ctc只有隐状态序列的概率。我们递推t+1时刻各个隐状态的前向概率,如图:
我们可以看出基于时刻t的各个隐藏状态的前向概率,再乘以对应状态的转移概率,即就是在时刻t观测序列为
,并且t时刻隐状态为
,t+1时刻为
的概率。如果将t时刻所有状态转移到t+1时刻的i状态的求和即
,,就是在时刻t观测序列为
,t+1时刻为
的概率,进一步t+1时刻的观测概率
只依赖于t+1时刻的隐状态
,
就是t+1时刻观测到
的概率,注意在hmm中所有隐状态到任意观测状态都有发射概率,这是ctc与hmm不同之处。
针对hmm的前向算法则有
输入为模型,观测序列为
求观测序列概率
计算时刻1的各个隐藏状态的前向概率:
,意思就是在第一时刻每一个状态都有发射到观测状态
的概率,
2)然后递推出2,3,...T时刻的前向概率:
意思就是t+1时刻状态为i的且观测状态为o(t+1)的概率是t时刻所有状态转移到t+1时刻状态为i的概率求和。
3)所以最中结果为:
后向概率同理,就不再解释,具体请看https://www.cnblogs.com/pinard/p/6955871.html讲解的非常详细。基本结合了hmm算法的前后向算法结合两者不同进行讲解,解析来继续讲解ctc的前后向算法过程。
假设一个实际label,定义一个前向算法变量
这个表示是label
,也就是前向计算出了从1到s所有实际label的路径概率,当前搜索路径实在时刻t,公式表示如下:
公式后边应该就是暴力求解的方法与等价。根据hmm的前后向算法
可以由
和
递归求得,原因也比较简单,在t-1时刻只有两种状态,要么t-1步已经能够通过
映射到了实际标记的
,那么t时刻要么是blank或者是S步的标记。另外一种可能是t-1时刻到(s-1)步,t时刻走到s步的标记,所以有以上两种情况递归得到。
为了使得输出路径含有blank,就更改labels序列为,把blank添加到开始/结束和每一个label之间。则
的长度就变成了
,为了计算
的前向概率,我们考虑的情况包括,非blank与blank之间的转换以及两个非blank之间的转换,也存在以blank开始(b)或者以第一个标注开始
。
对给定规则的初始化如下:
注意此时的s代表的就hi是序列的第s步的序列标注。那么初始化概率就容易理解了。
表示时间t=1时刻为blank的概率,也可直接跳到
的第二步直接是实际序列标注
的概率为
,其他任意的s步都为0,很容易理解,意思就是如果跳过实际标记
那么就不是这个整体序列标记,举个例子比如,我现在要求的是序列为
=(abbacd)的概率,如果第一个a跳过,那就不是序列标记
了。
通过递归表示如下:
为了解释以上公式我们需要把论文中的图翻出来如下: