当前位置:   article > 正文

【自然语言处理01】——语音识别(LAS模型的原理详解)_李宏毅 自然语言处理

李宏毅 自然语言处理

前言

本系列会详细讲解自然语言处理nlp的相关模型和应用。

这里强推李宏毅老师的课程,链接如下:李宏毅NLP(自然语言处理)完整课程,强推!_哔哩哔哩_bilibili 

这篇文章中LAS模型的论文链接:[1508.01211] Listen, Attend and Spell (arxiv.org)

一、什么语音识别

1.1 什么是语言识别

随着ChatGPT的兴起,自然语言处理NLP(Natural Language Processing)也是相当的火,所以在这里详细讲解NLP的相关理论基础以及他的应用。

NLP有两种形式:文字、语言

NLP的本质是:人和机器如何用自然语言沟通

语音识别就是输入一段声音讯号,通过一个模型,然后输出文字。

那么声音讯号和文字该怎么表示?

声音:一串向量来表示,长度为T,维度为d。

文字:一串token来表示,长度为N,有V种不同的token

一般而言,T>N

1.2 token是什么?

常用的一种token是phoneme,phoneme是发音的基本单位,类似于音标。如图:

但如果输出是这样的,咱是看不懂的。那怎么办?有个工具是Lexicon,他记录了phoneme和词之间的关系。如下图。所以我们要根据这个关系来将phoneme转化成文字。

grapheme:书写的基本单位。

在英文中就是26个字母。但除了字母外,还需要加入空白格(因为词汇之间是用空白做分隔的),还需要加一些标点符号等等。如下图的例子

在中文里,基本书写单位就是汉字,例如 “安”,“可” 等等这些常用字。我们常用字大概有4000左右。中文里边就不需要空白格了。如下图例子:

grapheme和phoneme的区别就是:grapheme不需要lexicon。但他面临的挑战是:字与字之间的关系是比较复杂的,例如 “蜂蜜”,可能会被识别出 “蜂密”。在英文中,当听到“k”的发音时,可以对应英文字母c,也可以对应k。这样的逻辑关系就得看上下文了。

word:以词汇为单位,但往往不是一个很好的选择,因为V的数量会特别特别大。

morpheme:比word小比grapheme大的单位。举例来说,"unbreakable"可以拆成 "un"、 "break" 和"able"。

一般而言 ,大家最喜欢用的token是phoneme和grapheme

1.3 声音讯号转换成向量

上一节提到,输入一段声音讯号,要把它转化成一串向量。那么如何转换呢?

一段声音进来,我们会将其分开成一段一段的,这个一段的长度通常是25ms。那么一个小段的向量通常叫做一个frame。这一段一段是可以重叠的,通常将图中红色的框右移动10ms。如下图所示 :(1s的声音可以转化成100个frame)

怎么描述这一个frame里的声音讯号呢?

  • 假设声音是16KHz,那么25ms里就有400个数值(不推荐)。
  • MFCC:可以表示成39维的向量
  • 80维-filter bank output:逐渐取代了MFCC

一段声音讯号是怎么被抽出来的?

输入一段声音,我们会对其通过DFT得到图谱。如下图:

我们通常用spectrogram(图谱)通过一些filter bank得到向量。然后取log,就得到MFCC或filter bank output,如下图:

现在常用的是filter bank output

二、LAS模型

LAS模型全称:Listen,Attend,and Spell(LAS),一个seq2seq 模型。

Listen相当于encoder;

Spell相当于Decoder;

Attend相当于Attention;

2.1 Listen部分

如下图所示:

Listen部分的输入:x^1,...,x^4,即一串 acoustic features(声音向量)

Listen部分的输出:通过encoder,输出h^{1},...,h^{4}。也是一串向量,数量、维度和长度均和输入相同。

Encoder作用:提取出和语音辨识提到的相关的信息,并把语音中的无关信息去掉,可以用RNN,CNN等。

例如:

  • RNN循环神经网络,它可以使用单向的也可以使用双向的,如下图:

  • CNN卷积神经网络,如下图所示,采用1-D的卷积,把一个filter沿着时间的方向扫过这些acoustic features,每一个filter会涵盖一个范围之内的acoustic features进去,红色三角形代表一个filter,涵盖三个acoustic features进去会得到一个数值,一直往右边移。

 filter不止一个,黄色的filter会给出另一排数值,如下:

