带你看懂CTC算法

2023-11-07

转自:https://zhuanlan.zhihu.com/p/161186907

在文本识别模型CRNN中,涉及到了CTC算法的使用,由于算法的原理涉及内容较多,所以特另开一篇文章对其原理进行叙述。

自己在学习CTC过程中也是看了诸多资料才大概理解其中的思想,其中最著名的是一篇英文博客,其对CTC算法进行了通俗又详尽地讲解,链接在文末给出。本文的内容也是以其为大纲,同时参考其他优秀的资料,并加上了自己一些的理解,希望能让读者对CTC的原理有一个大致的了解。

文章涉及内容较多,难免有疏漏之处,如有错误,还望指出。

1. 前言

CTC全称Connectionist temporal classification,是一种常用在语音识别、文本识别等领域的算法,用来解决输入和输出序列长度不一、无法对齐的问题。在CRNN中,它实际上就是模型对应的损失函数。

再进行进一步叙述前,这里需要做几点说明。不管是在语音识别还是文本识别领域,CTC通常接在RNN的后面,与RNN结合使用,就像CRNN中一样。所以后面除非特别说明,否则提到的CTC均是将RNN和CTC当整体看待。

RNN在CRNN模型中代表的就是BiLSTM,它接受经过CNN提取的特征向量,大小为 [公式] 。[公式] 即上文提到的特征图的宽度,由于高度为1,所以被去掉了, [公式] 即为特征图的通道数。为了便于理解,后面将 [公式] 也记作 [公式] ,也可以简写为 [公式] ,即CTC中常涉及的概念——时间步。输出序列的大小为 [公式] ,序列长度与输入一致。而每个分量(向量)的维度均为 [公式] ,在这里等于字符字典的个数,表示字典个数的概率分布。概率分布经过变换便可以得到最终的预测结果。

为方便叙述,假设输入的序列为 [公式] ,对应的输出序列为 [公式] ,在这里希望找到 [公式] 到 [公式] 的映射关系。

如果使用一般的监督学习算法,会面临诸多的问题,主要可以概括为以下几点:

  • [公式] 和 [公式] 的长度是可变的。
  • [公式] 和 [公式] 的长度比例也是可变的。
  • [公式] 和 [公式] 对应元素之间不能找到严格的对齐关系。

而CTC正是一种可以解决这些问题的算法。对于一个给定的输入 [公式] ,它可以计算对应所有可能的 [公式] 的概率分布。通过该概率分布,可以预测最大概率对应的输出或者某个特定输出的概率

由此可以引出损失函数的定义。对于一个给定的输入 [公式] ,转录层需要最大化对应 [公式] 的后验概率 [公式] 。当然为了能够正常地训练模型, [公式] 应该是可导的。由于训练模型通常以最小化损失函数为目标,所以将优化目标转为最小化 [公式] 的负对数似然值,即:

[公式]

其中 [公式] 表示训练集。

而在预测阶段,每给定一个输入 [公式] ,CRNN要找到最大概率对应的输出,即

[公式]

不难想到,如果序列长度稍长,所有概率分布的计算量是及其巨大的,因此这里需要一个速度更快的算法。

前面说过,对于给定的输入 [公式] ,转录层需要计算所有可能的 [公式] 的概率分布,而关键的问题在于如何处理 [公式] 与 [公式] 间的对齐问题。所以下面先分析CTC的对齐方式。

2. 对齐

要说明的是,CTC是不需要输入输出进行对齐的。但是对于给定的输入,为了计算对应 [公式] 的概率,仍需要对所有可能对齐的概率进行求和,因为可能同一个输出有多个输出路径对应。下面举例进行说明。

例如CRNN的输入 [公式] 是一张包含单词“cat”的图片,所以对应的输出序列应该为 [公式] 。那么一种对齐 [公式] 和 [公式] 的方式是先对输入的每个分量 [公式] 对应一个输出字符,然后将相邻的重复字符进行合并,具体如下图所示。

图1 单词cat对齐过程 [1]

当然这里很容易发现这种对应方式是不合理的。第一个问题是输入的图片可能根本不包含任何字符,即输出的结果应该为空,而强制每个输入分量 [公式] 对应一个字符显然得不到这样的结果。第二个问题是如果将所有相邻重复字符都进行合并处理的话,将不能产生连续相同字符,导致结果可能是错误的。比如如果将单词tooth进行合并处理,那么最终的输出将是toth而不是tooth。

