Transformer面试十问

1 Scaled Dot-Product Attention中为什么要除以 d k \sqrt{d_k} dk ?

1. 从纯数学上考虑:对于输入均值为0,方差为1的分布,点乘后结果其方差为dk,所以需要缩放一下。下图为原论文注释。
Attention is all you need
2. 从神经网络上考虑:防止在计算点积时数值过大,导致后续应用 softmax 函数时出现梯度消失的问题。
在这里插入图片描述
计算点积时,如果Q K的元素值和dk的值都很大,那么点积的结果可能会非常大,导致 softmax 函数的输入变得非常大。
softmax 函数在处理很大的输入值时,会使输出的概率分布接近0或1,这会造成梯度非常小,难以通过梯度下降有效地训练模型,即出现梯度消失问题。
通过使用dk缩放点积的结果,可以使点积的数值范围被适当控制。

2 Transformer 的基本组成是什么?

在这里插入图片描述

Transformer分为encoder和decoder两个部分。
Encode包含self-attention和前馈神经网络,用于提取特征;
Decoder在自注意力和前馈神经网络中间多了一个cross-attention,用于和encoder的输出做交互。

3 多头注意力机制如何实现?

在这里插入图片描述

每个头独立地在相同的输入上计算注意力权重,最后把所有头的输出合并。每个头关注一部分的特征,类似于卷积中通道的作用。

import torch
import torch.nn as nn
import torch.nn.functional as Fclass MultiHeadAttention(nn.Module):def __init__(self, embed_size, heads):super(MultiHeadAttention, self).__init__()self.embed_size = embed_sizeself.heads = headsself.head_dim = embed_size // headsassert (self.head_dim * heads == embed_size), "Embedding size needs to be divisible by heads"# Separate linear layers for values, keys, and queries for each headself.values = nn.Linear(self.head_dim, self.head_dim, bias=False)self.keys = nn.Linear(self.head_dim, self.head_dim, bias=False)self.queries = nn.Linear(self.head_dim, self.head_dim, bias=False)self.fc_out = nn.Linear(heads * self.head_dim, embed_size)def forward(self, values, keys, query):N = query.shape[0]  # Number of examplesvalue_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1]# Split embeddings into self.heads piecesvalues = values.reshape(N, value_len, self.heads, self.head_dim)keys = keys.reshape(N, key_len, self.heads, self.head_dim)queries = query.reshape(N, query_len, self.heads, self.head_dim)# Apply linear transformation (separately for each head)values = self.values(values)keys = self.keys(keys)queries = self.queries(queries)# Attention mechanism (using torch.matmul for batch matrix multiplication)# Calculate attention scoreattention = torch.matmul(queries, keys.transpose(-2, -1)) / torch.sqrt(torch.tensor(self.head_dim, dtype=torch.float32))attention = F.softmax(attention, dim=-1)# Apply attention weights to valuesout = torch.matmul(attention, values)# Concatenate headsout = out.reshape(N, query_len, self.heads * self.head_dim)# Final linear layerout = self.fc_out(out)return out# Example usage
embed_size = 256
heads = 8
N = 1  # Batch size
sentence_length = 5  # Length of the input sequence
model = MultiHeadAttention(embed_size, heads)# Dummy input (batch size, sentence length, embedding size)
x = torch.rand((N, sentence_length, embed_size))# Forward pass
out = model(x, x, x)  # In self-attention, queries, keys, values are all the sameprint("Input shape:", x.shape)
print("Output shape:", out.shape)

4 训练过程为什么需要 Mask 机制?

两个原因。

  1. 屏蔽未来信息,防止未来帧参与训练。
  2. 处理不同长度的序列,在批处理时对较短的序列进行填充(padding),并确保这些填充不会影响到模型的输出。

5 mask机制如何实现?

  1. 屏蔽未来信息的 Mask:在自注意力层中,通过构造一个上三角矩阵(对于解码器),其中上三角部分(包括对角线,取决于具体实现)被设置为非常大的负数,这样在通过 softmax 层时,这些位置的权重接近于0,从而在计算加权和时不考虑未来的词。

  2. Padding Mask:将填充位置的值设置为一个大的负数,使得经过 softmax 层后,这些位置的权重接近于0。

