CTC算法原理详解

CTC算法简介

CTC(Connectionist Temporal Classification)算法是一个用于OCR(文字识别)、ASR(语言识别)等任务场景的算法,主要用于解决输入序列和输入序列长度不一,难以对齐的问题。它提出了一种新的对齐方式,将输出序列切分为多个时间段,通过制定一定的处理规则来实现序列对齐的问题。

CTC算法

CTC算法的核心思想是在解决输入和输出序列的匹配问题。在语音识别中,我们无法确切的切分一个音所占的长度;在文字识别中,我们也无法自动切分出一个字所占的长度,从而进行切分识别。所以CTC提出了输入序列和输出序列之间不需要一一对齐,即不需要严格对齐。在CTC算法中,将文字图片切分成了等长的T块,并对每块进行多分类,从而实现文本的识别(语音识别也是一样的)。

当然此时大家的疑惑是这T块的识别中是不是有连着重复的字,如“cat”识别成“cccaatt”、“apple”识别成“appple”。

对于“cccaatt”这种识别,我们只需要将连续的重复字删除即可,但使用这中方法会导致“appple”识别成“aple”,这显然存在错误。故CTC的作者引入了"Blank"解决了这个问题

新标签blank

CTC算法引入了“blank”标签(即在原本的分类标签中加上了一个新的标签),用于指代句首、句尾或者词与词之间的间隙。

论文作者主要将blank插入到不同的词之间(本文使用“_”指代blank)即在识别“apple”时,“pp”之间插入了一个blank,那么“app_ple”或者“ap_pple”就可以识别成“apple”了。解决了语音识别或者文字识别中出现重复字符的情况。

故我们仅需对分类结果进行俩个操作:1、去除连续的重复字符;2、去除blank标签。我们就可以实现不严格对齐了。

CTC loss

解决了相邻字符相同的问题后,我们又遇到一个问题,那就是一个结果可能有多个匹配的路径。那么在模型训练时我们需要去寻找所有可能的路径,使各个路径的可能性最大化。所以作者提出了一种寻找所有路径的方法,并建立相应的损失函数

寻找所有路径

在模型训练时,我们需要去最大化与真实标签相匹配的所有路径的概率。所以我们需要从真实标签入手,去寻找真实标签对应的路径。例如我们的真实标签为(ab),序列长度为 T T T,那么我们将letter扩展为长度为 T T T的序列。

首先在所有“ab”中插入 b l a n k blank blank,即“_a_b_”。如果使用暴力算法去寻找所有路径,机器运行时间的消耗是非常大的。所以这里可以使用动态规划的思想,确定起始状态、转移条件,结束边界。

我们规定路径的第一个词只能为 b l a n k blank blank或者第一个字母“a”,同样的路径最后一个词也是 b l a n k blank blank或者最后一个字母“b”。

接下来我们需要确定的就是转移条件了,假设 x t = s k x_{t}=s_{k} xt=sk(其中 x t x_{t} xt是指 t t t时刻的输出, s k s_{k} sk是指标签第 k k k个元素),那么这个元素存在三种情况

  1. s k = b l a n k s_{k}=blank sk=blank,这种情况他就只能在 t + 1 t+1 t+1转移到当前的 b l a n k blank blank和下一个标签a,从下图上看 b l a n k blank blank x 1 x_{1} x1只能转移到第一个 b l a n k blank blank和标签a,不能转移到a下面的 b l a n k blank blank,否则就会出现路径中丢失a的情况。
  2. s k = s k + 2 s_{k}=s_{k+2} sk=sk+2,即标签 s k s_{k} sk和标签 s k + 2 s_{k+2} sk+2是相同的字符(除 b l a n k blank blank),那么它同第一种情况一样,只能转移到 t + 1 t+1 t+1时刻中的 s k s_{k} sk s k + 1 s_{k+1} sk+1
  3. 除上述俩种情况外的情况,可以直接转移 t + 1 t+1 t+1时刻中的 s k s_{k} sk s k + 1 s_{k+1} sk+1 s k + 2 s_{k+2} sk+2
    在这里插入图片描述
    通过上述的动态规划算法即可以实现寻找全部路径。

定义损失函数

