首页 > 其他分享 >【李宏毅机器学习2021】(四)Self-attention

【李宏毅机器学习2021】(四)Self-attention

时间:2024-03-01 22:22:05浏览次数:22  
标签:李宏毅 Self attention vec 输入 注意力 向量

引入 Self-attention

前面学到的内容输入都是一个向量,假如输入是一排向量,又应如何处理。

image-20240301182000716

来看下有什么例子需要将一排向量输入模型:

image-20240301182728799

当输入是一排向量时,输出有三种类型:

  • 输入和输出的长度一样,每一个向量对应一个 label,如词性标注、音标识别、节点特性(如会不会买某件商品)。
image-20240301183326950
  • 一整个 Sequence 只需输出一个 label,如情感分析、语者辨识、分子亲水性检测。
image-20240301183521066
  • 输出的 label 数目又机器决定,这种任务又叫 seq2seq,如翻译、语音辨识。
image-20240301183844756

接下来将通过讲解第一种输出类型即每一个输入向量对应一个 label 来深入 Self-attention。

第一种输出类型也叫 Sequence Labeling,那如何实现呢?假如现在要做词性分析,简单的想法是给将每个输入向量都单独丢入一个全连接层(以下简称 FC)中,然后生成一个 label。

image-20240301184350018

当这会带来一个问题,对于 saw 这个词来说,第一个 saw 是动词,第二个 saw 是名词,但是对于 FC 来说它俩并无区别。

要区分 saw 是动词还是名词,显然要根据上下文信息决定,所以可以考虑把上下文信息一起丢入 FC,如此一来即可对 saw 进行区分。

image-20240301185116800

这个例子中考虑的上下文并不长,假如有一个待解决问题要考虑整个 Sequence 才能够解决,一个直接的想法是把 window 开大点,直到包括整个 Sequence,但是 Sequence 的大小是不固定的,你需要统计出最长的 sequence,并且 window 开大了,就意味着 FC 需要非常多的参数,不仅运算量很大,还容易导致 overfitting。

Self-attention 就是一个考虑整个 input sequence 资讯的好办法。

Self-attention 的运作方式

Self-attention 会吃一整个 input sequence,然后输出同等长度的 sequence,输出的每个向量都是考虑了整个 input sequence 才得到的。然后再将 Self-attention的输出丢入 FC,如此一来 FC 就考虑整个 input sequence 的资讯再来决定应该输出什么样的结果。

image-20240301190403337

Self-attention 可以叠加很多次:FC 输出后可以再丢入 Self-attention,再考虑一次整个 sequence 的资讯。可以把 Self-attention 和 FC 交替使用,Self-attention 处理整个 sequence 的资讯,FC 专注于处理某个位置的资讯。

image-20240301191053927

Self-attention 的内部实现

由于 Self-attention 可以叠加,所以它的输入不仅来自训练数据还可能来自隐藏层。\(\vec{b}^i\) 都是考虑了整个 input sequence 才得到的。

image-20240301191600394

现在以 \(\vec{b}^1\) 为例说明是如何由 input sequence 得到 \(\vec{b}^i\)。

\(\vec{b}^1\) 是 \(\vec{a}^1\) 对应的考虑了整个 Sequence 的 Self-attention 输出,因此第一步是找出哪些部分与决定 \(\vec{a}^1\) 对应的 label 是有关的。

image-20240301192202876

Self-attention 有一个模块,能将两个向量作为输入,然后输出注意力分数 \(\alpha\),\(\alpha\) 可以用来表示两个向量间的关联程度。这个模块有许多实现,其中两种实现方式分别是 Dot-product 和 Additive。

image-20240301193857860

Dot-product 是对两个输入向量分别做线性变换(可学习的矩阵 W)得到查询向量 \(\vec{q}\) 和 键向量 \(\vec{k}\)(这样做的目的是将原始输入映射到一个更高维度的表示空间中,以增加模型的表达能力),然后将 \(\vec{q}\) 和 \(\vec{k}\) 进行点积操作即可得到注意力分数 \(\alpha\)。

