Chapter1-6_Speech_Recognition(RNN-T Training)

文章目录

    • 1 一个alignment概率的计算
    • 2 所有alignments概率的计算
    • 3 Training
    • 4 Inference
    • 5 小结

本文为李弘毅老师【Speech Recognition - RNN-T Training (optional)】的课程笔记,课程视频youtube地址,点这里👈(需翻墙)。

下文中用到的图片均来自于李宏毅老师的PPT,若有侵权,必定删除。

文章索引:

上篇 - 1-5 Alignment of HMM, CTC and RNN-T

下篇 - 1-7 Language Modeling

总目录

1 一个alignment概率的计算

不管是HMM,还是CTC,还是RNN-T,它们计算得到某一个alignment的概率的方法是一致的。下面以RNN-T为例,来说一下计算的方法。

如下图所示,我们现在来计算h=ϕcϕϕaϕtϕϕh=\phi c \phi \phi a \phi t \phi \phih=ϕcϕϕaϕtϕϕ的概率,写成公式就是

P(h∣X)=P(ϕ∣X)P(c∣X,ϕ)P(ϕ∣X,ϕc)⋯P(h|X)=P(\phi | X)P(c | X,\phi)P(\phi | X,\phi c) \cdots P(hX)=P(ϕX)P(cX,ϕ)P(ϕX,ϕc)
ch1-6-1
那么这个结合模型到底是怎么算出来的呢?在decode的时候,RNN-T会有两个RNN,一个RNN_1(上半图)会吃一个“<BOS><BOS><BOS>“这样的起始符,然后吐出一个l0l_0l0,这个l0l_0l0和encoder吐出的h1h_1h1会一起喂给另一个RNN_2(下半图),RNN_2会生成一个概率分布p1,0p_{1,0}p1,0表示着这个time step由h1h_1h1l0l_0l0生成的字典中每个字符和"ϕ\phiϕ"的概率,最后我们从中找到”ϕ\phiϕ“对应的概率是多少,就得到了我们的P(ϕ∣X)P(\phi | X)P(ϕX)

由于我们这次计算的是"ϕ\phiϕ",根据RNN-T的特性,我们不会去计算RNN_1,而是把新的h2h_2h2和旧的l0l_0l0塞进RNN_2当中,吐出一个由h2h_2h2l0l_0l0生成的概率分布p2,0p_{2,0}p2,0,从这个p2,0p_{2,0}p2,0中找到字符"c"的概率,就得到了P(c∣X,ϕ)P(c | X,\phi)P(cX,ϕ)

又因为RNN-T的特性,在没有遇到"ϕ\phiϕ“不会喂给RNN_2新的hhh,而RNN1RNN_1RNN1需要重新计算一个得到l1l_1l1,于是由h2h_2h2l1l_1l1生成概率分布p2,1p_{2,1}p2,1,从中找到”ϕ\phiϕ"的对应概率,就得到了P(ϕ∣X,ϕc)P(\phi | X,\phi c)P(ϕX,ϕc)

依此类推,一致计算下去,直到算完整个hhh。然后把得到的概率值,全都乘起来,就得到了我们的P(h∣X)P(h|X)P(hX)
ch1-6-2

2 所有alignments概率的计算

P(h∣X)P(h|X)P(hX)会算了,接下来,我们要来算一下P(Y∣X)P(Y|X)P(YX)。得益于RNN-T有两个结构上不影响的RNN,我们在计算pi,jp_{i,j}pi,j的时候,不管前面的输出顺序如何,其结果都是保持不变的。比如,在计算p4,2p_{4,2}p4,2时,不管前面的输出序列是"ϕcϕϕa\phi c \phi \phi aϕcϕϕa",还是“cϕϕaϕc \phi \phi a \phicϕϕaϕ",还是“ϕϕϕca\phi \phi \phi c aϕϕϕca",我们的l2l^2l2h4h^4h4是打死不变的,所以p4,2p_{4,2}p4,2是不会变的。

不过这里我其实有一个疑惑,虽然l2l^2l2h4h^4h4是不会变的,但是生成p4,2p_{4,2}p4,2的这个RNN的记忆不会因为前面产生token的顺序不同而变化吗?存疑。(疑惑已解,生成p4,2p_{4,2}p4,2的是简单的DNN,不是RNN,黄色方块没有横向的传播)
ch1-6-3
现在我们就认为pi,jp_{i,j}pi,j是不会变化的,然后来看一下下面这个表格。然后我们会用和HMM中的forward algorithm差不多的方法来计算P(Y∣X)P(Y|X)P(YX)

