【机器学习】一文搞懂算法模型之:Transformer

Transformer

  • 1、引言
  • 2、Transformer
    • 2.1 定义
    • 2.2 原理
    • 2.3 算法公式
      • 2.3.1 自注意力机制
      • 2.3.1 多头自注意力机制
      • 2.3.1 位置编码
    • 2.4 代码示例
  • 3、总结

1、引言

小屌丝:鱼哥, 你说transformer是个啥?
小鱼:嗯… 啊… 嗯…就是…
小屌丝:你倒是说啊,是个啥?
小鱼:你不知道?
小屌丝:我知道啊,
小鱼:你知道,你还问我?
小屌丝:考考你
小鱼:kao…kao… wo??
小屌丝:对
小鱼:看你你很懂 transformer
小屌丝: 必须的
小鱼:那你来跟我说一说?
小屌丝:可以。
小鱼:秃头顶上点灯
小屌丝:啥意思? 你说的是啥意思?你说清楚,啥意思???

在这里插入图片描述
小鱼:唉~ ~没文化,真可怕。

2、Transformer

2.1 定义

Transformer是一种基于自注意力机制的深度学习模型,它完全摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN)结构,转而通过自注意力机制来计算输入序列中不同位置之间的依赖关系。

Transformer模型由谷歌在2017年提出,并在自然语言处理领域取得了显著的成绩,如机器翻译、文本生成、问答系统等。

2.2 原理

Transformer的核心思想是利用自注意力机制来捕捉输入序列中的上下文信息。
它采用Encoder-Decoder架构,其中Encoder负责将输入序列编码为一系列的隐藏状态,而Decoder则根据这些隐藏状态生成输出序列。

在Transformer中,自注意力机制是通过计算输入序列中每个位置与其他位置之间的相似度来实现的。

具体来说,对于输入序列中的每个位置,Transformer会生成一个查询向量、一个键向量和一个值向量。然后,它会计算查询向量与所有键向量之间的相似度,得到一个相似度分数矩阵。

最后,根据这个相似度分数矩阵对值向量进行加权求和,得到每个位置的输出表示。

2.3 算法公式

2.3.1 自注意力机制

自注意力机制

  • 输入:查询矩阵Q、键矩阵K、值矩阵V
  • 输出:自注意力输出Z
  • 公式 Z = s o f t m a x ( Q K T / √ d k ) V Z = softmax(QK^T/√d_k)V Z=softmax(QKT/√dk)V

其中,d_k是键向量的维度,用于缩放点积结果以防止梯度消失。

2.3.1 多头自注意力机制

多头自注意力机制

  • 输入:查询矩阵Q、键矩阵K、值矩阵V、头数h
  • 输出:多头自注意力输出MultiHead(Q, K, V)
  • 公式 M u l t i H e a d ( Q , K , V ) = C o n c a t ( h e a d 1 , . . . , h e a d h ) W O MultiHead(Q, K, V) = Concat(head_1, ..., head_h)W^O MultiHead(Q,K,V)=Concat(head1,...,headh)WO

其中,每个头head_i都执行一次自注意力机制,W^O是输出线性变换的权重矩阵。

2.3.1 位置编码

位置编码
为了捕捉序列中的位置信息,Transformer使用位置编码将位置信息嵌入到输入向量中。

公式 P E ( p o s , 2 i ) = s i n ( p o s / 1000 0 ( 2 i / D ) ) P E ( p o s , 2 i + 1 ) = c o s ( p o s / 1000 0 ( 2 i / D ) ) PE(pos, 2i) = sin(pos / 10000^(2i / D)) PE(pos, 2i+1) = cos(pos / 10000^(2i / D)) PE(pos,2i)=sin(pos/10000(2i/D))PE(pos,2i+1)=cos(pos/10000(2i/D))

其中, p o s pos pos是位置索引, i i i是维度索引, D D D是输入向量的维度。

2.4 代码示例

# -*- coding:utf-8 -*-
# @Time   : 2024-03-17
# @Author : Carl_DJ

