transformer详解

transformer

  • 框架
    • 注意力机制
      • 注意力评分函数(scoring function)
      • 自注意力机制(self-attention)
      • masked self-attention
      • 多头注意力(multi-head attention)
    • 位置编码
    • Layer normalization
    • Resnet(Add)

框架

在这里插入图片描述

框架解析:

注意力机制

三要素:查询(query),键(key),值(value)
通过query序列检索key,获取合适的value信息

注意力评分函数(scoring function)

假设有一个查询 q ∈ R q q \in \mathcal{R}^{q} qRq m m m个键值对 ( k 1 , v 1 ) , ⋯   , ( k m , v m ) (k_{1},v_{1}),\cdots,(k_{m},v_{m}) (k1,v1),,(km,vm) k ∈ R k , v ∈ R v k \in \mathcal{R}^{k},v\in \mathcal{R}^{ v} kRk,vRv
注意力函数可表示为加权和的形式:
f ( q , ( k 1 , v 1 ) , ⋯   , ( k m , v m ) ) = ∑ i = 1 m α ( q , k i ) v i ∈ R v f(q,(k_{1},v_{1}),\cdots,(k_{m},v_{m}))=\sum_{i=1}^{m}\alpha(q,k_{i})v_{i}\in \mathcal{R}^{v} f(q,(k1,v1),,(km,vm))=i=1mα(q,ki)viRv
其中 α ( q , k i ) \alpha(q,k_{i}) α(q,ki)是由注意力评分函数 a a a通过 s o f t m a x softmax softmax函数归一化得到
$ α ( q , k i ) = s o f t m a x ( a ( q . k i ) ) = e x p ( a ( q , k i ) ) ∑ j m e x p ( a ( q , k j ) ) \alpha(q,k_{i})=softmax(a(q.k_{i}))=\frac{exp(a(q,k_{i}))}{\sum_{j}^{m}exp(a(q,k_{j}))} α(q,ki)=softmax(a(q.ki))=jmexp(a(q,kj))exp(a(q,ki))
a a a有以下几种形式:

  • 加性注意力(Additive Attention):(当query,key为不同长度的矢量时)
    a ( q , k i ) = W v T t a n h ( W q q + W k k ) ∈ R a(q,k_{i})=W_{v}^{T}tanh(W_{q}q+W_{k}k)\in \mathcal{R} a(q,ki)=WvTtanh(Wqq+Wkk)R
    其中, W q ∈ R h × q , W k ∈ R h × k , W v ∈ R h × 1 W_{q}\in \mathcal{R}^{h\times q}, W_{k}\in \mathcal{R}^{h\times k},W_{v}\in \mathcal{R}^{h\times 1} WqRh×q,WkRh×k,WvRh×1
    即,将查询和键连结起来后输入到一个多层感知机(MLP)中, 感知机包含一个隐藏层,其隐藏单元数 h h h是一个超参数, t a n h tanh tanh作为激活函数,并禁用偏置项(即使添加了偏置项,即 t a n h ( X + b ) tanh(X+b) tanh(X+b),在经过 s o f t m a x softmax softmax归一化时会被消除,仍然无效)
  • 点积注意力(Dot Product Attention ):(要求query和key长度相同)
    a ( q , k i ) = q T k i a(q,k_{i})=q^{T}k_{i} a(q,ki)=qTki
  • 缩放点积注意力(Scaled Dot-Product Attention): q , k i ∈ R d k q,k_{i}\in R^{d_{k}} q,kiRdk,并假设其中的元素均为0均值,1方差
    a ( q , k i ) = q T k / d a(q,k_{i})=q^{T}k/\sqrt{d} a(q,ki)=qTk/d
    当query和key的维度 d k d_{k} dk较小时,点积注意力和加性注意力表现效果相似,但是 d k d_{k} dk较大时,方差也会变大( D ( q ⋅ k ) = d k D(q\cdot k)=d_{k} D(qk)=dk),分布趋于陡峭,当点积的数据量级较大时,经过 s o f t m a x softmax softmax后,梯度会很小,容易导致梯度消失,不利于计算,需要进行一定的缩放,将其方差控制为1。
    证明可见:self-attention中的dot_product为什么要被缩放

