自注意力机学习

自注意力机制的核心概念

1. Query, Key 和 Value
  • Query(查询向量):可以看作是你当前在关注的输入项。假设你正在阅读一段文字,这就像你当前在读的句子。

  • Key(键向量):表示其他所有输入项的标识或特征。这就像你在书中已经读过的所有句子的摘要或要点。

  • Value(值向量):是与每个Key相关联的具体信息或内容。就像这些句子带来的详细信息。

现实比喻
想象你在图书馆寻找一本特定的书(Query),书架上有很多书,每本书都有一个书名(Key)。根据书名(Key)匹配你的查询(Query),你从合适的书中获取详细内容(Value)。

2. 点积注意力(Dot-Product Attention)

这是计算Query和Key之间相关性的方式。我们通过计算Query和Key的点积来确定它们的关系强度。

比喻
就像在图书馆,你有一本书的部分标题(Query),你对比书架上所有书的书名(Key),看哪个书名最接近你的标题,然后选出最相关的书(Value)。

3. 缩放(Scaling)

为了防止Query和Key之间的点积结果太大导致数值不稳定,我们将结果除以一个常数——通常是Key向量的维度的平方根。这使得计算更加稳定。

比喻
假设你在测试你的记忆力,如果你直接用高分数衡量,可能会出现极端值。所以你需要调整分数范围,使得评估更合理和稳定。

4. Softmax 归一化

Softmax函数将一组数值转换为概率分布,使得它们的总和为1。这意味着每个单词的注意力权重表示它对当前处理单词的重要性。

比喻
就像你在评分不同的书,Softmax就像把所有的分数转换成百分比,这样你可以看到每本书相对于其他书的重要性。

自注意力机制的工作流程

让我们更详细地看看自注意力机制是如何一步一步工作的:

  1. 生成 Query, Key 和 Value 向量

    我们首先通过线性变换将输入序列的每个单词转换成三个不同的向量:Query, Key 和 Value。

    query = W_q * input
    key = W_k * input
    value = W_v * input
    

    比喻:这是把每个单词变成三个不同的代表,就像给每个单词生成了三个不同的标签,用于不同的目的(查询、匹配和提供信息)。

  2. 计算注意力权重

    通过计算Query和Key的点积,我们得到它们之间的相关性得分。然后,我们将这些得分除以 d k \sqrt{d_k} dk 进行缩放,最后应用Softmax函数来得到权重。

    # 计算点积
    scores = query.dot(key.T) / sqrt(d_k)
    # 使用Softmax函数归一化
    attention_weights = softmax(scores)
    

    比喻:这就像你比较当前正在读的句子(Query)和你已经读过的所有句子(Key),然后根据它们的相似程度打分。接着,你将这些分数标准化,使它们总和为1,表示每个句子的重要性百分比。

  3. 加权求和 Value 向量

    我们将Value向量按照注意力权重进行加权求和,这样每个Value对最终输出的贡献由它的重要性决定。

    # 计算加权的Value
    output = sum(attention_weights * value)
    

    比喻:就像你根据每本书的重要性百分比(注意力权重),从每本书中提取一定量的信息(Value),最终形成你对整个图书馆信息的理解。

示例和实际应用

假设你在处理一句话“我喜欢吃苹果,因为苹果很甜”:

  1. Query, Key, Value

    • Query:当前处理的词是“苹果”。
    • Key:句子中的所有单词的表示,如“我”,“喜欢”,“吃”,“苹果”,“因为”,“很”,“甜”。
    • Value:这些单词的具体信息,比如它们的词义或上下文信息。
  2. 点积注意力

    • 你在评估“苹果”和句子中其他词的关系,比如“苹果”与“甜”的关系就很重要,而与“我”关系可能不大。
  3. Softmax 归一化

    • 将关系得分转化为一个概率分布,表示每个单词对当前词“苹果”的重要性。
  4. 加权求和

    • 最后,根据重要性权重,从每个单词中提取信息,生成“苹果”的最终表示,这样“苹果”就包含了它和“甜”的关系。

自注意力机制代码示例

