Transformer:一种革命性的序列到序列学习框架

目录

​编辑

引言

Transformer模型的基本结构

1. 自注意力机制

2. 前馈神经网络

3. 位置编码

Transformer的工作原理

Transformer的应用

机器翻译

文本摘要

问答系统

文本分类

语音识别

图像识别

结论


引言

Transformer模型,自2017年由Vaswani等人提出以来,已经成为自然语言处理(NLP)和计算机视觉领域的一个里程碑。这一模型的核心优势在于其并行处理能力,这使得它在处理长序列数据时比传统的循环神经网络(RNN)和长短期记忆网络(LSTM)更加高效。Transformer模型的提出,不仅在理论上推动了深度学习模型的发展,而且在实际应用中也取得了显著的成果,如机器翻译、文本摘要、问答系统等。本文将详细介绍Transformer模型的基本结构、工作原理以及它在不同领域的应用。

Transformer模型的基本结构

Transformer模型主要由两部分组成:编码器(Encoder)和解码器(Decoder)。编码器和解码器都由多个相同的层(Layer)组成,每层包含两个子层:自注意力(Self-Attention)机制和前馈神经网络(Feed-Forward Neural Network)。这种结构的设计使得模型能够捕捉到序列中的长距离依赖关系,并且能够并行处理序列中的所有元素,从而大大提高了模型的训练效率。

1. 自注意力机制

自注意力机制是Transformer的核心,它允许模型在序列中的每个元素上同时考虑其他元素的信息。这种机制通过计算序列中所有元素之间的关系来实现,使得模型能够捕捉到序列中长距离的依赖关系。自注意力机制的关键优势在于它能够为模型提供全局的上下文信息,这对于理解语言的复杂性和多样性至关重要。

import torch
import torch.nn as nn
import torch.nn.functional as F
import math

class SelfAttention(nn.Module):
    def __init__(self, embed_size, heads):
        super(SelfAttention, self).__init__()
        self.embed_size = embed_size
        self.heads = heads
        self.head_dim = embed_size // heads

        assert (
            self.head_dim * heads == embed_size
        ), "Embedding size needs to be divisible by heads"

        self.values = nn.Linear(self.head_dim, self.head_dim, bias=False)
        self.keys = nn.Linear(self.head_dim, self.head_dim, bias=False)
        self.queries = nn.Linear(self.head_dim, self.head_dim, bias=False)
        self.fc_out = nn.Linear(heads * self.head_dim, embed_size)

    def forward(self, value, key, query):
        N = query.shape[0]
        value_len, key_len, query_len = value.shape[1], key.shape[1], query.shape[1]

        # Split the embedding into self.heads different pieces
        values = self.values(value).view(N, value_len, self.heads, self.head_dim)
        keys = self.keys(key).view(N, key_len, self.heads, self.head_dim)
        queries = self.queries(query).view(N, query_len, self.heads, self.head_dim)

        # Einsum does matrix multiplication for query*keys for each training example
        # with every other training example, don't be confused by einsum
        # it's just a way to do batch matrix multiplication
        energy = torch.einsum("nqhd,nkhd->nhqk", [queries, keys])
        attention = torch.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

2. 前馈神经网络

每个自注意力层之后是一个前馈神经网络,它对自注意力层的输出进行进一步的处理。这个网络是简单的全连接层,通常包含一个ReLU激活函数。前馈神经网络的作用是对自注意力层的输出进行非线性变换,以增强模型的表达能力。这种结构的设计使得模型能够学习到更复杂的特征表示,从而提高模型的性能。

class FeedForwardNetwork(nn.Module):
    def __init__(self, embed_size, ffn_size):
        super(FeedForwardNetwork, self).__init__()
        self.fc1 = nn.Linear(embed_size, ffn_size)
        self.fc2 = nn.Linear(ffn_size, embed_size)

    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

3. 位置编码

由于Transformer模型本身不包含任何循环或卷积结构,因此无法直接捕捉序列中的位置信息。为了解决这个问题,Transformer引入了位置编码,将位置信息嵌入到输入序列中。位置编码的设计使得模型能够区分序列中不同位置的元素,这对于理解语言的语法结构和语义关系至关重要。