除以 d k d_{k} dk的原因

  1. 防止输入softmax的值过大,导致偏导数趋近于0,避免梯度消失
  2. 使得 q ⋅ k q\cdot k qk的值满足期望为0,方差为1的分布

当实际应用一个批量数据进行运算时,基于 n n n个查询和 m m m个键-值对计算注意力,其中查询,键长度为 d d d,值长度为 v v v,则 Q ∈ R n × d , K ∈ R m × d , V ∈ R m × v Q\in \mathcal{R}^{n\times d},K\in \mathcal{R}^{m\times d},V\in \mathcal{R}^{m\times v} QRn×dKRm×d,VRm×v的缩放点击注意力为:
s o f t m a x ( Q K T d ) V   ∈   R n × v softmax(\frac{QK^{T}}{\sqrt{d}})V\ \in\ \mathcal{R}^{n\times v} softmax(d QKT)V  Rn×v

区别:Dot Product Attention 和 Additive Attention两者在复杂度上是相似的。但是Additive Attention增加了三个可学习的矩阵,所以相比另外两个效果会更好,同时也增加了更多的模型参数,计算效率会较低

自注意力机制(self-attention)

查询、键、值均由同一个输入经过不同的“线性投影”变化得到,并采用缩放点积注意力得到最终输出
A t t e n t i o n ( Q , K , V ) = s o f t m a x ( Q K T d ) V   ∈   R n × v Attention(Q,K,V)=softmax(\frac{QK^{T}}{\sqrt{d}})V\ \in\ \mathcal{R}^{n\times v} Attention(Q,K,V)=softmax(d QKT)V  Rn×v

masked self-attention

作用:防止Transformer在训练时泄露后面的它不应该看到的信息,确保仅看到当前及以前得信息

在这里插入图片描述
更多可见:MultiHead-Attention和Masked-Attention的机制和原理

多头注意力(multi-head attention)

原理:在给定相同的查询、键、值时,使用**h个独立的"线性投影"**来变换q,k,v,然后并行得使用h个注意力机制,学习到不同的行为,然后将h个自注意力的输出拼接在一起,通过另一个可学习的线性投影进行变换,产生最终的输出,来捕捉序列内各种范围内的依赖关系(例如短距离依赖和长距离依赖)
其中,每个自注意力被称为一个头

  • 作用:将模型分为多个头,期望形成多个相互独立的子空间,可以让模型关注不同的信息
import torch
from torch import nn

##### 使多个头可以进行并行计算,p_q = p_k = p_v = p_o/h,p_o=num_hiddens,
# 直接用nn.Linear(query_size,num_hiddens),num_hiddens=p_v*h,即多个线性变换结合在一起

 # 假设输出维度为num_hiddens,同时h*p_v = num_hiddens
def transpose_qkv(X, num_heads): # 将组合起来的输入,变换为num_heads个输入
    # 输入X的shape为(batch_size,查询或者“键值对”的个数,num_hiddens)
    # 输出X的shape为(batch_size,查询或者“键值对”的个数,num_heads,num_hiddens/num_heads) 
    X = X.reshape(X.shape[0],X.shape[1], num_heads,-1)
    # 输出X的形状:(batch_size,num_heads,查询或者“键-值”对的个数,
    # num_hiddens/num_heads)
    X = X.permute(0,2,1,3)
    # 最终输出的形状:(batch_size*num_heads,查询或者“键-值”对的个数,
    # num_hiddens/num_heads)
    return X.reshape(-1,X.shape[2],X.shape[3])

def transpose_output(X,num_heads): # 将组合起来的输出,变换为num_heads个输出
    """逆转transpose_qkv函数的操作"""
    X = X.reshape(-1,num_heads,X.shape[1].X.shape[2])
    X = X.permute(0,2,1,3)
    return X.reshape(X.shape[0], X.shape[1],-1)
    
    
