赞
踩
本系列会详细讲解自然语言处理nlp的相关模型和应用。
这里强推李宏毅老师的课程,链接如下:李宏毅NLP(自然语言处理)完整课程,强推!_哔哩哔哩_bilibili
这篇文章中LAS模型的论文链接:[1508.01211] Listen, Attend and Spell (arxiv.org)
随着ChatGPT的兴起,自然语言处理NLP(Natural Language Processing)也是相当的火,所以在这里详细讲解NLP的相关理论基础以及他的应用。
NLP有两种形式:文字、语言
NLP的本质是:人和机器如何用自然语言沟通
语音识别就是输入一段声音讯号,通过一个模型,然后输出文字。
那么声音讯号和文字该怎么表示?
声音:用一串向量来表示,长度为T,维度为d。
文字:用一串token来表示,长度为N,有V种不同的token。
一般而言,T>N
常用的一种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。
上一节提到,输入一段声音讯号,要把它转化成一串向量。那么如何转换呢?
一段声音进来,我们会将其分开成一段一段的,这个一段的长度通常是25ms。那么一个小段的向量通常叫做一个frame。这一段一段是可以重叠的,通常将图中红色的框右移动10ms。如下图所示 :(1s的声音可以转化成100个frame)
怎么描述这一个frame里的声音讯号呢?
一段声音讯号是怎么被抽出来的?
输入一段声音,我们会对其通过DFT得到图谱。如下图:
我们通常用spectrogram(图谱)通过一些filter bank得到向量。然后取log,就得到MFCC或filter bank output,如下图:
现在常用的是filter bank output。
LAS模型全称:Listen,Attend,and Spell(LAS),一个seq2seq 模型。
Listen相当于encoder;
Spell相当于Decoder;
Attend相当于Attention;
如下图所示:
Listen部分的输入:,即一串 acoustic features(声音向量)
Listen部分的输出:通过encoder,输出。也是一串向量,数量、维度和长度均和输入相同。
Encoder作用:提取出和语音辨识提到的相关的信息,并把语音中的无关信息去掉,可以用RNN,CNN等。
例如:
filter不止一个,黄色的filter会给出另一排数值,如下:
现在,每一个输入的acoustic features都会转成一排向量 ,产生的每一个向量
都已经考虑了相邻的输入,例如,产生的
这个向量,我们已经考虑了
这三个向量。
CNN和RNN通常会纵横使用,前几层用CNN,后几层用RNN。
做语音识别很重要的一件事是对输入Down sampling (☆☆☆)
作用:因为一段声讯,如果把它表示成acoustic features,会特别长,一秒钟的声音讯号就有一百个向量,而且,相邻向量之间带有的资讯量的差异不会太大,为了要节省计算量,让训练更有效,会采取down sampling。
down sampling有很多中不同的方法,例如:
主要作用是通过注意力机制建立声学特征和文本之间的关联,帮助模型更好地将声学特征转化为文本输出。其可以动态地分配注意力权重,以捕获输入序列中不同位置的重要信息的关键组件。
具体attention步骤:
1. 首先要有一个vector为,然后用
和encoder的输出去计算attention,就像搜寻一样,在attention时,会有一个function叫match,它会用
和来自encoder的一个向量当做输入,输出一个数值
。match可以自行定义,常用的方式有Dot-product Attention,h和z分别是match的输入,分别乘一个矩阵,得到一个新的向量,两个vector做点乘(Dot-product),得到
。这个
是h和z的相似度。如下图所示:
在这里,引入Key、Query、Value的概念 。
match的内部操作如下图所示:先将z和h进行transform,然后进行点积。z与h进行transform后,相加,然后经过一个function,再来一个线性transform。
然后,如下图,相似度分数经过 softmax 操作,将它们归一化为概率分布,以获得每个时间步的注意力权重。最后把normalize后的乘上
,得到一个vector,为
。这个
就是attend环节的输出。
为什么要用attention?好在哪?
如下图,左边attention的方式是把decoder的hidden state 拿出来,做attention,产生出来的向量是下一个timestep的输入,右边attention的方式是先把拿出来,做attention,得到
,在这个timestep 就立即使用,把
和
合起来,放到RNN里边,产生distribution,在下一个timestep,会产生
,再结合
,立刻会影响这个timestep的结果。
第一篇做seq2seq 模型做语音辨识的论文,是结合了上述两种方法,如下图:
此外,第一篇用LAS做语音辨识的论文,作者加了一个Location-aware attention机制,因为在做语音辨识时,attention不能随便乱调,你的attention要考虑前一个timestep得到的attention,因为你的attention的权重会受到前一个timestep所得到的attention weight的影响。
假设现在要用和
去计算attention,在一般的流程中,有一个function,输入
和
,输出
。现在不同了,第一篇用LAS做语音辨识的论文中提出了Location-aware attention机制,该机制是指,把前一个timestep所得到的
拿出来,然后现在要考虑
的
,把它前后相关的
拿出来,放到transform里,通过transform得到一个vector,再把这个vector当做match的输入,所以现在我们得到的
不是只看
和
了,它还会看前一个timestep时,附近位置的注意力权重,合起来得到
。所以,现在的attention都会考虑过去的。
Attend环节的输出
新的隐藏状态
假设输入是cat,spell会拼出什么字母,就看distribution里面哪一个token几率最大,如下图,输出c字母。
接下来输出第二个字母,用去做attention,算出新的数值,再做softmax,得到
,,做decoder的输入,得到hidden state值
。前一个输出的字母会变成下一个timestep的输入,
通过transform做softmax得到一个分布,选几率最大的,得到字母a。
得到<eos>就意味着辨识结束,输出完毕。
注意,如何选取token?
例如取概率值最大的token是贪心解码(Greedy Decoding),还有常用的束约束(Beam Search)
讲一下 Beam Search
Beam Search的作用是: 如果我们每次都在当前位置直接取max,也就是采用所谓的“Greedy Decoding”,基于贪心的解码策略,我们不能保证生成整个序列的概率是最优的。例如下述情况:
在上图这种情况中:
显然绿色的路径更好。但是在实际中,没办法搜寻过多的可能性,找出最好的结果,怎么办呢?
解决上述问题的方法为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”,但之前的训练就白费了。
所以我们不能让这个事情发生,每一层就应当给予正确答案,专注自己所学,而不要被前边人影响
在一开始,LAS 在一些小数据集上面训练出来的结果其实并不是很好,它和常规的深度学习结果还有一定的差距。但随着训练的数据集越来越大,LAS也开始起飞了,最终在12500hour+的数据集上反超了常规深度学习的算法,并且LAS在模型大小上(0.4 GB)还远胜于传统深度学习算法(7.2 GB)
LAS可以学到很复杂的输入的声音讯号和输出的文字之间的关系。
但是LAS不能一边听一边辨识,比如这个句子有十秒,机器要先把这个句子听完才能做辨识。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。