算法金 | Transformer,一个神奇的算法模型!!

news/2024/7/7 19:06:30/文章来源:https://www.cnblogs.com/suanfajin/p/18278993


大侠幸会,在下全网同名「算法金」 0 基础转 AI 上岸,多个算法赛 Top 「日更万日,让更多人享受智能乐趣」

抱个拳,送个礼

在现代自然语言处理(NLP)领域,Transformer 模型的出现带来了革命性的变化。它极大地提升了语言模型的性能和效率,而自注意力机制是其中的核心组件。

今个儿我们将通过五个阶段,逐步深入讲解自注意力机制,帮助大侠一窥其原理和应用,成功实现变身(装 X )

第一阶段:自注意力机制基础

在处理语言和文字时,我们经常需要理解一个句子中的单词是如何相互关联的。例如,在句子“猫追着老鼠跑”中,我们需要知道“猫”是追的主体,“老鼠”是被追的对象。传统的方法在理解这些关系时有一些困难,特别是当句子变得很长时。自注意力机制是一种新的方法,可以更好地理解句子中单词之间的关系,无论句子有多长。

自注意力机制的核心思想是:每个单词都能“注意到”句子中的其他单词,并根据这些单词来调整自己。这有点像我们在读一篇文章时,会注意到一些关键的词句来帮助我们理解文章的整体意思。

第二阶段:自注意力机制的工作原理

在自注意力机制中,每个单词会看向句子中的其他单词,并计算一个注意力得分。这些得分表示每个单词对其他单词的关注程度。这个过程可以理解为每个单词都在问自己:“我应该关注哪些单词?”

计算注意力得分

以句子“我喜欢吃苹果”为例:

  • “我”计算它对“喜欢”、“吃”和“苹果”的注意力得分。
  • 每个单词的得分会被转换成一个概率,表示它在句子中有多重要。

注意力得分会被一种叫做 softmax 的方法转换成概率。这种方法确保所有的得分加起来等于 1,这样我们就可以知道每个单词的重要性。例如:

  • “我”可能对“喜欢”的关注度是 0.4,对“吃”的关注度是 0.3,对“苹果”的关注度是 0.3。
  • 这些得分表示“我”最关注的是“喜欢”,其次是“吃”和“苹果”。

生成新表示

每个单词会根据这些概率得分,重新组合句子中的信息,生成新的表示。这就像我们在阅读一篇文章时,会根据每句话的重要性来总结文章的核心内容。

防失联,进免费知识星球,直达算法金 AI 实验室 https://t.zsxq.com/ckSu3

第三阶段:查询、键和值

在自注意力机制中,每个单词都被表示为三个向量:查询(Query)、键(Key)和值(Value)。这些向量帮助我们计算注意力得分,并生成新的单词表示。

查询(Query)

查询向量表示我们希望了解的单词。每个单词都有一个查询向量,用于计算它与其他单词的关系。

键(Key)

键向量表示句子中每个单词的特征。查询向量会与键向量进行对比,计算出注意力得分。

值(Value)

值向量表示句子中每个单词的具体内容。注意力得分会作用于值向量,以生成新的单词表示。

示例

以句子“我喜欢吃苹果”为例:

  • “我”的查询向量会与“喜欢”、“吃”和“苹果”的键向量进行对比,计算出它们的注意力得分。
  • 这些得分会用于加权“喜欢”、“吃”和“苹果”的值向量,生成“我”的新表示。

多头注意力机制

为了更好地捕捉句子中不同方面的信息,Transformer 引入了多头注意力机制。这个机制允许我们并行地计算多组查询、键和值向量,捕捉不同的关系。

多头注意力机制的步骤

  1. 分组:将查询、键和值向量分成多组,每组称为一个“头”。
  2. 独立计算:每个头独立计算注意力得分,并生成新的表示。
  3. 拼接与变换:将所有头的结果拼接起来,并通过一个线性变换生成最终的输出。

例子

假设我们有两个头:

  • 第一头可能主要关注“我”和“喜欢”的关系。
  • 第二头可能主要关注“吃”和“苹果”的关系。通过这种方式,多头注意力机制可以更全面地理解句子中的不同关系。

第四阶段:残差连接和层归一化