class MultiHeadAttention(nn.Module):
    def __init__(self,key_size,query_size,value_size,num_hiddens,num_heads,dropout,bias=False,**kwargs)
    super(MultiHeadAttention,self).__init__(**kwargs)
    self.num_heads = num_heads
    self.attendtion = DotProductAttendtion(droupout)
    self.W_q = nn.Linear(query_size,num_hiddens, bias)
    self.W_k = nn.Linear(key_size,num_hiddens, bias)
    self.W_v = nn.Linear(value_size,num_hiddens, bias)
    self.W_o = nn.Linear(num_hiddens,num_hiddens, bias)
    
   def forward(self,queries, keys, values, valid_lens):
    # queries,keys,values的形状:
        # (batch_size,查询或者“键-值”对的个数,num_hiddens)
    # valid_lens 的形状:
        # (batch_size,)或(batch_size,查询的个数)
    # 经过变换后,输出的queries,keys,values 的形状:
        # (batch_size*num_heads,查询或者“键-值”对的个数,
        # num_hiddens/num_heads)
        
    queries = transpose_qkv(self.W_q(queries),self.num_heads)
    keys = transpose_qkv(self.W_k(keys),self.num_heads)
    values = transpose_qkv(self.W_v(values),self.num_heads)
    
    if valid_lens is not None:
        # 按行重复num_heads遍
        valid_lens = torch.repeat_interleave(
                valid_lens, repeats=self.num_heads, dim=0)
    
    output = self.attention(queries,keys, values,valid_lens)
    
    output_concat = transpose_output(output, self.num_heads)
    return self.W_o(output_concat)

位置编码

作用:self-attention能够看到全局信息,忽略了顺序关系,为了使用序列的顺序信息,通过在输入表示中添加位置编码(positional encoding)来注入绝对的或相对的位置信息

假设输入 X ∈ R n × d X\in \mathcal{R}^{n\times d} XRn×d表示一个序列中 n n n个词元的 d d d维嵌入表示。位置编码使用与输入 X X X相同形状的位置嵌入矩阵 P ∈ R n × d P\in \mathcal{R}^{n\times d} PRn×d表示

固定位置编码:
P i , 2 j = s i n ( i 1000 0 2 j / d ) P_{i,2j}=sin(\frac{i}{10000^{2j/d}}) Pi,2j=sin(100002j/di)
P i , 2 j + 1 = c o s ( i 1000 0 2 j / d ) P_{i,2j+1}=cos(\frac{i}{10000^{2j/d}}) Pi,2j+1=cos(100002j/di)
即对于每个词元,奇数维度采用 c o s cos cos函数,偶数维度采用 s i n sin sin函数
包含以下两种信息

  • 绝对位置信息:( i , j i,j i,j分别表示词元在序列中的位置、位置编码的维度)

位置编码信息

  • 相对位置信息:
    对于任何确定的位置偏移 δ \delta δ,位置处 i + δ i+\delta i+δ的位置编码可以线性投影位置 i i i处的位置编码来表示。
    ( P i , 2 j , p i , 2 j + 1 ) → ( p i + δ , p i + δ , 2 j + 1 ) ) (P_{i,2j},p_{i,2j+1}) \to (p_{i+\delta},p_{i+\delta,2j+1})) (Pi,2j,pi,2j+1)(pi+δ,pi+δ,2j+1))
    在这里插入图片描述

缺点:当词嵌入维度较大时,较大维度的位置编码值完全一致

Layer normalization

因为神经网络的Block大部分都是矩阵运算,一个向量经过矩阵运算后值会越来越大,为了网络的稳定性,我们需要及时把值拉回正态分布。归一化的方式可以分为:

  • BatchNorm就是通过对batch size这个维度归一化来让分布稳定下来。
  • LayerNorm则是通过对Hidden size这个维度归一化来让某层的分布稳定。独立于batch size的算法,所以无论样本数多少都不会影响参与LN计算的数据

原因:神经网络的学习过程中,对于神经网络中间的每一层,其前面层的参数在学习中会不断改变,导致其输出也在不断改变,不利于这一层及后面层的学习,学习收敛速度会变慢,就会出现Internal Covariate Shift(内部协变量偏移). 随着网络的层数不断增大,这种误差就会不断积累,最终导致效果欠佳。