由于我们的目的是使与真实结果路径的概率最大,即使 P ( Y ∣ X ) P(Y|X) P(YX)的概率达到最大,这里我们记所有可能的路径为 l l l,记 π i \pi_{i} πi为其中的一条的路径,即 π i ∈ l \pi_{i}\in l πil,故损失函数为
O M L ( l ) = − ∑ π i ∈ l ln ⁡ ( p ( π i ∣ x ) ) O^{ML}(l) = -\sum_{\pi_{i}\in l}\ln(p(\pi_{i}|x)) OML(l)=πilln(p(πix))

向前向后算法

由于 p ( π i ∣ x ) p(\pi_{i}|x) p(πix)的表达式未知,所以需要通过推导寻找其表达式。论文作者通过向前算法和向后算法结合,推导出了其表达式

首先定义向前变量 α t ( s ) = ∑ π i 1 : t ∈ l 1 : t ∏ t ′ = 1 t y π i t ′ t ′ \alpha_{t}(s) =\sum_{\pi_{i}^{1:t}\in l^{1:t}}\prod^{t}_{t'=1} y_{\pi_{i}^{t'}}^{t'} αt(s)=πi1:tl1:tt=1tyπitt

即表示了在 1 → t 1\to t 1t时刻经过标签 s s s的所有路径的概率和

在实际应用中,可以通过动态规划算法来求得 α t ( s ) \alpha_{t}(s) αt(s),具体如下

初始化 α 1 ( 1 ) = y b l a n k 1 \alpha_{1}(1) = y_{blank}^{1} α1(1)=yblank1 α 1 ( 2 ) = y l 1 1 \alpha_{1}(2) = y_{l_{1}}^{1} α1(2)=yl11 l 1 l_{1} l1是指label中的第一个字符), α 1 ( s ) = 0 ∣ ∀ s > 2 \alpha_{1}(s)=0|\forall s>2 α1(s)=0∣∀s>2