现在,每一个输入的acoustic features都会转成一排向量 b^{1},...,b^{4},产生的每一个向量b都已经考虑了相邻的输入,例如,产生的b^2这个向量,我们已经考虑了x^{1},x^{2},x^{3}这三个向量。

CNN和RNN通常会纵横使用,前几层用CNN,后几层用RNN

做语音识别很重要的一件事是对输入Down sampling   (☆☆☆)

作用:因为一段声讯,如果把它表示成acoustic features,会特别长,一秒钟的声音讯号就有一百个向量,而且,相邻向量之间带有的资讯量的差异不会太大,为了要节省计算量,让训练更有效,会采取down sampling。

down sampling有很多中不同的方法,例如:

  • Paramid RNN:把两个Tensor 结合起来送到下一层,如下图所示。

  • pooling over time:从两个Tensor 中选一个送到下一层,如下图所示。

  • Time-delay DNN :只考虑第一个和最后一个,大幅减少运算量

  •  truncated self-attention:要把x^3变为h^3,要考虑整个输入序列中所有的资讯,很难去做self-attention,因为序列太长了,所以一个简单的方法是,在attention的时候,只允许attention在一个范围内,超过这个范围就不看了。

2.2 attend部分(Attention)

主要作用是通过注意力机制建立声学特征和文本之间的关联,帮助模型更好地将声学特征转化为文本输出。其可以动态地分配注意力权重,以捕获输入序列中不同位置的重要信息的关键组件。

具体attention步骤:

1. 首先要有一个vector为z^0,然后用z^0和encoder的输出去计算attention,就像搜寻一样,在attention时,会有一个function叫match,它会用z^0和来自encoder的一个向量当做输入,输出一个数值\alpha _0^1。match可以自行定义,常用的方式有Dot-product Attention,h和z分别是match的输入,分别乘一个矩阵,得到一个新的向量,两个vector做点乘(Dot-product),得到\alpha。这个\alpha是h和z的相似度。如下图所示:

在这里,引入Key、Query、Value的概念 。

  • Key(键):是上图中的h^{1},...,h^{4}。Key是编码器(通常是RNN或CNN)生成的中间表示的一部分。每个时间步都有对应的Key,因此它是一个时间步的特征向量。
  • Query(查询):是上图中的z^0。Query是解码器中的隐藏状态,通常用于生成文本输出。在LAS模型中,Query是解码器中的隐藏状态向量,它表示当前时间步的解码器状态。
  • Value(值):在这里也指的是图中的h^{1},...,h^{4}。Value是与Key对应的权重信息,通常也是编码器生成的声学特征表示。每个时间步都有一个对应的Value。Value包含了有关输入序列的有用信息。

 match的内部操作如下图所示:先将z和h进行transform,然后进行点积。z与h进行transform后,相加,然后经过一个function,再来一个线性transform。

然后,如下图,相似度分数经过 softmax 操作,将它们归一化为概率分布,以获得每个时间步的注意力权重。最后把normalize后的\alpha乘上h^{1},...,h^{4},得到一个vector,为c_0。这个c_0就是attend环节的输出。

 为什么要用attention?好在哪?

如下图,左边attention的方式是把decoder的hidden state 拿出来,做attention,产生出来的向量是下一个timestep的输入,右边attention的方式是先把z^t拿出来,做attention,得到c^t,在这个timestep 就立即使用,把c^tz^t合起来,放到RNN里边,产生distribution,在下一个timestep,会产生z^{t+1},再结合c^{t+1} ,立刻会影响这个timestep的结果。

第一篇做seq2seq 模型做语音辨识的论文,是结合了上述两种方法,如下图: 

 此外,第一篇用LAS做语音辨识的论文,作者加了一个Location-aware attention机制,因为在做语音辨识时,attention不能随便乱调,你的attention要考虑前一个timestep得到的attention,因为你的attention的权重会受到前一个timestep所得到的attention weight的影响。

假设现在要用z^1h^2去计算attention,在一般的流程中,有一个function,输入z^1h^2,输出\alpha。现在不同了,第一篇用LAS做语音辨识的论文中提出了Location-aware attention机制,该机制是指,把前一个timestep所得到的\alpha拿出来,然后现在要考虑h^2\alpha,把它前后相关的\alpha拿出来,放到transform里,通过transform得到一个vector,再把这个vector当做match的输入,所以现在我们得到的\alpha不是只看z^1 和h^2了,它还会看前一个timestep时,附近位置的注意力权重,合起来得到\alpha。所以,现在的attention都会考虑过去的。

 