class PositionalEncoding(nn.Module):
    def __init__(self, embed_size, max_len=5000):
        super(PositionalEncoding, self).__init__()

        # Create constant 'pe' matrix with values dependent on
        # pos and i
        pe = torch.zeros(max_len, embed_size)
        for pos in range(max_len):
            for i in range(0, embed_size, 2):
                pe[pos, i] = math.sin(pos / (10000 ** ((2 * i)/embed_size)))
                pe[pos, i + 1] = math.cos(pos / (10000 ** ((2 * (i + 1))/embed_size)))
                
        pe = pe.unsqueeze(0)
        self.register_buffer('pe', pe)

    def forward(self, x):
        # Make embeddings relatively larger
        x = x * math.sqrt(self.pe.size(-1))
        # Add constant to embedding
        seq_len = x.size(1)
        x = x + self.pe[:, :seq_len].detach()
        return x

Transformer的工作原理

Transformer模型的工作原理基于自注意力机制和前馈神经网络的堆叠。在编码器中,每个层都会接收前一个层的输出,并计算新的隐藏状态。这个过程会重复多次,每一层都会对输入序列进行更深层次的抽象和表示。解码器的工作方式类似,但它还会接收来自编码器的编码信息,并通过注意力机制关注编码器的输出。这种结构的设计使得模型能够捕捉到输入序列和输出序列之间的复杂关系,从而实现高质量的序列到序列的转换。

Transformer的应用

Transformer模型因其出色的性能和灵活性,已经被广泛应用于各种NLP任务中,包括但不限于:

机器翻译

机器翻译是Transformer模型最初被提出时的主要应用之一。Transformer模型通过学习源语言和目标语言之间的复杂映射关系,实现了高质量的翻译输出。与传统的序列到序列模型相比,Transformer模型在机器翻译任务上取得了显著的性能提升,这主要得益于其强大的自注意力机制和并行处理能力。

class EncoderLayer(nn.Module):
    def __init__(self, embed_size, ffn_size, heads):
        super(EncoderLayer, self).__init__()
        self.self_attention = SelfAttention(embed_size, heads)
        self.norm1 = nn.LayerNorm(embed_size)
        self.ffn = FeedForwardNetwork(embed_size, ffn_size)
        self.norm2 = nn.LayerNorm(embed_size)

    def forward(self, value, key, query):
        attention = self.self_attention(value, key, query)
        x = self.norm1(attention + query)
        forward = self.ffn(x)
        out = self.norm2(forward + x)
        return out

class DecoderLayer(nn.Module):
    def __init__(self, embed_size, ffn_size, heads, dropout):
        super(DecoderLayer, self).__init__()
        self.self_attention = SelfAttention(embed_size, heads)
        self.norm1 = nn.LayerNorm(embed_size)
        self.enc_attention = SelfAttention(embed_size, heads)
        self.norm2 = nn.LayerNorm(embed_size)
        self.ffn = FeedForwardNetwork(embed_size, ffn_size)
        self.norm3 = nn.LayerNorm(embed_size)
        self.dropout = nn.Dropout(dropout)

    def forward(self, value, key, query, enc_output):
        attention = self.self_attention(value, key, query)
        x = self.norm1(attention + query)
        enc_attention = self.enc_attention(x, enc_output, enc_output)
        x = self.norm2(enc_attention + x)
        forward = self.ffn(x)
        out = self.norm3(forward + x)
        return self.dropout(out)

文本摘要

文本摘要是另一个Transformer模型的重要应用领域。Transformer模型通过学习长文本的关键信息,能够生成简洁且信息丰富的摘要。这一过程涉及到对长文本的理解和压缩,Transformer模型的自注意力机制使得这一过程变得更加高效和准确。

在文本摘要任务中,Transformer模型通常被训练为编码器-解码器结构,其中编码器处理源文本,而解码器生成摘要。编码器能够捕捉到源文本的全局和局部特征,而解码器则利用这些特征来生成连贯且信息丰富的摘要。这种结构的优势在于它能够处理变长的输入和输出序列,同时保持对源文本的忠实度。

以下是一个简单的文本摘要模型的实现示例:

