• CTCLoss原理解读


    一、本文参考

    根据重要性排名

    【Learning Notes】CTC 原理及实现_MoussaTintin的博客-CSDN博客_ctc实现

    白话CTC(connectionist temporal classification)算法讲解_罗罗可爱多的博客-CSDN博客_ctc 算法

    CTC Loss原理 - 知乎

    二、CTC的作用概述

    -------------------------------------------------------新版解读方式----------------------------------------------------

    特征x经过DNN之后,再经过softmax层,得到后验概率y矩阵,维度为m*T(m为车牌总字符数,T为车牌长度)。

    假设知道每一时刻的车牌标签,即训练样本x和z’

    如果z=[nihao],则z’=[nnniiihhhaaaooo]

    于是目标函数为:

    上式对求导,发现当时有值,其他均为0。所以在每一时刻t,目标只与是相关的。

    如果训练数据每个t都标记过则训练过程简单很多,但实际上每个t标记过的数据非常稀少。CTC可以做到不用逐个t标记来为数据做训练。

    L表示所有车牌字符集合

    Π=(π1, π2, … , πn)表示一条由L中元素组成的长度为T的路径

    B表示简单的压缩(连续相同的字符归一)

    如果一条路径π有B(π)=(n, I, h, a, o),则认为是正确的车牌。

    每一条路径π的概率:

    在车牌没有对齐的情况下,目标函数为多条π(B(π)=z)的路径概率之和,即:

    CTC的训练过程是通过调整w使得值最大。

    因为:

    所以只要得到即可反向传播得到

    对于两条路径q和r,在每一个点上路径只能向右或向下移动。假设有两条路径均经过这点,则在目标函数的连加项中,可以剔除掉与无关的项。

    设q和r为与相关的两条路径,用A1与B1分别表示q在之前和之后的部分,用A2与B2分别表示r在之前和之后的部分。可以发现A1B2和A2B1也是可得到的两条路径。

    这四条路径的概率:

    A1OB1+A1OB2+A2OB1+A2OB2

    =A1O(B1+B2)+A2O(B1+B2)

    =(A1+A2)O(B1+B2)

    所以可以发现,该值为(前置项) (后置项),则:

    定义α14(h)=(前置项)yh14,可以发现α14(h)可由α13(h)或α13(i)递推得到。

    α14(h)=(α13(h) +α13(i)) yh14.

    即每个值都可由上一时刻的一个或两个值得到。

    同理,β14(h)=(β15(h) +β15(a)) yh14.

    所以,

    所以,

    得到此值后,即可根据反向传播进行训练。

    -------------------------------------------------------旧版解读方式----------------------------------------------------

    CTC(connectionist Temporal Classification)连接时序分类。

     

    以语音识别为例,以一段”你好”的语音为例,经过MFCC特征提取后产生30帧,每帧含有12个特征,即。经过DNN后得到后验概率,矩阵里面每一列之和为1(softmax之和为1)。

    我们希望在最后的softmax矩阵中使得生成”nihao”的所有路径的概率最大。

    因此在音素没有对齐的情况下,目标函数应该为中所有元素的概率之和。即:

    其中z为目标音素的扩展版字符集。

    CTC的训练过程是通过调整w值使得值最大,计算过程如下:

    因此,只要得到,即可根据反向传播,得到

    解读如下:

    正向:输入的x经过神经网络后得到y,计算p(z|y)的值

    反向:p(z|y)对上一层的输出y求导,然后y再对x求导就得到了w的值

    三、CTCLoss原理

    1、aligh-free变长映射

    ocr或者语音序列学习任务一般是多对多的映射关系,语音识别中好几帧对应若干音节或者字符,并且每个输入和输出之间也没有清楚的对应关系。

    CTC引入一个特殊blank字符解决多对一映射问题。

    扩展原始词表 L 为 L′=L∪{blank}L′=L∪{blank}。对输出字符串,定义操作 B:

    1)合并连续的相同符号;

    2)去掉 blank 字符

    2、定义

    (1)表示在第t个时间,类别为k的softmax值。

    神经网络层最终输出的为softmax矩阵,也即后验概率矩阵y

    (2)表示路径集合,l为路径字符集

    (3)和大多数有监督学习一样,CTC使用最大似然标准进行训练

    在给定输入情况下,输出路径的概率为:

    所有路径,我们的目标是p(l|x)越大越好。

    在t点k类别时

    3、前向-后向的缘由

    假设有2条路径在t时刻经过k类别,如下所示:

    定义F1为从第1时间点到t时间点的路径概率积的值,F1‘为从第1时间点到t-1时间点的路径概率积的值。,类似的B1定义为:

    为什么不直接定义F1为从第1点到第t-1点的概率之积?因为此时F1没有固定唯一的终点,从没有固定的起点到没有固定的终点,是不能这么定义的,定义时至少有一个明确的起点或者终点。

    此时通过以上2条路径可以衍生出4条路径:

    对t时刻k类别的p(l|x)继续计算如下:

    用​ α 来表示forward的部分,​ β 表示backward的部分,上式继续计算如下:

    最后得到:

    反向传播求导如下:

    除法的求导公式如下:

    于是:

    因为中包含,所以对其求导后再乘以,就又得到了

    L中可能包含多个k字符,它们计算的梯度要进行累加

    优化似然函数取对数,于是:

    4、forward和backward的递推关系

    都有对应的初始化值和递推关系如下:

    末尾带有blank和不带有blank都是正确的,最后可以得到似然 p(l|x)=αT(|l′|)+αT(|l′|−1)。

    四、解码

    训练好的模型用新的样本输入来预测对应的输出字符串,这个过程是解码的过程。

    按照最大似然准则,最优的解码结果为:

    求该解可用贪心搜索算法和束搜索算法。

    1、贪心搜索

    贪心搜索就是每个时间t中都选择概率最高的那个分类组成最后的路径。

    2、束搜索

    贪心搜索只能找出局部最优的一条路径,而束搜索是找出局部最优的N条路径,N是束宽(beam size)。

    假如取beam size为2,

    第1个时间点找到最优的两个是AC

    第2个时间点,通过A遍历所有类别,通过C遍历所有类别,在上述2个类别的值中找到最优的两个是AB和CE

    第3个时间点,通过AB遍历所有类别,通过CE遍历所有类别,在上述2个类别的值中找到最优的两个是ABD和CED。

    计算时间复杂度,假如beam size为k,时间段为T,类别为N,则时间复杂度为:T*N*k

  • 相关阅读:
    python后台框架简介
    通过Nginx Ingress实现灰度发布和蓝绿发布
    bclinux aarch64 ceph 14.2.10 彻底删除ceph集群及数据
    java网络故障报修系统J2EE
    Codeforces Round #833 (Div. 2) C. Zero-Sum Prefixes
    B站基于Iceberg+Alluxio助力湖仓一体项目落地实践
    【译】.NET 7 中的性能改进(一)
    淘宝店铺订单交易接口/淘宝店铺商品上传接口/淘宝店铺订单解密接口/淘宝店铺订单明文接口/淘宝店铺订单插旗接口代码对接分享
    时序处理的一些命令
    ELK集群安装
  • 原文地址:https://blog.csdn.net/benben044/article/details/126659328