巧用语言模型——让准确率再涨一点点!

news2024/9/20 9:38:30

还记得在去年,我们曾经发过一篇文章介绍 icefall 中的语言模型使用方法:升点小技巧之—在icefall中巧用语言模型如今半年过去了,k2 团队又有了一些新进展。今天来给大家做一个小小的总结,再给大家的模型涨涨点(又又又又又可以找老板涨工资了!)。本篇文章将分别介绍 CTC 和 RNN-T 两种模型上的语言模型使用方法,大家可以挑选适合自己的方法使用~

1. CTC

不知道大家还记不记得,在上次的分享中我们介绍了一个叫做 Low-order Density Ratio (LODR) 的解码办法(忘了的同学快去补课!),即在使用 Density Ratio 的时,用一个低阶 n-gram 的分数近似端到端模型的内部语言模型(Internal Language Model, ILM)的分数。在 RNN-T 模型上使用该方法比单纯使用 shallow fusion 更为有效,是升点的不二法门。下图是一个简单的对比:

既然 LODR 在 RNN-T 模型上这么有效,那同样为端到端模型的 CTC 是否也能从 LODR 上受益呢?虽然 CTC 没有一个接受文本信息的 decoder,但作为一个端到端模型, 我们猜测 CTC 和 RNN-T 一样,不可避免地学习了一些 high-level 的语言模型信息,也就是所谓的 ILM 信息。如果能够在解码的时候去除 ILM 的分数,那是不是能够进一步提升 CTC 和语言模型融合的能力?

对此,我们 k2 团队做了一些探索,尝试将 LODR 融入到 CTC 的解码中。我们尝试了同领域 (in-domain)和跨领域(cross-domain)测试的场景,即使用在 LibriSpeech 上训练的模型分别在 LibriSpeech 和 GigaSpeech 的测试集上解码。我们分别在 LS 官方文本训练集和GigaSpeech数据集的文本上训练了两个 4-gram 语言模型,分别作为 LODR 中的Target domain 语言模型。在进行 LODR 时,我们使用了 LS 960小时文本上训练的 2-gram 作为 source-domain 语言模型。解码时,我们抽取 CTC lattice 中的 nbest-list 进行 rescore,公式如下:

其中分别是 4-gram 和 2-gram 的分数。我们选用了zipformer-ctc 模型进行测试,实验结果如下:

我们发现,在 in-domain 的情境下,LODR 并不能够提升 CTC 模型的准确率,相较于单纯 nbest-rescore,LODR带来的收益非常有限,在 test-clean 和 test-other 上只有0.02和0.01的差距。但是在 cross-domain 的情境下,LODR 能够显著减少 CTC 模型在 target domain 的词错率。这从侧面证明了 CTC 模型在端到端训练时也一定程度上学习了一些语言模型的信息。在现实场景中,ASR 模型的部署环境更接近于 cross-domain,感兴趣的小伙伴不妨试试在 CTC 解码时使用 LODR 吧!该方法我们近期会提交 PR ,还请大家多多关注icefall

2. RNN-T

说完了 CTC 模型,我们再回来看看 RNN-T 模型。在升点小技巧之—在icefall中巧用语言模型这篇文章中,我们提到 Shallow fusion(SF) 和 LODR 两种都能够显著降低 RNN-T 的词错率的办法。但天下没有免费的午餐,由于需要神经网络语言模型(例如 RNNLM)的前向运算,解码所需要的时间相较单纯 beam search 会明显变长。为了解决这一缺点,我们最近刚刚实现了一版基于 rescore 的 RNN-T 语言模型融合解码办法,能够在仅仅牺牲一点点准确率的前提下,大幅缩短解码时间。

由于 SF 需要在每生成一个新 non-blank token 时进行一次打分,并且要为每个可能的 hypothesis 存储语言模型的状态,所需要的时间和显存都明显比 beam search 多。但如果只是用 RNNLM 对 beam search 的 n-best list 进行rescore,运算量和所需储存的 RNNLM 状态都能明显下降。在 rescore 的基础上,我们可以再加入一个 2-gram 语言模型进行 LODR 的解码。我们使用在LibriSpeech 上训练的 pruned_transducer_stateless7_streaming (流式 zipformer)模型进行测试,比较 shallow fusion,rescore,rescore + LODR 这三种解码办法的 WER。三种办法都使用了同样的 RNNLM,参数量为17M,LODR 使用的 2-gram 是在960h 的文本上训练的。结果如下:

不难发现,三种结合了语言模型的解码办法都能够显著减少 RNN-T 模型的词错率。随着 beam 的增长,rescore 和 SF  的 WER 差距越来越小,当 beam size 为 12 时,rescore 甚至略胜 SF 一筹,在 test-clean 和 test-other 都减少了超过 10% 的相对词错率。在 rescore 的基础上再加入 LODR 能够进一步减小 WER,相对词错率减少达到了 13.8% 和 12.2%。下表展示了上述几种解码办法完成 test-clean 解码所需要的时间:

可以看出,在 WER 相近的前提下,rescore 所需要的时间远远小于 SF。在 rescore 的过程中加入 LODR 仅仅让解码时间相较于 beam search 增加了20%,却减少了13.8%的词错率,可谓是又快又准。基于 rescore 的这两个解码办法已经提交在 icefall中,详见这两个 PR:

  • RNNLM rescore[1]

  • RNNLM rescore + LODR[2]

悄悄告诉大家,我们最近也计划在 sherpa-onnx 中加入语言模型的支持[3],初步计划是添加 RNNLM rescore 的解码办法,敬请期待!

3. 总结

本文给大家介绍了如何在 CTC 中的 LODR 解码,该方法在 cross-domain 的测试场景下效果明显。还给大家介绍了基于 RNNLM rescore 的两种 RNN-T 解码办法,又快又准,谁用谁知道!

参考资料

[1]RNNLM rescore: https://github.com/k2-fsa/icefall/pull/1002

[2]RNNLM rescore + LODR: https://github.com/k2-fsa/icefall/pull/1017

[3]支持: https://github.com/k2-fsa/sherpa-onnx/pull/125

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/489039.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【问题解决】小米 升级后蓝牙关闭后 早上自动打开怎么办?

目录 原理 连接态: 半连接态:​编辑 关闭态:​编辑 重点来了 升级小米MIUI 14后,发现蓝牙无法关闭,每天睡觉前点击关闭,第二早上它又自动打开,感觉 手机中毒了!! 经过一番研究,搞…

YOLOv6 4.0 使用记录: OpenCV DNN C++推理

目录 1、下载源码 2、下载权重文件 3、配置环境 4、推理 6、ONNX格式导出 权重文件为yolov6list_s.pt 权重为yolov6.pt 7、opencv DNN推理 8、个人总结 1、下载源码 下载最新的4.0版本的 2、下载权重文件 我下的是YOLOv6Lite-S 3、配置环境 cd到项目目录,运…

国民技术N32G430开发笔记(16)- IAP升级 整合多个bin文件为一个升级包

IAP升级 整合多个bin文件为一个升级包 1、我们的程序分区目前为: Boot 0x8000000 – 0x8004000 16KB Settings 0x8004000 – 0x8006000 8KB App 0x8006000 – 0x800B000 20KB Download 0x800B000 – 0x800FFFF 20KB 2、烧录时候的bin文件有三个: Bootl…

Docker笔记整理

安装Docker 通过 uname -r 命令查看你当前的内核版本 uname -r 使用 root 权限登录 Centos。确保 yum 包更新到最新 yum -y update 卸载旧版本(如果安装过旧版本的话) yum remove docker docker-common docker-selinux docker-engine 安装需要的软件包, yum-u…

Web前端已死?别带节奏了,说白了就是“卷”

趁着“前端已死”这个话题还有点热度,我想再好好聊聊这个话题。社区里怎么只有前端已死的论调,后端、DB、运维、连原生开发还在好好“划水”。前端却发出了哀嚎:前端已死,找工作好难啊。 前端技术精微渊深,除了基础的…

( 数组和矩阵) 766. 托普利茨矩阵 ——【Leetcode每日一题】

❓766. 托普利茨矩阵 难度:简单 给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵,返回 true ;否则,返回 false 。 如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。…

【Python习题集7】Python对CSV文件数据进行可视化

csv可视化 一、实验内容二、实验总结 一、实验内容 1、datal.csv中的B、C、D和E列数据分别是日期、权重、A企业的销售额、B企业的销售额。读取C、D、E列数据,并统计E列数据的算术平均数、加权平均值(权值为C列数据)、方差、中位数、最小值、最大值。并绘制E列数据的…

MyBatis:使用 MyBatis 实现多表查询(多对一和一对多)、动态 SQL、缓存

文章目录 MyBatis:Day 03一、复杂查询的环境搭建二、多表查询1. 多对一:关联(1)联表查询(2)子查询 2. 一对多:集合(1)联表查询(2)子查询 3. 总结 …