首先我们定义αi,j\alpha_{i,j}αi,j表示读取了第iii个声音讯号的特征并且输出了第jjj个token时,所有alignments的概率之和。比如α4,2\alpha_{4,2}α4,2就表示输出了”ccc“和"aaa",且用到h4h_4h4时,所有alignments的概率之和。

α4,2\alpha_{4,2}α4,2只可能从α4,1\alpha_{4,1}α4,1或者α3,2\alpha_{3,2}α3,2过来,所以有

α4,2=α4,1p4,1(a)+α3,2p3,2(ϕ)\alpha_{4,2} = \alpha_{4,1}p_{4,1}(a)+ \alpha_{3,2}p_{3,2}(\phi) α4,2=α4,1p4,1(a)+α3,2p3,2(ϕ)

按照这个办法,我们就可以把这整个表格填满,而右下角最后一个格子的概率,就是P(Y∣X)P(Y|X)P(YX)
ch1-6-4

3 Training

而以上的这些步骤,都只是一个forward的过程,我们还没有到training这一步。我们先要有一个一组参数θ\thetaθ可以输出Pθ(Y^∣X)P_{\theta}(\hat{Y}|X)Pθ(Y^X),然后我们再用梯度下降的方法去优化参数,使得给定一段声音讯号XXX,模型输出标签Y^\hat{Y}Y^的概率是最大的。

θ∗=argmax⏟θlogPθ(Y^∣X)\theta^* = \underbrace{argmax}_{\theta} log P_{\theta}(\hat{Y}|X) θ=θargmaxlogPθ(Y^X)

在梯度下降时,我们当然要先求解一下偏微分

∂P(Y^∣X)∂θ\frac{\partial P(\hat{Y}|X)}{\partial \theta}θP(Y^X)

而这里的P(Y^∣X)=∑h∈align(Y^)P(h∣X)P(\hat{Y}|X) = \sum_{h \in align(\hat{Y})}P(h|X)P(Y^X)=halign(Y^)P(hX)是一堆和p1,0(ϕ)p_{1,0}(\phi)p1,0(ϕ)p2,0(c)p_{2,0}(c)p2,0(c)p2,1(ϕ)p_{2,1}(\phi)p2,1(ϕ)⋯\cdots这些相关的连乘和连加。故

∂P(Y^∣X)∂θ=∂p4,1(a)∂θP(Y^∣X)∂p4,1(a)+⋯\frac{\partial P(\hat{Y}|X)}{\partial \theta} = \frac{\partial p_{4,1}(a)}{\partial \theta} \frac{P(\hat{Y}|X)}{\partial p_{4,1}(a)}+\cdotsθP(Y^X)=θp4,1(a)p4,1(a)P(Y^X)+

我们以∂p4,1(a)∂θP(Y^∣X)∂p4,1(a)\frac{\partial p_{4,1}(a)}{\partial \theta} \frac{P(\hat{Y}|X)}{\partial p_{4,1}(a)}θp4,1(a)p4,1(a)P(Y^X)为例,先来算一下∂p4,1(a)∂θ\frac{\partial p_{4,1}(a)}{\partial \theta}θp4,1(a)。这个部分就和正常的RNN神经网络反向传播(BPTT)一致,这里不做说明。示意图如下所示。
ch1-6-5
而在计算P(Y^∣X)∂p4,1(a)\frac{P(\hat{Y}|X)}{\partial p_{4,1}(a)}p4,1(a)P(Y^X)时,我们就可以把P(Y^∣X)P(\hat{Y}|X)P(Y^X)拆分成

P(Y^∣X)=∑hwithp4,1(a)P(h∣X)+∑hwithoutp4,1(a)P(h∣X)P(\hat{Y}|X) = \sum_{h\ with\ p_{4,1}(a)} P(h|X)+\sum_{h\ without\ p_{4,1}(a)} P(h|X) P(Y^X)=h with p4,1(a)P(hX)+h without p4,1(a)P(hX)

