【深度学习】最强算法之:Transformer

Transformer

  • 1、引言
  • 2、Transformer
    • 2.1 引言
    • 2.2 核心概念
    • 2.3 应用
    • 2.4 算法公式
    • 2.5 代码示例
  • 3、总结

1、引言

小屌丝:鱼哥,昨天的感受咋样
小鱼:啥感受啊?
小屌丝:你确定不知道?
小鱼:我…
小屌丝:再想一想… 嘿嘿~
小鱼:嗯… 确实值得回味。
小屌丝:那咱再去体验体验?
小鱼:这… 不太好吧。
小屌丝:那有啥不太好的。
在这里插入图片描述

小鱼:我可是正经人,体验一次就够了,可不能上瘾的
小屌丝: 那你不去,我可去了。反正都约好了
小鱼:额… 都约好了,那不去岂不是浪费了。
小屌丝:但是,咱的有个条件
小鱼:啥条件?
小屌丝:就是,跟我讲一讲 Transformer
小鱼: 这岂不是张口就来。
小屌丝:那讲讲。
小鱼:路上讲。
小屌丝:也就这个时候,你最积极。

2、Transformer

2.1 引言

Transformer模型是一种深度学习算法,自2017年由Google的研究者Vaswani等人在论文《Attention is All You Need》中首次提出以来,它迅速成为了自然语言处理(NLP)领域的一种革命性技术。

Transformer模型的核心思想是利用“自注意力(Self-Attention)”机制来处理序列数据,这使得它能够在处理长距离依赖问题时表现得更加出色。

2.2 核心概念

  • 自注意力(Self-Attention):
    • 自注意力机制允许模型在处理每个序列元素时,考虑到序列中的所有其他元素,这样能够捕获序列内的长距离依赖关系。
    • 自注意力机制通过计算序列中每个元素对其他所有元素的注意力分数来实现,这些分数表示了元素间的相关性强度。
  • 多头注意力(Multi-Head Attention):
    • Transformer模型使用多头注意力机制来增强模型的注意力能力。
    • 通过并行地执行多个自注意力操作,模型可以从不同的表示子空间中学习信息,这样能够让模型更好地理解和处理数据。
  • 位置编码(Positional Encoding):
    • 由于Transformer完全基于注意力机制,没有像循环神经网络(RNN)那样的递归结构来处理序列数据,因此需要一种方式来理解序列中元素的位置信息。
    • Transformer通过给输入元素添加位置编码来实现这一点,位置编码与元素的嵌入向量相加,从而让模型能够利用序列的顺序信息。
  • 编码器-解码器架构:
    • Transformer模型采用编码器-解码器架构。
      • 编码器负责处理输入序列,解码器则负责生成输出序列。
      • 在编码器和解码器中,都使用了多层自注意力和全连接网络。
        在这里插入图片描述

2.3 应用

Transformer模型已经被广泛应用于各种自然语言处理任务中,包括但不限于:

  • 机器翻译
  • 文本摘要
  • 问答系统
  • 文本生成

2.4 算法公式

Transformer模型的核心是自注意力机制,其关键的计算公式如下:

  • 自注意力得分计算
    Attention ( Q , K , V ) = softmax ( Q K T d k ) V \text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V Attention(Q,K,V)=softmax(dk QKT)V
    其中,

    • Q Q Q K K K V V V分别代表查询(Query)、键(Key)和值(Value),
    • d k d_k dk是键的维度。

    这个公式通过计算查询和所有键之间的相似度,然后用softmax归一化得到权重分布,最后用这个分布来加权值。

  • 多头注意力

    • Transformer采用多头注意力机制来并行地执行多次自注意力操作,从而能够让模型从不同的子空间学习信息。
    • 多头注意力的计算可以表示为: MultiHead ( Q , K , V ) = Concat ( head 1 , head 2 , . . . , head h ) W O \text{MultiHead}(Q, K, V) = \text{Concat}(\text{head}_1, \text{head}_2, ..., \text{head}_h)W^O MultiHead(Q,K,V)=Concat(head1,head2,...,headh)WO
    • 其中,每个 head i = Attention ( Q W i Q , K W i K , V W i V ) \text{head}_i = \text{Attention}(QW_i^Q, KW_i^K, VW_i^V) headi=Attention(QWiQ,KWiK,VWiV) W O W^O WO是输出线性变换的权重矩阵。
  • 位置编码

    • 位置编码的公式如下,用于给每个位置的元素编码一个唯一的位置信息: P E ( p o s , 2 i ) = sin ⁡ ( p o s 1000 0 2 i / d model ) PE_{(pos, 2i)} = \sin\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) PE(pos,2i)=sin(100002i/dmodelpos) P E ( p o s , 2 i + 1 ) = cos ⁡ ( p o s 1000 0 2 i / d model ) PE_{(pos, 2i+1)} = \cos\left(\frac{pos}{10000^{2i/d_{\text{model}}}}\right) PE(pos,2i+1)=cos(100002i/dmodelpos)
    • 其中, p o s pos pos是位置序号, i i i是维度序号, d model d_{\text{model}} dmodel是模型的维度。