转移公式如下
α t ( s ) = { ( α t − 1 ( s − 1 ) + α t − 1 ( s ) ) y s t i f l s = b l a n k ∣ l s − 2 = l s ( α t − 1 ( s − 2 ) + α t − 1 ( s − 1 ) + α t − 1 ( s ) ) y s t o t h e r s \alpha_{t}(s) = \left\{ \begin{aligned} &(\alpha_{t-1}(s-1)+\alpha_{t-1}(s))y_{s}^{t} & if\quad l_{s} = blank|l_{s-2} = l_{s} \\ &(\alpha_{t-1}(s-2)+\alpha_{t-1}(s-1)+\alpha_{t-1}(s))y_{s}^{t} & others\\ \end{aligned} \right . αt(s)={(αt1(s1)+αt1(s))yst(αt1(s2)+αt1(s1)+αt1(s))ystifls=blankls2=lsothers

通过上述公式即可求出变量 α \alpha α

然后定义了向后变量 β t ( s ) = ∑ π i t : T ∈ l t : T ∏ t ′ = t T y π i t ′ t ′ \beta_{t}(s) = \sum_{\pi_{i}^{t:T}\in l^{t:T}}\prod^{T}_{t'=t} y_{\pi_{i}^{t'}}^{t'} βt(s)=πit:Tlt:Tt=tTyπitt

表示了在 T → t T\to t Tt时刻经过标签 s s s的所有路径的概率和
初始化 β T ( ∣ l ∣ ) = y b l a n k T \beta_{T}(|l|) = y_{blank}^{T} βT(l)=yblankT β T ( ∣ l ∣ − 1 ) = y l ∣ l ∣ T \beta_{T}(|l|-1) = y_{l_{|l|}}^{T} βT(l1)=yllT ∣ l ∣ |l| l是指label的长度), β T ( s ) = 0 ∣ ∀ s < ∣ l ∣ − 1 \beta_{T}(s)=0|\forall s<|l|-1 βT(s)=0∣∀s<l1

转移公式如下
β t ( s ) = { ( β t + 1 ( s ) + β t + 1 ( s + 1 ) ) y s t i f l s = b l a n k ∣ l s + 2 = l s ( β t + 1 ( s ) + β t + 1 ( s + 1 ) + β t + 1 ( s + 2 ) ) y s t o t h e r s \beta_{t}(s) = \left\{ \begin{aligned} &(\beta_{t+1}(s)+\beta_{t+1}(s+1))y_{s}^{t} &if\quad l_{s} = blank|l_{s+2} = l_{s} \\ &(\beta_{t+1}(s)+\beta_{t+1}(s+1)+\beta_{t+1}(s+2))y_{s}^{t} & others\\ \end{aligned} \right . βt(s)={(βt+1(s)+βt+1(s+1))yst(βt+1(s)+βt+1(s+1)+βt+1(s+2))ystifls=blankls+2=lsothers

通过上述公式即可求出变量 β \beta β

然后将俩个变量相乘,得到 α t ( s ) β t ( s ) = ∑ π i ∈ l ∣ π i t = s y s t p ( π i ∣ x ) \alpha_{t}(s)\beta_{t}(s) = \sum_{\pi_{i}\in l |\pi_{i}^{t}=s} y_{s}^{t}p(\pi_{i}|x) αt(s)βt(s)=πilπit=systp(πix)

他们相乘之后就得到所有 t t t时刻经过标签 s s s路径的概率,结果中多了一个 y s t y_{s}^{t} yst,这是因为向前和向后变量各有一个,但是总的路径中只到一次。

所以 ∑ π i ∈ l ∣ π i t = s p ( π i ∣ x ) = α t ( s ) β t ( s ) y s t \sum_{\pi_{i}\in l |\pi_{i}^{t}=s}p(\pi_{i}|x) = \frac{\alpha_{t}(s)\beta_{t}(s)}{ y_{s}^{t}} πilπit=sp(πix)=ystαt(s)βt(s)

所以有 − ∑ π i ∈ l ln ⁡ ( p ( π i ∣ x ) ) = − ln ⁡ ( ∏ π i ∈ l p ( π i ∣ x ) ) = − ln ⁡ ( ∑ s = 1 ∣ l ∣ ∑ π i ∈ l ∣ π i t = s p ( π i ∣ x ) ) = − ln ⁡ ( ∑ s = 1 ∣ l ∣ α t ( s ) β t ( s ) y s t ) -\sum_{\pi_{i}\in l}\ln(p(\pi_{i}|x)) =-\ln(\prod_{\pi_{i}\in l}p(\pi_{i}|x))= -\ln(\sum_{s=1}^{|l|}\sum_{\pi_{i}\in l |\pi_{i}^{t}=s}p(\pi_{i}|x)) =-\ln(\sum_{s=1}^{|l|}\frac{\alpha_{t}(s)\beta_{t}(s)}{ y_{s}^{t}}) πilln(p(πix))=ln(πilp(πix))=ln(s=1lπilπit=sp(πix))=ln(s=1lystαt(s)βt(s))

接下来对 y s t y_{s}^{t} yst求导就有
∂ − ∑ π i ∈ l ln ⁡ ( p ( π i ∣ x ) ) ∂ y s t = − 1 ∑ s = 1 ∣ l ∣ α t ( s ) β t ( s ) y s t α t ( k ) β t ( k ) y k t 2 \frac{\partial -\sum_{\pi_{i}\in l}\ln(p(\pi_{i}|x))}{\partial y_{s}^{t}} = -\frac{1}{\sum_{s=1}^{|l|}\frac{\alpha_{t}(s)\beta_{t}(s)}{ y_{s}^{t}}}\frac{\alpha_{t}(k)\beta_{t}(k)}{y_{k}^{t^{2}}} ystπilln(p(πix))=s=1lystαt(s)βt(s)1ykt2αt(k)βt(k)

此处分母是平方的原因是 α \alpha α β \beta β各包含一个 y y y,所以原来的方程中只有一个一次的 y y y,求导完就为1了,但是为了保持它们的形式,我们需要补俩个 y y y给它,即 y 2 y^{2} y2

寻找最佳路径

由于模型预测的路径存在多对一的情况,若我们仅选择每个时刻的最大概率作为结果,那么可能存在多条相同结果的路径概率值大于该结果的情况,那么就说明了模型结果不一定是最佳路径。那么为了解决这个问题分别使用了prefix beam search和beam search。

beam search

beam search的思想相对简单,它是从时刻 1 1 1开始预测,寻找 n n n n n n为超参此处假设为3)个概率最大的值作为候选,然后从3个候选产生的9条路径中,寻找在求时刻 2 2 2最大概率的三条路径,以此类推寻找最佳的3条路径。具体过程见下图
在这里插入图片描述
但是beam search只能找到相对最优,并不能保证找到最佳的路径。

prefix beam search

由于beam search算法并未考虑到序列等价的情况(即不同路径同一结果),会导致部分序列概率偏低。使用prefix beam search可以有效的解决这个问题。beam search是寻找每个时刻最大概率的三个序列,而prefix beam search是在每个步骤都考虑下一步所有可能的序列,并将序列和并,选取概率最高的k个序列再进行搜索,有效的缓解了beam search的缺点。具体过程见下图
在这里插入图片描述
通过这个方法一般而言是可以找到最优解,但并不绝对。如果beam值够大,那么肯定是可以找到最优解的。

本文是个人的理解,若存在错误请指正。

  • 17
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
封装 FCPBGA 1143 工艺 28nm 低功耗工艺 典型功耗 30W(est.) 48x1G/48x2.5G/24x5G 下行,上行支持 10G/40G/25G/50G/100G 上联,并可 以使用 40G/50G/100G 等任意速率进行堆叠。 云时代和物联网高速发展,在接入交换节点,提出了更大表项,更低时延,更 灵活的流水线的需求。CTC7132 针对云时代的需求,深度优化流水线,打造了 TransWarp™第六代架构。 芯片特性  全面的二层特性  VLAN,MAC,LAG,广播风暴抑制等  VXLAN Bridge 大二层到边缘  802.1BR  DCB (PFC, ECN, ETS)优化 RDMA 流量  全面的三层特性  算法 ALPM 支持 IPv4 和 IPv6 双栈  线速的 NAT / NAPT / NAT-PT 转发  CAPWAP 隧道加解封装,分片重组,加解密  IPv4 和 IPv6 互转技术(6in4, 6to4,IVI 等)  全面的 MPLS 特性  LSP,L2VPN,L3VPN,L2VPN-L3VPN Gateway  Segment Routing  OAM/APS 特性  802.1ag/ Y.1731 以太网 OAM  G.8031/ G.8032 以太网业务保护  G.8113.1/ G.8113.2 MPLS-TP OAM  G.8131/ G.8132 MPLS-TP 业务保护  BFD/ OAM 检测自动保护切换  可视化特性  Buffer/Latency 监控  基于硬件的 NetFlow  ERSPAN (Ingress Timestamp and latency)  可编程特性  L2-L4 Programmable Edit  可编程隧道加解封装  安全和流量控制特性  支持 VLAN / MAC / Port / IP 进行 ACL 绑定  支持每个端口的 MACSec  支持基于 AES256 算法加密的 CloudSec  CPU 流量保护  时钟特性  IEEE 1588v2 和 Sync Ethernet
CTC(Connectionist Temporal Classification)分割是一种被广泛应用于序列学习任务中的分割方法。它最初被应用于语音识别领域,用于解码语音信号对应的文字序列。CTC分割的思想是将输入序列与输出序列对齐,使得输入序列上的每一个时间步都能对应一个输出标记。 在CTC分割中,输入序列被表示为一个矩阵,例如语音识别中的声学特征矩阵。输出序列是一个包含所有可能标记的序列,包括目标标记和空白标记。空白标记用于建立标记间的空隙,以便更好地适应输入序列与输出序列的对齐。 CTC分割的目标是找到最可能对应于输入序列的输出序列。这通过计算条件概率来实现,即给定输入序列的条件下,得到输出序列的概率。CTC分割使用动态规划算法来计算这一条件概率,通过对输入序列上的所有可能对齐路径求和来得到最终的输出序列概率。 CTC分割具有很好的鲁棒性,它可以处理输入序列与输出序列之间的对齐问题,即输入序列和输出序列长度不一致的情况。同时,CTC分割还可以处理同一输出序列上的多个相同标记的情况,这对于一些序列学习任务非常重要,例如语音识别中的连续重叠发音。 总的来说,CTC分割是一种有效的序列分割方法,可以被应用于多个领域的序列学习任务中,如语音识别、手写识别等。通过对输入序列与输出序列的对齐和概率计算,CTC分割能够找到最可能对应的输出序列,为序列学习任务提供了一种可靠且灵活的解决方案。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值