看不懂我吃屎系列——CTC

Posted by 高庆东 on February 12, 2019

CTC的作用

CTC就是对于不定长序列计算损失的方法,为啥会有不定长序列,比如一段语音,这段语音是可以是定长的但是语音的内容可能是不定长的
有时候是3个字有时候是4个字,这时候我们需要计算损失就会用到CTC。
CTC主要有几个条件,首先输出序列的长度不能超过输入的长度,其次一个输出序列中时间步长间是相互独立的,简单来说就是可以随便相
乘,最后一个限制就是强制让其输出与输入一 一对应,现实中的输出学列不定长,我们需要一种映射将输出序列与输入序列一一对应上这
时候我们需要一种方法,首先增加一个空格,来作为填充,同时可以允许序列中的值重复。这样可以构建很多个与输入一样长的序列,个数
取决于实际的输入长度和输出长度。

量化结果

需要将输出的结果进行量化,首先我们需要将被补齐的输出进行还原。还原的规则是,连续重复的只保留一个,空格去掉,从原始的序列
扩展成和输入一样长的序列时有很多方式,当把cat这个序列扩展成4个长度时,可以是 -cat,c-at,ca-t,cat-,这四种方法
每种都可以是最终的结果。是我们都需要的,这四种同时出现的可能性是之和就是预测正确的概率。我们的目标是最大化这个概率。

计算概率

首先我们已经假设输出序列中的每个元素都是独立的,同时输出序列可以使用空格和重复填充使之成为和输入序列一样长,我们需要计算
一共有多少条路劲可以经过上述规则变化后成为目标序列然后计算每条路径的概率,这个概率就好计算了,因为独立所以直接乘,然后把
所有路径概率加和就是最后的结果。我们的模型要使这个概率最大。
路径的个数和输入输出序列的长度都有关系,如果输入序列很长,输出序列很短那路劲的个数会很多,如何找到全部的路径是一个问题
找全到全部路径使用动态规划的方法找。

找规律 前后向算法

定义一个中间量a(t,s)t表示序列时间坐标s表示元素词典中的值,这个变量表示从头到t时刻的所有可能的正确路径的概率和。 前向计算 上图前向计算就是数一共有多少条路径从起点到t3时刻,答案是4条
再来看后向计算,后向计算就是从t时刻起到最后一个时刻一共有多少条正确路径,请看图 后向算法 这个图中的从t6时刻到最后一个时刻正确的路径一共有4条,
由此我们可以确定在一个时间点上一共有多少正确的路径,和每条路径的概率
单点计算 这个是计算一个粉色节点的所有路劲其中蓝色线就是其中一条,具体的计算方法就是前向乘后向得到一个点的所有概率
时刻下的所有可能点
一个时刻下可以取很多个点,这些点的求和即为最后在一个时刻上的路劲概率

反向传播

在计算所有的导数的时候需要计算每个时间时刻的导数。对每个时刻进行求导,前向的计算是为了计算最后的结果后向的计算
是为了帮助计算损失