2.3 Spell部分

  • 输入:前一个时间步的隐藏状态z_i

                  Attend环节的输出c_0

  • 输出:概率分布。输出什么取决于选用了什么样的单位当做token,decoder会给每个token一             个几率,输出的dimension会跟他的token数目一样。

                  新的隐藏状态 z_i

假设输入是cat,spell会拼出什么字母,就看distribution里面哪一个token几率最大,如下图,输出c字母。

接下来输出第二个字母,用z^1去做attention,算出新的数值,再做softmax,得到c_1,,做decoder的输入,得到hidden state值z^2。前一个输出的字母会变成下一个timestep的输入, z^2通过transform做softmax得到一个分布,选几率最大的,得到字母a。

得到<eos>就意味着辨识结束,输出完毕。 

注意,如何选取token?

例如取概率值最大的token是贪心解码(Greedy Decoding),还有常用的束约束(Beam Search)

讲一下 Beam Search

Beam Search的作用是: 如果我们每次都在当前位置直接取max,也就是采用所谓的“Greedy Decoding”,基于贪心的解码策略,我们不能保证生成整个序列的概率是最优的。例如下述情况:

在上图这种情况中: 

  • 假设世界上只有两个token,a和b
  • 假设第一个timestep,在decoder产生第一个token的时候,A的几率是0.6,B的几率是0.4,在做decode的时候,选几率最大的那个,就往左边走,因为输出的结果会是下一次产生输出的时候的输入,第一个字母如果是a,会影响到接下来decode的结果。红色的路径叫做Greedy Decoding,这样会出现问题导致不一定能输出最好的结果。假设在第一个step选B,之后,下一步选B的几率是0.9。

显然绿色的路径更好。但是在实际中,没办法搜寻过多的可能性,找出最好的结果,怎么办呢? 

解决上述问题的方法为Beam Search。

具体做法如下:每次都保留两个最好的路径,保留几个路径就是B的大小。B可以为50,15,20等,保留的路径多,有可能会找到分数比较大的结果,但是计算量会增大。所以Beam Size的大小设置为多少,是需要去考量的。如下图:

 三、训练过程

训练时,要告诉机器,要输出什么样的文字。举个例子,如果要输出'c','a','t'这三个字,就要在第一个timestep产生第一个distribution时,希望产生出'c'的几率越大越好,换句话说,把'c'表示成one-hot vector,接下来去计算输出的这个distribution和‘c’之间的交叉熵,并且最小化这个交叉熵(即损失函数)。也就是说,告诉机器,现在训练的目标是假设第一个字母是'c',让'c'在第一个distribution里的几率越大越好。如下图:

接下来就是重复之前的操作,第二个distribution会参考第一个distribution输出的结果,但是在训练的时候,会告诉机器看到'a'之前的正确答案是什么,在第一个timestep,输出的是对的或错的都不重要,就看正确答案是什么,把正确答案放在训练过程中叫做Teacher Forcing

解释一下 Teacher Forcing. 

如果拿前一个timestep的输出当做下一个的输入,会发生什么呢?

在训练过程中,模型一开始训练的时候的参数是随机的,decode的效果很差,输出的东西可能是乱七八糟的,假设第一个timestep输出'x',变成下一个的输入,现在RNN学到的是“看到x接下来应该输出a”,经过一连串训练后,模型变厉害了,它知道“看到c接下来该输出a”,但之前的训练就白费了。

所以我们不能让这个事情发生,每一层就应当给予正确答案,专注自己所学,而不要被前边人影响

四、总结

4.1 LAS效果

在一开始,LAS 在一些小数据集上面训练出来的结果其实并不是很好,它和常规的深度学习结果还有一定的差距。但随着训练的数据集越来越大,LAS也开始起飞了,最终在12500hour+的数据集上反超了常规深度学习的算法,并且LAS在模型大小上(0.4 GB)还远胜于传统深度学习算法(7.2 GB)

4.2 LAS局限性

LAS可以学到很复杂的输入的声音讯号和输出的文字之间的关系。

但是LAS不能一边听一边辨识,比如这个句子有十秒,机器要先把这个句子听完才能做辨识

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/1011678
推荐阅读
相关标签
  

闽ICP备14008679号