2.5 代码示例

# -*- coding:utf-8 -*-
# @Time   : 2024-04-06
# @Author : Carl_DJ

import torch  
import torch.nn as nn  
import torch.nn.functional as F  
  
class MultiHeadAttention(nn.Module):  
    def __init__(self, d_model, num_heads):  
        super(MultiHeadAttention, self).__init__()  
        # 初始化参数  
        self.num_heads = num_heads  
        self.d_k = d_model // num_heads  
          
        # 定义线性层用于生成查询(Q)、键(K)和值(V)  
        self.queries_linear = nn.Linear(d_model, d_model)  
        self.keys_linear = nn.Linear(d_model, d_model)  
        self.values_linear = nn.Linear(d_model, d_model)  
          
        # 初始化最后的线性层,用于将多头注意力结果合并回原始维度  
        self.fc_out = nn.Linear(d_model, d_model)  
          
        # 定义缩放因子  
        self.scale = 1 / (self.d_k ** 0.5)  
      
    def forward(self, values, keys, query, mask=None):  
        # 将输入通过线性层得到Q、K、V  
        N = query.shape[0]  
        query = self.queries_linear(query).view(N, -1, self.num_heads, self.d_k).transpose(1, 2)  
        keys = self.keys_linear(keys).view(N, -1, self.num_heads, self.d_k).transpose(1, 2)  
        values = self.values_linear(values).view(N, -1, self.num_heads, self.d_k).transpose(1, 2)  
          
        # 计算注意力分数  
        energy = torch.einsum("nqhd,nkhd->nhqk", [query, keys]) * self.scale  
          
        # 如果提供了掩码,则将其应用到注意力分数上  
        if mask is not None:  
            energy = energy.masked_fill(mask == 0, float("-1e20"))  
          
        # 通过softmax计算注意力权重  
        attention = torch.softmax(energy / (self.d_k ** 0.5), dim=3)  
          
        # 应用注意力权重到值上,得到输出  
        out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).transpose(1, 2).contiguous().view(N, -1, self.d_model)  
          
        # 通过最后的线性层得到最终输出  
        out = self.fc_out(out)  
          
        return out  
  
# 假设我们有以下输入维度和头数  
d_model = 512  
num_heads = 8  
  
# 实例化自注意力层  
self_attn = MultiHeadAttention(d_model, num_heads)  
  
# 创建一些模拟数据  
batch_size = 64  
seq_length = 10  
values = torch.randn(batch_size, seq_length, d_model)  
keys = torch.randn(batch_size, seq_length, d_model)  
query = torch.randn(batch_size, seq_length, d_model)  
  
# 创建掩码(例如,为了处理填充)  
mask = torch.ones(batch_size, 1, seq_length).bool()  
  
# 将数据输入自注意力层进行前向传播  
output = self_attn(values, keys, query, mask=mask)  
  
print(output.shape)  # 输出形状应该是 (batch_size, seq_length, d_model)


步骤

  • 首先,定义了一个MultiHeadAttention类,并创建了一个自注意力层的实例self_attn;
  • 然后,创建了一些模拟数据values、keys、query以及一个掩码mask;
  • 最后,我们调用self_attn的forward方法,将模拟数据作为输入进行前向传播,得到输出output;

