【自注意力与Transformer架构在自然语言处理中的演变与应用】

背景介绍

  • 在自然语言处理(NLP)领域,序列到序列(seq2seq)模型和Transformer架构的出现,极大地推动了机器翻译、文本生成和其他语言任务的进展。传统的seq2seq模型通常依赖于循环神经网络(RNN)来处理输入序列,并通过编码器-解码器结构进行信息传递。然而,这种方法在处理长序列时存在一定的局限性,主要体现在信息的丢失和长距离依赖的建模能力不足。

  • 为了解决这些问题,Transformer模型于2017年被提出。它引入了自注意力机制(Self-Attention),使得模型能够在处理每个单词时,考虑到句子中所有其他单词的上下文信息。这种机制不仅提高了模型对长距离依赖的捕捉能力,还显著提升了并行计算的效率,从而加快了训练速度。

  • 自注意力机制的核心在于通过计算查询(Query)、键(Key)和值(Value)向量之间的相关性,来动态调整每个单词在上下文中的重要性。这种方法使得模型能够灵活地关注句子中不同位置的词,从而更好地理解和生成语言。

  • 此外,Transformer模型的多头注意力机制进一步增强了模型的表达能力。通过将注意力机制分成多个头,模型能够在不同的子空间中学习到多种不同的表示,从而捕捉到更丰富的语义信息。

  • 近年来,基于Transformer的模型,如BERT、GPT和CLIP等,已经在多个NLP任务中取得了显著的成果。这些模型不仅在文本处理上表现出色,还扩展到了图像处理和多模态学习等领域,展示了Transformer架构的广泛适用性和强大能力。

  • 综上所述,seq2seq模型和Transformer架构的演变,标志着自然语言处理技术的重大进步,为实现更智能的语言理解和生成奠定了基础。

seq2seq原理

  • 参考:https://blog.csdn.net/zhuge2017302307/article/details/119979892
  • 对比作用
    在这里插入图片描述
    在这里插入图片描述

Transformer原理

在这里插入图片描述

Self-Attention 过程

如上一节所讲,Self Attention 在处理某个词之前,通过对句子片段中每个词的相关性进行打分,并将这些词的表示向量加权求和。

Self-Attention 沿着句子中每个 token 的路径进行处理,主要组成部分包括 3 个向量:

  1. Query:Query 向量是当前单词的表示,用于对其他所有单词(使用这些单词的 key 向量)进行评分。我们只关注当前正在处理的 token 的 query 向量。
  2. Key:Key 向量就像句子中所有单词的标签。它们就是我们在搜索单词时所要匹配的。
  3. Value:Value 向量是实际的单词表示,一旦我们对每个词的相关性进行了评分,我们需要对这些向量进行加权求和,从而表示当前的词。
    在这里插入图片描述
  • 以下是计算it时的评分
    在这里插入图片描述
  • 这些加权的 Value 向量会得到一个向量,它将 50% 的注意力放到单词robot 上,将 30% 的注意力放到单词 a,将 19% 的注意力放到单词 it。最终一个具有高分数的 Value 向量会占据结果向量的很大一部分
  • 上面都是展示大量的单个向量,是想把重点放在词汇层面上。而实际的代码实现,是通过巨大的矩阵相乘来完成的

MultiheadAttention

在这里插入图片描述

  • 多头注意力模型中,head数是一个超参数,语料大,电脑性能好就可以设置的高一点

torch实现

torch.nn.MultiheadAttention(embed_dim, num_heads, dropout=0.0, bias=True, add_bias_kv=False, add_zero_attn=False, kdim=None, vdim=None)
 1.embed_dim:最终输出的 K、Q、V 矩阵的维度,这个维度需要和词向量的维度一样
 2.num_heads:设置多头注意力的数量。要求embed_dim%num_heads==0,即要能被embed_dim整除。这是为了把词的隐向量长度平分到每一组,这样多组注意力也能够放到一个矩阵里,从而并行计算多头注意力。
 3.dropout:这个 dropout 加在 attention score 后面
  例如,我们前面说到,8 组注意力可以得到 8 组 Z 矩阵,然后把这些矩阵拼接起来,得到最终的输出。
  如果最终输出的每个词的向量维度是 512,那么每组注意力的向量维度应该是512/8=64 如果不能够整除,那么这些向量的长度就无法平均分配。

