Attention相关问题笔试解析。

Attention相关问题笔试解析。

  • 题目描述一:【选择】
  • 题目描述二:【简答】
  • 题目描述三:【代码】
  • Scaled Dot-Product Attention:下面是用PyTorch实现的一个Attention机制的代码。这个实现包括一个简单的Scaled Dot-Product Attention机制和一个Multi-Head Attention机制。
  • Multi-Head Attention:
  • 无注释背诵版:

题目描述一:【选择】

Attention 机制中,输入QKV的shape为[N,L,D],请问 输出的shape和attention score 的shape分别是多少?
A. 输出:[N,L,D] attention score: [N,L,L,D]
B.输出:[N,L,D] attention score: [N,L,L]
C.输出:[N,L,L] attention score: [N,L,L,D]
D.输出:[N,L,L] attention score: [N,L,L]

正确答案是:B
在这里插入图片描述
在这里插入图片描述

题目描述二:【简答】

Transformer的核心思想是什么?它较之前的方法有什么优势(举例说明)?他和CNN有什么联系(开放问题)?

答:
Transformer的核心思想是使用自注意力机制(Self-Attention Mechanism)来建模序列数据中的依赖关系,取代传统的递归神经网络(RNN)和卷积神经网络(CNN)在处理序列任务时的局限性。具体来说,Transformer的架构主要由编码器(Encoder)和解码器(Decoder)组成,每个编码器和解码器模块由多头自注意力机制(Multi-Head Self-Attention Mechanism)和前馈神经网络(Feed-Forward Neural Network)组成。
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
总结:
Transformer通过自注意力机制实现了高效的序列建模,克服了RNN在长距离依赖和并行处理上的局限性。它在自然语言处理(如机器翻译、文本生成)和其他序列任务中表现出色。虽然与CNN在结构上不同,但两者都能高效地进行特征提取和处理,并利用并行计算加速训练和推理过程。

题目描述三:【代码】

请使用torch 或者numpy 编写attention机制。QKV都是三维张量。

  • 实现一个attention 类
  • 需要说明函数入参含义、输入输出shape
  • 完成简单的scaled dot-product attention即可
  • 有把握的,可以实现multi-head attentlon

Scaled Dot-Product Attention:下面是用PyTorch实现的一个Attention机制的代码。这个实现包括一个简单的Scaled Dot-Product Attention机制和一个Multi-Head Attention机制。

首先,我们实现一个简单的Scaled Dot-Product Attention机制。

import torch
import torch.nn.functional as Fclass ScaledDotProductAttention:def __init__(self, d_k):"""初始化函数:param d_k: int, 每个attention头的维度"""self.d_k = d_kdef __call__(self, Q, K, V):"""执行Scaled Dot-Product Attention:param Q: torch.Tensor, 形状为[N, L, D]:param K: torch.Tensor, 形状为[N, L, D]:param V: torch.Tensor, 形状为[N, L, D]:return: 输出张量的形状为[N, L, D], attention score的形状为[N, L, L]"""# 计算注意力分数scores = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(self.d_k, dtype=torch.float32))attention_scores = F.softmax(scores, dim=-1)# 计算注意力输出attention_output = torch.matmul(attention_scores, V)return attention_output, attention_scores# 使用示例
N, L, D = 2, 5, 64
d_k = DQ = torch.rand(N, L, D)
K = torch.rand(N, L, D)
V = torch.rand(N, L, D)attention = ScaledDotProductAttention(d_k)
output, scores = attention(Q, K, V)print(f"Output shape: {output.shape}")
print(f"Attention scores shape: {scores.shape}")

Multi-Head Attention:

接下来,我们实现一个Multi-Head Attention机制,它是基于多个Scaled Dot-Product Attention头的。