3、总结

Transformer模型通过其独特的自注意力机制解决了序列处理中的长距离依赖问题,其多头注意力和位置无关的特性使其在处理各种序列数据时都能获得卓越的表现。

由于其强大的性能和灵活的结构,Transformer及其衍生模型已经成为了自然语言处理领域的基石,影响了整个人工智能领域的发展方向。

我是小鱼

  • CSDN 博客专家
  • 阿里云 专家博主
  • 51CTO博客专家
  • 企业认证金牌面试官
  • 多个名企认证&特邀讲师等
  • 名企签约职场面试培训、职场规划师
  • 多个国内主流技术社区的认证专家博主
  • 多款主流产品(阿里云等)测评一、二等奖获得者

关注小鱼,学习【机器学习】&【深度学习】领域的知识。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

查看每月网站的带宽以及网站访问记录

接到一位用户反馈想要了解知道在带cPanel面板的虚拟主机中如何查看每个网站使用的带宽数值以及网站访问记录,这边私信进行沟通了解到他当前使用的是Hostease 的LInux虚拟主机,由于是属于新手,对于cPanel面板也不是很了解,因而在论…

Python爬虫之Scrapy框架基础

Scrapy爬虫框架介绍 文档 英文文档中文文档 什么是scrapy 基于twisted搭建的异步爬虫框架. scrapy爬虫框架根据组件化设计理念和丰富的中间件, 使其成为了一个兼具高性能和高扩展的框架 scrapy提供的主要功能 具有优先级功能的调度器去重功能失败后的重试机制并发限制ip使用次…

基于spring boot的大学生体质测试管理系统

基于spring boot的大学生体质测试管理系统设计与实现 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7(一定要5.7版本) 数据库工具:Navicat11 …

【SQL Sever】3. 用户管理 / 权限管理

1. 创建登录名/用户/角色 在SQL Server中,创建用户通常涉及几个步骤。 首先,你需要创建一个登录名,然后你可以基于这个登录名在数据库中创建一个用户。 以下是如何做到这一点的步骤和相应的SQL语句: 创建登录名 首先&#xff0c…

面试算法-171-翻转二叉树

