图解Self-Attention和代码实现,大语言模型基础思维导图

文章目录

    • 1 Self-Attention的概念
      • 注意
      • 优缺点
    • 2 Self-Attention的原理
      • Q,K,V, and Self-Attention
      • 计算公式
      • 代码实现
    • Self-Attention的计算细节
      • 输入是如何Embedding的?
        • Word Embeddings
        • Sentence Embeddings
        • Pre-trained Embeddings
      • Self=Attention是如何计算的
        • 计算图
    • 4 Self-Attention的问题
  • 大语言模型知识整理

1 Self-Attention的概念

Self-Attention,也被称为scaled dot-product attention,是自然语言处理和深度学习领域的一个基本概念。它在机器翻译、文本摘要和情感分析等任务中发挥着关键作用。Self-Attention使模型能够在进行预测或捕获单词之间的依赖关系时权衡输入序列中不同部分的重要性。

在我们深入研究自我注意力之前,让我们先了解一下注意力这个更广泛的概念。想象一下阅读一份很长的文件;根据上下文,你的注意力自然地从一个词转移到另一个词。深度学习中的Attention mechanisms模仿了这种行为,允许模型选择性地专注于输入数据的特定元素,而忽略其他元素。

比如,在Encoder-Decoder框架中中,对于英-中机器翻译来说,Source是英文句子,Target是对应的翻译出的中文句子,每生成一个target单词都会考虑到Source和已生成的内容,接下来要生成的这个词就是通过计算待生成词与已生成词之间的Attention决定的。

在这里插入图片描述

Self-Attention中就是通过分析上下文,使模型能够辨别序列中单个词元的重要性,能够动态调整每个词元对下一个词元的影响程度。

注意

  1. Self-Attention存在于Transformer架构中的Encoder部分,也就是一串输入的词元中,每个词元的注意力分数都是跟上下文有关,会与前后词元进行计算。可以通过上图中看到。
  2. 而预测下一个词的时用到的注意力机制为:掩码注意力机制(Mask-Self-Attention),当前词元的注意力分数计算只与前文有关,只拿当前词元之前的词来计算。掩码注意力机制存在于Transformer中的Decoder中。
  3. 而位于Encoder-Decoder之间的,为交叉注意力机制,Cross-Self-Attention,键Key来自于Encoder,而Query来自于Decoder。

优缺点

  1. 优点:可以建立全局的依赖关系,扩大图像的感受野。相比于CNN,其感受野更大,可以获取更多上下文信息。

  2. 缺点:自注意力机制是通过筛选重要信息,过滤不重要信息实现的,这就导致其有效信息的抓取能力会比CNN小一些。这样是因为自注意力机制相比CNN,无法利用图像本身具有的尺度,平移不变性,以及图像的特征局部性(图片上相邻的区域有相似的特征,即同一物体的信息往往都集中在局部)这些先验知识,只能通过大量数据进行学习。这就导致自注意力机制只有在大数据的基础上才能有效地建立准确的全局关系,而在小数据的情况下,其效果不如CNN。

2 Self-Attention的原理

这里先给出Self-Attention的架构

在这里插入图片描述

Q,K,V, and Self-Attention

  • Query(Q): 可以将查询视为查找信息的元素。对于输入序列中的每个单词,计算一个查询向量。这些查询表示您希望在序列中关注的内容。
  • Key(K):用于识别和定位序列中的重要元素。与查询一样,为每个单词计算键向量。
  • Value(V): 对于每个单词,计算一个值向量。这些向量包含我们在确定序列中单词的重要性时要考虑的内容。
    -Attention Scores: 准备好QKV后,计算序列中每对单词的注意分数。查询和关键字之间的关注分数量化了它们的兼容性或相关性。
  • Weighted Aggregation:最后,将注意力得分作为权重,对值向量进行加权聚合。这种聚合产生自关注输出,表示输入序列的增强的和上下文知情的表示。

计算公式

Self-Attention的核心是Query(Q),Key(K),Value(V)。
通过对注意力机制的学习我们知道,对于注意力机制来说,键值对形式的Attention计算公式如下:

在这里插入图片描述

在Self-Attention中,公式中的K、Q、V表示如下图所示,可以看出QKV的来源都是输入矩阵X与矩阵的乘积,本质上都是X的线性变换(代码上就是分别经过了三个线性层),这也是为什叫做自注意力机制的原因。

图片

从上式可以看出其计算过程为:首先,计算矩阵Q和K每一行向量的内积,为了防止内积过大,除以d_k的平方根;其次,**使用Softmax对上述内积的结果进行归一化;**最后得到Softmax矩阵之后和V相乘,得到最终的输出。