class MultiHeadAttention:def __init__(self, num_heads, d_model):"""初始化函数:param num_heads: int, 注意力头的数量:param d_model: int, 输入的特征维度"""assert d_model % num_heads == 0, "d_model必须是num_heads的整数倍"self.num_heads = num_headsself.d_model = d_modelself.d_k = d_model // num_headsself.W_q = torch.nn.Linear(d_model, d_model)self.W_k = torch.nn.Linear(d_model, d_model)self.W_v = torch.nn.Linear(d_model, d_model)self.W_o = torch.nn.Linear(d_model, d_model)self.attention = ScaledDotProductAttention(self.d_k)def split_heads(self, x, batch_size):"""将最后一维分裂成(num_heads, d_k)形状,并将张量重塑为(batch_size * num_heads, seq_length, d_k):param x: torch.Tensor, 形状为(batch_size, seq_length, d_model):param batch_size: int, batch大小:return: torch.Tensor, 形状为(batch_size * num_heads, seq_length, d_k)"""x = x.view(batch_size, -1, self.num_heads, self.d_k)return x.transpose(1, 2).contiguous().view(batch_size * self.num_heads, -1, self.d_k)def __call__(self, Q, K, V):"""执行Multi-Head Attention:param Q: torch.Tensor, 形状为[N, L, D]:param K: torch.Tensor, 形状为[N, L, D]:param V: torch.Tensor, 形状为[N, L, D]:return: 输出张量的形状为[N, L, D], attention score的形状为[N * num_heads, L, L]"""batch_size = Q.size(0)Q = self.split_heads(self.W_q(Q), batch_size)K = self.split_heads(self.W_k(K), batch_size)V = self.split_heads(self.W_v(V), batch_size)attention_output, attention_scores = self.attention(Q, K, V)attention_output = attention_output.view(batch_size, self.num_heads, -1, self.d_k)attention_output = attention_output.transpose(1, 2).contiguous().view(batch_size, -1, self.d_model)return self.W_o(attention_output), attention_scores.view(batch_size, self.num_heads, -1, attention_scores.size(-1))# 使用示例
N, L, D = 2, 5, 64
num_heads = 8
d_model = DQ = torch.rand(N, L, D)
K = torch.rand(N, L, D)
V = torch.rand(N, L, D)multi_head_attention = MultiHeadAttention(num_heads, d_model)
output, scores = multi_head_attention(Q, K, V)print(f"Output shape: {output.shape}")
print(f"Attention scores shape: {scores.shape}")

在这里插入图片描述

以上实现了简单的Scaled Dot-Product Attention和Multi-Head Attention机制,并包含示例代码用于测试。

无注释背诵版:

  1. __init__是初始化d_k是每个向量的维度
  2. torch.matmul,转置K.transpose(-2, -1),/根号sqrt(d_k)
  3. F.softmax(scores, dim=-1)得注意力分数
  4. torch.matmul与V乘得输出
import torch
import torch.nn.functional as Fclass Attention:def __init__(self, d_k): self.d_k = d_kdef __call__(self, Q, K, V):scores = torch.matmul(Q, K.transpose(-2, -1)) / torch.sqrt(torch.tensor(self.d_k, dtype=torch.float32))attention_scores = F.softmax(scores, dim=-1)attention_output = torch.matmul(attention_scores, V)return attention_output, attention_scoresclass MultiHeadAttention:def __init__(self, num_heads, d_model):assert d_model % num_heads == 0self.nums_heads = num_headsself.d_model = d_modelself.d_k = d_model // num_headsself.W_q = torch.nn.Linear(d_model, d_model)self.W_k = torch.nn.Linear(d_model, d_model)self.W_v = torch.nn.Linear(d_model, d_model)self.W_o = torch.nn.Linear(d_model, d_model)self.attention = Attention(self.d_k)def split_heads(self, x, batch_size):x = x.view(batch_size, -1, self.nums_heads, self.d_k)return x.transpose(1, 2).contiguous().view(batch_size * self.nums_heads, -1, self.d_k)def __call__(self, Q, K, V):batch_size = Q.size(0)Q = self.split_heads(self.W_q(Q), batch_size)K = self.split_heads(self.W_k(K), batch_size)V = self.split_heads(self.W_v(V), batch_size)attention_output, attention_score = self.attention(Q, K, V)attention_output = attention_output.view(batch_size, self.nums_heads, -1, self.d_k)attention_output = attention_output.transpose(1, 2).contiguous().view(batch_size, -1, self.d_model)return self.W_o(attention_output), attention_score.view(batch_size, self.nums_heads, -1, attention_score.size(-1))

