zoukankan      html  css  js  c++  java
  • 语音识别算法阅读之LAS

    LAS:
      listen, attented and spell,Google
    思想:
      sequence to sequence的思想,模型分为encoder和decoder两部分,首先将任意长的输入序列通过encoder转化为定长的特征表达,然后输入到decoder再转化为任意长的输出序列;相比于传统sequence to sequence在decoder部分引入attention机制,让模型自学习特征相关性,有助于提升识别效果,对静音和噪声具有较好鲁棒性

      其中,输入序列x=(x1,x2,x3,....xT),每个时间片声学特征为40维logfbank; 隐层状态h=(h1,h2,h3,....,hU),U<T; 输出序列y=(<sos>,y1,y2,y3,....,yS,<eos>),<sos>和<eos>分别代表起始和结束符号

    模型:

    • encoder采用1 BLSTM(512)+3 pBLSTM(512)的金字塔状结构,能够将原始时间片减少到1/8,从而剔除冗余信息,加速decoder部分训练;
         其中, i为第i个时间片,j为第j个隐层;
    • decoder采用两层的单向LSTM(521)结构,且引入attention机制
     
        其中,Φ和ψ表示MLP网络
    • 目标函数:最大化每个时间片的log概率
     
     
    • 解码:beam width=32的beam search+n-gram Rescore
     其中,|y|c为字符长度,实验中λ=0.008
    细节:
    • pBLSTM结构能够有效解决模型收敛缓慢和识别效果较差的问题,这种金字塔结构可以减少上层隐层的输出时间片个数,从而剔除冗余信息,加速deocder训练
    • LSTM结构相比传统RNN,能够有效缓解梯度弥散,网络采用均匀分布进行初始化u(-0.1~0.1)
    • attention机制能够自学习特征相关性,一定程度上屏蔽干扰信息,比如静音、噪声等
    • decoder部分在训练时,如果采用当前时间片的输入为上一时刻的标签这种模式;那么在测试时,模型因为无法利用groundtruch信息而影响识别结果;论文在训练中采用10%的概率采用上一时刻的预测输出作为当前时刻的输入,从而缓解训练和测试的差异性
    • 解码时采用beam search+LM Rescore形式,能够带来5%的提升效果
    • 解码时,每一时刻的输出概率进行归一化处理,缓解模型偏向较短的路径
    • 论文还证明了,相比于CTC结构,网络结构具有学习隐式语言模型的能力,比如“triple a”和“aaa”
    • 数据部分采用2000小时的Google voice search utterances,抽取10小时dev set和16小时test set;此外,采用混响和噪声增强使的数据量扩大了20倍

    效果:

    • 模型在最优的情况下取得了clean 10.3%和noise 12.0%的WER
    • LM Rescore带来了5%的效果提升
    • decoder训练时采用sample方式将上一时刻预测输出作为当前时刻输入,带来了2%的提升
    • google state-of-the-art模型CLDNN clean 8.0%和noise 8.9%;论文分析原因在于CLDNN中采用了CNN的前置结构,CNN作为浅层特征提取器,能够增强频域不变形,为LSTM提供更强大的特征表达
    • 作者对LAS进行了基于pytorch的代码实现,并使用kaldi做数据准备、特征提取和cmvn;并在aishell1上进行了训练
    • 实现中,模型的输入是240维fbank特征
    • 模型的encoder部分采用3层BLSTM结构,结点数为256,采用droput=0.2
    • deocder采用1层LSTM,结点数512
    • attention结构中,MLP网络采用两层线性层,第一层线性层输出维度512,激活函数tanh,第二层线性层输出维度为字典个数4203,MLP输出后接softmax
    • 解码部分采用beam width=30的beam search算法得到最终的最优解码,未使用额外的LM
    • 优化函数adam
    • aishell1 test cer: 13.2%

     Reference:

    [1] https://arxiv.org/pdf/1508.01211.pdf
  • 相关阅读:
    ExtJS面向对象
    简单理解Ext.DomQuery操作CSS3选择器
    简单理解Ext.extend
    Pycharm去掉项目所有 # 注释
    windows 杀死进程
    mongo官方企业版安装及数据库授权使用
    python中赋值,深拷贝,浅拷贝区别
    测试驱动开发简单理解
    Flask与WSGI
    Python直接改变实例化对象的列表属性的值 导致在flask中接口多次请求报错
  • 原文地址:https://www.cnblogs.com/zy230530/p/13661785.html
Copyright © 2011-2022 走看看