Self-Attention 和经典的(seq2seq)模型的区别

一个注意力模型不同于经典的(seq2seq)模型,主要体现在 3 个方面:

  1. 编码器把所有时间步的 hidden state(隐藏层状态)传递给解码器,而非只传递最后一个 hidden state。即编码器会把更多的数据传递给解码器。
  2. 对于 Self Attention 机制,会把其他单词的理解融入处理当前的单词。使得模型不仅能够关注这个位置的词,而且能够关注句子中其他位置的词,作为辅助线索,进而可以更好地编码当前位置的词。
  3. 解码器输出之前,计算了注意力。让模型找到此时刻最该注意的词。

对于第二点举例如下:

机器人第二定律

机器人必须服从人给予它的命令,当该命令与第一定律冲突时例外。

句子中高亮的 3 个部分,用于指代其他的词。如果不结合它们所指的上下文,就无法理解或者处理这些词。当一个模型要处理好这个句子,它必须能够知道:

  • 指的是机器人
  • 该命令 指的是这个定律的前面部分,也就是人给予它的命令
  • 第一定律 指的是机器人第一定律

Self Attention 能做到这一点。它在处理某个词之前,将模型中这个词的相关词和关联词的理解融合起来(并输入到一个神经网络)。它通过对句子片段中每个词的相关性打分(attention score),并将这些词向量加权求和。

下图顶部模块中的 Self Attention 层在处理单词 it 的时候关注到 a robot。它最终传递给神经网络的向量,是这 3 个单词的词向量加权求和的结果。
在这里插入图片描述

QKV计算过程

在这里插入图片描述

为什么求内积之后除以 d \sqrt{d} d

在计算相似度 s = ⟨ q , k ⟩ s = \langle q, k \rangle s=q,k 时, s s s 要除以 d k e y \sqrt{d_{key}} dkey (Key 向量的长度)。原因是词向量 embedding 维度过高时, s s s 过大,softmax 函数会进入饱和区。例如:

对于两个 d d d 维向量 q , k q, k q,k,假设它们都采样自“均值为 0、方差为 1”的分布。Attention 是内积后 softmax,主要设计的运算是 e q ⋅ k e^{q \cdot k} eqk,我们可以大致认为内积之后、softmax 之前的数值在 − 3 d -3\sqrt{d} 3d 3 d 3\sqrt{d} 3d 这个范围内,由于 d d d 通常都至少是 64,所以 e 3 d e^{3\sqrt{d}} e3d 比较大而 e − 3 d e^{-3\sqrt{d}} e3d 比较小,softmax 函数进入饱和区。这样会有两个影响:

  1. 带来严重的梯度消失问题,导致训练效果差。
  2. softmax 之后,归一化后计算出来的结果 a a a 要么趋近于 1 要么趋近于 0,Attention 的分布非常接近一个 one hot 分布了,加权求和退化成胜者全拿,则解码时只关注注意力最高的(attention 模型还是希望别的词也有权重)。

相应地,解决方法有两个(参考苏剑林《浅谈 Transformer 的初始化、参数化与标准化》):

  1. 像 NTK 参数化那样,在内积之后除以 d \sqrt{d} d ,使 q ⋅ k q \cdot k qk 的方差变为 1,对应 e 3 e^{3} e3 e − 3 e^{-3} e3 都不至于过大过小,这也是常规的 Transformer 如 BERT 里边的 Self Attention 的做法。对公式 s = ⟨ q , k ⟩ s = \langle q, k \rangle s=q,k 进行优化:( q q q k k k 求内积,所以其实 key 和 q q q 的向量长度一样。)

    s = ⟨ q , k ⟩ d k e y s = \frac{\langle q, k \rangle}{\sqrt{d_{key}}} s=dkey q,k

  2. 另外就是不除以 d \sqrt{d} d ,但是初始化 q , k q, k q,k 的全连接层的时候,其初始化方差要多除以一个 d d d,这同样能使得 q ⋅ k q \cdot k qk 的初始方差变为 1,T5 采用了这样的做法。