残差连接(Residual Connection)

残差连接是一种技术,它通过在网络层之间添加直接的跳跃连接,帮助缓解深度神经网络中的梯度消失问题。

原理

在每一层的输出中,我们会添加上这一层的输入。这可以用公式表示为:

其中,Layer(𝑥) 表示这一层的计算结果,𝑥 是输入。

优点

  • 缓解梯度消失问题:残差连接允许梯度直接通过跳跃连接传播,从而保持梯度不至于消失。
  • 更快的训练速度:残差连接使得网络更容易训练,减少了训练时间。

示例

假设我们有一个句子“我喜欢吃苹果”,经过一层自注意力机制处理后,我们会将这一层的输出与原始输入相加,生成新的表示。这使得信息更好地在网络中传播。

层归一化(Layer Normalization)

层归一化是一种技术,它通过对每一层的输出进行归一化处理,帮助加速训练和提高模型稳定性。

原理

层归一化会对每一层的输出进行归一化处理,使得输出的均值为 0,方差为 1。这可以用公式表示为:

优点

  • 提高训练速度:层归一化使得网络层的输出更为稳定,加快了训练速度。
  • 提高模型稳定性:通过归一化处理,减少了网络层之间的数值波动,提高了模型的稳定性。

示例

在每一层的输出经过残差连接后,我们会对结果进行层归一化处理,使得输出更加稳定。例如,在句子“我喜欢吃苹果”中,每一层的输出经过层归一化处理后,可以更好地进行下一层的计算。

抱个拳,送个礼

点击 ↑ 领取

防失联,进免费知识星球,直达算法金 AI 实验室

https://t.zsxq.com/ckSu3

第五阶段:实际应用与高级优化

自注意力机制的实现

基本实现步骤

  1. 输入处理:将输入文本转换为向量表示,可以使用词嵌入(word embedding)技术。
  2. 计算查询、键和值:根据输入向量,计算每个单词的查询、键和值向量。
  3. 计算注意力得分:使用查询和键向量计算注意力得分,并通过 softmax 转换成概率。
  4. 加权求和:根据注意力得分,对值向量进行加权求和,生成新的表示。
  5. 多头注意力机制:并行计算多组查询、键和值向量,并将结果拼接起来。
  6. 残差连接和层归一化:在每一层的输出后,添加残差连接并进行层归一化处理。

代码示例

以下是一个简化的自注意力机制的实现示例:

import torch
import torch.nn.functional as Fclass SelfAttention(torch.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 = torch.nn.Linear(self.head_dim, self.head_dim, bias=False)self.keys = torch.nn.Linear(self.head_dim, self.head_dim, bias=False)self.queries = torch.nn.Linear(self.head_dim, self.head_dim, bias=False)self.fc_out = torch.nn.Linear(heads * self.head_dim, 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]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)energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys])if mask is not None:energy = energy.masked_fill(mask == 0, float("-1e20"))attention = torch.nn.functional.softmax(energy / (self.embed_size ** (1 / 2)), dim=3)out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape(N, query_len, self.heads * self.head_dim)out = self.fc_out(out)return out

优化技巧

使用预训练模型

在实际应用中,可以使用预训练的 Transformer 模型,如 BERT、GPT 等,这些模型已经在大规模数据上进行过训练,能够大幅提升性能。

微调(Fine-tuning)

在特定任务上对预训练模型进行微调,即在预训练模型的基础上,使用少量的任务特定数据进行训练,以适应具体的应用场景。

正则化技术

为了防止模型过拟合,可以使用正则化技术,如 Dropout、权重衰减等。

实际应用案例

自然语言处理

自注意力机制广泛应用于自然语言处理任务,如机器翻译、文本生成、情感分析等。例如,Google 的翻译系统使用 Transformer 模型进行高效的翻译。

图像处理

自注意力机制也被应用于图像处理任务,如图像分类、目标检测等。Vision Transformer(ViT)是将 Transformer 应用于图像处理的成功案例。

[ 抱个拳,总个结 ]

在第五阶段中,我们探讨了自注意力机制在实际应用中的实现步骤,提供了代码示例,并介绍了一些高级优化技巧和实际应用案例。通过这些内容,大侠可以一窥 Transformer 的核心 - 自注意力机制的实际应用和优化方法。

