Transformer架构笔记

devtools/2024/11/24 7:47:48/

Attention is All You Need.


3.Model Architecture

3.1 整体架构如图

在这里插入图片描述

3.2 Encoder与Decoder

  • Encoder:由 N = 6 N=6 N=6个相同的Block/Layer堆叠而成。每个Block有两个子层sub-layer:多头注意力和MLP(FFN,前馈神经网络),每个子层被一个残差链接包围,且后接一个LayerNorm。由于残差链接要求被包围的Block输入输出shape一致(比如Resnet中利用PWConv达到降维、尺寸缩减,来保证输入输出的shape一致)。多头注意力层和FFN层就要满足此条件,因此作者选择固定网络中的Embedding dimension为512。每个子层的输出可以用公式表示为 LayerNorm ( x + SubLayer ( x ) ) \text{LayerNorm}(x + \text{SubLayer}(x)) LayerNorm(x+SubLayer(x)) x x x为输入。

Q: SliceGPT如何解决各层hidden dimension一致的问题?

  • Decoder:同样为6个Block。有两个多头注意力子层,一个FNN子层。且使用自回归的方式:t时刻Decoder的输入,为t时刻以前所有Decoder的输出的总和

    • masked self multi-head attention: mask样本t时刻以后的输入,保证t时刻无法看到未来的输入,避免模型“作弊”。理解起来很简单,因为预测第i个位置的输出时只能依靠第i个位置以前的所有输出单词的语义信息
  • 为什么用LN而不是BN?
    BN针对特征做归一化,LN则针对样本。LN在机器翻译中会用的更多,主要是因为输入序列的长度通常不一致。(在训练中,使用zero padding来解决输入长度不一致的问题)。如果一个batch中输入序列的长度差异很大,则得到的mean,square也会产生震荡。并且在预测时,由于使用全局的mean square,如果输入序列很长,比train set的序列都要长,则预测效果也会变差(因为之前没有统计过)。

3.3 Attention

概括来说,Attention就是一个将query,key,value映射为output的函数。output,k,v,q均为矩阵/向量。output为value的加权平均,权重由key和query的相似度函数计算得到,不同的attention实现会有不同的计算相似度的方法。

  • 注:这里的query,key,value都是指attention的输入。当然有些文章也会指Attention中q, k, v对应的权重矩阵。这里需要指出,输入的shape一般都是一样的: x ∈ R N × d model x \in R^{N \times d_{\text{model}}} xRN×dmodel。其中 N N N为序列长度, d model d_{\text{model}} dmodel为embedding长度。如果是权重矩阵,比如key的 w k ∈ R d model × d k w_k \in R^{d_{\text{model}}\times d_{\text{k}}} wkRdmodel×dk,相当于把输入 x x x投影到另一个维度 d m o d e l → d k d_{model} \to d_k dmodeldk

3.3.1 Scaled Dot-Product Attention

最基本的Attention。 Q Q Q K K K的hidden dimension维度 d k d_k dk V V V d v d_v dv,计算 K K K Q Q Q的内积作为 V V V的权重。具体公式如下:

Attention ( Q , K , V ) = softmax ( Q K T d k ) V (1) \text{Attention}(Q,K,V)=\text{softmax}(\frac{QK^T}{\sqrt{d_k}})V \tag1 Attention(Q,K,V)=softmax(dk QKT)V(1)

Q , K , V Q, K, V QKV 在这里就是输入乘以权重矩阵后的结果: Q ∈ R N × d k , K ∈ R d k × m , V ∈ R m × d v Q \in R^{N \times d_k}, K \in R^{d_k \times m}, V \in R^{m \times d_v} QRN×dkKRdk×mVRm×dv。比如 Q = x w k Q = xw_k Q=xwk

Scaled:除以了 d k \sqrt{d_k} dk 。当 d k d_k dk很大时,维度数过多,各个值可能差别很大,softmax后大的值很大,小的值很小,softmax函数的梯度,会变得很小,train不动。(这个具体是根据softmax函数的一次函数来看)。

  • Mask:mask掉的是key-value,即对t时刻以后的key-query weight设为0(即进入softmax前设一个很大的负数)。

3.3.2 多头注意力

将高维的 Q , V , K Q,V,K QVK(输入)投影到低维,投影h次分别得到h个低维的 Q , V , K Q,V,K QVK,再分别做attention(相当于h个头),把h个头的attention输出并在一起,然后投影回原维度。多头注意力能让模型学习更多参数,相当于学习不同角度的信息。