参考

  • https://blog.csdn.net/qq_56591814/article/details/119759105
  • https://blog.csdn.net/weixin_38252409/article/details/133828294

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微服务Sleuth解析部署使用全流程

目录 1、Sleuth链路追踪 1、添加依赖 2、修改日志配置文件 3、测试 2、zipkin可视化界面 1、docker安装 2、添加依赖 3、修改配置文件 4、查看页面 5、ribbon配置 1、Sleuth链路追踪 sleuth是链路追踪框架,用于在微服务架构下开发,各个微服务之…

刷题 - 分治

面试经典 150 题 - 分治 148. 排序链表⭐️⭐️⭐️ - 快慢指针找中间节点 - 归并排序 伪代码: 将链表拆分成两半,返回右半边头节点(左半边头节点就是原始链表头节点)对左边进行排序并返回左边头节点对右边进行排序返回右边头节…

使用jenkins将airflow-dbt部署到服务器上

系列文章目录 文章目录 系列文章目录课程地址YT一、jenkins服务器的初始化配置1.1 运行第一个jenkins pipeline二、编写本地dbt项目2.1 克隆git上的初始文件到本地2.2 本地创建虚拟环境2.3 创建airflow的Dockerfile2.4 安装dbt2.5 创建dbt所需要的snowflake数据库2.6 配置docke…

Android开发视频预览效果

Android开发视频预览效果 视频播放不是一个简单的事情,得有暂停,继续播放等功能,屏幕的适配也是头疼的事情 一、思路: 引用的是腾讯播放器TXVodPlayer 二、效果图: 图片不是很直观,也可以看下视频 And…

渗透测试 之 域渗透手法【域内用户枚举】手法 Kerbrute msf pyKerbrute 工具使用详解

说明一下: 域内用户枚举工具使用说说: Kerbrute pyKerbrute MSF模块的使用 域内用户名枚举原理分析: 域内用户枚举攻击防御: 流量检测: 日志层面: 说明一下: 域环境或者内网环境下,可以在没有域环…

npm ERR! PhantomJS not found on PATH

安装phantomj时发生报错 old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Some versions have web compatibility issues. Please, upgrade your dependencies to the actual version of core-js. npm ERR! code 1 npm ERR! path /va…

四、Spring Boot集成Spring Security之认证流程

Spring Boot集成Spring Security之认证流程 一、概要说明二、基于内存的用户名密码1、默认用户名密码2、自定义用户名密码3、为方便测试添加测试接口TestController 三、登录登出重要概念介绍四、登录业务逻辑1、登录业务相关过滤器2、访问业务请求处理流程①、访问业务请求地址…

kubernetes中微服务部署

微服务 问:用控制器来完成集群的工作负载,那么应用如何暴漏出去? 答:需要通过微服务暴漏出去后才能被访问 Service 是一组提供相同服务的Pod对外开放的接口借助Service,应用可以实现服务发现和负载均衡Service 默认只…

初学Qt之环境安装与 hello word

环境: Qt Creator 4.11.0 (Community) Qt 5.14.0 目录 1.Qt环境配置 1.1 下载Qt 5.14.0 1.2 注册Qt账号 1.3 安装Qt 1.4 配置环境变量 2.创建项目 2.1 创建一个项目 2.2 初始代码解析 2.3 可视化GUI ​编辑 2.4 hello word 2.4.1 可视化hello word …

链式二叉树及二叉树各种接口的实现(C)

二叉树的性质 若规定根节点的层数为1,则一棵非空二叉树的第 i i i层上最多有 2 i − 1 2^{i-1} 2i−1个结点.若规定根节点的层数为1,则深度为h的二叉树的最大结点数是 2 h − 1 2^{h}-1 2h−1对任何一棵二叉树,如果度为0其叶结点个数为 n 0 …

Koa学习