至此,五个阶段的学习已经完成,希望这能帮助你全面理解自注意力机制,并在实际项目中成功应用。

- 科研为国分忧,创新与民造福 -

日更时间紧任务急,难免有疏漏之处,还请大侠海涵 内容仅供学习交流之用,部分素材来自网络,侵联删

[ 算法金,碎碎念 ]

全网同名,日更万日,让更多人享受智能乐趣

如果觉得内容有价值,烦请大侠多多 分享、在看、点赞,助力算法金又猛又持久、很黄很 BL 的日更下去;同时邀请大侠 关注、星标 算法金,围观日更万日,助你功力大增、笑傲江湖

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

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

相关文章

SPI驱动-基于ICM20608六轴MEMS传感器

1 IMX6ULL的SPI控制器简介 SPI是全双工同步串行通讯总线,是一个四线结构的总线协议,其使用比IIC简洁许多,具体关于SPI总线协议的内容可以自行查阅资料。 1.1 SPI控制器介绍 imx6ull中有四个ECSPI控制器,也即四个增强型SPI控制器,也可以当作普通的SPI控制器使用。这里又要和…

基于dspic33ck64mp105的电机控制器开发①

原理图是基于 microchip官方的 MCP1722_Power_Tools 参考设计而来,修改部分如下:https://www.microchip.com/en-us/tools-resources/reference-designs/portable-power-tool-reference-design1,修改了电源模块2,修改了栅极驱动3,增加了蓝牙通信模块4,修改了原版AUX的端口…

7、 Django-路由-router-页面跳转

概念: 在实际开发过程中、一个Django项目会包含很多的app、这时候如果我们只在主路由里进行配置就会显得杂乱无章、 所以通常在每个app中创建各自的urls.py路由模块、然后从根路由出发、将app所属的url请求、全部转发到相应的urls.py 模块 而这个从主路由转发到各个应用的路由…

10、 Django-模板-templates

模板语法 #模板中的变量语法:{{ var }}如果变量不存在、则插入空字符串#方法不能有参数{{ int }}{{ str }}{{ list }}{{ list.0 }}{{ dict }}{{ dict.a }} #dict[a]{{ func }} #传递函数{{ class_obj.func }} #传递类.方法#列表、使用索引、不允许负索引it…

Simple WPF: WPF 透明窗体和鼠标事件穿透

一个自定义WPF窗体的解决方案,借鉴了吕毅老师的WPF制作高性能的透明背景的异形窗口一文,并在此基础上增加了鼠标穿透的功能。可以使得透明窗体的鼠标事件穿透到下层,在下层窗体中响应。一个自定义WPF窗体的解决方案,借鉴了吕毅老师的WPF制作高性能的透明背景的异形窗口一文…

VMware安装Win11环境

准备 Win11的iso镜像 下载链接:https://www.microsoft.com/zh-cn/software-download/windows11/?open_in_browser=true 配置步骤 步骤一——创建虚拟机 1、点击创建新虚拟机2、使用典型模式3、选择镜像位置4、选择虚拟机存放位置5、输入密码,此密码可以随便写6、选择单个文件…

2、爬虫-安装anaconda工具

1、官网:https://www.anaconda.com/download-success2、一直下一步安装即可 3、打开4、输入:jupyter notebook 打开有一个浏览器的界面 5、右上角点击new新建python3(ipykernel)本文来自博客园,作者:little小新,转载请注明原文链接:https://www.cnblogs.com/littlecc/…

50、k8s-DashBoard(k8s的web)-部署

1、下载yaml文件:https://github.com/kubernetes/dashboard/blob/v2.0.0/aio/deploy/recommended.yaml 2、修改yaml文件的service 配置: --------------------------------------------- ---kind: Service apiVersion: v1 metadata:labels:k8s-app: kubernetes-dashboardname…

[JLU] 数据结构与算法上机题解思路分享-第二次上机

这是吉林等通知大学数据结构与算法上机题的题解思路,没有精妙的解法,只是一个记录罢前言 首先,请务必自己尽全力尝试实现题目,直接看成品代码,思维就被拘束了,也很容易被查重。 这里只是思路解析的博客,代码仓库在 JLU_Data_Structures_Record 希望你能在这里找到你想要…

