【第七周】李宏毅机器学习笔记05:自注意力机制

摘要

本周学习了自注意力机制,了解了Self-attention的组成结构和有关参数α的计算方法,并且运用了线性代数的方法手动推导了求解输出矩阵的矩阵乘法表示方式,将复杂的问题简单化,更加深入理解了Self-attention的具体机制以及运用方法,最后也将Self-attention与CNN和RNN网络做对比,学习不同方法的优缺点。在师兄的建议下了解了空洞卷积和转置卷积的概念,对部分内容进行了笔算,加深了我对卷积运算的印象。

Abstract

This week, I learned about the self-attention mechanism, understood the structure of self-attention and the calculation method for the parameter α. I used linear algebra to manually derive the matrix multiplication representation for solving the output matrix, simplifying complex problems and gaining a deeper understanding of the specific mechanisms and application methods of self-attention. Finally, I compared self-attention with CNN and RNN networks, learning about the pros and cons of different approaches. Following my senior colleague’s advice, I also explored the concepts of dilated convolution and transposed convolution, performing some calculations by hand to reinforce my impression of convolution operations.

1.自注意力机制

1.1.不同的输入和输出

在这里插入图片描述

前几周学到的例子中输入的都是一个固定大小的数据,比如一个向量或者一张尺寸固定的图片。那如果遇到要输入多个向量,甚至每个向量的长度会发生改变时,我们应该怎么处理呢?

在这里插入图片描述

对于输入多个向量的模型来说,输出结果有三种类别:

  1. 输出同等输入向量数目的label:POS tagging
  2. 输出一个label:sentiment analysis
  3. 输出不定数量的label(也叫做seq2seq任务)

本次学习中主要聚焦于第一种类别。

在这里插入图片描述

对于词性标注任务(POS tagging),我们可以想到的一个最符合直觉的解决方式就是将每一个单词向量都通过一个全连接层,然后每一个全连接层都输出对应词性的label。但是,这个方法显然是有缺陷的。比如在“I saw a saw”这个句子里的两个“saw”虽然都是同一个单词,但显然词性是不同的,直接让不同单词向量粗暴地通过全连接层来解决问题是行不通的。

在这里插入图片描述

我们可以构建一个窗口,在窗口范围内的向量均输入到FC层,这样子FC层就会考虑一个窗口内的上下文信息来决定输出的label。但这样子又会导致新的问题,因为我们不知道这个窗口要设置成多大的大小并且输入的序列可能有长有短。因此,我们需要再优化一下这个方法。

1.2.Self-atttention

在这里插入图片描述

我们可以在向量序列先通过一个Self-attention层,通过该层之后输出的新向量是考虑了整个序列信息的向量,再把向量输入FC层最后产生相应的label。

在这里插入图片描述

Self-attention也可以和FC层多次交叉使用。

那么Self-attention是如何实现的呢?

在这里插入图片描述

a 1 a^1 a1 a 2 a^2 a2 a 3 a^3 a3 a 4 a^4 a4为输入向量,输出向量 b 1 b^1 b1 b 2 b^2 b2 b 3 b^3 b3 b 4 b^4 b4都是考虑了 a 1 a^1 a1 a 2 a^2 a2 a 3 a^3 a3 a 4 a^4 a4的结果。

在这里插入图片描述

例如我们考虑 b 1 b^1 b1是如何产生的,我们需要找到 a 1 a^1 a1和剩下向量之间的关联,用一个数值 α α α来表示。接下来我们就要考虑要怎么求 α α α了。

1.3.α的计算方法

在这里插入图片描述

  • Dot-product:将两个向量分别乘上两个权重矩阵 W q W^q Wq W k W^k Wk得到两个新的矩阵 q q q k k k,在将这两个矩阵做点乘得到 α α α
  • Additive:将两个向量分别乘上两个权重矩阵 W q W^q Wq W k W^k Wk得到两个新的矩阵,再将两个矩阵相加之后通过一个激活函数再一个transform得到 α α α

除此之外还有各种各样计算 α α α的方式,本次学习主要学习的是 Dot-product 的方法,这也是transformer架构采用的方法。

请添加图片描述