import torch
import torch.nn as nn
import torch.nn.functional as Fclass SelfAttention(nn.Module):def __init__(self, embed_size, heads):super(SelfAttention, 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, embed_size, bias=False)self.keys = nn.Linear(self.head_dim, embed_size, bias=False)self.queries = nn.Linear(self.head_dim, embed_size, bias=False)self.fc_out = nn.Linear(embed_size, embed_size)def forward(self, values, keys, query, mask):N = query.shape[0]value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1]# 1. 生成 Query, Key 和 Value 向量values = 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)# 2. 计算注意力权重energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys])if mask is not None:energy = energy.masked_fill(mask == 0, float("-1e20"))attention = torch.softmax(energy / (self.embed_size ** (1 / 2)), dim=3)# 3. 加权求和 Value 向量out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape(N, query_len, self.embed_size)out = self.fc_out(out)return out

关键概念总结

  1. 自注意力机制:允许模型在处理一个输入时,同时关注到整个输入序列中的所有其他输入。提高了捕捉长距离依赖关系的能力。

  2. Query, Key 和 Value:分别代表当前处理的焦点、其他输入的标识和它们携带的信息。

  3. 点积注意力:通过计算Query和Key的相似性来确定它们之间的关系强度。

  4. 缩放:对点积结果进行调整,防止数值过大导致计算不稳定。

  5. Softmax 归一化:将相似性得分转化为概率分布,表示每个输入的重要性。

通过这些步骤,自注意力机制能够帮助模型在处理每一个输入时同时考虑整个序列,从而更好地理解上下文和词语之间的关系。

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

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

相关文章

保姆级 | MySQL的安装配置教程(非常详细)

一、下载Mysql 官网步骤 MySQLhttps://www.mysql.com/进入官网首页 点击DOWNLOADS 点击MySQL Community (GPL) Downloads 点击 小页面直接进入 MySQL :: Download MySQL Installerhttps://dev.mysql.com/downloads/installer/点击“Download”下载最新版本,其他…

【吊打面试官系列】MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?

大家好,我是锋哥。今天分享关于 【MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别?】面试题,希望对大家有帮助; MySQL 中 InnoDB 支持的四种事务隔离级别名称,以及逐级之间的区别&#xf…

碳素钢化学成分分析 螺纹钢材质鉴定 钢材维氏硬度检测

碳素钢的品种主要有圆钢、扁钢、方钢等。经冷、热加工后钢材的表面不得有裂缝、结疤、夹杂、折叠和发纹等缺陷。尺寸和允许公差必须符合相应品种国家标准的要求。 具体分类、按化学成分分类 : 碳素钢按化学成分(即以含碳量)可分为低碳钢、中…

机器学习笔记 - stable diffusion web-ui安装教程

一、Stable Diffusion WEB UI 屌丝劲发作了,所以本地调试了Stable Diffusion之后,就去看了一下Stable Diffusion WEB UI,网络上各种打包套件什么的好像很火。国内的也就这个层次了,老外搞创新,国内跟着屁股后面搞搞应用层,就叫大神了。 不扯闲篇了,我们这里从git源码直接…

问题:11单位内部人员对行政机关作出的行政处分不服,可申请行政复议. #其他#微信

问题:11单位内部人员对行政机关作出的行政处分不服,可申请行政复议. 参考答案如图所示

问题:脾梗塞时,下列情况最符合的是 #职场发展#知识分享#媒体

问题:脾梗塞时,下列情况最符合的是 A、脾肿大 B、脾区摩擦感 C、两者均有 D、两者均无 参考答案如图所示

uniapp视频组件层级太高,解决方法使用subNvue原生子体窗口

目录 前言 先看一下uniapp官网的原话: subNvue的一些参数介绍 subNvues使用方法: 绑定id 显示 subNvue 弹出层 subNvue.show() 参数信息 subNvue.hide() 参数信息 在使用subNvue 原生子体窗口 遇到的一些问题 前言 nvue 兼容性 以及使用方式 控…

基于 中间件 的 数据交换平台 的实现

一、介绍 A. 背景和目的 随着云计算、大数据和物联网等技术的快速发展,企业面临着越来越多的数据交换和集成需求。不同系统之间的数据交换变得越来越复杂,而且数据量也越来越大,这对传统的数据交换方式提出了更高的要求。 中间件作为一种能…

把ROS程序作为桌面图标双击启动

1 写launch文件 把ROS程序写成一个launch文件&#xff0c;例如 powerline_with_rviz.launch <launch><!-- Load camera parameters --><rosparam file"$(find choose_powerline)/config/camera_params.yaml" command"load"/><!-- …