Additve 是将 \(\vec{q}\) 和 \(\vec{k}\) 串起来,然后丢入 tanh 函数,最后经过线性变换得到 \(\alpha\)。

其中 Dot-product 简单有效,被用于 transformer 中,接下来将以 Dot-product 为例了解 Self-attention 的内部实现。

计算每个向量和 \(\vec{a}^1\) 的注意力分数,还要经过 Soft-max 归一化处理,将注意力分数转换为概率分布,表示了对应位置的重要程度。这样可以避免某些位置的注意力权重过大或过小,提高了注意力机制的稳定性和有效性。并且将注意力分数进行 Soft-max 归一化后,得到的注意力权重可以看作是对应位置的输入的加权平均,其中权重表示了每个位置对于当前位置的重要程度。这样可以更好地捕捉输入序列中不同位置的相关性,提高了模型的性能。

image-20240301200842686

自此已经得到了注意力权重,接下来就是通过加权求和得到 \(\vec{b}^1\),但在此之前,为保证向量与注意力权重维度匹配,需要对原始向量进行线性变换得到数值向量 \(\vec{v}\),然后再加权求和。

image-20240301201859032

显然通过这种计算方式,\(\vec{b}^i\) 是一次同时被计算出来的。

image-20240301202117061

接下来从矩阵乘法角度来看下平行计算出 \(\vec{b^i}\) 的过程。

每一个输入向量都要经过线性变换产生查询向量、键向量和数值向量,将这些向量分别组合成矩阵 I、Q、K 和 V,运算操作如下图。

image-20240301202536162