示意图如Figure 2右图所示:h个头的attention。原特征维度 d model d_\text{model} dmodel,则投影后的维度为 d model / h = d k = d v d_\text{model} / h = d_k = d_v dmodel/h=dk=dv K , Q , V K,Q,V KQV经投影矩阵(权重矩阵),也就是Linear层降维后送入Attention,将h个头的Attention拼接,再经过最后的Linear升维度,得到输出。原文中 h = 8 , d model = 512 , d k = d v = 64 h=8, \ d_\text{model}=512, \ d_k = d_v = 64 h=8, dmodel=512, dk=dv=64为每个头的hidden dimension长度。

在这里插入图片描述

Attention的参数量。https://blog.csdn.net/qq_46009046/article/details/134417286

具体Multi-Head实现如以下公式:
M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) W O w h e r e h e a d i = A t t e n t i o n ( Q W i Q , K W i K , V W i V ) \begin{aligned} \mathrm{MultiHead}(Q,K,V)& =\mathrm{Concat}(\mathrm{head}_1,...,\mathrm{head}_\mathrm{h})W^O \\ \mathrm{where~head_i}& =\mathrm{Attention}(QW_{i}^{Q},KW_{i}^{K},VW_{i}^{V}) \end{aligned} MultiHead(Q,K,V)where headi=Concat(head1,...,headh)WO=Attention(QWiQ,KWiK,VWiV)

W i Q ∈ R d m o d e l × d k , W i K ∈ R d m o d e l × d k , W i V ∈ R d m o d e l × d v W_i^Q\in\mathbb{R}^{d_{\mathrm{model}}\times d_k},W_i^K\in\mathbb{R}^{d_{\mathrm{model}}\times d_k},W_i^V\in\mathbb{R}^{d_{\mathrm{model}}\times d_v} WiQRdmodel×dk,WiKRdmodel×dk,WiVRdmodel×dv W O ∈ R h d v × d m o d e l W^O\in\mathbb{R}^{hd_v\times d_{\mathrm{model}}} WORhdv×dmodel均为权重矩阵(投影矩阵)。 Q , K , V ∈ R N × d m o d e l Q ,\ K,\ V \in \mathbb{R}^{N \times d_{model}} Q, K, VRN×dmodel

3.3.3 Attention的不同应用

假设输入序列长为 N N N

  1. Encoder:输入shape为 R ∈ N × d model R \in {N \times d_\text{model}} RN×dmodel。输出shape与输入相同。

  2. Decoder中的Masked-MHSA:与Encoder中的attention类似,不过用了mask保证自回归性。

  3. Cross-Attention:Encoder的输出作为key-value,之前的Decoder输出信息的总和得到的embedding作为query,相当于考虑decoder与encoder的embedding之间的相关性。具体到机器翻译中,如英译中,就是中文某个字与英文某个句子(多个字)的关系。

3.4 Point-Wise FFN

简而言之就是两个全连接层。Point指的是每个word embedding,即针对每个word做处理。与PWConv类似但参数量不同。
PWFFN为: in_embedding × out_embedding \text{in\_embedding} \times \text{out\_embedding} in_embedding×out_embedding,而PWConv为: in_channel × out_channel \text{in\_channel} \times \text{out\_channel} in_channel×out_channel
为什么能用Point-Wise FFN,也就是对每个word做投影?因为Attention部分已经汇聚了语义信息(词与词之间的相关度),MLP相当于只是做维度的变换。

3.5 Embeddings and Softmax

embedding层中权重乘以 d model \sqrt{d_\text{model}} dmodel ,因为L2Norm把权重惩罚得很小。

3.6 Positional Encoding

Attention中没有考虑单词的位置信息,所以理论上来说,如果不加入位置信息,把输入word顺序打乱之后,attention输出应该一致。所以要加入位置编码信息。

预测过程:

Encoder:直接获得整个句子的输入的Embedding,经过6个block,然后得到Encoder的输出,比较直接。
Decoder:先输入起始符(S),经过n层decoder,每一层decoder都要通过masked自注意力机制,以及交互注意力机制(和encoder输出的k,v进行计算,这里就说明decoder在交互注意力不需要再算k,v),在最后一层输出预测结果。然后把最新的预测结果以及历史预测结果综合起来,再放到decoder中,做下一个word的预测,直到得到终止符(E)。

训练过程

Encoder:与预测过程类似。

Decoder:与预测过程不同的是,采用Teacher Forcing的方式,即直接告诉Decoder整个目标序列(也就是正确的输出结果),但是由于预测阶段中,不可能直接告诉你答案是上面,因此会加一些随机mask,比如对15%的单词加入mask,以保证训练效果。


文献标注

Attention的参数数量: https://blog.csdn.net/qq_46009046/article/details/134417286

Attention的训练,推理过程: https://blog.csdn.net/AIcar_lrm/article/details/138577652