代码实现


import torch
import torch.nn as nn
import torch.nn.functional as F
import mathclass SelfAttention(nn.Module):def __init__(self, dim_q, dim_k, dim_v):super(SelfAttention, self).__init__()self.dim_q = dim_qself.dim_k = dim_k11.          self.dim_v = dim_v# 定义线性变换函数self.linear_q = nn.Linear(dim_q, dim_k, bias=False)self.linear_k = nn.Linear(dim_q, dim_k, bias=False)self.linear_v = nn.Linear(dim_q, dim_v, bias=False)self._norm_fact = 1 / math.sqrt(dim_k)def forward(self, x):# x: batch, n, dim_q# 根据文本获得相应的维度batch, n, dim_q = x.shape# 如果条件为 True,则程序继续执行;如果条件为 False,则程序抛出一个 AssertionError 异常,并停止执行。assert dim_q == self.dim_q  # 确保输入维度与初始化时的dim_q一致q = self.linear_q(x)  # batch, n, dim_kk = self.linear_k(x)  # batch, n, dim_kv = self.linear_v(x)  # batch, n, dim_v# q*k的转置并除以开根号后的dim_kdist = torch.bmm(q, k.transpose(1, 2)) * self._norm_fact# 归一化获得attention的相关系数dist = F.softmax(dist, dim=-1)  # batch, n, n# attention系数和v相乘,获得最终的得分att = torch.bmm(dist, v)return att

关于为什么bias=False:

  • 由于 softmax 函数会将输入转换成一个概率分布,其输出值的范围在0到1之间,并且各输出值的和为1,这减少了偏置项对模型性能的影响。因此,在这种情况下,省略偏置项可以减少模型的参数数量,提高训练速度,简化模型复杂度,并且有助于避免过拟合,提高模型的泛化能力。

Self-Attention的计算细节

输入是如何Embedding的?

Word Embeddings

词嵌入是词的数值表示,旨在捕捉词之间的语义关系。其思想是将每个单词映射到一个高维向量,其中相似的单词在向量空间中更接近。最流行的单词嵌入之一是Word2Vec,它根据单词在大量文本语料库中出现的上下文生成单词向量。

下面是一个使用Gensim库实现Word2Vec embedding的代码:

# Import the Gensim library
from gensim.models import Word2Vec# Sample sentences for training the Word2Vec model
sentences = [['machine', 'learning', 'is', 'fascinating'],['natural', 'language', 'processing', 'is', 'important'],['word', 'embeddings', 'capture', 'semantic', 'relations'],
]# Train the Word2Vec model
model = Word2Vec(sentences, vector_size=100, window=5, min_count=1, sg=0)# Get the word vector for a specific word
vector = model.wv['machine']
print(vector)## 输出
[-1.9442164e-03 -5.2675214e-03  9.4471136e-03 -9.2987325e-034.5039477e-03  5.4041781e-03 -1.4092624e-03  9.0070926e-039.8853596e-03 -5.4750429e-03 -6.0210000e-03 -6.7469729e-03-7.8948820e-03 -3.0479168e-03 -5.5940272e-03 -8.3446801e-037.8290224e-04  2.9946566e-03  6.4147436e-03 -2.6289499e-03-4.4534765e-03  1.2495709e-03  3.9146186e-04  8.1169987e-031.8280029e-04  7.2315861e-03 -8.2645155e-03  8.4335366e-03-1.8889094e-03  8.7011540e-03 -7.6168370e-03  1.7963862e-031.0564864e-03  4.6005251e-05 -5.1032533e-03 -9.2476979e-03-7.2642174e-03 -7.9511739e-03  1.9137275e-03  4.7846674e-04-1.8131376e-03  7.1201660e-03 -2.4756920e-03 -1.3473093e-03-8.9005642e-03 -9.9254129e-03  8.9493981e-03 -5.7539381e-03-6.3729975e-03  5.1994072e-03  6.6699935e-03 -6.8316413e-039.5975993e-04 -6.0084737e-03  1.6473436e-03 -4.2892788e-03-3.4407973e-03  2.1856665e-03  8.6615775e-03  6.7281104e-03-9.6770572e-03 -5.6221043e-03  7.8803329e-03  1.9893574e-03-4.2560520e-03  5.9881213e-04  9.5209610e-03 -1.1027169e-03-9.4246380e-03  1.6084099e-03  6.2323548e-03  6.2823701e-034.0916502e-03 -5.6502391e-03 -3.7069322e-04 -5.5317880e-054.5717955e-03 -8.0415895e-03 -8.0183093e-03  2.6475071e-04-8.6082993e-03  5.8201565e-03 -4.1781188e-04  9.9711772e-03-5.3439774e-03 -4.8613906e-04  7.7567734e-03 -4.0679323e-03-5.0159004e-03  1.5900708e-03  2.6506938e-03 -2.5649595e-036.4475285e-03 -7.6599526e-03  3.3935606e-03  4.8997044e-048.7321829e-03  5.9827138e-03  6.8153618e-03  7.8225443e-03]
Sentence Embeddings