'''
import torch  
import torch.nn as nn  
import torch.nn.functional as F  
  
# 定义位置编码类  
class PositionalEncoding(nn.Module):  
    def __init__(self, d_model, max_len=5000):  
        super(PositionalEncoding, self).__init__()  
          
        # 计算位置编码  
        pe = torch.zeros(max_len, d_model)  
        position = torch.arange(0, max_len, dtype=torch.float).unsqueeze(1)  
        div_term = torch.exp(torch.arange(0, d_model, 2).float() *  
                                 -(np.log(torch.tensor(10000.0)) / d_model))  
        pe[:, 0::2] = torch.sin(position * div_term)  
        pe[:, 1::2] = torch.cos(position * div_term)  
        pe = pe.unsqueeze(0).transpose(0, 1)  
        self.register_buffer('pe', pe)  
          
    def forward(self, x):  
        x = x + self.pe[:, :x.size(1)]  
        return x  
  
# 定义Transformer编码器层  
class TransformerEncoderLayer(nn.Module):  
    def __init__(self, d_model, nhead, dim_feedforward=2048, dropout=0.1):  
        super(TransformerEncoderLayer, self).__init__()  
        self.self_attn = nn.MultiheadAttention(d_model, nhead, dropout=dropout)  
        self.linear1 = nn.Linear(d_model, dim_feedforward)  
        self.dropout = nn.Dropout(dropout)  
        self.linear2 = nn.Linear(dim_feedforward, d_model)  
          
        self.norm1 = nn.LayerNorm(d_model)  
        self.norm2 = nn.LayerNorm(d_model)  
        self.dropout1 = nn.Dropout(dropout)  
        self.dropout2 = nn.Dropout(dropout)  
          
    def forward(self, src, src_mask=None, src_key_padding_mask=None):  
        # 自注意力机制  
        src2, attn = self.self_attn(src, src, src, attn_mask=src_mask,  
                                      key_padding_mask=src_key_padding_mask)  
        src = src + self.dropout1(src2)  
        src = self.norm1(src)  
          
        # 前馈神经网络  
        src2 = self.linear2(self.dropout(F.relu(self.linear1(src))))  
        src = src + self.dropout2(src2)  
        src = self.norm2(src)  
          
        return src, attn  
  
# 定义Transformer编码器  
class TransformerEncoder(nn.Module):  
    def __init__(self, encoder_layer, num_layers, norm=None):  
        super(TransformerEncoder, self).__init__()  
        self.layers = nn.ModuleList([encoder_layer for _ in range(num_layers)])  
        self.num_layers = num_layers  
        self.norm = norm  
          
    def forward(self, src, mask=None, src_key_padding_mask=None):  
        output = src  
          
        # 堆叠多个编码器层  
        for mod in self.layers:  
            output, attn = mod(output, mask, src_key_padding_mask)  
          
        if self.norm:  
            output = self.norm(output)  
          
        return output  
  
# 定义完整的Transformer模型  
class TransformerModel(nn.Module):  
    def __init__(self, src_vocab_size, d_model, nhead, num_encoder_layers, dim_feedforward, max_position_embeddings):  
        super(TransformerModel, self).__init__()  
        self.src_mask = None  
        self.position_enc = PositionalEncoding(d_model, max_position_embeddings)  
        encoder_layer = TransformerEncoderLayer(d_model, nhead, dim_feedforward, dropout=0.1)  
        encoder_norm = nn.LayerNorm(d_model)  
        self.encoder = TransformerEncoder(encoder_layer, num_encoder_layers, norm=encoder_norm)  
		self.src_embedding = nn.Embedding(src_vocab_size, d_model)  
    	self.d_model = d_model  
      
def generate_square_subsequent_mask(self, sz):  
    mask = (torch.triu(torch.ones(sz, sz)) == 1).transpose(0, 1)  
    mask = mask.float().masked_fill(mask == 0, float('-inf')).masked_fill(mask == 1, float(0.0))  
    return mask  
  
def forward(self, src, src_mask=None):  
    if src_mask is None:  
        device = src.device  
        bsz, seq_len = src.size()  
        src_mask = self.generate_square_subsequent_mask(seq_len).to(device)  
      
    src = self.src_embedding(src) * math.sqrt(self.d_model)  
    src = self.position_enc(src)  
    output = self.encoder(src, src_mask)  
    output = self.decoder(output)  
      
    return output


代码解析

  • PositionalEncoding:定义位置编码类,用于给输入序列添加位置信息。Transformer模型是位置无关的,因此需要通过位置编码来提供序列中每个位置的信息。

  • TransformerEncoderLayer:定义Transformer编码器层,包含自注意力机制和前馈神经网络。每个编码器层都会接收输入序列,经过自注意力机制和前馈神经网络处理,输出新的序列表示。

  • TransformerEncoder:定义Transformer编码器,通过堆叠多个编码器层来构建更深的模型。

  • TransformerModel:定义完整的Transformer模型,包括嵌入层、位置编码、编码器和解码器。模型将源语言序列作为输入,经过一系列变换后,输出每个位置的目标语言词汇的预测概率。

  • generate_square_subsequent_mask:生成一个上三角矩阵的掩码,用于在自注意力机制中防止模型看到未来的信息。

  • forward:模型的前向传播函数。首先,将源语言序列通过嵌入层转换为向量表示,并乘以模型维度的平方根进行缩放。然后,将位置编码加到嵌入向量上。接下来,将结果输入到编码器中。最后,将编码器的输出传递给解码器,得到每个位置的预测概率。

在这里插入图片描述

3、总结

Transformer模型通过自注意力机制打破了传统RNN和CNN的局限性,能够更好地捕捉序列中的长期依赖关系,因此在自然语言处理任务中取得了显著的效果。

Transformer的Encoder-Decoder架构和多头自注意力机制使得模型能够同时处理输入序列中的多个位置,提高了模型的并行性和效率。通过位置编码,Transformer还能够处理序列中的位置信息,使得模型在处理自然语言等序列数据时更加灵活和准确。

虽然Transformer模型具有强大的能力,但它也需要大量的数据和计算资源来进行训练。

因此,在实际应用中,我们通常使用预训练的Transformer模型(如BERT、GPT等)作为基础,通过微调来适应特定的任务需求。

我是小鱼

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

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

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

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

相关文章

uni-app攻略:如何对接驰腾打印机

一.引言 在当前的移动开发生态中,跨平台框架如uni-app因其高效、灵活的特点受到了开发者们的青睐。同时,随着物联网技术的飞速发展,智能打印设备已成为许多业务场景中不可或缺的一环。今天,我们就来探讨如何使用uni-app轻松对接驰…

异步爬虫实践攻略:利用Python Aiohttp框架实现高效数据抓取

在当今信息爆炸的时代,数据是无处不在且变化迅速的。为了从海量数据中获取有用的信息,异步爬虫技术应运而生,成为许多数据挖掘和分析工作的利器。本文将介绍如何利用Python Aiohttp框架实现高效数据抓取,让我们在信息的海洋中快速…

怎么才可以实现自定义异常?

在回答怎么才可以自定义异常这个问题之前,我们先看异常处理对象是怎么实现的?下图为运行时异常需要继承 RuntimeException异常类。 而RuntimeException异常类又继承Exception异常类。 所以,要实现自定义异常类,就需要去继承Runtim…

matlab矩形薄板小挠度弯曲有限元编程 |【Matlab源码+理论文本】|板单元| Kirchoff薄板 | 板壳单元

专栏导读 作者简介:工学博士,高级工程师,专注于工业软件算法研究本文已收录于专栏:《有限元编程从入门到精通》本专栏旨在提供 1.以案例的形式讲解各类有限元问题的程序实现,并提供所有案例完整源码;2.单元…

2024年三大主食冻干品牌测评,希喂、SC、K9自费实测综合PK

在现今注重科学养宠的时代背景下,主食冻干已经成为猫咪日常饮食的重要组成部分。主食冻干的高肉含量特性使其易于被猫咪吸收和消化,同时,它还能提供其他猫粮所无法提供的微量物质,满足猫咪的全面营养需求。然而,在众多…

力扣题目训练(23)

2024年2月16日力扣题目训练 2024年2月16日力扣题目训练645. 错误的集合653. 两数之和 IV - 输入二叉搜索树657. 机器人能否返回原点307. 区域和检索 - 数组可修改309. 买卖股票的最佳时机含冷冻期174. 地下城游戏 2024年2月16日力扣题目训练 2024年2月16日第二十三天编程训练&…

【开发环境搭建篇】Redis客户端安装和配置

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过大学刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是&#xff0…

AST学习入门

AST学习入门 1.AST在线解析网站 https://astexplorer.net/ 1.type: 表示当前节点的类型,我们常用的类型判断方法t.is********(node)**,就是判断当前的节点是否为某个类型。 2**.start**:表示当前节点的开始位置 3.end:当前节点结束 4.loc : 表示当前节点所在的行…

Qt利用反射机制实现函数调用

QT本身就带有强大的反射功能&#xff0c;如果想通过函数名称字符串调用函数&#xff0c;需要在被调用的函数前添加宏&#xff1a;Q_INVOKABLE 父类 QtInvoke.h 头文件&#xff1a; #pragma once #include <QMainWindow> #include "ui_QtInvoke.h" class Qt…

麒麟系统中使用nginx发布项目

1. 安装Nginx sudo apt-get update #进行所有安装操作前都要执行这一句 sudo apt install nginx #出现询问就Yes参考具体 Nginx—在linux的ubuntu系统上的安装使用 2. 修改发布文件 将打包好的dist文件夹中的所有文件覆盖下面这个文件夹中的所有文件 如果出现没有权限替…

UnityShader(十九) AlphaBlend

上代码&#xff1a; Shader "Shader入门/透明度效果/AlphaBlendShader" {Properties{_MainTex ("Texture", 2D) "white" {}_AlphaScale("AlphaScale",Range(0,1))1.0}SubShader{Tags { "RenderType""Transparent&quo…

java数字城管APP系统源码,智慧执法平台,现代信息技术手段的综合管理平台

智慧城管源码&#xff0c;智慧执法&#xff0c;城管智慧综合执法系统源码 智慧城管系统充分利用物联网、云计算、信息融合、网络通讯、数据分析与挖掘等技术&#xff0c;对城市管理进行全方位覆盖。它通过建立城市综合管理平台&#xff0c;将城市的信息和管理资源有机结合起来&…

蓝桥杯day7刷题日记

P8697 [蓝桥杯 2019 国 C] 最长子序列 思路&#xff1a;直接遍历&#xff0c;和子序列相同就记录&#xff0c;不然就下一位 #include <iostream> #include <string> using namespace std; int res;int main() {string s,t;cin>>s>>t;int i0,j0;while…

文生图的基石CLIP模型的发展综述

CLIP的英文全称是Contrastive Language-Image Pre-training&#xff0c;即一种基于对比文本-图像对的预训练方法或者模型。CLIP是一种基于对比学习的多模态模型&#xff0c;CLIP的训练数据是文本-图像对&#xff1a;一张图像和它对应的文本描述&#xff0c;这里希望通过对比学习…

大数据-基础架构设施演进的过程

一、第一阶段-Hadoop 以Hadoop为代表的离线数据处理基础设施 1.1、围绕HDFS和MR&#xff0c;产生了一系列的组件 面向在线KV操作的HBase面向SQL的Hive面向工作流的PIG 1.2、随着对批处理性能要求越来越高&#xff0c;产生了Tez、Spark、Flink等计算引擎。RM模型也逐步进化成…

注册省市要选择你的驾驶证的发证省市

1、首先在手机应用商店&#xff08;任何可以下载软件的&#xff0c;比如360、360&#xff09;搜索流量管理12123&#xff0c;然后下载。 2.然后打开手机上的APP&#xff0c;你会看到下面的页面&#xff0c;然后选择注册&#xff01; 3、在注册页面&#xff0c;根据您的实际情况…

【智能算法】多元宇宙优化算法(MVO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2016年&#xff0c;Mirjalili 等人受到宇宙膨胀理论启发&#xff0c;提出了多元宇宙优化算法(Multi-verse Optimization, MVO)。 2.算法原理 2.1算法思想 MVO基于宇宙膨胀的原理&#xff0c;利用…

3新 IT 技术深刻变革,驱动实体经济进入智能化时代

技术进步和创新是实体经济转型升级的内生 源动力&#xff0c;是企业数字化转型的核心工具&#xff0c;有 助于“降本增效提质”目标的达成。自 20 世 纪 90 年代至今&#xff0c;我国快速完成信息化的大规 模建设&#xff0c;典型数字化技术已发展成熟并充分 融合进企业日…

Linux——du, df命令查看磁盘空间使用情况

一、实现原理&#xff1a; df 命令的全称是Disk Free &#xff0c;显而易见它是统计磁盘中空闲的空间&#xff0c;也即空闲的磁盘块数。它是通过文件系统磁盘块分配图进行计算出的。 du 命令的全称是 Disk Used &#xff0c;统计磁盘有已经使用的空间。它是直接统计各文件各目…

2024年人工智能顶级会议投稿信息汇总(数据挖掘领域)

数据挖掘是信息科学领域的重要分支&#xff0c;致力于挖掘和分析庞大数据集中的有价值模式与规律。它融合了统计学、机器学习和数据库技术&#xff0c;目的是从海量数据中抽取有用的知识&#xff0c;辅助决策制定过程。本文首先精选介绍数据挖掘领域内的重要会议&#xff0c;包…