所以考虑上述问题,CTC算法又引入了一个特殊的字符——占位符,记作 [公式] 或 [公式] 。它表示一个占位,不对应任何字符,因此在最终的输出时要将其删除。这样以后这里仍可以采用上述的对齐规则,并同时避免以上的问题,当然最后不要忘了在输出中去掉 。单词hello的对齐过程如下图所示。

图2 单词hello对齐过程 [1]

可以看出,如果单词存在两个相同的字符,为了能够处理这种情况,需要在这两个字符间插入 [公式] 。这样就能区分诸如“toth”和“tooth”的对齐方式了。

这样的规则具有以下几种特征。第一,输入 [公式] 与输出 [公式] 的对齐是单调的,即当 [公式] 前进至下一个时间片对应的输入分量 [公式] 时,[公式] 既可以保持不动,也可以移动至下一个时间片对应的输出分量 [公式] 。第二,输入与最终的输出是一对多的关系,即多个输入分量可能只对应一个输出分量。

所以,输出 [公式] 的长度一定不大于 [公式] 。

3. 后验概率

回顾CTC的优化目标,对于一个给定的输入 [公式] ,需要最大化 [公式] 对应 [公式] 的后验概率 [公式] ,所以显然需要先得到后验概率的值。通过上面定义的对齐规则,已经解决了最后序列合并的对齐问题。接下来说明具体如何根据每个时间片的概率,推算出最终输出序列的后验概率 [公式] 。

具体地,对于一个输入 [公式] ,每一时间步对应分量 [公式] 的特征维度,记为 [公式] 。 [公式] 经过BiLSTM输出 [公式] ,每个分量 [公式] 的维度记为 [公式] ,表示 [公式] 个概率。 [公式] 实际上等于字符集合 [公式] 的个数,假如需要预测的字符对应的字段包含52个英文字母(包括大小写),考虑之前加入的占位符,则 [公式] 的值就是53。

对于每个分量 [公式] ,都选取一个元素,便可以组成一条输出路径,记为 [公式] ,输出路径的空间可表示为 [公式] 。

定义一个映射 [公式] ,表示对中间输出路径进行变换,得到最后的输出 [公式] 。注意这里的路径不是最终的输出 [公式] ,需要经过合并相邻字符以及删除占位符的处理,才会得到 [公式] ,所以相当于中间结果。下面举例说明。

假设识别的序列为"taste", [公式] 时,那么以下几种路径均满足条件:

[公式]

因此求taste最终输出对输入的后验概率时 ,就是求这四条路径对应概率之和。进一步推广,给定输入 [公式] ,中间结果对应的路径 [公式] ,最终输出 [公式] ,则 [公式] 对 [公式] 的后验概率可以表示为:

[公式]

假设不同时间步的输出变量相互独立,那么对于输出路径 [公式] 对 [公式] 的后验概率可表示为:

[公式]

[公式] 表示路径 [公式] 在 [公式] 时间步时对应的输出字符,而 [公式] 表示在 [公式] 时间步时选取的字符为 [公式] 的概率。因此,综合上述两式可得:

[公式]

简单来说,公式表示的含义为 [公式] 对 [公式] 的后验概率等于所有对应路径的概率之和,而每条路径对 [公式] 的后验概率又等于组成该路径的字符出现概率的乘积。

由于连续重复字符以及占位符的存在,每一个特定的输出 [公式] 都会对应相当多的路径。如果这里逐一遍历进行求解,那么时间的复杂度可达到 [公式] , [公式] 为前面定义的字符集的个数, [公式] 为时间步总长。这是因为有 [公式] 个步长,而每个步长输出的字符又有 [公式] 种可能性。所以需要对算法进行改进,这里便借鉴了动态规划的思想。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