单词嵌入表示单个单词,句子嵌入捕获句子的整体含义。获取句子嵌入的一种常用方法是对句子中的单词向量取平均值

import numpy as np# Sample sentence and its word embeddings
sentence = ['machine', 'learning', 'is', 'fascinating']
word_vectors = [model.wv[word] for word in sentence]# Calculate the sentence embedding by averaging word vectors
sentence_embedding = np.mean(word_vectors, axis=0)
print(sentence_embedding)

在这段代码中,我们取一个示例句子,并使用我们之前训练的Word2Vec模型获得句子中每个单词的词嵌入。然后,我们通过平均单词向量来计算句子嵌入。这给了我们整个句子的数字表示。

句子嵌入对于各种NLP任务都很有用,包括文本分类、情感分析和信息检索。

Pre-trained Embeddings

在许多NLP项目中,通常使用预训练的词嵌入或句子嵌入。这些嵌入是从大型语料库中生成的,并捕获一般的语言模式。流行的预训练模型包括Word2Vec、GloVe和BERT。

from gensim.models import KeyedVectors# Load pre-trained GloVe embeddings
glove_model = KeyedVectors.load_word2vec_format('glove.6B.100d.txt', binary=False)# Get the word vector for a specific word
vector = glove_model['machine']
print(vector)

