【机器学习】transformer中Attention机制的介绍

前言:并不是计算机类的学生,只是因为兴趣了解过一点知识。语音学和语言学的内容我也不太懂,所以也不太会把处理语音序列和这个机制的结合很好的写出来。写这个attention是因为上次训练语音,最初用的MockingBird里的tacotron模型。刚开始时效果非常差,梯度直接消失,loss都不带动的,看的我血压飙升(也有我的问题,训练集找的不是太好),于是我翻看了它的源码,看到了几层LSTM和几层全连接在那里孤零零地放着。(有的部分甚至只有一层,可能有点太简陋了)后来换成vits效果相比就好了很多,翻看两边的源码对比了一下,于是就想记录一下这个MultiHeadAttention机制。
在这里插入图片描述
就比如这层

传统RNN的缺点

与tacotron那简陋的LSTM(常用于RNN)和全连接组成的解编码器不同,VITS的解编码器不是传统的RNN神经网络,他使用了一个多头注意(MutiHeadAttention)机制而不是LSTM。并使用这个机制来实现与RNN类似的效果。

说起最传统的RNN神经网络的encoder和decoder,我们输入一段序列,然后用这些序列训练需要的encoder,再用从encoder输出的序列训练decoder,如果deecoder最终最终输出的序列与原输入序列差别非常非常小,那我们就可以说这个网络的效果非常好。

但实际上,无论我们输入多长的序列,我们都是用这一套机制进行学习,当序列非常长的时候,我们就会遇到因为梯度问题,前面的信息无法传播到最后的结果,而最后输入的序列会对这个模型产生很大的影响,从而使最后的output失真。除此之外,我们RNN网络的维度是我们人为设置的,也就是我们人为用这个维度的量就可以描述我们输入的序列(比如说语音),图像还好说,我们通常认为彩图就是三通道的,也就是用一个三维张量就能全面的描述,但是比如语音该用什么维度的量描述,好像是没有定论的(应该吧,我不知道该怎么描述)。所以当维度过低不足以描述这个序列时,会丢失很多信息,应该也会导致最后结果的失真。

Attention与MutiHeadAttention

Self-Attention

为了解决这些问题,我们才会引入attention机制,也就是我们想让这个模型全面合理地考虑输入的序列信息。即模型要确定序列那部分需要重视,并且从重要部分提取出特征信息。下面是一个self-attention的总体结构
在这里插入图片描述

如图,qkv是输入序列a与一个矩阵相乘得到的。训练也是训练这个矩阵各元素的权值。
在这里插入图片描述
然后就需要考虑到总体输出一个a ̂。比如我们要输出a ̂1,就用q1与矩阵Wk1,Wk2 ,Wk3 ,Wk4进行运算,在这里我们就发现Wk矩阵就使这个模型全面地考虑了输入序列。
在这里插入图片描述
接着我们将运算产生的矩阵A(或者经过归一化的A’)与vI进行运算,得到了最后输出的值bi。在这个过程中我们发现,如果谁对attention矩阵A产生的影响最大,乘以对应的v时就会将其显现出来,主导输出的b。
在这里插入图片描述
最后,总体结构就是这样的
在这里插入图片描述

MutiHeadAttention

而这次合成语音用的是attention的升级版,叫做多头注意(MutiHeadAttention)。它也使用相互独立的三个一维卷积层q(query查询)、k(key键)、v(value值)来处理这个序列问题。同时也使用多头(MutiHead)这个机制来实现对序列信息特征更全面地提取。每个头(Head)有一套q、k、v,每个头与头之间也是独立的,他们关注的信息也是不一样的。
在这里插入图片描述
就像很多小人去观察这个序列,就更有可能全面地描述它。我们分头行动(?)之后,每个不同的头(分组)是独立的,中间的运算与之前的attention相同,也就是最后也会输出n个bi,n,然后我们使他们与一个Wo运算,得到最后输出的bi。
在这里插入图片描述

(只能说乐的是,我只能尽可能让这种算法可以充分地考虑输入序列,然后让网络学习(拟合)这个过程,中间具体发生了什么,各具体值有什么含义,有时候是挺难描述的,就像个黑箱一样)下面是总体结构图。
在这里插入图片描述

但在这时候,我们意识到对于q1、q2等,他们是没有位置关系的,对他们的操作是一模一样的,于是我们需要用一个值来使其之间有位置信息,即position。于是我们就添加一个ei来标记这个位置。
在这里插入图片描述
最后,虽然self-attention机制在很多方面的效果很好,但是它的网络比较复杂,需要训练的时间也会更长,需要的数据集也会更多,适合更加复杂的应用场景(比如语音合成,语音可以说是很复杂的信息了)。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值