带你看懂CTC算法 的相关文章

  • 对象检测工具包mmdetection简介、安装及测试代码

    mmdetection是商汤和港中文大学联合开源的基于PyTorch的对象检测工具包 属于香港中文大学多媒体实验室open mmlab项目的一部分 该工具包提供了已公开发表的多种流行的检测组件 通过这些组件的组合可以迅速搭建出各种检测框架
  • 深度学习之图像的数据增强

    在图像的深度学习中 为了丰富图像训练集 更好的提取图像特征 泛化模型 防止模型过拟合 一般都会对数据图像进行数据增强 数据增强 常用的方式 就是旋转图像 剪切图像 改变图像色差 扭曲图像特征 改变图像尺寸大小 增强图像噪音 一般使用高斯噪音
  • 深度学习中的随机梯度下降(SGD)简介

    随机梯度下降 Stochastic Gradient Descent SGD 是梯度下降算法的一个扩展 机器学习中反复出现的一个问题是好的泛化需要大的训练集 但大的训练集的计算代价也更大 机器学习算法中的代价函数通常可以分解成每个样本的代价
  • windows下运行pointnet(全)

    放假闲着在家没事 本人突然想跑一下3d深度学习的开山之作 pointnet玩一玩 可是目前网上大部分pointnet的运行教程都是在Ubuntu系统下的 其实本人也曾装过双系统 但是因为我太菜了 在Ubuntu下装完显卡驱动和cuda后切换
  • 输入文本就可建模渲染了?!OpenAI祭出120亿参数魔法模型!

    转自 https new qq com omn 20210111 20210111A0CBRD00 html 2021刚刚开启 OpenAI又来放大招了 能写小说 哲学语录的GPT 3已经不足为奇 那就来一个多模态 图像版GPT 3 今天
  • word2vector学习笔记(一)

    word2vector学习笔记 一 最近研究了一下google的开源项目word2vector http code google com p word2vec 其实这玩意算是神经网络在文本挖掘的一项成功应用 本文是看了论文 Distribu
  • 视觉注意力的循环神经网络模型

    我们观察PPT的时候 面对整个场景 不会一下子处理全部场景信息 而会有选择地分配注意力 每次关注不同的区域 然后将信息整合来得到整个的视觉印象 进而指导后面的眼球运动 将感兴趣的东西放在视野中心 每次只处理视野中的部分 忽略视野外区域 这样
  • pytorch 入门 DenseNet

    知识点0 dense block的结构 知识点1 定义dense block 知识点2 定义DenseNet的主体 知识点3 add module 知识点 densenet是由 多个这种结构串联而成的 import torch import
  • PyTorch torch.optim.lr_scheduler 学习率设置 调参-- CyclicLR

    torch optim lr scheduler 学习率设置 CyclicLR 学习率的参数调整是深度学习中一个非常重要的一项 Andrew NG 吴恩达 认为一般如果想调参数 第一个一般就是学习率 作者初步学习者 有错误直接提出 热烈欢迎
  • (#########优化器函数########)TensorFlow实现与优化深度神经网络

    反正是要学一些API的 不如直接从例子里面学习怎么使用API 这样同时可以复习一下一些基本的机器学习知识 但是一开始开始和以前一样 先直接讲类和常用函数用法 然后举例子 这里主要是各种优化器 以及使用 因为大多数机器学习任务就是最小化损失
  • Transformer——《Attention is all you need》

    本文是Google 机器翻译团队在2017 年发表 提出了一个新的简单的网络模型 Transformer 该模型基于纯注意力机制 Attention mechanisms 完全抛弃了RNN和CNN网络结构 在机器翻译任务上取得了很好的效果
  • 基于Lasagne实现限制玻尔兹曼机(RBM)

    RBM理论部分大家看懂这个图片就差不多了 Lasagne写代码首先要确定层与层 RBM 正向反向过程可以分别当作一个层 权值矩阵互为转置即可 代码 coding utf 8 data format is bc01 written by Ph
  • 深度学习中的验证集和超参数简介

    大多数机器学习算法都有超参数 可以设置来控制算法行为 超参数的值不是通过学习算法本身学习出来的 尽管我们可以设计一个嵌套的学习过程 一个学习算法为另一个学习算法学出最优超参数 在多项式回归示例中 有一个超参数 多项式的次数 作为容量超参数
  • cs231n: How to Train a Neuron Network 如何训练神经网络

    CS231N第六第七课时的一些笔记 如何训练神经网络是一个比较琐碎的事情 所以整理了一下 以后训练Neuron Network的时候可以看一下 Activation Functions ReLu good ELU leaky ReLu no
  • Emojify – Create your own emoji with Deep Learning 通过深度学习创建你自己的表情

    全文总览 本文目的 原文链接 我的电脑环境 数据集下载 代码下载 本文目的 深度学习初级项目 Emojify Create your own emoji with Deep Learning 通过深度学习创建你自己的表情 本文旨在描述源代码
  • PyTorch训练简单的全连接神经网络:手写数字识别

    文章目录 pytorch 神经网络训练demo 输出结果 来源 pytorch 神经网络训练demo 数据集 MNIST 该数据集的内容是手写数字识别 其分为两部分 分别含有60000张训练图片和10000张测试图片 神经网络 全连接网络
  • GNN等优缺点总结及解决方案

    https www zhihu com question 338051122 https www zhihu com question 346942899 https zhuanlan zhihu com p 291230435 GCN的缺
  • 【直观详解】什么是正则化

    转自 https charlesliuyx github io 2017 10 03 E3 80 90 E7 9B B4 E8 A7 82 E8 AF A6 E8 A7 A3 E3 80 91 E4 BB 80 E4 B9 88 E6 98
  • 全网最最最轻量级检测网络 yolo-fastest 快速上手

    文章目录 0x01 Yolo Fastest 0x02 Prepare step1 clone step2 make step3 run darknet 0x03 Train step1 获取权重文件 step2 准备数据集 step3 修
  • pthread_create返回值错误码11 (EAGAIN)或libgomp: Thread creation failed: Resource temporarily unavailable错误

    在主机上开发torch xla时 使用非root用户在conda环境 遇到tensorflow中报pthread create 11错误 大意为系统资源不足 解决方案 分析 此主机多用户使用 资源占用非常大 且大多数情况下在docker容器

随机推荐

  • 在零配置的情况下,怎么启动、打包一个.vue文件?

    问题 比如我们在开发一个组件 以及做一些小demo的时候 怎么快速启动服务 解决 1 安装拓展 npm install g vue cli service global 复制代码 2 新建vue文件 建立一个vue test文件夹 在里面新
  • npm、yarn 与 pnpm 的逻辑区别

    目录 npm2的依赖管理 npm3 yarn的依赖管理 pnpm的依赖管理 npm2的依赖管理 npm2 安装依赖的时候比较简单直接 直接按照包依赖的树形结构下载填充本地目录结构 比如在项目中A和 C 都依赖 B 无论被依赖的 B 是否是同
  • Dapper入门

    Dapper 一 dapper是什么 dapper是一款轻量级的ORM Object Relationship Mapper 它负责 数据库和编程语言之间的映射 SqlConnection MysqlConnection OracleCon
  • Jmeter之Android脚本录制

    在进行测试的时候 可能有好多脚本或者界面需要操作测试 并且有些测试链接需要重复多线程高并发进行测试 我们一般会针对这一些操作 进行一个脚本录制 录制好之后 之后测试就可以在这个基础上进行测试 使用Jmeter自带的代理服务器进行脚本录制 注
  • 阿里云服务器linux选centos哪个版本好?

    如果要我推荐一般就推荐首选阿里云centos 8 2 64位或者是最新版本的centos系统 当天centos 7 9也可以的 其实具体哪个版本真的没啥区别的 一般用户不和系统打交道的话 完全是感受不到什么差异的 不过关于阿里云ecs服务器
  • Unity动画系统常用知识总结

    Unity动画系统常用知识总结 资源导入需要注意的地方 常用的组件 Animator 组件 Avatar Mask 骨骼遮罩 Animator Controller 动画切换 Any State Has Exit Time 是否有退出时间
  • windows11 - 快速实现局域网内传文件

    一条命令就可以实现局域网内共享传输文件 windows 简单共享目录 打开cmd 先cd进一个要共享的目录 这个步骤可以简化一步到达 参考这个链接 然后执行 python m http server 8010 其他设备 手机或者电脑 用浏览
  • dcmtk源码编译 (windows和 linux)

    说一下我们的项目是Java的dicom影像 但是有些医院的胶片打印机用的国产化的 dcm4che的通信模块不能使用 需要用 dcmtk的 dcmpsprt exe 和 dcmprscu exe的命令行服务 下面跟着我一起开始编译 1 dcm
  • 阿里云ECS服务器 2核4G/2核8G/4核8g配置的区别及如何选择【 可供新手小白参考】

    简介 阿里云服务器2核4G 2核8G 4核8g是企业级服务器中的热门选择 而且阿里云官方也一直在力推这三款配置作为企业级应用的首选 在阿里云的各种活动页面都能够看到这三款配置 基于这几款配置在活动中能见到的机型是计算型sn1ne实例 计算型
  • Linux下虚拟机终端背景颜色更改

    下载安装完虚拟机 发现背景颜色是白色的 总结了更改背景颜色的方法 基于CentOS 7演示 方法 1 进入终端2 选择 编辑 gt 首选项 3 更改主题类型 亮色 白底 暗色 黑底 4 若更改其他更多颜色 进入终端 选择 编辑 gt 配置文
  • 耕地单目标语义分割实践——Pytorch网络过程实现理解

    一 卷积操作 一 普通卷积 Convolution 二 空洞卷积 Atrous Convolution 根据空洞卷积的定义 显然可以意识到空洞卷积可以提取到同一输入的不同尺度下的特征图 具有构建特征金字塔的基础 三 深度可分离卷积 Dept
  • Qt 读取多行文本框中的内容

    本文介绍将plainTextEdit中的多行文本内容按行读取为字符串的方法 QTextDocument doc ui gt plainTextEdit gt document 将plainTextEdit中的内容读取到doc中 int co
  • 【Kubernetes系列】Container(容器)

    文章目录 Container Container Image 容器镜像 镜像名称 更新镜像 镜像拉取策略 默认镜像拉取策略 强制拉去镜像 ImagePullBackOff 使用私有仓库 容器环境 容器信息 集群信息 Runtime Clas
  • pycharm如何安装pythoncard_pycharm的各种设置,配置

    本博客一直在同步更新中 内容包含 pycharm学习技巧 Learning tips PyCharm3 0默认快捷键 翻译的 pycharm常用设置 pycharm环境和路径配置 Pycharm实用拓展功能 pycharm中清除已编译 py
  • 有关数据结构上机实验的问题

    1 收到学弟提醒 http chuantu xyz t6 741 1605524547x 1566660945 png 本实验不允许公开实验代码 2 原专栏设置付费 本意是希望大家不要再看了 但是有同学订阅了 特此表示歉意 考虑不周 3 原
  • Python爬虫怎么挣钱?6个Python爬虫赚钱方式,搞搞副业不是问题

    1 最典型的就是找爬虫外包活儿 网络爬虫最通常的的挣钱方式通过外包网站 做中小规模的爬虫项目 向甲方提供数据抓取 数据结构化 数据清洗等服务 新入行的程序员大多都会先尝试这个方向 直接靠技术手段挣钱 这是我们技术人最擅长的方式 因项目竞价的
  • redis监控命令monitor(监控内容写入文件)

    redis有一个monitor命令 使用该命令可以实时监控redis正在执行的命令 先登录redis集群 redis app 3 2 12 bin redis cli h 192 168 177 122 p 6379 a abcdef c
  • USB数据线串联电阻知识总结

    一 为什么USB的特性阻抗为90欧姆 USB设备具有简单易用 支持热插拔 速度快等特点 很快被广泛应用于个人电脑和移动设备等信息通讯产品 并扩展至摄影器材 数字电视 机顶盒 游戏机等其它相关领域 可以说USB是目前最为成功的I O技术 而且
  • DDOS高防IP的用途

    DDOS高防IP是为了应对互联网的DDOS攻击而产生的一款付费增值产品 那么该怎么使用呢 DDOS高防IP根据不同的业务接入的方法也不同 在开通这款DDOS高防IP时服务商会给到对应的高防IP作为对外IP和业务IP使用 游戏业务就需要将之前
  • 带你看懂CTC算法

    转自 https zhuanlan zhihu com p 161186907 在文本识别模型CRNN中 涉及到了CTC算法的使用 由于算法的原理涉及内容较多 所以特另开一篇文章对其原理进行叙述 自己在学习CTC过程中也是看了诸多资料才大概