在这个例子中,我们从一个文件(在这个例子中是’ GloVe . 6b .100d.txt ')加载预训练的GloVe嵌入,并使用glove_model[‘word’]访问词向量。

总之,单词和句子嵌入在NLP任务中起着关键作用,使我们能够用数字表示文本数据。无论您是创建自己的嵌入还是使用预训练的模型,嵌入都是构建强大的NLP模型的基本组成部分。

Self=Attention是如何计算的

先看李宏毅所讲的这图, [ a 1 , a 2 , a 3 , a 4 ] [a^1,a^2,a^3,a^4] [a1,a2,a3,a4]是Embedding之后的输入,输入向量中的每个元素都经过一个矩阵计算得到 Q u e r y ( q ) , K e y ( k ) , V a l u e ( v ) Query(q),Key(k),Value(v) Query(q),Key(k),Value(v), 然后再经过计算得到注意力分数。

在这里插入图片描述

计算图

ps:在神经网络设置中, W v , W q , W k W^v, W^q, W^k Wv,Wq,Wk这些权重通常是很小的数字,一般会对这些权重矩阵使用适当的随机分布(例如高斯、Xavier和Kaiming分布)进行随机初始化。

只要能够看懂下面这图的计算过程即可。

图片

self-attention-matrix-calculation-2

具体看这两篇文章:

  • “AI”科普丨一文读懂自注意力机制:8大步骤图解+代码
  • Understanding Self-Attention - A Step-by-Step Guide

4 Self-Attention的问题

Self-Attention虽然考虑了所有的输入向量,但没有考虑到向量的位置信息有学者提出可以通过位置编码(Positional Encoding)来解决这个问题,就是把位置信息添加到输入序列中,让输入数据本身就带有位置信息,该方法我们将在后续的Transformer中详细介绍。

自注意力机制(Self-Attention)虽然强大,但在实际应用中也存在一些问题,以下是一些主要问题以及相应的解决方案:
1.计算复杂度较高:自注意力操作的计算复杂度为 0 ( n 2 ) 0(n^2) 0(n2),其中n是序列长度。对于长序列,这可能导致计算成本显著增加。

解决方案:可以通过优化算法和使用高效的硬件(如GPU)来加速计算。此外,研究者们提出了,各种加速方法,例如稀疏注意力模式,以减少计算量24。

2.缺乏位置信息:自注意力机制没有内置的位置信息处理能力,这可能导致模型无法捕捉序列中单词的顺序。

解决方案:通过添加位置编码(Positional Encoding)来提供序列中每个元素的位置信息,帮助模型理解单词的顺序。

3.显存占用大:在处理高分辨率数据时,自注意力机制可能需要大量的显存,尤其是当特征图较大时。

解决方案:可以采用稀疏注意力模式或降低特征维度的方法来减少显存使用

4.对长席列处理能力有限:虽然自注意力可以处理长序列,但在实际应用中,可能需要对非常长的序列进行有效处理

解决方案:使用分段的注意力机制或层次化注意力结构以有效处理长序列

5.可能的过拟合问题:自注意力机制由于其参数众多,可能在小数据集上出现过拟合。

解决方案:使用正则化技术,如Dropout,或采用数据增强等策略来减轻过拟合21。

6.对小数据集的泛化能力有限:自注意力机制可能需要大量数据来训练,以学习有效的表示。

解决方案:使用迁移学习或预训练模型来提高模型在小数据集上的表现

7.多头注意力的实现复杂性:虽然多头注意力可以提高模型的表达能力,但其实现相对复杂,需要额外的计算资源。

解决方案:优化多头注意力的实现,例如通过使用高效的线性变换和并行计算来简化多头注意力

大语言模型知识整理

我正在整理大语言模型的相关知识,可以看我的Github,恳请佬们给一个Star
LLM-tutorial-AllinOne
在这里插入图片描述
本文是属于基础部分内容,基础部分的思维导图为:
在这里插入图片描述
需要的可以在GitHub仓库中自取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1536896.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

无畏契约 (Valorant)YOLO 模型数据集

4万数据集 无畏契约 Valorant YOLO 模型 数据集 截图大小:256x256 截图数量:40000包含保安拌线,被闪被黑,蝰蛇大招内 模型类别:2类 头身类 1身0头 人物:黄色色盲 已添加部分负样本,防止识别除敌…

数据结构——“二叉搜索树”

二叉搜索树是一个很重要的数据结构,它的特殊结构可以在很短的时间复杂度找到我们想要的数据。最坏情况下的时间复杂度是O(n),最好是O(logn)。接下来看一看它的接口函数的实现。 为了使用方便,这里采用模版的方式: 一、节点 temp…

docker部署Stirling-PDF

github网址: GitHub - Stirling-Tools/Stirling-PDF: #1 Locally hosted web application that allows you to perform various operations on PDF files 1、官方docker镜像无法拉取,使用别人阿里云私人镜像仓库下载Stirling-PDF镜像: regi…

微服务以及注册中心

一、什么是微服务 微服务是指开发一个单个小型的但有业务功能的服务,每个服务都有自己的处理和轻量通讯机制,可以部署在单个或多个服务器上。微服务也指一种松耦合的、有一定的有界上下文的面向服务架构。也就是说,如果每个服务都要同时修改…

Objects as Points基于中心点的目标检测方法CenterNet—CVPR2019

Anchor Free目标检测算法—CenterNet Objects as Points论文解析 Anchor Free和Anchor Base方法的区别在于是否在检测的过程中生成大量的先验框。CenterNet直接预测物体的中心点的位置坐标。 CenterNet本质上类似于一种关键点的识别。识别的是物体的中心点位置。 有了中心点之…

AI助力遥感影像智能分析计算,基于高精度YOLOv5全系列参数【n/s/m/l/x】模型开发构建卫星遥感拍摄场景下地面建筑物智能化分割检测识别系统

随着科技的飞速发展,卫星遥感技术已成为获取地球表面信息的重要手段之一。卫星遥感图像以其覆盖范围广、数据量大、信息丰富等特点,在环境监测、城市规划、灾害评估等多个领域发挥着不可替代的作用。然而,面对海量的卫星图像数据,…

wx小程序渗透思路

免责声明:本文仅做分享! 目录 WX小程序源代码 wx小程序目录位置: 反编译: e0e1-wx.py工具 unveilr.exe工具 查看源代码: 微信开发者工具: WX抓包 Fiddler抓包 官网下载 下载证书 操作: bp proxifier bp:(代理抓包) proxifier:(本地代理) WX小程序源代码 其实就…

程序修改题(41-50)

第四十一题 题目 给定程序modi1.c的主函数中&#xff0c;将a、b、c三个结点链成一个单向链表&#xff0c;并给各结点的数据域赋值&#xff0c;函数fun()的作用是:累加链表结点数据域中的数据作为函数值返回。 #include <stdio.h> typedef struct list { int data…

【数据结构-扫描线】力扣57. 插入区间

给你一个 无重叠的 &#xff0c;按照区间起始端点排序的区间列表 intervals&#xff0c;其中 intervals[i] [starti, endi] 表示第 i 个区间的开始和结束&#xff0c;并且 intervals 按照 starti 升序排列。同样给定一个区间 newInterval [start, end] 表示另一个区间的开始和…

李宏毅结构化学习 02

文章目录 一、上篇博文复习二、Separable Case三、Non-separable Case四、Considering Errors五、Regularization六、Structured SVM七、Cutting Plane Algorithm for Structured SVM八、Multi-class and binary SVM九、Beyond Structured SVM 一、上篇博文复习 图中x表示输入的…

Android Framework(六)WMS-窗口显示流程——窗口内容绘制与显示

文章目录 窗口显示流程明确目标 窗户内容绘制与显示流程窗口Surface状态完整流程图 应用端处理finishDrawingWindow 的触发 system_service处理WindowState状态 -- COMMIT_DRAW_PENDING本次layout 流程简述 窗口显示流程 目前窗口的显示到了最后一步。 在 addWindow 流程中&…

基于Python的自然语言处理系列(10):使用双向LSTM进行文本分类

在前一篇文章中&#xff0c;我们介绍了如何使用RNN进行文本分类。在这篇文章中&#xff0c;我们将进一步优化模型&#xff0c;使用双向多层LSTM来替代RNN&#xff0c;从而提高模型在序列数据上的表现。LSTM通过引入一个额外的记忆单元&#xff08;cell state&#xff09;来解决…

24.Redis实现全局唯一ID

是一种分布式系统下用来生成全局唯一ID的工具。 特点 1.唯一性 2.高可用 3.高性能 4.递增性&#xff0c;数据也要保持一种递增&#xff0c;有利于数据库进行查询。 5.安全性 全局唯一ID的生成策略 1.UUID(没有顺序&#xff0c;字符串类型&#xff0c;效率不高) 2.Redis…

【电路笔记】-差分运算放大器

差分运算放大器 文章目录 差分运算放大器1、概述2、差分运算放大器表示2.1 差分模式2.2 减法器模式3、差分放大器示例3.1 相关电阻3.2 惠斯通桥3.3 光/温度检测4、仪表放大器5、总结1、概述 在之前的文章中,我们讨论了反相运算放大器和同相运算放大器,我们考虑了在运算放大器…

floodfill算法(二)

目录 一、太平洋大西洋水流问题 1. 题目链接&#xff1a;417. 太平洋大西洋水流问题 2. 题目描述&#xff1a; 3. 解法 &#x1f334;算法思路&#xff1a; &#x1f334;算法代码&#xff1a; 二、扫雷游戏 1. 题目链接&#xff1a;529. 扫雷游戏 2. 题目描述&#xf…

softmax回归的从零实现(附代码)

softmax回归是一个多分类模型&#xff0c;但是他跟线性回归一样将输入特征与权重做线性叠加&#xff0c;与线性不同的是他有多个输出&#xff0c;输出的个数对应分类标签的个数&#xff0c;比如四个特征和三种输出动物类别&#xff0c;则权重包含12个标量&#xff08;带下标的w…

深度学习之线性代数预备知识点

概念定义公式/案例标量(Scalar)一个单独的数值&#xff0c;表示单一的量。例如&#xff1a;5, 3.14, -2向量 (Vector)一维数组&#xff0c;表示具有方向和大小的量。 &#xff0c;表示三维空间中的向量 模(Magnitude)向量的长度&#xff0c;也称为范数&#xff08;通常为L2范数…

HCIA--实验十六:ACL通信实验(2)

2.高级ACL配置 一、实验内容 1.需求/要求&#xff1a; 使用三台PC和一台交换机&#xff0c;在交换机上配置高级ACL&#xff0c;测试PC1、PC2、PC3间的连通性。 二、实验过程 1.拓扑图&#xff1a; 2.步骤&#xff1a; 1.给PC3配置ip地址&#xff1a; 2.给交换机SW3配置高…

Hello,Spring Boot...

今天开启了Spring Boot学习之旅。 首先就是&#xff0c;JDK、Maven、IDEA以及各种官网的下载、安装与配置 然后通过组件创建小类&#xff0c;最让人头痛的就是&#xff0c;这个spring-boot-starter-thymeleaf&#xff0c;下错版本了 其他的一切顺利&#xff0c;自动化明显 最后…

2024最新版mysql数据库表的查询操作-总结

序言 1、MySQL表操作(创建表&#xff0c;查询表结构&#xff0c;更改表字段等)&#xff0c; 2、MySQL的数据类型(CHAR、VARCHAR、BLOB,等)&#xff0c; 本节比较重要&#xff0c;对数据表数据进行查询操作&#xff0c;其中可能大家不熟悉的就对于INNER JOIN(内连接)、LEFT JOIN…