这里的第二项和p4,1(a)p_{4,1}(a)p4,1(a)没有关系,故求偏导为0,可直接忽略,前一项可以写成

∑hwithp4,1(a)P(h∣X)=∑hwithp4,1(a)p4,1(a)×others\sum_{h\ with\ p_{4,1}(a)} P(h|X) = \sum_{h\ with\ p_{4,1}(a)} p_{4,1}(a) \times others h with p4,1(a)P(hX)=h with p4,1(a)p4,1(a)×others

P(Y^∣X)∂p4,1(a)=∑hwithp4,1(a)others=∑hwithp4,1(a)P(h∣X)p4,1(a)=1p4,1(a)∑hwithp4,1(a)P(h∣X)\frac{P(\hat{Y}|X)}{\partial p_{4,1}(a)} = \sum_{h\ with\ p_{4,1}(a)} others=\sum_{h\ with\ p_{4,1}(a)} \frac{P(h|X)}{p_{4,1}(a)}=\frac{1}{p_{4,1}(a)}\sum_{h\ with\ p_{4,1}(a)}P(h|X) p4,1(a)P(Y^X)=h with p4,1(a)others=h with p4,1(a)p4,1(a)P(hX)=p4,1(a)1h with p4,1(a)P(hX)

那么问题来了,这个∑hwithp4,1(a)P(h∣X)\sum_{h\ with\ p_{4,1}(a)}P(h|X)h with p4,1(a)P(hX)该怎么算呢?这里,我们就要引进HMM中的backward algorithm。这个和之前的forward algorithm很类似,我们定义一个参数βi,j\beta_{i,j}βi,j表示从输入第iii个声音讯号,输出第jjj个token的位置开始,一致走到终点的所有alignments的概率之和。

而这个βi,j\beta_{i,j}βi,j也是和αi,j\alpha_{i,j}αi,j一样,整个表格是可以事先填满的。
ch1-6-6
那么根据αi,j\alpha_{i,j}αi,jβi,j\beta_{i,j}βi,j的定义,我们有

∑hwithp4,1(a)P(h∣X)=α4,1p4,1(a)β4,2\sum_{h\ with\ p_{4,1}(a)}P(h|X) = \alpha_{4,1} p_{4,1}(a)\beta_{4,2} h with p4,1(a)P(hX)=α4,1p4,1(a)β4,2

那么就有

P(Y^∣X)∂p4,1(a)=α4,1β4,2\frac{P(\hat{Y}|X)}{\partial p_{4,1}(a)} = \alpha_{4,1} \beta_{4,2} p4,1(a)P(Y^X)=α4,1β4,2

示意图如下所示。
ch1-6-7

4 Inference

现在假设我们已经train好了一个模型,然后输出XXXYYY就可以计算出P(Y∣X)P(Y|X)P(YX)这个概率,那么我们要做的就是找到一个Y∗Y^*Y使得P(Y∗∣X)P(Y^*|X)P(YX)最大。

Y∗=argmax⏟YP(Y∣X)Y^*=\underbrace{argmax}_{Y}P(Y|X) Y=YargmaxP(YX)

虽然有演算法可以做到这点,但还是太过复杂,实际情况下,我们不会那么去做。我们会去找一个近似的解。而这个求近似解的方法,就是取每一个pi,jp_{i,j}pi,j中概率最大的那一个就可以了。这个也被称为greedy decoding。

ch1-6-8

如果希望更精确一些,也可以用Beam Search。greedy decoding可以说是beam search的一种特殊情况,就是beam=1的时候的情况。在遍历每个time step的时候,我会会一直保留一个大小为beam的候选集,候选集中是多个长度相等,但不同的字符串,每个字符串有一个score,也就是其概率大小。