注意力分数矩阵 \(A = K^TQ\)。然后将 A 经过 Soft-max 得到注意力权重矩阵 \(A'\) 。

image-20240301203055256

Self-attention 的输出矩阵 \(O = VA'\)。

image-20240301203336575

来看下 Self-attentin 的总体计算流程:

image-20240301203448796

其中,只有 \(W^q,W^k,W^v\) 是未知的,是需要学习的。

Multi-head Self-attention

Multi-head Self-attention 是 Self-attention 的进阶版本。前面所讲的 Self-attention 计算两个向量之间的注意力分数只用了一个 \(\vec{q}\) 和 \(\vec{k}\),相当于只从一个角度观察两个向量的关联,Multi-head Self-attention 则是同时从不同的角度进行观察,用不同的 \(\vec{q}\) 来负责不同的观察角度。

以 2 头为例,每个头的计算方式与 Self-attention 一致。

第一个头的输出:

image-20240301203631132

第二个头的输出:

image-20240301203839548

将每个头的输出拼接起来,得到多头自注意力的最终输出。通常会再进行一次线性变换,将多头输出映射到期望的输出维度上。

image-20240301203858947

通过多个头并行计算注意力,模型能够从不同的角度对输入序列进行关注,捕捉更丰富的信息,提高模型的性能和表现力。

Position Encoding

到目前为止还缺少一个也许很重要的资讯,即位置的资讯。对于 Self-attention 而言,对每一个输入的操作是一模一样的,输入向量是出现在 sequence 的哪个位置,它是完全不知道的。例如,在做词性标注时动词比较不容易出现句首,那么位置资讯可能就很有用。

如何为输入向量塞入位置资讯呢?Position Encoding 为每个输入向量设置一个唯一的位置向量 \(\vec{e}\),将位置向量加上输入向量即可让 Self-attention 了解到位置资讯。

image-20240301205659276

有各种方法产生位置向量,可以人工设置、Sinusoidal、通过学习得到。

image-20240301211104550

通常使用 Sinusoidal 来计算,位置编码矩阵中的每一行对应一个位置,每一列对应一个位置编码维度。

应用

Self-attention 广泛用于 NLP 领域:

image-20240301211639462

Self-attention 应用于语音,不过要经过一些小小改动,通常语音的每一个向量只代表了 10ms 的长度,一段语音的 sequence 太长了,可能会导致计算和内存开销过大的问题。

截断自注意力(Truncated Self-attention)是一种用于处理长序列的自注意力机制的技术。截断自注意力通过限制每个位置只与其周围的一部分位置进行交互来解决这个问题,而不是与整个序列进行交互。具体来说,对于每个位置,只选择与其距离不超过一定阈值的邻近位置进行注意力计算,忽略超出阈值的远距离位置。

通过截断自注意力,可以减少计算和内存开销,并且更适合处理长序列。然而,截断自注意力也可能会损失一些长距离依赖性信息,因此需要根据具体任务和序列性质来进行权衡和选择。

image-20240301212121523

将图片的每一个像素看成是一个三维的向量,下面这张图片就有 \(5*10\) 个向量。从这个角度看待图片,当然也可以用 Self-attention 处理图片。

image-20240301212541262

用 Self-attention 处理影像的两个例子:

image-20240301212914656

Self-attention 可以用于 Graph 上。之前做 Self-attention 时关联性都是要找出来的,Graph 中的边保存着关联信息,就不再需要通过机器寻找 node 之间的关联性。把 Self-attention 用在 Graph 上是 GNN 的某一种类型。

image-20240301220820970

v.s. CNN

我们来看下 Self-attention 与 CNN 的对比。在图片识别中,CNN 只考虑感受域里的资讯,而 Self-attention 考虑整张图片的资讯。Self-attention 就好像是一个复杂版的 CNN,用 attention 找出相关的像素,就好像是感受域是自动被学习出来的,network 自己决定感受域是什么样子。

image-20240301213137662

在《On the Relationship between Self-Attention and Convolutional Layers》这篇论文上用数学的方式说明了 CNN 就是 Self-attention 的特例,只要设置合适的参数,Self-attention 可以做到和 CNN 一模一样的事。

image-20240301213257654

所以,Self-attention 是更 flexible 的 CNN,CNN 是有限制的 Self-attention。

越 flexible 的模型需要越多的训练数据,否则有可能 overfitting。下面实验用不同量级的训练数据训练 Self-attention 和 CNN,观察下会发现所言不虚。

image-20240301214449101

CNN 弹性较小,在比较少的训练数据上表现较 Self-attention 好;训练数据较多时,Self-attention 弹性大,能更拟合数据,而 CNN 没有办法从更大量的训练数据获取好处,效果自然不如 Self-attention。

v.s. RNN

RNN 是循环神经网络(Recurrent Neural Network)的缩写,是一种经典的神经网络结构,和 Self-attention 一样用于处理序列数据。

RNN 在每个时间步接收输入数据和上一个时间步的隐藏状态,计算当前时间步的隐藏状态和输出,并将隐藏状态保存用于下一个时间步的计算。这样就能够在序列数据中建模时间上的依赖关系,并进行各种任务的预测和分析。

image-20240301215427458

Self-attention 和 RNN 的区别:

  • 并行性:由于 RNN 是逐步处理序列数据的,因此在训练和推理过程中,很难实现并行计算,导致计算效率较低。自注意力机制中,元素之间的相关性可以并行计算,因此可以更有效地利用硬件资源,提高计算效率。
  • 长期依赖关系:传统的 RNN 在处理长序列数据时容易出现梯度消失或梯度爆炸的问题,难以捕捉长期依赖关系。自注意力机制可以直接捕捉序列中不同位置之间的关系,不受距离限制,因此可以更好地处理长期依赖关系。

未来研究方向

Self-attention 最大的问题是运算量非常大,怎么减少运算量是研究的重点。

《Long Range Arena: A Benchmark for Efficient Transformers》比较了各种不同的 Self-attention 的变形,可以看到快的速度带来的是表现变差了。

image-20240301221151161

《Efficient Transformers: A Survey》是一篇综述性论文,主要介绍了关于如何提高Transformer模型的效率的各种方法和技术。

标签:李宏毅,Self,attention,vec,输入,注意力,向量
From: https://www.cnblogs.com/hzyuan/p/18048084

相关文章

  • 【李宏毅机器学习2021】(二)Tips for training
    这一节主要讲解机器学习、类神经网络训练不起来怎么办?讲解一些训练的tips。先来回顾下机器学习的步骤:接下来将介绍在机器学习过程中,遇到问题时如何判断原因并解决:在训练数据上Loss值很大ModelBias在训练数据上Loss值很大,有可能是发生了Model问题。问题原因:模型太......
  • 【李宏毅机器学习2021】(一)引入机器学习和深度学习
    引入机器学习MachineLearning概括来说就是LookingforFunction,即让机器具备找一个函数的能力这些函数显然非常复杂,要依靠机器自动找出该函数。随着要找的函数不同,机器学习有不同的类别:Regression,回归:函数输出的是数值。Classification,分类:函数从给定选项(类别)中选择一个......
  • 李宏毅2022机器学习HW3 Image Classification
    Homework3数据集下载在本地环境下进行实验总是令人安心,但是又苦于网上找不到数据集,虽然kaggle上有数据集但是下载存在问题于是有了一个天才的想法,间接从kaggle上下载(利用output文件夹中的文件是可下载这一机制将数据集从input文件夹拷贝到output文件夹),具体操作如下图等待数......
  • 李宏毅《机器学习》总结 - RL
    引入给一张动物的图片,分辨是什么动物。这个问题可以用CNN解决(HW3)。核心是通过有标注(label)的图片进行学习。而在下围棋时,如何落子是一个难以标注的问题,但是机器可以学到什么是好的,什么是不好的。这就是强化学习的适用场景。结构总的目标是想找一个Actor(或称policy),环境(envir......
  • /proc/pid/mountinfo /proc/self/mountinfo
    该文件包含有关进程的挂载名称空间中的挂载的信息(参见mount_namespaces(7))。它提供了各种信息(例如,传播状态、绑定挂载的挂载根、每个挂载及其父挂载的标识符),这些信息在(旧的)/proc/pid/挂载文件中是没有的(例如,不可扩展性、无法区分每个挂载和每个超级块选项)。 (4)root:......
  • Multi-behavior Self-supervised Learning for Recommendation论文阅读笔记
    Abstract本文提出了一个多行为自监督学习框架,以及一种自适应优化方法。具体而言,我们设计了一个行为感知的图神经网络,结合自注意力机制来捕捉行为的多样性和依赖关系。为了增强对目标行为下的数据稀疏性和辅助行为的嘈杂交互的鲁棒性,我们提出了一种新的自监督学习范式,以在行为间和......
  • 李宏毅《机器学习》总结 - 2022 HW8(Anomaly Detection、ResNet) Strong Baseline
    重新学习了一下ResNet。。这作业平均一跑就是3、4个小时题目大意是让你做异常检测(anomalydetection),即给你一些正常的图片,再让你测试图片是正常的还是异常的(可以理解为2分类问题,只不过其中一个类别是无限大的)代码:https://www.kaggle.com/code/skyrainwind/hw8-anomaly-detec......
  • 【linux新手起步02】vi编辑时出现E325:ATTENTION。
    vi编辑时出现E325:ATTENTION一、原因二、解决方法:rm+swap文件路径以及名称一.原因:出现这个问题,是因为由于在编辑该文件的时候异常退出,因为vim在编辑文件时会创建一个交换文件swapfile以保证文件的安全性。点击查看代码E325:ATTENTIONFoundaswapfilebythen......
  • 李宏毅《机器学习》总结 - BERT(待填)
    BERT实际上是一个tranformerencoder,输入一串向量输出相同个数的向量。以下以句子为例,句子可以认为是一串向量。pre-train如何训练BERT呢(事实上应该是预训练,pre-train)?一个常用的方法是做填空题。即,随机挖去一些字,让模型学习如何去填空。其中这个“挖去”也有好几种方法(如......
  • 【学习笔记】李宏毅 2023 春机器学习课程听课记录
    1ChatGPT原理剖析ChatGPT的社会化:学会文字接龙人类引导文字接龙方向模仿人类喜好用增强式学习向模拟老师学习1.1预训练(Pre-train)ChatGPT真正在做的事情本质上是文字接龙,将其看成一个函数\(f(x)\),其中的\(x\)自变量可以是用户输入的一个语句,得到的函数就是接下来......