题目 给你一棵二叉树的根节点 root ,翻转这棵二叉树,并返回其根节点。 示例 1: 输入:root [4,2,7,1,3,6,9] 输出:[4,7,2,9,6,3,1] 解 class Solution {public TreeNode invertTree(TreeNode root) {if (root n…

STM32电机控制SDK实战

一、前言 本次测试基于ST开发板NUCLEO-F302R8,驱动板X-NUCLEO-IHM07M1,使用无刷直流电机BLDC实现FOC控制;采样三霍尔传感器检测电机转子位置;基于速度环闭环控制实现电机转动; 二、实战环境 软件环境: 1…

IP地址查询的应用

IP地址是互联网中用于唯一标识设备的数字地址,通过查询IP地址,我们可以获取到与之相关的各种信息。IP地址查询在网络安全、网络管理、市场营销等领域都有着广泛的应用。本文将探讨IP地址查询的各种应用场景及其重要性。 IP地址准查询:IP数据…

【架构六】系统架构风格

一、数据流风格 批处理:每一步都是独立的,并且每一步都是顺序执行的,只有当前一步处理完毕后,后一步处理才开始。数据必须是完整的,作为一个整体进行传递。如日志分析、计费程序等。管道/过滤器:每个构件都…

50-服务编排(下):基于Helm的服务编排部署实战

制作IAM Chart包 我们假设IAM项目源码根目录为${IAM_ROOT},进入 ${IAM_ROOT}/deployments目录,在该目录下创建Chart包。具体创建流程分为四个步骤, 第一步,创建一个模板Chart。 Chart是一个组织在文件目录中的集合,…

【汇编语言实战】已知10个整数求最大值

C语言描述该程序流程&#xff1a; #include <stdio.h> int main() {int a[]{11,33,23,54,12,51,2,4,34,45};int maxa[0];for(int i1;i<9;i){if(a[i]>max){maxa[i];}}printf("%d",max); }汇编语言&#xff1a; include irvine32.inc .data arr dword 11…

深入了解Redis——持久化

一&#xff0c;Redis持久化 Redis持久化即将内存中的数据持久化到磁盘中&#xff0c;在下一次重启后还能进行使用&#xff0c;Redis持久化分为RDB和AOF两种&#xff0c;我们接下来分别介绍RDB和AOF的内部原理和区别 RDB Redis运行时会将当前的内存快照存入至磁盘中&#xff…

c++ 字符串与STL用法

文章目录 StringVector构造增加删除大小清空排序 map定义添加数据遍历数据查找清空删除长度判断空交换排序常用用法 String Vector vector是动态扩充的数组 构造 ​ vector()​:创建一个空vectorvector(int nSize)​:创建一个vector,元素个数为nSize​vector(int nSize,co…

【MATLAB】基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据(附代码)

基于Wi-Fi指纹匹配的室内定位-仿真获取WiFi RSSI数据 WiFi指纹匹配是室内定位最为基础和常见的研究&#xff0c;但是WiFi指纹的采集可以称得上是labor-intensive和time-consuming。现在&#xff0c;给大家分享一下我们课题组之前在做WiFi指纹定位时的基于射线跟踪技术仿真WiFi…

Josephus排列:组合数学与跨学科应用

Josephus排列&#xff1a;组合数学与跨学科应用 一、背景二、定义和历史三、问题的形式化描述四、解决方案4.1 n2&#xff0c;任意m4.2 m1&#xff0c;任意n4.3 n为奇数&#xff0c;m为偶数4.4 n和m都是奇数 五、红黑树简介六、Josephus排列问题描述七、使用红黑树解决Josephus…

设计模式之备忘录模式(上)

备忘录模式 1&#xff09;概述 1.定义 在不破坏封装的前提下&#xff0c;捕获一个对象的内部状态&#xff0c;并在该对象之外保存这个状态&#xff0c;可以在以后将对象恢复到原先保存的状态。 2.作用 备忘录模式提供了一种状态恢复的实现机制&#xff0c;使得用户可以方便…

展厅设计方案需要考虑哪些因素环节

1、整体展厅规划 整体规划是展厅搭建中需要优先考虑的环节&#xff0c;必须为搭建成本和效果提供坚实的基础。需确定整体展厅面积、展厅的使用目的、产品布局以及进入展厅的路线、确定展厅的整体框架之后&#xff0c;还需考虑展品种类、产生的呈现效果&#xff0c;这些都将影响…

el-table动态合并列

需要合并列&#xff0c;并且不确定需要合并多少列的&#xff0c;可以参照如下代码 首先需要再el-table上传入span-method方法 arraySpan({ row, column, rowIndex, columnIndex }){if (row.groupName 汇总 && columnIndex 0) {return [0,0]} else if (row.groupName…

迷宫 — — 蓝桥杯(动态规划)

迷宫 题目&#xff1a; 输入样例&#xff1a; 3 1 1 1 2 3 4 5 6 7 8 9 2 2 1 3 1 R输出样例&#xff1a; 21思路&#xff1a; 题目大意&#xff1a;给定一个n x m的平面网格&#xff0c;并且每一个格子都有一定的代价&#xff0c;并且设有障碍物和陷阱&#xff0c;障碍物的意…

win11 连接海康摄像头 ONVif协议

目录 Win 11 通过脚本打开自带的IE浏览器访问海康摄像头 海康摄像头设置支持onvif协议 安装onvif协议 onvif协议示例代码 Win 11 通过脚本打开自带的IE浏览器访问海康摄像头 第一步、桌面右键新建一个 txt 的文档 第二步、打开文档并且复制粘贴下面代码 CreateObject(&…

【科研】搜索文献的网站

文章目录 paperswithcode【最新论文&#xff0c;代码】huggingface【大语言模型&#xff0c;最新论文】dblp【关键词搜索】arxiv【最新文章】semanticscholar【相关引用查询】connectedpapers【相关引用查询】github【工程&#xff0c;代码&#xff0c;论文开源代码】 paperswi…