class TextSummarizationTransformer(nn.Module):
    def __init__(self, encoder, decoder, src_embed, tgt_embed, generator):
        super(TextSummarizationTransformer, self).__init__()
        self.encoder = encoder
        self.decoder = decoder
        self.src_embed = src_embed
        self.tgt_embed = tgt_embed
        self.generator = generator

    def forward(self, src, tgt):
        src_mask = (src != 0).unsqueeze(-2)
        tgt_mask = self.make_std_mask(tgt, src_mask)
        return self.forward2(src, tgt, src_mask, tgt_mask)

    def forward2(self, src, tgt, src_mask, tgt_mask):
        src_embed = self.src_embed(src)
        tgt_embed = self.tgt_embed(tgt)

        encoder_out = self.encoder(src_embed, src_mask)
        decoder_out = self.decoder(tgt_embed, encoder_out, tgt_mask)
        out = self.generator(decoder_out)
        return out

    def make_std_mask(self, tgt, src_mask):
        tgt_mask = (tgt != 0).unsqueeze(-2)
        src_mask = src_mask.unsqueeze(1).unsqueeze(2)
        tgt_mask = tgt_mask.unsqueeze(-3)
        mask = src_mask & tgt_mask
        return mask

问答系统

问答系统是Transformer模型的另一个重要应用。在问答系统中,模型需要理解问题的内容,并在给定的文本中找到答案。Transformer模型通过分析问题和上下文之间的关系,能够提供准确的答案。这一过程涉及到对语言的深入理解和推理,Transformer模型的自注意力机制和位置编码为其提供了强大的支持。

以下是一个简单的问答系统模型的实现示例:

class QATransformer(nn.Module):
    def __init__(self, encoder, decoder, src_embed, tgt_embed, generator):
        super(QATransformer, self).__init__()
        self.encoder = encoder
        self.decoder = decoder
        self.src_embed = src_embed
        self.tgt_embed = tgt_embed
        self.generator = generator

    def forward(self, src, tgt):
        src_mask = (src != 0).unsqueeze(-2)
        tgt_mask = self.make_std_mask(tgt, src_mask)
        return self.forward2(src, tgt, src_mask, tgt_mask)

    def forward2(self, src, tgt, src_mask, tgt_mask):
        src_embed = self.src_embed(src)
        tgt_embed = self.tgt_embed(tgt)

        encoder_out = self.encoder(src_embed, src_mask)
        decoder_out = self.decoder(tgt_embed, encoder_out, tgt_mask)
        out = self.generator(decoder_out)
        return out

    def make_std_mask(self, tgt, src_mask):
        tgt_mask = (tgt != 0).unsqueeze(-2)
        src_mask = src_mask.unsqueeze(1).unsqueeze(2)
        tgt_mask = tgt_mask.unsqueeze(-3)
        mask = src_mask & tgt_mask
        return mask

文本分类

文本分类是NLP中的一个基本任务,涉及到将文本分类到预定义的类别中。Transformer模型通过学习文本的特征表示,能够实现高效的文本分类。与传统的文本分类模型相比,Transformer模型能够捕捉到更丰富的上下文信息,从而提高分类的准确性。

以下是一个简单的文本分类模型的实现示例:

class TextClassificationTransformer(nn.Module):
    def __init__(self, encoder, src_embed, generator):
        super(TextClassificationTransformer, self).__init__()
        self.encoder = encoder
        self.src_embed = src_embed
        self.generator = generator

    def forward(self, src):
        src_mask = (src != 0).unsqueeze(-2)
        src_embed = self.src_embed(src)
        encoder_out = self.encoder(src_embed, src_mask)
        out = self.generator(encoder_out)
        return out

语音识别

语音识别是Transformer模型在语音领域的一个应用。Transformer模型通过学习语音信号的特征表示,能够实现准确的语音识别。这一过程涉及到对语音信号的理解和转换,Transformer模型的自注意力机制和并行处理能力使其在这一领域表现出色。

以下是一个简单的语音识别模型的实现示例:

