深度学习(三十)——Deep Speech, 自动求导
CTC
推断计算(续)
上图是一个Beam Width为3的Beam Search。Beam Search的细节可参见《机器学习(二十三)》。
由于语音的特殊性,我们实际上用的是Beam Search的一个变种:
如上图所示,所有在合并规则下,能够合并为同一前缀的分支,在后续计算中,都被认为是同一分支。其概率值为各被合并分支的概率和。
此外,如果在语音识别中,能够结合语言模型的话,将可以极大的改善语音识别的准确率。这种情况下的CTC loss为:
Y∗=argmaxYp(Y∣X)⋅p(Y)α⋅L(Y)βY^*=\mathop{\text{argmax}}_{Y} p(Y \mid X)\cdot p(Y)^{\alpha}\cdot L(Y)^{\beta}Y∗=argmaxYp(Y∣X)⋅p(Y)α⋅L(Y)β
其中,p(Y)αp(Y)^{\alpha}p(Y)α是语言模型概率,而L(Y)βL(Y)^{\beta}L(Y)β表示词嵌入奖励。
CTC的特性
CTC是条件独立的。
缺点:条件独立的假设太强,与实际情况不符,因此需要语言模型来改善条件依赖性,以取得更好的效果。
优点:可迁移性比较好。比如朋友之间的聊天和正式发言之间的差异较大,但它们的声学模型却是类似的。
CTC是单调对齐的。这在语音识别上是没啥问题的,但在机器翻译的时候,源语言和目标语言之间的语序不一定一致,也就不满足单调对齐的条件。
CTC的输入/输出是many-to-one的,不支持one-to-one或one-to-many。比如,“th”在英文中是一个音节对应两个字母,这就是one-to-many的案例。
最后,Y的数量不能超过X,否则CTC还是没法work。
CTC应用
HMM
如上图所示,CTC是一种特殊的HMM。CTC的状态图是单向的,这也就是上面提到的单调对齐特性,这相当于给普通HMM模型提供了一个先验条件。因此,对于满足该条件的情况,CTC的准确度要超过HMM。
最重要的是,CTC是判别模型,它可以直接和RNN对接。
Encoder-Decoder模型
Encoder-Decoder模型是sequence问题最常用的框架,它的数学形式为:
H=encode(X)p(Y∣X)=decode(H)H=encode(X)\\ p(Y\mid X)=decode(H) H=encode(X)p(Y∣X)=decode(H)
这里的H是模型的hidden representation。
CTC模型可以使用各种Encoder,只要保证输入比输出多即可。CTC模型常用的Decoder一般是softmax。
参考
https://distill.pub/2017/ctc/
Sequence Modeling With CTC
http://blog.csdn.net/laolu1573/article/details/78791992
Sequence Modeling With CTC中文版
https://mp.weixin.qq.com/s?__biz=MzIzNDQyNjI5Mg==&mid=2247483834&idx=1&sn=3a92eb19858d2cec709af28d2eb69c4a
时序分类算法之Connectionist Temporal Classification
http://blog.csdn.net/u012968002/article/details/78890846
CTC原理
https://www.zhihu.com/question/47642307
语音识别中的CTC方法的基本原理
https://www.zhihu.com/question/55851184
基于CTC等端到端语音识别方法的出现是否标志着统治数年的HMM方法终结?
https://zhuanlan.zhihu.com/p/23308976
CTC——下雨天和RNN更配哦
https://zhuanlan.zhihu.com/p/23293860
CTC实现——compute ctc loss(1)
https://zhuanlan.zhihu.com/p/23309693
CTC实现——compute ctc loss(2)
http://blog.csdn.net/xmdxcsj/article/details/70300591
端到端语音识别(二)ctc。这个blog中还有5篇《CTC学习笔记》的链接。
https://blog.csdn.net/luodongri/article/details/77005948
白话CTC(connectionist temporal classification)算法讲解
Warp-CTC
Warp-CTC是一个可以应用在CPU和GPU上的高效并行的CTC代码库,由百度硅谷实验室开发。
官网:
https://github.com/baidu-research/warp-ctc
非官方caffe版本:
https://github.com/xmfbit/warpctc-caffe
Deep Speech
Deep Speech是吴恩达领导的百度硅谷AI Lab 2014年的作品。
论文:
《Deep Speech: Scaling up end-to-end speech recognition》
代码:
https://github.com/mozilla/DeepSpeech
上图是Deep Speech的网络结构图。网络的前三层和第5层是FC,第4层是双向RNN,Loss是CTC。
主要思路:
1.这里的FC只处理部分音频片段,因此和CNN有异曲同工之妙。
2.论文解释了不用LSTM的原因是:很难并行处理。
参考:
http://blog.csdn.net/xmdxcsj/article/details/54848838
Deep Speech笔记
Deep speech 2
Deep speech 2是Deep speech原班人马2015年的作品。
论文:
《Deep speech 2: End-to-end speech recognition in english and mandarin》
代码:
https://github.com/PaddlePaddle/DeepSpeech
这个官方代码是PaddlePaddle实现的,由于比较小众,所以还有非官方的代码:
https://github.com/ShankHarinath/DeepSpeech2-Keras
不出所料,这里使用CNN代替了FC,音频数据和图像数据一样,都是局部特征很明显的数据,从直觉上,CNN应该要比FC好使。
至于多层RNN或者GRU都是很自然的尝试。论文的很大篇幅都是各种调参,也就是俗称的“深度炼丹”。
论文附录中,如何利用集群进行分布式训练,是本文的干货,这里不再赘述。
EESEN
论文:
《EESEN: End-to-End Speech Recognition using Deep RNN Models and WFST-based Decoding》
苗亚杰,南京邮电大学本科(2008)+清华硕士(2011)+CMU博士(2016)。
个人主页:
http://www.cs.cmu.edu/~ymiao/
官网:
https://github.com/srvk/eesen
eesen是基于Tensorflow开发的,苗博士之前还有个用Theano开发的叫PDNN的库。
自动求导
DL发展到现在,其基本运算单元早就不止CNN、RNN之类的简单模块了。针对新运算层出不穷的现状,各大DL框架基本都实现了自动求导的功能。
论文:
《Automatic Differentiation in Machine Learning: a Survey》
Numerical differentiation
数值微分最大的特点就是很直观,好计算,它直接利用了导数定义:
f′(x)=limh→0f(x+h)−f(x)hf'(x)=\lim_{h\to 0}{f(x+h)-f(x)\over h}f′(x)=h→0limhf(x+h)−f(x)
不过这里有一个很大的问题:h怎么选择?选大了,误差会很大;选小了,不小心就陷进了浮点数的精度极限里,造成舍入误差。
第二个问题是对于参数比较多时,对深度学习模型来说,上面的计算是不够高效的,因为每计算一个参数的导数,你都需要重新计算f(x+h)f(x+h)f(x+h)。
因此,这种方法并不常用,而主要用于做梯度检查(Gradient check),你可以用这种不高效但简单的方法去检查其他方法得到的梯度是否正确。
Symbolic differentiation
符号微分的主要步骤如下:
1.需要预置基本运算单元的求导公式。
2.遍历计算图,得到运算表达式。
3.根据导数的代入法则和四则运算法则,求出复杂运算的求导公式。
这种方法没有误差,是目前的主流,但遍历比较费时间。
Automatic differentiation
除此之外,常用的自动求导技术,还有Automatic differentiation。(请注意这里的AD是一个很狭义的概念。)
类比复数的概念:
x=a+bi(i2=−1)x = a + bi \quad (i^2 = -1)x=a+bi(i2=−1)
我们定义Dual number:
x↦x=x+x˙d(d2=0)x \mapsto x = x + \dot{x} d \quad (d^2=0)x↦x=x+x˙d(d2=0)
定义Dual number的运算法则:
(x+x˙d)+(y+y˙d)=x+y+(x˙+y˙)d(x + \dot{x}d) + ( y + \dot{y}d) = x + y + (\dot{x} + \dot{y})d(x+x˙d)+(y+y˙d)=x+y+(x˙+y˙)d
(x+x˙d)(y+y˙d)=xy+x˙yd+xy˙d+x˙y˙d2=xy+(x˙y+xy˙)d(x + \dot{x}d) ( y + \dot{y}d) = xy + \dot{x}yd + x\dot{y}d + \dot{x}\dot{y}d^2 = xy + (\dot{x}y+ x\dot{y})d(x+x˙d)(y+y˙d)=xy+x˙yd+xy˙d+x˙y˙d2=xy+(x˙y+xy˙)d
−(x+x˙d)=−x−x˙d-(x + \dot{x}d) = - x - \dot{x}d−(x+x˙d)=−x−x˙d
1x+x˙d=1x−x˙x2d\frac{1}{x + \dot{x}d} = \frac{1}{x} - \frac{\dot{x}}{x^2}dx+x˙d1=x1−x2x˙d
dual number有很多非常不错的性质。以下面的指数运算多项式为例:
f(x)=p0+p1x+p2x2+...+pnxnf(x) = p_0 + p_1x + p_2x^2 + ... + p_nx^nf(x)=p0+p1x+p2x2+...+pnxn
用x+x˙dx + \dot{x}dx+x˙d替换x,则有:
f(x+x˙d)=p0+p1(x+x˙d)+...+pn(x+x˙d)n=p0+p1x+p2x2+...+pnxn+p1x˙d+2p2xx˙d+...+npn−1xx˙d=f(x)+f′(x)x˙df(x + \dot{x}d) = p_0 + p_1(x + \dot{x}d) + ... + p_n(x + \dot{x}d)^n \\ = p_0 + p_1x + p_2x^2 + ... + p_nx^n + \\ p_1\dot{x}d + 2p_2x\dot{x}d + ... + np_{n-1}x\dot{x}d\\ = f(x) + f'(x)\dot{x}df(x+x˙d)=p0+p1(x+x˙d)+...+pn(x+x˙d)n=p0+p1x+p2x2+...+pnxn+p1x˙d+2p2xx˙d+...+npn−1xx˙d=f(x)+f′(x)x˙d
可以看出d的系数就是f′(x)f'(x)f′(x)。
参考
https://mp.weixin.qq.com/s/7Z2tDhSle-9MOslYEUpq6g
从概念到实践,我们该如何构建自动微分库
https://mp.weixin.qq.com/s/bigKoR3IX_Jvo-re9UjqUA
机器学习之——自动求导
https://www.jianshu.com/p/4c2032c685dc
自动求导框架综述
https://mp.weixin.qq.com/s/xXwbV46-kTobAMRwfKyk_w
自动求导–Deep Learning框架必备技术二三事
深度学习(三十)——Deep Speech, 自动求导相关推荐
- 推荐系统遇上深度学习(三十九)-推荐系统中召回策略演进!
推荐系统中的核心是从海量的商品库挑选合适商品最终展示给用户.由于商品库数量巨大,因此常见的推荐系统一般分为两个阶段,即召回阶段和排序阶段.召回阶段主要是从全量的商品库中得到用户可能感兴趣的一小部分候选 ...
- 深度学习三十年创新路
深度学习三十年创新路 编者注:深度学习火了,从任何意义上,大家谈论它的热衷程度,都超乎想象.但是,似乎很少有人提出不同的声音,说深度学习的火热,有可能是过度的繁荣,乃至不理性的盲从.而这次,有不同的想 ...
- 【PyTorch学习(三)】Aurograd自动求导机制总结
Aurograd自动求导机制总结 PyTorch中,所有神经网络的核心是 autograd 包.autograd 包为tensor上的所有操作提供了自动求导机制.它是一个在运行时定义(define- ...
- 深度学习三十问!一位算法工程师经历30+场CV面试后总结的常见问题合集(含答案)...
点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 作者丨灯会 来源丨极市平台 编辑丨极市平台 极市导读 作者灯会为21届中部985研究生,凭借自己整理的 ...
- 【深度学习】深度学习三十问!一位算法工程师经历30+场CV面试后总结的常见问题合集(含答案)...
作者丨灯会 来源丨极市平台 编辑丨极市平台 导读 作者灯会为21届中部985研究生,凭借自己整理的面经,去年在腾讯优图暑期实习,七月份将入职百度cv算法工程师.在去年灰飞烟灭的算法求职季中,经过30+ ...
- 《动手学深度学习》 第二天 (自动求梯度)
2.3.自动求梯度 MXNet提供的autograd模块可以用来自动求梯度. 2.3.1 一个简单的栗子 这里我们要求对函数 y = 2xTx (2乘以x的转秩乘以X)求关于列向量 x 的梯度.(使用 ...
- 深度学习:Sigmoid函数与损失函数求导
1sigmoid函数 1 从指数函数到sigmoid 2 对数函数与sigmoid 2sigmoid函数求导 3神经网络损失函数求导 1.sigmoid函数 sigmoid函数,也就是s型曲线函数 ...
- 推荐系统遇上深度学习(三十六)--Learning and Transferring IDs Representation in E-commerce...
本文介绍的文章题目为<Learning and Transferring IDs Representation in E-commerce>,下载地址为:https://arxiv.org ...
- Pytorch学习(一)—— 自动求导机制
现在对 CNN 有了一定的了解,同时在 GitHub 上找了几个 examples 来学习,对网络的搭建有了笼统地认识,但是发现有好多基础 pytorch 的知识需要补习,所以慢慢从官网 API 进行 ...
最新文章
- 2019年微服务实践第一课,网易谐云蘑菇街奥思技术大咖深度分享
- 参数NLS_LENGTH_SEMANTICS的设置问题
- POJ 1753 Flip Game (黑白棋) (状态压缩+BFS)
- stm32定时器中断类型分析
- 一步一步写算法(之克鲁斯卡尔算法 下)
- Tomcat配置技巧Top 10
- android:layout_margintop=3dip,南昌航空大学android期末复习资料之 编程题.pdf
- python黑帽子学习
- DOSBox 的安装及使用 详细教程
- 计算机要重启电脑才能检测出u盘启动,电脑使用U盘需要重启才能识别分析及解决措施...
- 关于5G数据中心:数据中心在5G无线网络系统中的作用
- 基于Python 实现 Spirent TestCenter 自动化
- ibus table的快捷键
- win10 开 5g 热点
- Vue keep-alive的使用
- python股票网格交易_不知道哪位交易员可以解释下网格交易法?
- 系统——windows10专业工作站版简单优化
- android 高德地图设置不能旋转_北京实习阿里巴巴、国寿投资、小饭桌、高德软件...
- Gulp插件之gulp-babel和gulp-uglify关于js代码的转换和压缩
- 【1030】计算球的体积
热门文章
- ERROR 1045 (28000): Access denied for user'root'@'localhost'(using password:YES)
- 关于Response.redirect和Response.End出现线程中止异常的处理
- 图书馆可以借到的书目
- Guice 1.0 用户指南
- 实现拼团_生鲜商家如何使用微信拼团小程序做水果生鲜拼团活动?
- mysql中的类型与java_mysql与java数据类型对应关系
- 为什么选择angular?-学习笔记
- 户频繁点击发送ajax请求
- go程序的跨平台编译
- CSS3实现侧边栏快速定位的隐藏和消失