JavaScript学习(一)

一、JavaScript的背景及知识结构 1、三个问题 什么是JavaScript?JavaScript能干什么?JavaScript是由什么构成的?怎样学习JavaScript? 2、什么是JavaScript? ①JavaScript是一种轻量级的编程语言;借鉴了J…

2023年2月573名学员通过国家信息安全水平考试其中CISP218名,NISP二级355名

北京PER20230217HEBAN3 考试时间:2023年02月17日 地点:北京 王佳俊、王后月、程鹏、王海洋、牛麒盛、张飞、禹晓瑞、李鹏卫、柳位世、李霖、刘志超、刘峰、张广军、刘鑫博、王琳、翟栋、刘高军、康寅哲、夏中玲、冯光豪、程岩辉、白玉强、遆盼明、李淼…

IDEA部署tomcat项目

文章目录 只是部署一下看到这里即可war和war exploded的区别warwar exploded update的动作update resourcesupdate classes and resourcesredeployrestart server 解决了拿到了一个tomcat项目后如何将它部署到IDEA里面的问题。 file->open 选中pom.xml并open as project …

【网站架构】Nginx 4层、7层代理配置,正向代理、反向代理详解

大家好,欢迎来到停止重构的频道。 本期我们讨论网络代理。 在往期《大型网站 安全性》介绍过,出于网络安全的考虑,一般大型网站都需要做网络区域隔离,以防止攻击者直接操控服务器。 网站系统的应用及数据库都会放在这个网络安全…

js实现归并排序(mergeSort)

理解归并排序 归并排序是一种基于分治思想的排序算法,它将一个待排序的序列分为两个子序列,分别对子序列进行排序,然后将排好序的子序列合并成一个有序的序列。这个过程可以递归地进行,直到序列被划分为只有一个元素时停止递归。 …

版本控制 | 如何使用虚幻引擎的多用户编辑(MUE)功能

随着现代虚拟制作技术的发展,电影制片厂不再需要完全依赖实际场景,而是可以在拍摄期间就让虚拟制作设计团队将实景与计算机生成的虚拟内容融合在一起。虚幻多用户编辑(Unreal Multi-User Editing,简称MUE)可以帮助简化…

【产品方案】后台管理系统设计思路

第一章 前言 相比前端设计,我更喜欢设计后台管理系统。如果说前端设计考验的是共情能力,那后台管理系统设计考研的就是逻辑能力,前者需要站在用户的角度,后者是站在管理者的角度思考。 有幸参与了公司不少业务系统从“0-1”的设计…

使用prometheus时发现mongodb exporter的/metrics数据展示很慢,延迟高

项目场景: 使用prometheusgrafana搭建对mongoDB集群的监控。 问题描述 使用prometheus时发现mongodb exporter的/metrics数据展示接口很慢,延迟高。 看了一下大概是10s 原因分析: 由于是在云服务器上进行搭建的。 经过尝试之后发现创建mo…

Apache Doris学习记录

1. Doris基础学习 中文官网:https://doris.apache.org/zh-CN/docs/dev/summary/basic-summary/ 1.1 doris 简介 Apache Doris 是一个现代化的 MPP(Massively Parallel Processing,即大规模并行处理) 分析型数据库产品 亚秒级响应时间即可获得查询结果 可以支持 10PB…

Python每日一练:最长递增的区间长度(一行代码花样解法)

文章目录 前言一、题目二、一行超人三、分析一下思路 总结 前言 很显然,Python的受众远远大于C,其实笔者本人对Python的理解也是远强于C的,C纯粹是为了假装笔者是个职业选手才随便玩玩的,借着十多年前学的C的功底,强行…

链表(数据结构)

目录 链表 链表的分类 1、单向或者双向 2、带头或者不带头 3、循环或者非循环 总结: 单链表 创建链式结构 创建新节点 尾插 尾删 头插 头删 查找节点 在pos位置后插入 删除pos位置后的节点 销毁 链表 概念: 链表是一种物理结构上非连续的、非顺序的存储结…

c# 数据保存为PDF(二) (Aspose pdf篇)

文章目录 前言关于Aspose PDF使用Aspose.Pdf常用的命名空间和类库1 创建简单的PDF文档2 美化PDF样式2.1 创建测试数据2.2 项目头部样式2.3 全部代码 小结附录参考 前言 项目中需要将数据导出存为PDF格式,试了一下Aspose组件,仅以此记录一下使用感受。 …