class SpeechRecognitionTransformer(nn.Module):
    def __init__(self, encoder, decoder, src_embed, tgt_embed, generator):
        super(SpeechRecognitionTransformer, self).__init__()
        self.encoder = encoder
        self.decoder = decoder
        self.src_embed = src_embed
        self.tgt_embed = tgt_embed
        self.generator = generator

    def forward(self, src, tgt):
        src_mask = (src != 0).unsqueeze(-2)
        tgt_mask = self.make_std_mask(tgt, src_mask)
        return self.forward2(src, tgt, src_mask, tgt_mask)

    def forward2(self, src, tgt, src_mask, tgt_mask):
        src_embed = self.src_embed(src)
        tgt_embed = self.tgt_embed(tgt)

        encoder_out = self.encoder(src_embed, src_mask)
        decoder_out = self.decoder(tgt_embed, encoder_out, tgt_mask)
        out = self.generator(decoder_out)
        return out

    def make_std_mask(self, tgt, src_mask):
        tgt_mask = (tgt != 0).unsqueeze(-2)
        src_mask = src_mask.unsqueeze(1).unsqueeze(2)
        tgt_mask = tgt_mask.unsqueeze(-3)
        mask = src_mask & tgt_mask
        return mask

图像识别

在计算机视觉领域,Transformer也被用于图像分类和目标检测等任务。它通过学习图像的特征表示,能够实现高效的图像识别。与传统的卷积神经网络(CNN)相比,Transformer模型能够捕捉到图像中的长距离依赖关系,从而提高识别的准确性。

以下是一个简单的图像识别模型的实现示例:

class ImageRecognitionTransformer(nn.Module):
    def __init__(self, encoder, src_embed, generator):
        super(ImageRecognitionTransformer, self).__init__()
        self.encoder = encoder
        self.src_embed = src_embed
        self.generator = generator

    def forward(self, src):
        src_mask = (src != 0).unsqueeze(-2)
        src_embed = self.src_embed(src)
        encoder_out = self.encoder(src_embed, src_mask)
        out = self.generator(encoder_out)
        return out

结论

Transformer模型以其并行处理能力和对长距离依赖的捕捉能力,已经成为NLP和计算机视觉领域的一个强大工具。随着研究的深入,Transformer及其变体将继续推动人工智能技术的发展。从机器翻译到图像识别,Transformer模型的应用范围越来越广泛,其影响力也在不断扩大。未来,我们期待Transformer模型能够在更多的领域中发挥其强大的能力,为人工智能的发展带来更多的可能性。

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

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

相关文章

轮转数组(java)

题目描述 给定一个整数数组 nums,将数组中的元素向右轮转 k 个位置,其中 k 是非负数 示例 1: 输入: nums [1,2,3,4,5,6,7], k 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,…

【vue3实现微信小程序】每日专题与分页跳转的初步实现

快速跳转: 我的个人博客主页👉:Reuuse博客 新开专栏👉:Vue3专栏 参考文献👉:uniapp官网 免费图标👉:阿里巴巴矢量图标库 ❀ 感谢支持!☀ 前情提要 &#x…

【优先算法学习】双指针--结合题目讲解学习

目录 1.有效三角形的个数 1.2题目解题思路 1.3代码实现 2.和为s的两个数 2.1刷题链接-> 2.2题目解题思路 2.3代码实现 1.有效三角形的个数 1.1刷题链接-> 力扣-有效三角形的个数https://leetcode.cn/problems/valid-triangle-number/description/ 1.2题目解…

云服务器部署WebSocket项目

WebSocket是一种在单个TCP连接上进行全双工通信的协议,其设计的目的是在Web浏览器和Web服务器之间进行实时通信(实时Web) WebSocket协议的优点包括: 1. 更高效的网络利用率:与HTTP相比,WebSocket的握手只…

前端---HTML(一)

HTML_网络的三大基石和html普通文本标签 1.我们要访问网络,需不需要知道,网络上的东西在哪? 为什么我们写,www.baidu.com就能找到百度了呢? 我一拼ping www.baidu.com 就拼到了ip地址: [119.75.218.70]…

网络基础 - IP 隧道篇

在一个如图所示的网络环境里,网络 A、B 使用 IPv6,如果处于中间位置的网络 C 支持使用 IPv4 的话,网络 A 与网络 B 之间将无法直接进行通信,为了让它们之间正常通信,这时必须得采用 IP 隧道的功能,IP 隧道中…

1.1、Python 安装与开发环境设置指南

作为你的 Python 导师,我将带领你一步步完成 Python 的安装和开发环境的设置,让你顺利开启 Python 学习之旅。 1. Python 安装 1.1 下载 Python 安装包 首先,我们需要从 Python 官网下载 Python 的安装包。 打开你的浏览器,访…