使用示例

N, L, D = 2, 5, 64
num_heads = 8
d_model = DQ = torch.rand(N, L, D)
K = torch.rand(N, L, D)
V = torch.rand(N, L, D)multi_head_attention = MultiHeadAttention(num_heads, d_model)
output, scores = multi_head_attention(Q, K, V)print(f"Output shape: {output.shape}")
print(f"Attention scores shape: {scores.shape}")

创作不易,观众老爷们请留步… 动起可爱的小手,点个赞再走呗 (๑◕ܫ←๑)
欢迎大家关注笔者,你的关注是我持续更博的最大动力


原创文章,转载告知,盗版必究



在这里插入图片描述


在这里插入图片描述
♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠ ⊕ ♠

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

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

相关文章

XX数字中台技术栈及能力

XX数字中台技术栈及能力 1 概述 XX数字中台面向数据开发者、数据管理者和数据应用者,提供数据汇聚、融合、治理、开发、挖掘、共享、可视化、智能化等能力,实现数据端到端的全生命周期管理,以共筑数字基础底座,共享数据服务能力…

Java核心: 脚本引擎和动态编译

静态语言和动态语言的在相互吸收对方的优秀特性,取人之长补己之短。脚本引擎和动态编译就是其中一个关键特性,扩展了Java的能力边界。这一篇我们主要讲两个东西: ScriptEngine,执行脚本语言代码,如JavaScript、Groovy JavaCompile…

插入排序(概述)

描述 插入排序为将一个数插入到以排序好的数组中 目录 描述 原理 特性 代码 原理 我们以升序为例 先将新数插入到数组的最后一位,记录下新数的值 从新数的位置开始往前遍历,如果前一位大于新数的值 则将当前位置修改为前一位的值 如果前一位小…

爬虫案例:有道翻译python逆向

pip install pip install requestspip install base64pip install pycrytodome tools 浏览器的开发者工具,重点使用断点,和调用堆栈 工具网站:https://curlconverter.com/ 简便请求发送信息 flow 根据网站信息,preview,respon…

按键大师:用Python实现无人值守的自动化操作

哈喽,大家好,我是木头左! 在这个科技日新月异的时代,的生活被各种软件和应用所包围。然而,你是否想过,如果你能够控制这些应用的操作,那么你的生活将会变得多么的便捷?今天&#xff…

php之sql代码审计

1 SQL注入代码审计流程 1.1 反向查找流程 通过可控变量(输入点)回溯危险函数 查找危险函数确定可控变量 传递的过程中触发漏洞 1.2 反向查找流程特点 暴力:全局搜索危险函数 简单:无需过多理解目标网站功能与架构 快速:适用于自动化代码审…

RK3588 opencv maliGPU图像拼接

1 左边图 图像大小:1920*1080 2右边图 图像大小:1920*1080 3拼接好的图像 图像大小&#xff1a;1920 *1080 4代码 #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/highgui.hpp>//图像融合 #include <opencv2/xfeatures2d.…

基于SpringBoot和Mybatis实现的留言板案例

目录 一、需求及界面展示 二、准备工作 引入依赖 .yml文件相关配置 数据库数据准备 三、编写后端代码 需求分析 代码结构 Model Mapper Service Controller 前端代码 四、测试 一、需求及界面展示 需求&#xff1a; 1. 输入留言信息&#xff0c;点击提交&…

Unity对接科大讯飞实时语音转写WebAPI(Windows平台)(二)

上一篇中&#xff0c;用到的是MicPhone类&#xff0c;然后遗留问题是yield return new WaitForSecondsRealtime(0.04f)导致消息发送得很慢&#xff0c;语音识别不及时。 上一篇链接&#xff1a;Unity对接科大讯飞实时语音转写WebAPI&#xff08;Windows平台&#xff09;_unity…

qt-C++笔记之使用QtConcurrent异步地执行槽函数中的内容,使其不阻塞主界面