比如我们有一个非常简单的输出矩阵为,其中#就是空白符ϕ\phiϕ
matrix_sample
我们用beam search取找其最优组合的过程为
beam search
要注意的是,每次得到的新的字符串可能来自于不同的beam,要把他们的概率都加起来。beam越大,最终输出的结果就越准,但相应的计算成本也就更高。一般情况下,我们都是greedy search来做的,没必要用这个,仅作为了解。其实现可见[这里]。(https://github.com/githubharald/CTCDecoder/blob/master/ctc_decoder/beam_search.py)

5 小结

最后,我们来比较一下LAS,CTC以及RNN-T这三者的异同。在decoder这部分,LAS和RNN-T是依赖于之前的输出的,而CTC是不管的;CTC和RNN-T是需要对结果做alignment的,而LAS是输出什么就是什么的;LAS的training就是硬train一发,而CTC和RNN-T由于需要alignment,会复杂一些;LAS是无法做到句子还没念完就输出预测结果的,但是CTC和RNN-T是可以的。
ch1-6-9

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

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

相关文章

Mongoose 预定义模式修饰符 Getters 与 Setters 自定义修饰符

一、mongoose 预定义模式修饰符 lowercase、uppercase 、trim mongoose 提供的预定义模式修饰符&#xff0c;可以对我们增加的数据进行一些格式化。 var UserSchemamongoose.Schema({ name:{ type:String, trim:true }, age:Number, status:{ type:Number, default:1 } })二…

微信可以远程控制电脑吗_用微信就能远程控制电脑,这款神器有些厉害

「本期内容标签」安卓 iOS 电脑 小程序 网站 游戏 教程微信确实一步步改变生活&#xff0c;尤其是微信小程序面世以来&#xff0c;可谓是神器一个接一个的出现&#xff0c;很多功能已经和手机app旗鼓相当了。那么&#xff0c;今天说的这款刚推出的微信小程序&#xff0c;实现远…

开源的excel读取库libxls在windows下的编译,且支持中文,全网首发

转载请注明出处&#xff1a;http://www.cnblogs.com/superbi/p/5482516.html 到目前为止&#xff0c;网络和官网上并没有关于libxls在windows下支持中文的教程&#xff0c;也没有现成的二进制文件。 想直接得到结果的请直接拉到最后获取成果&#xff0c;想自己以后遇到类似问题…

Chapter1-7_Speech_Recognition(Language Modeling)

文章目录1 为什么需要Language Model2 N-gram3 Continuous LM3 NN-based LM4 RNN-based LM5 合并LAS和LM5.1 shallow fusion5.2 deep fusion5.3 cold fusion本文为李弘毅老师【Speech Recognition - Language Modeling】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;…

Mongoose 索引、Mongoose 内置 CURD 方 法、扩展 Mongoose Model 的静态方法和 实例方法

一、Mongoose 索引 索引是对数据库表中一列或多列的值进行排序的一种结构&#xff0c;可以让我们查询数据库变得更 快。MongoDB 的索引几乎与传统的关系型数据库一模一样&#xff0c;这其中也包括一些基本的查询 优化技巧。 mongoose 中除了以前创建索引的方式&#xff0c;我们…

winre drv分区干嘛用的_都2020年了,还在给硬盘分区?看完你就知道有没有必要了...

电脑硬盘&#xff0c;到底该不该分区&#xff1f;很多人买了新电脑或者在电脑中安装了SSD硬盘之后&#xff0c;第一个步骤就是&#xff1a;开机-给硬盘分区。但是&#xff0c;大家有没有考虑过&#xff0c;硬盘是否真的需要分区呢&#xff1f;这不最近有人就在程序员社区V2EX上…

php 系列

1.给 跑在windows 环境下的php&#xff0c; 安装redis 拓展。&#xff08;installing Redis & Redis extension in PHP on XAMPP on windows.&#xff09; step 1: 安装redis server&#xff08;windows&#xff09; http://fellowtuts.com/php/install-redis-redis-extens…

搞懂RNN

文章目录1 什么是RNN2 LSTM3 Training3.1 Learning Target3.2 为什么难train4 应用举例4.1 Many To One4.2 Many To Many4.3 其他本文为李弘毅老师【Recurrent Neural Network(Part I)】和【Recurrent Neural Network(Part II)】的课程笔记&#xff0c;课程视频来源于youtube(需…

bp神经网络预测_股指期货价格变动趋势往往反映的是股票价格的走势,因此BP神经网络对股指期货价格的准确预测就是对股票价格的准确预测。...

一只猫の生活态度对于投资者而言&#xff0c;利用BP神经网络模型对股指期货价格进行准确预测&#xff0c;可以帮助投资者构建较佳的投资组合&#xff0c;从而获取较好的投资收益&#xff0c;规避系统风险&#xff1b;对于国家而言&#xff0c;准确预测股指期货价格走势&#xf…

Mongoose aggregate 多表关联查询

1. 查询每个order订单中的所有orderItem&#xff08;多表关联查询&#xff09; order.js: var mongoose require(./db.js)var OrderSchema mongoose.Schema({order_id: String,uid: Number,trade_no: String,all_price: Number,all_num: Number })var OrderModel mongoose…

搞懂Transformer

文章目录1 内容简述2 seq2seq的常用模块3 Self-attention4 Multi-head Self-attention5 Positional Encoding6 Transformer参考资料文为李弘毅老师【Transformer】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;点这里&#x1f448;(需翻墙)。 下文中用到的图片均来自…

excel计算二元线性回归_怎么看懂Excel线性回归参数

虽然之前用python做线性回归的时候看上去好像很简单&#xff0c;但是直到我在excel上实践了线性回归&#xff0c;发现有很多指标值得去参考&#xff0c;对于在python上实现有指导作用。打开excel2016&#xff0c;先找个数据我们这里直接选择做线性回归&#xff0c;在菜单栏选择…

冲刺阶段 day 6

项目进展&#xff1a;学生管理这部分已经进展的差不多了&#xff0c;调试了几遍,改了几个小Bug之后就没有什么问题了,基本完成&#xff0c;如若后续还有一些新的功能到时候再自行加入。明天开始教师部分。 存在问题&#xff1a;我觉得我们的项目还是比较课堂&#xff0c;比较中…

Chapter2-1_Voice Conversion(Feature Disentangle)

文章目录1 什么是Voice Conversion2 实际实现中的细节3 根据数据集分类4 Feature disentangle5 训练技巧本文为李弘毅老师【Voice Conversion - Feature Disentangle】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;点这里&#x1f448;(需翻墙)。 下文中用到的图片均…

1 0.99999的悖论_无限小数与芝诺悖论

问题昨天晚上&#xff0c;小学6年级的外甥女从数学课外辅导班补习回来&#xff0c;兴冲冲的对家里人说&#xff0c;哎&#xff0c;我发现了一个数学的大bug啊。你说1/3不是一个无限循环小数0.33333...&#xff0c;那么三个1/3加起来&#xff0c;不就是0.99999...吗&#xff1f;…

Mongoose 中使用 populate 实现关联查询

一、Mongoose populate 官方文档 https://mongoosejs.com/docs/populate.html 二、Mongoose populate 关联查询 1、定义 ref var ArticleSchema new Schema({ title:{type: String, unique: true},cid : {type: Schema.Types.ObjectId, ref:ArticleCate //model 的名称 }, …

FPGA开发全攻略——概念篇

原文链接&#xff1a; FPGA开发全攻略连载之一&#xff1a;FPGA为什么这么热&#xff1f; FPGA开发全攻略连载之二&#xff1a;为什么工程师要掌握FPGA开发知识&#xff1f; FPGA开发全攻略连载之三&#xff1a;FPGA基本知识与发展趋势&#xff08;part1&#xff09; FPGA开发全…

vue @input带参数_Vue 全家桶开发的一些小技巧和注意事项

前言用 vue 全家桶开发一年多了&#xff0c;踩过不少坑&#xff0c;也解决了很多的问题&#xff0c;把其中的一些点记录下来&#xff0c;希望能帮到大家。以下内容基于最新版的 vue vuex vue-router axios less elementUI&#xff0c;vue 脚手架是 vue-cli3。css 的 scope…

Chapter2-2_Voice Conversion(CycleGAN and StarGAN)

文章目录1 内容简述2 CycleGAN3 StarGAN本文为李弘毅老师【Voice Conversion - CycleGAN and StarGAN】的课程笔记&#xff0c;课程视频youtube地址&#xff0c;点这里&#x1f448;(需翻墙)。 下文中用到的图片均来自于李宏毅老师的PPT&#xff0c;若有侵权&#xff0c;必定删…

cookie与session原理详解

一、 Cookie cookie&#xff1a;浏览器在电脑硬盘中开辟的一块空间&#xff0c;主要供服务器端存储数据。 cookie中的数据是以域名的形式进行区分的。cookie中的数据是有过期时间的&#xff0c;超过时间数据会被浏览器自动删除。cookie中的数据会随着请求被自动发送到服务器端。…