【Redis篇】String类型命令详讲以及它的使用场景

目录 前言: 基本命令: setnx/setxx FLUSHALL mest mget 计数命令 INCR / INCRBY DECR/DECYBY INCRBYFLOAT 其他命令 APPEND GETRANGE SETRANGE STRLEN String的典型使用场景 缓存(Cache)功能 计数(…

【2024】前端学习笔记19-ref和reactive使用

学习笔记 1.ref2.reactive3.总结 1.ref ref是 Vue 3 中用来创建响应式引用的一个函数,通常用于基本数据类型(如字符串、数字、布尔值等)或对象/数组的单一值。 ref特点: ref 可以用来创建单个响应式对象对于 ref 包裹的值&…

构造函数的相关

文章目录 一、构造函数 今天我们要来讲解类的默认成员函数之一的构造函数。 一、构造函数 构造函数是特殊的成员函数,需要注意的是,构造函数虽然名称叫构造,但是构造函数的主要任务并不是开空间创建对象(我们常使用的局部对象是栈帧创建时&…

C嘎嘎探索篇:栈与队列的交响:C++中的结构艺术

C嘎嘎探索篇:栈与队列的交响:C中的结构艺术 前言: 小编在之前刚完成了C中栈和队列(stack和queue)的讲解,忘记的小伙伴可以去我上一篇文章看一眼的,今天小编将会带领大家吹奏栈和队列的交响&am…

Xcode15(iOS17.4)打包的项目在 iOS12 系统上启动崩溃

0x00 启动崩溃 崩溃日志,只有 2 行,看不出啥来。 0x01 默认配置 由于我开发时,使用的 Xcode 14.1,打包在另外一台电脑 Xcode 15.3 Xcode 14.1 Build Settings -> Asset Catalog Compliter - Options Xcode 15.3 Build S…

【Python爬虫实战】深入解析 Scrapy:从阻塞与非阻塞到高效爬取的实战指南

🌈个人主页:易辰君-CSDN博客 🔥 系列专栏:https://blog.csdn.net/2401_86688088/category_12797772.html ​ 目录 前言 一、阻塞和非阻塞 (一)阻塞 (二)非阻塞 二、Scrapy的工作…

01 [51单片机 PROTEUS仿真设计]基于温度传感器的恒温控制系统

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 五个按键,分别为启动按键,则LCD1602显示倒计时,音乐播放 设置按键,可以设置倒计时的分秒,然后加减按键,还有最后一个暂停音乐…

途普科技企业知识中台完成华为昇思MindSpore技术认证

近日,北京途普科技有限公司(以下简称“途普科技”)作为华为昇腾大模型方向的应用软件伙伴,核心产品企业知识中台已成功与华为AI框架昇思MindSpore完成相互兼容性认证。这一成就标志着途普科技在AI领域与华为的合作进一步加深&…

shodan(7)

声明! 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&#…

MYSQL 表的增删改查(上)

目录 1.新增数据 2.查询数据 一般查询 去重查询 排序查询 关于NULL 条件查询 分页查询 1.新增数据 语法:insert into 表名[(字段1,字段2...)] values (值,值....); 插入一条新数据行,前面指定的列,要与后面v…

海康面阵、线阵、读码器及3D相机接线说明

为帮助用户快速了解和配置海康系列设备的接线方式,本文将针对海康面阵相机、线阵相机、读码器和3D相机的主要接口及接线方法进行全面整理和说明。 一、海康面阵相机接线说明 海康面阵相机使用6-pin P7接口,其功能设计包括电源输入、光耦隔离信号输入输出…

Java多线程八股(三)一>多线程环境使用哈希表和ArrayList

目录: 一.多线程环境使用ArrayList: 二.多线程使用哈希表: 一.多线程环境使用ArrayList: 首先我们知道,Vector, Stack, HashTable, 是线程安全的(但是不建议用), 其他的集合类不是线程安全的 ,下面是…

TCP IP协议和网络安全

传输层的两个协议: 可靠传输 TCP 分段传输 建立对话(消耗系统资源) 丢失重传netstat -n 不可靠传输 UDP 一个数据包就能表达完整的意思或屏幕广播 应用层协议(默认端口): httpTCP80 网页 ftpTCP21验证用户身…