qt-C笔记之使用QtConcurrent异步地执行槽函数中的内容&#xff0c;使其不阻塞主界面 code review! 文章目录 qt-C笔记之使用QtConcurrent异步地执行槽函数中的内容&#xff0c;使其不阻塞主界面1.QtConcurrent::run基本用法基本用法启动一个全局函数或静态成员函数使用 Lambda…

iOS--锁的学习

iOS--锁的学习 锁的介绍线程安全 锁的分类自旋锁和互斥锁OSSpinLockos_unfair_lockpthread_mutexpthread_mutex的属性 NSLockNSRecursiveLockNSConditionNSConditionLockdispatch_semaphoredispatch_queuesynchronizedatomicpthread_rwlock&#xff1a;读写锁dispatch_barrier_…

摸鱼大数据——Hive基础理论知识——Hive基础架构

1、Hive和MapReduce的关系 1- 用户在Hive上编写数据分析的SQL语句&#xff0c;然后再通过Hive将SQL语句翻译成MapReduce程序代码&#xff0c;最后提交到Yarn集群上进行运行 2- 大家可以将Hive理解成有道词典&#xff0c;帮助你翻译英文 2、Hive架构 用户接口: 包括 CLI、JDBC/…

武汉大学化学与分子科学学院雷爱义教授

国务院政府特殊津贴专家(2020)&#xff0c;第四届Yoshida Prize(吉田奖&#xff0c;2019)&#xff0c;国家“万人计划”科技创新领军人才(2017)&#xff0c;国家中青年科技创新领军人才(2015)&#xff0c;英国皇家化学学会会士(2015)&#xff0c;长江学者特聘教授(2014)&#x…

【数字移动通信】期末突击

文章目录 复习题一.简答题1、常用的移动通信系统有哪些?2、分别列出1G,2G,3G,4G的典型系统或标准&#xff1f;3、移动通信信道的基本特征&#xff1f;4、电波传播预测模型是用来计算什么量的&#xff0c;在选择传播预测模型时&#xff0c;主要考虑哪些因素&#xff1f;5、什么…

Java+Swing+Mysql实现飞机订票系统

一、系统介绍 1.开发环境 操作系统&#xff1a;Win10 开发工具 &#xff1a;Eclipse2021 JDK版本&#xff1a;jdk1.8 数据库&#xff1a;Mysql8.0 2.技术选型 JavaSwingMysql 3.功能模块 4.数据库设计 1.用户表&#xff08;users&#xff09; 字段名称 类型 记录内容…

脑机接口习题

9-12章习题 填空题 EEG电极分为 主动电极 和 被动电极 &#xff0c;其中 被动电极 直接与放大器连接&#xff0c; 主动电极 包含一个1~10倍的前置放大。除抗混淆滤波器&#xff0c;放大系统也包含由电阻器、电容器构成的模拟滤波器&#xff0c;把信号频率内容限制在一个特定的…

B树与B+树区别

B树和B树是常见的数据库索引结构&#xff0c;都具有相较于二叉树层级较少&#xff0c;查找效率高的特点&#xff0c;它们之间有以下几个主要区别&#xff1a; 1.节点存储数据的方式不同 B树的叶子结点和非叶子节点都会存储数据&#xff0c;指针和数据共同保存在同一节点中B树…

SpringMVC相关知识集锦----1

一、springMVC框架的了解 springMVC是一个基于java的实现了MVC设计模式的请求驱动类型的轻量级web框架,通过把model,view,controller分离,将web层进行职责解耦,把复杂的web应用分成逻辑清晰的几部分,简化开发. 二、springMVC主要组件 1.前端控制器(dispatcherservlet):接收请…

【深度学习】复习温故而知新1

数据集ref&#xff1a;https://raw.githubusercontent.com/justinge/pic-go-for-xbotgo/master/Income1.csv X torch.from_numpy(data.Education.values.reshape(-1,1).astype(np.float32)) Y torch.from_numpy(data.Income.values.reshape(-1,1).astype(np.float32))y_pred…