6 Transformer 中的Positional Encoding有什么作用?

保证attention机制考虑序列的顺序,否则无法区分不同的位置的相同的输入。

7 Transformer 如何处理长距离依赖问题?

Transformer 通过自注意力机制直接计算序列中任意两个位置之间的依赖关系,从而有效地解决了长距离依赖问题。

8 Layer Normalization的作用是什么?

Layer Normalization有助于稳定深层网络的训练,通过对输入的每一层进行标准化处理(使输出均值为0,方差为1),可以加速训练过程并提高模型的稳定性。它通常在自注意力和前馈网络的输出上应用。

9 能否用Batch Normalizatioin?

在 Transformer 架构中,层归一化(Layer Normalization,简称 LayerNorm)是首选的归一化方法,主要用于模型内部的每一层之后。理论上,层归一化可以被批归一化(Batch Normalization,简称 BatchNorm)替换,但是这两种归一化技术在应用上有着本质的不同,这些差异导致了在 Transformer 中通常优先选择层归一化而不是批归一化。

层归一化(Layer Normalization)

  • 层归一化是对每个样本的所有特征执行归一化操作,独立于其他样本。这意味着,无论批次大小如何,LayerNorm 的行为都是一致的。
  • 在处理序列数据和自注意力机制时,LayerNorm 更加有效,因为它能够适应不同长度的输入,这在自然语言处理任务中尤为重要。
  • LayerNorm 直接在每个样本的维度上工作,使得它在序列长度变化的情况下更为稳定。

批归一化(Batch Normalization)

  • 批归一化是在一个小批量的维度上进行归一化,这意味着它依赖于批次中所有样本的统计信息。因此,BatchNorm的行为会随着批次大小和内容的变化而变化,这在训练和推理时可能导致不一致的表现。
  • 在处理变长序列和自注意力结构时,BatchNorm可能不如 LayerNorm 高效,因为变长输入使得批次间的统计信息更加不稳定。
  • BatchNorm在训练时计算当前批次的均值和方差,在推理时使用整个训练集的移动平均统计信息。这种依赖于批次统计信息的特性使得 BatchNorm在小批量或在线学习场景中表现不佳。

10 手写Transformer中的Encoder模块

import torch
import torch.nn as nn
import torch.nn.functional as Fclass MultiHeadSelfAttention(nn.Module):def __init__(self, embed_size, heads):super(MultiHeadSelfAttention, self).__init__()self.embed_size = embed_sizeself.heads = headsself.head_dim = embed_size // headsassert (self.head_dim * heads == embed_size), "Embedding size needs to be divisible by heads"self.values = nn.Linear(self.head_dim, self.head_dim, bias=False)self.keys = nn.Linear(self.head_dim, self.head_dim, bias=False)self.queries = nn.Linear(self.head_dim, self.head_dim, bias=False)self.fc_out = nn.Linear(heads * self.head_dim, embed_size)def forward(self, values, keys, queries):N = queries.shape[0]value_len, key_len, query_len = values.shape[1], keys.shape[1], queries.shape[1]# Split the embedding into self.heads different piecesvalues = values.reshape(N, value_len, self.heads, self.head_dim)keys = keys.reshape(N, key_len, self.heads, self.head_dim)queries = queries.reshape(N, query_len, self.heads, self.head_dim)values = self.values(values)keys = self.keys(keys)queries = self.queries(queries)# Attention mechanism#attention = torch.einsum("nqhd,nkhd->nhqk", [queries, keys])attention = torch.matmul(queries, keys.transpose(-2, -1)) / torch.sqrt(torch.tensor(self.head_dim, dtype=torch.float32))attention = F.softmax(attention / (self.embed_size ** (1 / 2)), dim=3)out = torch.matmul(attention, values).reshape(N, query_len, self.heads * self.head_dim)# out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape(N, query_len, self.heads * self.head_dim)out = self.fc_out(out)return outclass TransformerBlock(nn.Module):def __init__(self, embed_size, heads, dropout, forward_expansion):super(TransformerBlock, self).__init__()self.attention = MultiHeadSelfAttention(embed_size, heads)self.norm1 = nn.LayerNorm(embed_size)self.norm2 = nn.LayerNorm(embed_size)self.feed_forward = nn.Sequential(nn.Linear(embed_size, forward_expansion * embed_size),nn.ReLU(),nn.Linear(forward_expansion * embed_size, embed_size),)self.dropout = nn.Dropout(dropout)def forward(self, value, key, query):attention = self.attention(value, key, query)x = self.dropout(self.norm1(attention + query))forward = self.feed_forward(x)out = self.dropout(self.norm2(forward + x))return outclass Encoder(nn.Module):def __init__(self,embed_size,num_layers,heads,device,forward_expansion,dropout,):super(Encoder, self).__init__()self.embed_size = embed_sizeself.device = deviceself.layers = nn.ModuleList([TransformerBlock(embed_size,heads,dropout=dropout,forward_expansion=forward_expansion,)for _ in range(num_layers)])self.dropout = nn.Dropout(dropout)def forward(self, x):out = self.dropout(x)for layer in self.layers:out = layer(out, out, out)return out# Hyperparameters
embed_size = 512
num_layers = 6
heads = 8
device = "cuda" if torch.cuda.is_available() else "cpu"
forward_expansion = 4
dropout = 0.1# Example
encoder = Encoder(embed_size, num_layers, heads, device, forward_expansion, dropout).to(device)

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

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