首先,将权重矩阵 W q W^q Wq和向量 a 1 a^1 a1相乘得到向量 q 1 q^1 q1,再将权重矩阵 W k W^k Wk分别与向量 a 1 a^1 a1 a 2 a^2 a2 a 3 a^3 a3 a 4 a^4 a4相乘得到向量 k 1 k^1 k1 k 2 k^2 k2 k 3 k^3 k3 k 4 k^4 k4。接下来把 q 1 q^1 q1分别与 k 1 k^1 k1 k 2 k^2 k2 k 3 k^3 k3 k 4 k^4 k4做点乘就可以得到 α 1 , 1 α_{1,1} α1,1 α 1 , 2 α_{1,2} α1,2 α 1 , 3 α_{1,3} α1,3 α 1 , 4 α_{1,4} α1,4,然后再让他们通过一个Soft-max函数就可以得到 α 1 , 1 ′ α_{1,1}' α1,1 α 1 , 2 ′ α_{1,2}' α1,2 α 1 , 3 ′ α_{1,3}' α1,3 α 1 , 4 ′ α_{1,4}' α1,4。再用权重矩阵 W v W^v Wv分别乘各个输入向量得到向量 v 1 v^1 v1 v 2 v^2 v2 v 3 v^3 v3 v 4 v^4 v4,最后将它们分别对应与 α 1 , 1 ′ α_{1,1}' α1,1 α 1 , 2 ′ α_{1,2}' α1,2 α 1 , 3 ′ α_{1,3}' α1,3 α 1 , 4 ′ α_{1,4}' α1,4相乘再求和就可以得到 b 1 b_1 b1了。

1.4.矩阵乘法的推导过程

请添加图片描述

在这里插入图片描述

看似复杂的计算过程实际上只是几个简单的矩阵乘法,其中只有权重矩阵 W q W^q Wq W k W^k Wk W v W^v Wv是未知的,是需要通过学习而找到的参数。

1.5.Multi-head Self-attention

在这里插入图片描述

一个问题可能会有多种不同的相关性,所以我们会采用多个head来处理不同相关性的问题。例如使用两个head时, q i q^i qi k i k^i ki v i v^i vi要分别乘两个矩阵产生两个不同的向量,再用 q i , 1 q^{i,1} qi,1 k i , 1 k^{i,1} ki,1 k j , 1 k^{j,1} kj,1 v i , 1 v^{i,1} vi,1 v j , 1 v^{j,1} vj,1去产生 b i , 1 b^{i,1} bi,1

在这里插入图片描述

同理, b i , 2 b^{i,2} bi,2也是按这种方法来计算出来的。

在这里插入图片描述
最后再将求出来的 b i , 1 b^{i,1} bi,1 b i , 2 b^{i,2} bi,2拼起来然后乘一个矩阵 W 0 W^0 W0得到 b i b^{i} bi

1.6.Positional Encoding

在学习自注意力机制的时候我们还遗漏了一个很重要的问题,就是我们没有考虑位置的信息。比如在POS tagging任务中,动词比较容易出现在句首而不是句末,因此位置信息在某些任务中也是至关重要的。

在这里插入图片描述

为了考虑位置信息,我们采取的做法是将向量 a i a^i ai加上一个包含位置信息的向量 e i e^i ei

1.7.Self-attention的应用

1.7.1.Self-attention for Speech

在这里插入图片描述

在语音识别问题中我们一个向量只表示10ms的内容,一句话可能会涉及成千上万的向量。由于注意力矩阵的大小是向量长度的平方,如果考虑整个语音的范围会使得我们的计算量非常大,并且会占用很多的内存资源,因此通常采用Truncated Self-attention。 Truncated Self-attention只考虑某个向量附近范围的向量而不去考虑整个语音过程,至于这个范围有多大这也是根据不同任务人为设置的一个hyperparameter。

1.7.2.Self-attention for Image

在这里插入图片描述

一张有色彩的图像可以看做是一个三维的张量,每个像素点不同channel的取值可以视为一个向量,一张图片就可以看做是一个vector set。因此,我们可以用Self-attention来处理图像问题。

1.8.Self-attention v,s. CNN

在这里插入图片描述

使用Self-attentionm去处理问题时,一个像素点需要求自身的query,然后再求自己和剩下所有像素的key,而CNN只需要考虑一个receptive field里面的像素。因此可以把CNN看做是一个简化版的Self-attention,而Self-attention可以看做是一个复杂版的CNN。

在这里插入图片描述

Self-attention比CNN更有弹性,因此需要更多的数据来使其得到更好的结果。复杂且有弹性的模型在数据集比较小时可能会导致过拟合现象,因此在小数据集时Selft-attention的效果比不过CNN,但是当数据集增大到100M后,Self-attention的性能又会优于CNN。

1.9 Self-attention v.s. RNN

在这里插入图片描述

RNN只考虑左边输入的向量,然后再将向量输出的FC层,这是一种不平行的方法。而Self-attention会考虑所有输入的向量,再平行地输出向量。在大多数情况下,Self-attention都优于RNN。

2.更多的卷积(拓展学习)

2.1.空洞卷积

空洞卷积(Atrous convolution),也称为扩张卷积(Dilated Convolution),是一种特殊的卷积操作,它通过在卷积核的元素之间插入空洞(即跳过一些像素)来扩大感受野(receptive field),同时保持参数数量不变。

在这里插入图片描述

上图从左到右分别为a、b、c子图,三幅图是相互独立进行卷积的,大框表示输入图像(感受野默认为1),黑色的圆点表示图片的卷积核,中间灰色的矩形表示卷积后的感受野。

  • a是普通的卷积过程(dilation rate = 1),卷积后的感受野为3
  • b是dilation rate = 2的空洞卷积,卷积后的感受野为5
  • c是dilation rate = 3的空洞卷积,卷积后的感受野为7