深入理解并应用KTT求解约束性极值问题

KT 很简单&#xff0c;口诀记心端&#xff0c;等式求最优&#xff0c;不等式验证——小飞打油 以后每期尝试编一句口诀&#xff0c;帮助大家记忆&#xff0c;可以是打油诗&#xff0c;也可以是类似“奇变偶不变&#xff0c;符号看象限”的口诀&#xff0c;如果编的不好&#xf…

2024年6月7日第十五周下午学习英语六级大纲

下午学习英语六级大纲的内容可以归纳为以下几个主要方面&#xff1a; 一、考试概述 六级考试的对象&#xff1a;修完大学英语相应阶段课程的在校大学生。考试目的&#xff1a;参照《大学英语教学指南》设定的教学目标&#xff0c;对我国大学生英语综合运用能力进行科学测量&a…

Docker 常用命令以及镜像选择

目录 1.Docker基本组成 2.镜像选择 2.1、镜像推荐选择方案 2.2版本选择 3.Docker 命令 3.1镜像管理 拉取镜像&#xff1a; 列出镜像&#xff1a; 删除镜像&#xff1a; 构建镜像&#xff1a; 3.2容器管理 运行容器 列出运行中的容器和所有容器 停止容器 启动重启…

【Qt】QPushButton 与 QAction 的区别

1. QPushButton QPushButton 是一个界面控件&#xff0c;能显示到界面上的。QPushButton 是 QWidget的一个子类&#xff0c;是一个表示按钮的界面控件。它用于在GUI中提供一个标准的按钮&#xff0c;用户可以点击它来触发一个即时的动作或命令。按钮可以显示文本、图标或两者都…

为什么要将Modbus转成MQTT

什么是Modbus Modbus 是一种串行通信协议&#xff0c;最初由Modicon&#xff08;现在的施耐德电气Schneider Electric&#xff09;于1979年开发&#xff0c;用于可编程逻辑控制器&#xff08;PLC&#xff09;之间的通信。Modbus协议设计简单&#xff0c;易于部署和维护&#xf…

从零入手人工智能(2)——搭建开发环境

1.前言 作为一名单片机工程师&#xff0c;想要转型到人工智能开发领域的道路确实充满了挑战与未知。记得当我刚开始这段旅程时&#xff0c;心中充满了迷茫和困惑。面对全新的领域&#xff0c;我既不清楚如何入手&#xff0c;也不知道能用人工智能干什么。正是这些迷茫和困惑&a…

用Python实现奇怪的疯狂按键需求

项目背景 说起来好笑,假设有一个奇怪需求 — 仅仅是假设,不代表我有这个需求,虽然可以想象有人会有这个需求,但是这个人不是我,我也不认识任何这样的人 — 疯狂向某个程序输出按键,比如,一会儿疯狂输入f,一会儿疯狂输入q。 如果是两个按键需求,我想要设置一个最简单…

M1Pro 使用跳板机

Mac (M1 Pro) 通过Iterm2 使用跳板机 1、由于堡垒机&#xff08;跳板机&#xff09;不能支持mac系统终端工具&#xff0c;只支持xshell等win生态。所以我们需要先安装iterm2 装iterms教程 这里头对rz、sz的配置不详细。我们可以这样配置&#xff1a; where iterm2-send-zmod…

Windows 11中删除分区的几种方法,总有一种适合你

序言 想从Windows 11 PC中删除一个分区,以便将空间重新分配给现有分区或创建一个新分区吗?我们将为你介绍删除Windows 11分区的多种方法。 删除Windows上的分区时会发生什么 删除分区时,Windows会擦除该分区的内容,并将该分区从电脑上的任何位置删除。你将丢失保存在该分…

Github 2024-06-05 C开源项目日报 Top10

根据Github Trendings的统计,今日(2024-06-05统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量C项目10C++项目2Python项目1我的电视 - 安卓电视直播软件 创建周期:40 天开发语言:CStar数量:649 个Fork数量:124 次关注人数:649 人贡献人…

单元测试覆盖率

什么是单元测试覆盖率 关于其定义&#xff0c;先来看一下维基百科上的一段描述&#xff1a; 代码覆盖&#xff08;Code coverage&#xff09;是软件测试中的一种度量&#xff0c;描述程序中源代码被测试的比例和程度&#xff0c;所得比例称为代码覆盖率。 简单来理解&#xff…