问题

  1. auto regressive 是什么意思?

    自回归模型:自变量和因变量应当属于同一个分布。比如根据前n天的股票价格,预测下一天的股票价格。(过去时候的输入作为当前时刻的输入)

  2. 为什么要除以 d k \sqrt {d_k} dk ?
    • 在数值过大/过小的情况下,softmax的偏导数值过小,造成学习困难。除以$\sqrt {d_k} $相当于将输入控制在均值为0,方差为1,控制了数量级。还起到了归一化的作用
  3. BN和LN是什么。Transformer中用的是什么?

    LN:对每个Batch中,所有样本基于所有维度进行归一化,均值和方差数量根据batch_size决定()。
    BN:对各个Batch中的样本,在各个维度进行归一化,均值和方差数量根据batch中的word数量决定(图片的话是维度)。
    使用的实际上是InstanceNorm,对每个instance的所有维度做归一化,但是pytorch中可以用nn.LayerNorm函数实现

实现细节:

  • d m o d e l = 512 d_{model}=512 dmodel=512,模型中的embedding dimension和output的维度固定为512,以保证训练效率
  • h = 8 h = 8 h=8代表使用8个头的注意力
    d k = d v = d m o d e l / h = 64 d_k = d_v = d_{model} / h=64 dk=dv=dmodel/h=64 为每个矩阵得到的向量维度。
    ding dimension和output的维度固定为512,以保证训练效率
  • h = 8 h = 8 h=8代表使用8个头的注意力
    d k = d v = d m o d e l / h = 64 d_k = d_v = d_{model} / h=64 dk=dv=dmodel/h=64 为每个矩阵得到的向量维度。

http://www.ppmy.cn/devtools/136495.html

相关文章

C++线程调用顺序的一些误区,以及线程资源的释放

1、 线程理解误区 #include <pthread.h> #include <stdio.h> #include <stdlib.h> pthread_mutex_t mutex1 PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t mutex2 PTHREAD_MUTEX_INITIALIZER; void* thread1_function(void* arg) {pthread_mutex_lock(&…

Node.js笔记(三)局域网聊天室构建1

目标 用户与服务端建立通信&#xff0c;服务端能检测到用户端的连接信息 代码 JS部分<chatroom.js> const express require(express) const http require(http) const {Server} require(socket.io)const app express() const se…

开源宝藏:Smart-Admin 重复提交防护的 AOP 切面实现详解

首先&#xff0c;说下重复提交问题&#xff0c;基本上解决方案&#xff0c;核心都是根据URL、参数、token等&#xff0c;有一个唯一值检验是否重复提交。 而下面这个是根据用户id&#xff0c;唯一值进行判定&#xff0c;使用两种缓存方式&#xff0c;redis和caffeine&#xff…

2024亚太杯C题宠物行业及相关产业的发展分析和策略——成品参考思路模型代码

更多资源请关注下方名片获取 1 总体分析 1.1 问题背景&#xff1a; 随着人们消费理念的发展&#xff0c;宠物行业这一新兴产业在全球范围内逐渐兴起&#xff0c;得益于经济的快速发展和人均收入的提升。1992年&#xff0c;中国小动物保护协会成立&#xff0c;随后国际宠物品…

【Ubuntu】如何在Ubuntu系统中查看端口是否可用

文章目录 前言一、使用netstat命令二、使用ss命令三、使用lsof命令四、使用nc&#xff08;netcat&#xff09;命令总结 前言 本文介绍了如何在Ubuntu系统中查看端口是否可用的方法&#xff0c;并给出了具体的命令示例&#xff0c;帮助用户通过命令行工具检测端口的开放状态。 …

论文阅读:SIMBA: single-cell embedding along with features

Chen, H., Ryu, J., Vinyard, M.E. et al. SIMBA: single-cell embedding along with features. Nat Methods 21, 1003–1013 (2024). 论文地址&#xff1a;https://doi.org/10.1038/s41592-023-01899-8 代码地址&#xff1a;https://github.com/pinellolab/simba. 摘要 大多…

⭐️ GitHub Star 数量前十的工作流项目

文章开始前&#xff0c;我们先做个小调查&#xff1a;在日常工作中&#xff0c;你会使用自动化工作流工具吗&#xff1f;&#x1f64b; 事实上&#xff0c;工作流工具已经变成了提升效率的关键。其实在此之前我们已经写过一篇博客&#xff0c;跟大家分享五个好用的工作流工具。…

SpringBoot整合SpringSecurity实现一个简单的认证与授权应用

1、SpringSecurity 的简介 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架&#xff0c;它是 Spring 项目组中用来提供安全认证服务的框架&#xff0c;能够为基于 Sprin g的企业应用系统提供声明式的安全访问控制解决方案。 Spring Security 的前身是 A…