带你看懂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项目的一部分 该工具包提供了已公开发表的多种流行的检测组件 通过这些组件的组合可以迅速搭建出各种检测框架
  • 深度学习之图像的数据增强

    在图像的深度学习中 为了丰富图像训练集 更好的提取图像特征 泛化模型 防止模型过拟合 一般都会对数据图像进行数据增强 数据增强 常用的方式 就是旋转图像 剪切图像 改变图像色差 扭曲图像特征 改变图像尺寸大小 增强图像噪音 一般使用高斯噪音
  • 如何高速安装jetson-inference,一步到位,避免踩坑!

    踩了很长时间的坑 终于弄明白怎么高速下载jetson inference 来源 安装jetson inference 自动下载模型 满速下载起飞 解决下载模型被墙问题 奈流云何的博客 CSDN博客 需要将Github的仓库复制到Gitee上
  • 3W字长文总结PyTorch中常用的函数

    quad quad PyTorch基本函数更新 quad q
  • 深度学习知识体系学习大全 牛!!

    搬来了大牛的博客 点击直接前往 https www yuque com angsweet machine learning jian jie 配一张大牛的思维导图 具体内容点进去都能看到 数学 机器学习 语言 算法 深度学习 书籍推荐 东西
  • 序列模型——自然语言处理与词嵌入(理论部分)

    1 词汇表征 深度学习已经给自然语言处理 Natural Language Process NLP 带来革命性的变革 其中一个很关键的概念是词嵌入 word embedding 这是语言表示的一种方式 可以让算法自动的了解一些类似的词 例如
  • 视觉注意力的循环神经网络模型

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

    FiftyOne是用于构建高质量数据集和计算机视觉模型的开源工具 由Python语言实现 最新发布版本为v0 14 0 它的License是Apache 2 0 源码位于https github com voxel51 fiftyone F
  • 几乎最全的中文NLP资源库

    NLP民工的乐园 The Most Powerful NLP Weapon Arsenal NLP民工的乐园 几乎最全的中文NLP资源库 词库 工具包 学习资料 在入门到熟悉NLP的过程中 用到了很多github上的包 遂整理了一下 分享在
  • 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
  • Pointpillars for object detection

    博客参考 pointpillars代码阅读 prep pointcloud篇 Little sky jty的博客 CSDN博客Brief这一篇内容主要是对函数prep pointcloud进行debug和记录 这里也是dataloader的
  • cs231n: How to Train a Neuron Network 如何训练神经网络

    CS231N第六第七课时的一些笔记 如何训练神经网络是一个比较琐碎的事情 所以整理了一下 以后训练Neuron Network的时候可以看一下 Activation Functions ReLu good ELU leaky ReLu no
  • deeplearning.ai课程作业:Course 1 Week 2

    deeplearning ai课程作业 Course 1 Week 2 原始作业在GitHub上下载 本文仅作为本人学习过程的记录 含答案 不喜勿看 全部自己跑过 保证可行 Part 1 Python Basics with Numpy o
  • Emojify – Create your own emoji with Deep Learning 通过深度学习创建你自己的表情

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

    文章目录 pytorch 神经网络训练demo 输出结果 来源 pytorch 神经网络训练demo 数据集 MNIST 该数据集的内容是手写数字识别 其分为两部分 分别含有60000张训练图片和10000张测试图片 神经网络 全连接网络
  • 谈一谈关于NLP的落地场景和商业价值

    欢迎大家关注微信公众号 baihuaML 白话机器学习 在这里 我们一起分享AI的故事 您可以在后台留言 关于机器学习 深度学习的问题 我们会选择其中的优质问题进行回答 本期的问题 你好 请问下nlp在现在的市场主要应用在哪些方面 什么是N
  • 深度学习中的优化算法之AdaGrad

    之前在https blog csdn net fengbingchun article details 123955067 介绍过SGD Mini Batch Gradient Descent MBGD 有时提到SGD的时候 其实指的是MB
  • 【直观详解】什么是正则化

    转自 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
  • yolov5量化部署(基于openvino和tensorrt)

    yolov5 openvino量化部署 首先 下载YOLOv5源码 安装YOLOv5和OpenVINO的python依赖 git clone https github com ultralytics yolov5 git pip insta

随机推荐

  • 在零配置的情况下,怎么启动、打包一个.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过程中也是看了诸多资料才大概