也可以这么说,普通卷积是空洞卷积的一种特殊情况

同样一个3×3的卷积核,却可以起到5×5、8×8等卷积的效果,空洞卷积在不增加参数量的前提下(参数量=卷积核大小+偏置),却可以增大感受野。

具体求法如下:
请添加图片描述

下面以一个例子计算感受野大小:下图是三个不同的空洞卷积,卷积核的kernel size=3,stride=1,但是空洞卷积的dilation rate分别是1,2,4。默认初始化感受野是1,a到b是从左到右连续卷积的(区别于独立卷积)。

在这里插入图片描述
请添加图片描述

空洞卷积的关键特点包括:

  • 感受野的增加:通过在卷积核中引入空洞,可以在不增加卷积核大小的情况下有效地增加其感受野。这意味着模型可以捕获更大范围内的上下文信息。
  • 参数数量不变:尽管感受野增大了,但实际参与计算的卷积核权重数量保持不变,因此不会显著增加模型的复杂度或计算成本。
  • 多尺度信息提取:使用不同大小的空洞率可以捕获不同尺度的特征,这对于图像分割等需要理解不同大小对象的任务非常有用。

2.2.转置卷积

在这里插入图片描述
通常,对图像进行多次卷积运算后,特征图的尺寸会不断缩小。而对于某些特定任务 (如图像分割和图像生成等),需将图像恢复到原尺寸再操作。这个将图像由小分辨率映射到大分辨率的尺寸恢复操作,叫做上采样 (Upsample),如上图图所示。

对于上采样(up-sampling)操作,目前有着一些插值方法进行处理:

  1. 最近邻插值(Nearest neighbor interpolation)
  2. 双线性插值(Bi-Linear interpolation)
  3. 双立方插值(Bi-Cubic interpolation)

然而,这些上采样方法都是基于人们的先验经验来设计的,在很多场景中效果并不理想 (如:规则固定、不可学习)。因此,我们希望神经网络自己学习如何更好地插值,即接下来要介绍的转置卷积。 与传统的上采样方法相比,转置卷积的上采样方式并非预设的插值方法,而是同标准卷积一样,具有可学习的参数,可通过网络学习来获取最优的上采样方式。

转置卷积(Transposed Convolution),有时也被称为分数步长卷积(Fractionally Strided
Convolution)、反卷积(Deconvolution)或上采样卷积(Upsampling
Convolution),是一种用于扩大特征图尺寸的操作。这种操作常见于生成对抗网络(GANs)、自动编码器(Autoencoders)以及图像分割等领域。

转置卷积主要作用就是起到上采样的作用,但转置卷积不是卷积的逆运算(一般卷积操作是不可逆的),它只能恢复到原来的大小(shape)而数值与原来不同。转置卷积的运算步骤可以归为以下几步:

  1. 在输入特征图元素间填充s-1行、列0(其中s表示转置卷积的步距)
  2. 在输入特征图四周填充k-p-1行、列0(其中k表示转置卷积的kernel_size大小,p为转置卷积的padding,注意这里的padding和卷积操作中有些不同)
  3. 将卷积核参数上下、左右翻转
  4. 做正常卷积运算(填充0,步距1)

在这里插入图片描述

假设输入的特征图大小为2x2(假设输入输出都为单通道),通过转置卷积后得到4x4大小的特征图。这里使用的转置卷积核大小为k=3,stride=1,padding=0的情况(忽略偏执bias)。

  1. 首先在元素间填充s-1=0行、列0(等于0不用填充)
  2. 然后在特征图四周填充k-p-1=2行、列0
  3. 接着对卷积核参数进行上下、左右翻转
  4. 最后做正常卷积(填充0,步距1)

参考视频:转置卷积-bilibili

总结

本周进行了理论内容的学习,了解了自注意力机制。自注意力是一种在深度学习和自然语言处理领域中广泛使用的技术,每个输入元素都会被转换为三个向量:查询(Query)、键(Key)和值(Value)。这些向量是由输入经过线性变换(通常是矩阵乘法)得到的。自我注意力机制提供了一种有效的方式来处理序列数据,它能够捕捉输入序列中的长距离依赖关系,并且允许模型并行处理输入序列中的所有位置。除了对普通自注意力的学习外,我还学习了多头注意力,即在同一层中执行多次独立的注意力计算,然后再将它们合并起来,这是为了捕获不同类型的依赖关系。学习了自注意力后,我还拓展学习了空洞卷积和转置卷积,空洞卷积能够帮助神经网络更好地理解输入数据的空间或时间结构,特别是在需要保持高分辨率输出的同时扩大感受野的应用中,而转置卷积帮助我们在深度学习中处理上采样和特征图尺寸扩大的需求。下周我会继续努力,投入更多时间和精力在新理论的学习之中,加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值