docker 基础学习--尚硅谷教程

1、新建、启动容器docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 2、列出当前所有正在运行的容器docker ps [OPTIONS] 3、退出容器4、重启、退出、删除容器 5、启动守护式容器 docker 常见命令

Bruno安装使用

下载地址直接解压,右键Bruno.exe创建快捷方式创建集合右键集合,New Request指定名称和url指定参数保存并测试

《与光重聚》 —— 属于他的夏日花火

题目是歌曲名称,from 《夏日花火》 (国产galgame ; 视觉小说「夏日花火」原声音乐集 - dizzylab PV视频 因为被平衡树制裁了,所以心血来潮写这篇文章,姑且算是练笔吧(毕竟好久不写鲜花了; 游戏本体发行时间:2022年10月28日,目前无DLC(永远的遗憾; 游戏背景设计是D…

玄机-第一章 应急响应-Linux日志分析

玄机-第一章 应急响应-Linux日志分析 账号root密码linuxrz ssh root@IP 1.有多少IP在爆破主机ssh的root帐号,如果有多个使用","分割 2.ssh爆破成功登陆的IP是多少,如果有多个使用","分割 3.爆破用户名字典是什么?如果有多个使用","分割 4.登陆…

使用 .NET 构建 UI 界面的各种方式

微软搞出了很多构建 UI 程序的框架,如 WinForms WPF WinUI MAUI,他们之间的简单对比可以看如下这篇官方文档 Overview of framework options - Windows apps | Microsoft Learn 本文主要是记录一下在搜索相关问题时,了解到的内容,不一定准确,如果发现错误,请留言补充。 1…

Docker详细安装教程

安装Docker: # 1,, 卸载旧的版本# 2,需要的安装 yum install -y yum-utils# 3, 设置镜像的仓库 https://blog.csdn.net/qq_43168442/article/details/116770163 (访问这个博客网站进行配置)# 更新yum软件包索引 yum makecache fast# 4,安装docker docker-ce 社区 ee企业…

详细讲解 Keil Pack Installer,以及通过 Keil 官网获取 Pack

前言 大家好,我是梁国庆。 收到粉丝留言,说 Keil 安装 Pack 不太明白,可不可以详细演示一下?当然可以有,直接视频+文章全部安排,我就是宠粉。 PS:第一次录视频有些紧张,见谅哈。微信视频号:https://weixin.qq.com/sph/AXbpYwEaw b站:https://www.bilibili.com/video…

webdav协议及我的笔记方案(私有部署)

背景 用markdown用于文章写作,有几年时间了,不是很喜欢折腾,主要就是在电脑上写,用的笔记软件就是typora。由于里面有很多工作相关的,以及个人资料相关的(包含了各种账号、密码啥的),所以不敢往各种云服务上放,还是想着数据由自己来管着。 自己管数据的话,就是数据存…

模拟集成电路设计系列博客——8.3.2 PLL中的抖动与相位噪声

8.3.2 PLL中的抖动与相位噪声 在PLL中有若干种抖动源,具体来说包括:输入参考的抖动\(\phi_{in}\) VCO中的抖动 环路滤波器产生的噪声 分频器产生的噪声由于任何实际PLL中的抖动都相对较小,因此分析其在环路中和环路内的传播可以使用线性小信号模型。上面列出的噪声源出现在环…

【git】github如何上传超过100MB大小的单个文件

在使用 GitHub 进行版本控制时,默认情况下,单个文件的大小限制为 100MB。 如果你需要上传超过这个大小的文件,可以使用 Git LFS(Large File Storage)。 Git LFS 是一种 Git 扩展,专门用于处理大文件,它将大文件替换为轻量级的指针,并将实际的文件内容存储在远程服务器上…

ros2 - microros - 雷达 -可视化点云

上一节完成了指定角度距离的测量这一节我们将其合成ROS的laserscan消息,并将其通过microros发布到上位机,最终实现rviz2的可视化。 一、雷达消息介绍使用指令ros2 interface show sensor_msgs/msg/LaserScan,可以看到ROS2对雷达数据接口的定义。# Single scan from a planar…