相关文章

安装配置NMon

NMon(Nigel’s Monitor)是一款由IBM公司提供的免费性能监控工具,专门用于监控AIX系统和Linux系统的资源使用情况 下载软件 wget http://sourceforge.net/projects/nmon/files/nmon16p_binaries.tar.gz 如果报错的话,安装提示添加…

vue的生命周期图解

vue的生命周期图解 添加链接描述 vue的生命周期函数及过程的简述: vue的生命周期函数,其实就是vm的生命周期; 创建:beforeCreate、created 挂载:beforeMount、mounted 更新:beforeUpdate、updated [ˌʌpˈ…

【Java EE初阶十七】网络原理(二)

2. 传输层 2.2 TCP协议 2.2.2 关于可靠传输 4.滑动窗口 前面的三个机制,都是在保证 tcp 的可靠性; TCP 的可靠传输,是会影响传输的效率的.(多出了一些等待 ack 的时间,单位时间内能传输的数据就少了); 滑动窗口,就让可靠传输对性能的影响,更…

什么是FTC能效标签? FTC能效标签办理流程是怎么样?

亚马逊美国站能源标签FTC 什么是FTC及历史背景 Federal TradeCommission(FTC)是美国联邦贸易委员会,是执行多种反托拉斯和保护消费者法律的联邦机构。其目的是确保国家市场行为具有竞争性,且繁荣、 高效地发展,不受不合理的约束。美国联邦贸易…

前端工程化面试题 | 10.精选前端工程化高频面试题

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

赋能AI原生应用开发:百度智能云千帆AppBuilder正式开放服务

为满足企业敏捷、高效地进行AI原生应用开发的需求,降低AI原生应用开发门槛,百度智能云千帆AppBuilder正式开放服务。戳我体验 AppBuilder将大模型开发AI原生应用的常见模式、工具、流程,沉淀成一个工作台,帮助开发者聚焦业务本身…

【网络安全】什么样的人适合学?该怎么学?

有很多想要转行网络安全或者选择网络安全专业的人在进行决定之前一定会有的问题: 什么样的人适合学习网络安全?我适不适合学习网络安全? 当然,产生这样的疑惑并不奇怪,毕竟网络安全这个专业在2017年才调整为国家一级…

C++初阶:容器适配器介绍、stack和queue常用接口详解及模拟实现

介绍完了list类的相关内容后:C初阶:适合新手的手撕list(模拟实现list) 接下来进入新的篇章,stack和queue的介绍以及模拟: 文章目录 1.stack的初步介绍2.stack的使用3.queue的初步介绍4.queue的使用5.容器适…

rust函数 stuct struct方法 关联函数

本文结合2个代码实例主要介绍了rust函数定义方法,struct结构体定义、struct方法及关联函数等相关基础知识。 代码1: main.rc #[derive(Debug)]//定义一个结构体 struct Ellipse {max_semi_axis: u32,min_semi_axis: u32, }fn main() {//椭圆&#xff0…

micro-app以UMD js链接方式引入使用

npm 下载好micro-zoe/micro-app后,找到index.umd.js: 新建一个测试html,引入并使用: 参考: 微组件实践 - 掘金

外汇110:外汇做空是什么意思?如何运作?一文读懂

外汇市场允许卖空,就像众多金融市场一样。但什么是卖空呢?如何外汇做空?在本文中,我们将讨论如何做空货币。什么是外汇做空? 外汇做空(Short Selling)是外汇市场上的一种投资方式。它指的是投资…

深度学习系列58:大模型训练和压缩

1. 大模型训练 1.1数据并行 1.2 模型并行 1.3 ZeRO 1.4 流水线并行 1.5 混合精度训练 1.6 offloading 把梯度放在cpu上保存和计算 1.7 overlapping 提前传输数据 1.8 checkpointing 中间线性层不保存,反向传播时再次重新计算 1.9 使用BMtrain 2. 大模型压…

蝶阀、球阀、阀门百科

一、D71X是蝶阀的型号其中D 就代表了蝶阀,7 代表是对夹式链接,1代表这个蝶阀是中线结构,x就是密封面材质为橡胶。结合起来D71X表示的就是手柄对夹中线蝶阀。 二、J41H-100C型号字母含义介绍 J41H-100C型号是德特森阀门常用的高压截止阀型号字母代表的意思是: J——代表阀门类…

MCU中断控制

目录 一、中断相关基础知识 1、NVIC:嵌套向量中断控制器 2、可屏蔽中断和不可屏蔽中断的区别 3、中断优先级 4、常见特殊中断 二、中断相关寄存器 三、中断使用步骤: 一、中断相关基础知识 1、NVIC:嵌套向量中断控制器 (1) 它是内核的…

Windows Server 2012 评估版和Windows Server 2019 评估版 升级为正式版(工作v笔记v分享)

Windows Server 2012 评估版和Windows Server 2019 评估版是微软提供的试用版本,可以免费下载和使用一段时间。当使用评估版时,可以在适当的时候将其升级为正式版,以便继续使用并享受完整的功能。 要将评估版升级为正式版,可以按…

基于ArcGIS Pro SDK的MVVM架构

示例结果展示 文件夹创建 相对于原始C#,少了Command文件夹里的类。该文件中的RelayCommand使用 ArcGIS.Desktop.Framework Properties属性配置,主要用于设置执行程序路径(自带文件夹) DarkImages用于存放深色图片(自…

面试经典150题【1-10】

文章目录 面试经典150题【1-10】88. 合并两个有序数组27.移除元素26.删除有序数组中的重复项80.删除有序数组中的重复项II169.多数元素189.轮转数组121.买卖股票的最佳时机1122. 买卖股票的最佳时机 II55.跳跃游戏![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/ff…

nvm安装配置环境

前言 对于前端开发人员来说,多个项目可能用的不同的node版本,如何方便快速的转换版本,nvm版本管理工具的出现,解决这个问题。 实战 1. 搜索nvm版本,我用的1.1.2,下载后直接安装。 2.在d盘建立nvm空文件…

uniapp H5唤起手机App 中间下载页

我这里直接是打开中间下载页,在下载页判断手机是否已存在App,有则唤起App,没有则可点击下载按钮下载app。 唤起App的关键语句是:window.location.href scheme Scheme链接格式样式: [scheme]://[host]/[path]?[que…

蓝桥杯:C++队列、优先队列、链表

C普通队列 算法竞赛中一般用静态数组来模拟队列,或者使用STL queue。使用C的STL queue时,由于不用自己管理队列,因此代码很简洁。队列的部分操作如下。 C优先队列 很多算法需要用到一种特殊的队列:优先队列。它的特点是最优数据…