更多可见Batch normalization和Layer normalization

Resnet(Add)

  1. 在模型能够收敛的情况下,网络越深,模型的准确率越低,同时,模型的准确率先达到饱和,此后迅速下降。称之为网络退化(Degradation),resnet能够有效训练出更深的网络模型(可以超过1000层),使得深网络的表现不差于浅网络,避免网络退化。
  2. 避免梯度消失/爆炸(主要通过归一化初始化和中间规归一化层来解决)

结构如下:
在这里插入图片描述
使数据可以跨层流动,残差模块的输出为:
H ( x ) = F ( x ) + x H(x)=F(x)+x H(x)=F(x)+x
其中, F ( x ) F(x) F(x)为残差函数,在网络深层的时候,在优化目标的约束下,模型通过学习使得逼近0(residule learning),让深层函数在学到东西的情况下,又不会发生网络退化的问题。

更多可见:ResNet(残差网络)几个关键问题的理解

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用AI自动生成PPT提高制作效率

使用AI自动生成PPT提高制作效率 在制作PPT方面,很多制作者都会轻易跳进一个怪圈:“我要制作一个关于关爱老人的PPT,该怎么做呢,有模板没有?”这个会涉及很多逻辑需要经过不断的思考,制作PPT要通过很多素材、使用技巧、…

【报错】检索 COM 类工厂中 CLSID 为 {28E68F9A-8D75-11D1-8DC3-3C302A000000} 的组件失败错误

情况描述 在使用C#进行工控软件开发,需要连接通过OPC连接DCS系统时,需要通过visual studio的NuGet包管理器添加OpcAutomation,如下图所示: 这样便可以实现通过C#连接读取数据。但是在通过C#连接OPC server时,会出现错…

性能压力测试:企业成功的关键要素

性能压力测试在现代企业软件开发中扮演着至关重要的角色,它不仅仅是一项技术手段,更是保障企业成功的关键要素。本文将探讨性能压力测试在企业中的重要性,并阐述其对业务稳定性、用户体验和品牌声誉的影响。 一、保障业务稳定性 1、应对高负载…

java数据结构与算法刷题-----LeetCode96. 不同的二叉搜索树

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 很多人觉得动态规划很难,但它就是固定套路而已。其实动态规划只…

走迷宫之推箱子