Koa 安装与配置 1. 初始化项目 在终端中执行以下命令: # 创建项目文件夹 mkdir koa cd koa# 初始化并安装依赖 npm init -y npm install koa npm install nodemon --save-dev2. 修改 package.json 在 package.json 文件中进行如下修改: {"type…

C语言 | Leetcode C语言题解之第472题连接词

题目&#xff1a; 题解&#xff1a; typedef struct Trie {struct Trie * children[26];bool isEnd; }Trie;#define TRIE_INITIAL(node) do { \for (int i 0; i < 26; i) { \(node)->children[i] NULL; \} \(node)->isEnd false; \ }while(0);static void freeTri…

互联网线上融合上门洗衣洗鞋小程序,让洗衣洗鞋像点外卖一样简单

随着服务创新的风潮&#xff0c;众多商家已巧妙融入预约上门洗鞋新风尚&#xff0c;并携手洗鞋小程序&#xff0c;开辟线上蓝海。那么&#xff0c;这不仅仅是一个小程序&#xff0c;它究竟蕴含着哪些诱人好处呢&#xff1f; 1. 无缝融合&#xff0c;双线共赢&#xff1a;小程序…

美团Java一面

美团Java一面 9.24一面&#xff0c;已经寄了 收到的第一个面试&#xff0c;表现很不好 spring bean生命周期 作用域&#xff08;忘完了&#xff09; 为什么用redis缓存 redis和数据库的缓存一致性问题 redis集群下缓存更新不一致问题 aop说一下 arraylist和linkedlist 数据库的…

2024年软件设计师中级(软考中级)详细笔记【5】软件工程基础知识上(分值10+)

第5章软件工程 目录 前言第5章 软件工程基础知识&#xff08;上&#xff09;&#xff08;分值10&#xff09;5.1 软件工程概述5.1.4 软件过程 5.2 软件过程模型5.2.1 瀑布模型 (Waterfall Model)5.2.2 增量模型5.2.3 演化模型5.2.4 喷泉模型&#xff08;Water Fountain Model&a…

JavaScript下载文件(简单模式、跨域问题、文件压缩)

文章目录 简介简单文件下载通过模拟form表单提交通过XMLHttpRequest方式 跨域(oss)下载并压缩文件完整示例文件压缩跨域设置 简介 相信各位开发朋友都遇到过下载的文件的需求&#xff0c;有的非常简单&#xff0c;基本链接的形式就可以。 有的就比较复杂&#xff0c;涉及跨域…

小米路由器R3Gv2安装openwrt记录

前言 小米路由器R3Gv2的硬件配置与小米路由器4A千兆版一致&#xff0c;但bootloader有所不同&#xff0c;因此openwrt的固件不要互刷。另外&#xff0c;R3Gv2和R3G、4A百兆版是不同的设备&#xff0c;切勿混淆。 硬件信息 OpenWrt参数页-Xiaomi MiWiFi 3G v2 CPU&#xff1a…

PPT分享:埃森哲-业务流程BPM能力框架体系

PPT下载链接见文末~ 业务流程管理&#xff08;BPM, Business Process Management&#xff09;的能力框架体系是一个全面、系统的流程管理方法论和工具集&#xff0c;旨在帮助企业优化和持续改进其业务流程&#xff0c;从而提升运营效率和市场竞争力。 一、BPM能力框架体系概述…

CUDA Example 处理一张二维图像

CUDA 实战 5.3.3 基于共享内存的位图&#xff1a;突出了同步操作的重要性 __synthreads() 才能保证图像的正确输出&#xff0c;如果去掉同步操作&#xff0c;输出图像如下&#xff1a; 加上同步操作之后&#xff1a; #include "cpu_bitmap.h" #include "cpu_an…

小北的技术博客:探索华为昇腾CANN训练营与AI技术创新——Ascend C算子开发能力认证考试(初级)

前言 哈喽哈喽友友们,这里是zyll~(小北)智慧龙阁的创始人及核心技术开发者。在技术的广阔天地里,我专注于大数据与全栈开发,并致力于成为这一领域的新锐力量。通过智慧龙阁这个平台,我期望能与大家分享我的技术心得,共同探索技术的无限可能。 Ascend C编程:小北的技术…