前言: 在上一篇文章当中我介绍了一个走迷宫的写法,但是那个迷宫没什么可玩性和趣味性,所以我打算在迷宫的基础上加上一个推箱子,使之有更好的操作空间,从而增强了游戏的可玩性和趣味性。 1. 打印菜单 void menu() {…

[WUSTCTF2020]alison_likes_jojo 1

BUUCTF:https://buuoj.cn/challenges 题目描述: 得到的 flag 请包上 flag{} 提交。 感谢 Iven Huang 师傅供题。 比赛平台:https://ctfgame.w-ais.cn/ 密文: 下载附件解压,得到两张jpg图片和一个文本文件。 解题思路&#x…

HNU-编译原理-实验2-Bison

编译原理实验2Bison 计科210X 甘晴void 202108010XXX 实验要求 详细的实验项目文档为 https://gitee.com/coderwym/cminus_compiler-2023-fall/tree/master/Documentations/lab2 实验步骤 本次实验需要在 Lab1 已完成的 flex 词法分析器的基础上,进一步使用 b…

【Java】源码文件开头添加注释

需求 应公司质量部要求,需要对代码做静态检查。质量部要求,源码文件必须在起始行起设置一些注释,然而项目已经开发了一年之久,且没有维护这个注释。 此时,面对好几千个源码文件,我们如何快速添加相应的注…

滑块拖动验证

效果 代码 svg图标 初始图标 <svg t"1705397535958" class"icon" viewBox"0 0 1024 1024" version"1.1" xmlns"http://www.w3.org/2000/svg" p-id"1492" width"200" height"200">&l…

Kubernetes核心实战

kubernetes&#xff08;一&#xff09;概述与架构 kubernetes&#xff08;二&#xff09;创建集群 云原生实战 语雀 官网 Kubernetes 文档 | Kubernetes B站课程&#xff1a;https://www.bilibili.com/video/BV13Q4y1C7hS/?p41 1.Namespace 名称空间&#xff0c;用来对集群…

【书生·浦语】大模型实战营——LMDeploy 大模型量化部署实战

大模型部署背景 大模型部署是指将训练好的模型在特定的软硬件环境中启动的过程&#xff0c;使模型能够接收输入并返回预测结果。大模型的内存开销巨大&#xff0c;7B模型仅权重需要14G内存。另外大模型是自回归生成&#xff0c;需要缓存Attention的 k/v。 LMDeploy 简介 推理性…

SpringMVC请求源码分析

文章目录 一、SpringMVC简介1. 概念2. 从Servlet到SprigMVC3. SpringMVC的XML实现4. SpringMVC的请求流程 二、SpringMVC源码分析1. SpringMVC启动流程验证2. 细节补充 一、SpringMVC简介 1. 概念 官网介绍 Spring Web MVC is the original web framework built on the Servl…

【Leetcode】82. 删除排序链表中的重复元素 II

文章目录 题目思路代码 题目 82. 删除排序链表中的重复元素 II 题目&#xff1a;给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,…

uni-app的项目创建和环境搭建

uni-app 是一个使用 Vue.js 开发所有前端应用的框架&#xff0c;开发者编写一套代码&#xff0c;可发布到iOS、Android、Web&#xff08;响应式&#xff09;、以及各种小程序&#xff08;微信/支付宝/百度/头条/飞书/QQ/快手/钉钉/淘宝&#xff09;、快应用等多个平台。 第一步…

Linux的权限(1)

目录 操作系统的"外壳"程序 外壳程序是什么&#xff1f; 为什么存在外壳程序&#xff1f; 外壳程序怎么运行操作&#xff1f; 权限 什么是权限&#xff1f; 权限的本质&#xff1f; Linux中的&#xff08;人&#xff09;用户权限&#xff1f; su和su -的区别…

C for Graphic:Sliced Circle Image

不做UI不知道&#xff0c;没想到时至今日&#xff0c;ugui居然没有sliced filled image模式&#xff0c;用circle做filled&#xff0c;不能用sliced九宫格图&#xff0c;导致每次使用这个效果必须一张新图&#xff0c;何其浪费资源。 原始功能如下&#xff1a; 我…

Python数据分析案例34——IMDB电影评论情感分析(Transformer)

电影评论的情感分析 案例背景 很多同学对电影系列的数据都比较喜欢&#xff0c;那我就补充一下这个最经典的文本分类数据集&#xff0c;电影情感评论分析。用神经网络做。对国外的英文评论文本进行分类&#xff0c;看是正面还是负面情感。 数据集介绍 数据集&#xff1a;IMDb…

PY32C613单片机简单介绍,高性能 32 位 ARM M0+内核,主频最高48M

PY32C613单片机是普冉新推出的高性能的 32 位 ARM Cortex-M0 内核&#xff0c;宽电压工作范围的 MCU。价格在市场上非常有竞争性&#xff0c;外设非常的丰富。PY32C613嵌入高达 64 Kbytes flash 和 8 Kbytes SRAM 存储器&#xff0c;最高工作频率 48 MHz&#xff0c;QFN20封装。…

uniapp 图片保持宽高比,撑满屏幕宽度

image 标签添加 mode"widthFix" <image mode"widthFix" :src"detailData.coverImageURL" />image 标签添加样式 image {width: 100%;height: auto; }

x-cmd pkg | sd - sed 命令的现代化替代品

目录 简介首次用户快速上手主要特点进一步阅读 简介 sd 是一个基于正则表达式的搜索和替换文本的命令行工具&#xff0c;类似于 sed&#xff0c;但 sd 使用更简单&#xff0c;对用户更为友好。 首次用户快速上手 使用 x sd 即可自动下载并使用 在终端运行 eval "$(curl …