【机器学习】自然语言处理(NLP)领域革命性突破的模型——Transformer

news2024/12/25 3:25:06

目录

引言

自注意力机制介绍

生成Query、Key和Value向量

模型结构与实现

在自然语言处理中的应用


个人主页:东洛的克莱斯韦克-CSDN博客

👀引言

👀在自然语言处理领域,传统的循环神经网络和长短时记忆网络虽然取得了一定的成果,但在处理长序列时会出现梯度消失或梯度爆炸的问题,这限制了它们的性能。

👀为了解决这些问题,谷歌提出了Transformer模型。该模型采用自注意力机制进行信息的交互与传递,具有高效的计算效率和强大的表示能力。

🧠自注意力机制介绍🧠

🧠自注意力机制是一种强大的工具,它允许模型在序列内部的不同位置间直接建立关系,从而提高了模型的性能和灵活性。通过计算注意力权重并生成加权和表示,自注意力机制能够捕捉到序列中的重要长距离依赖关系,并在各种NLP任务中表现出色。

概念

🧠自注意力机制是一种特殊的注意力机制,它通过将序列中的每个位置视为查询(Query),同时作为(Key)和(Value),来计算注意力权重并生成加权和表示。

核心组件

🧠查询(Query)、键(Key)、值(Value):输入序列中的每个元素首先被转换为这三个向量。查询向量用于与键向量进行匹配,值向量则用于生成加权和表示。

🧠注意力权重:通过计算查询向量和键向量的点积(或其他相似度度量),然后经过softmax归一化得到注意力权重。这些权重表示了输入序列中不同位置之间的依赖关系。

生成Query、Key和Value向量

🧠对于序列中的每个嵌入向量,我们会生成对应的Query、Key和Value向量。这通常是通过将嵌入向量与三个不同的权重矩阵(Wq, Wk, Wv)相乘来实现的。这些权重矩阵是随机初始化的,并在训练过程中进行更新。在这个例子中,假设权重矩阵的维度是(64, 512),因此生成的Query、Key和Value向量的维度是64维。生成Query、Key和Value向量

🧠以单词"Games"为例,假设其嵌入向量为X,则:

q = X * Wq

k = X * Wk

v = X * Wv

计算注意力权重

🧠接下来,对于序列中的每个单词(作为Query),我们计算它与序列中其他所有单词(作为Key)之间的相似度。这通常是通过点积(dot product)来实现的,即计算Query向量和Key向量的点积。然后,这些点积值经过softmax函数进行归一化,得到注意力权重。

🧠以单词"Games"为例,当处理它时,我们会计算它与"The"、"2022"、"Beijing"、"Winter"等单词的注意力权重。

加权求和

🧠最后,我们使用注意力权重对Value向量进行加权求和,得到最终的表示向量。这个表示向量将考虑到序列中所有单词与当前单词的相关性。

🧠以单词"Games"为例,其最终的表示向量将是序列中所有单词的Value向量的加权和,其中权重是单词"Games"与这些单词之间的注意力权重。

🧠为了理解自注意力机制,如下是PyTorch框架来编写的一个简单的示例代码

import torch  
import torch.nn as nn  
import torch.nn.functional as F  
  
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, values, keys, query, mask):  
        N = query.shape[0]  
        value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1]  
          
        # Split the embedding into self.heads different pieces  
        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)  
          
        values = self.values(values)   # (N, value_len, heads, head_dim)  
        keys = self.keys(keys)   # (N, key_len, heads, head_dim)  
        queries = self.queries(queries)  # (N, query_len, heads, head_dim)  
          
        # Einsum does matrix multiplication for query, key and then sum the last two dimensions.  
        # query shape: (N, query_len, heads, head_dim), key shape: (N, key_len, heads, head_dim)  
        # output shape: (N, heads, query_len, key_len)  
        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)  
          
        out = torch.einsum("nhql,nlhd->nqhd", [attention, values]).reshape(N, query_len, self.heads * self.head_dim)  
        out = self.fc_out(out)  
          
        return out  
  
# 示例输入  
# 假设有3个序列,每个序列长度为5,嵌入维度为10,头数为2  
embed_size = 10  
heads = 2  
batch_size = 3  
seq_len = 5  
  
# 随机初始化嵌入向量  
values = torch.randn(batch_size, seq_len, embed_size)  
keys = torch.randn(batch_size, seq_len, embed_size)  
query = torch.randn(batch_size, seq_len, embed_size)  
  
# 假设没有mask(在实际应用中,mask通常用于处理填充token)  
mask = None  
  
# 实例化自注意力层  
attention = SelfAttention(embed_size, heads)  
  
# 前向传播  
output = attention(values, keys, query, mask)  
  
print(output.shape)  # 应该输出 (batch_size, seq_len, embed_size)

🏠模型结构与实现🏠

🏠Transformer模型主要由编码器和解码器两部分组成,它们都是由若干个基本的Transformer Encoder/Decoder Block堆叠而成。

嵌入表示层:对于输入文本序列,首先通过输入嵌入层将每个单词转换为其相对应的向量表示。

🏠由于Transformer中没有任何信息能表示单词间的相对位置关系,故需在词嵌入中加入位置编码。

🏠具体来说,序列中每一个单词所在的位置都对应一个向量,这一向量会与单词表示对应相加并送入到后续模块中做进一步处理。

编码器:编码器由多个相同的层堆叠而成,每个层都包含一个Self-Attention层和一个前馈神经网络。

🏠Self-Attention层通过计算输入序列中每个位置之间的相关性,得到一个注意力权重分布,以便更好地进行信息传递。

🏠前馈神经网络则用于捕捉输入序列中的局部信息。

解码器:解码器同样由多个相同的层堆叠而成,但与编码器相比,解码器在Self-Attention层之后还包含一个Encoder-Decoder Attention层。

🏠这个层允许解码器关注编码器的输出,从而利用源语言序列的信息来生成目标语言序列。

✌在自然语言处理中的应用✌

✌Transformer模型在自然语言处理领域取得了广泛的应用,其中最具代表性的模型包括BERTGPT

✌BERT通过使用Transformer模型进行双向上下文信息的捕捉,在多项NLP任务中取得了显著成果;GPT则通过使用自回归的方式进行语言建模,在文本生成、文本摘要等任务中取得了优异表现。

✌此外,Transformer模型还可以用于文本分类、情感分析、问答系统等各种NLP任务中


小编其他文章:

【机器学习】音乐大模型的深入探讨——当机器有了创意,是机遇还是灾难?-CSDN博客

【机器学习】机器的登神长阶——AIGC-CSDN博客

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

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

相关文章

linux 登录ftp报Received message too long 1416128883

在linux 登录ftp报Received message too long 1416128883 [rootlocalhost ~]# sftp oaftp172.20.xx.xx解决办法: [rootlocalhost ~]# usermod -s /bin/bash oaftp[rootlocalhost ~]# systemctl restart vsftpd.service[rootlocalhost ~]# sftp oaftp172.20.xx.xx完…

【TB作品】stm32单片机,红外遥控器,温控风扇,模拟空调,PWM风扇

空调机 硬件:stm32、oled显示器、ds18b20温度传感器、风扇驱动和风扇、红外接收器、遥控器 软件功能: (1)显示室内温度 (2)显示当前模式:常态、除湿、通风 (3)显示当前风…

昇思25天学习打卡营第6天 | 函数式自动微分

神经网络的训练主要使用反向传播算法, 模型预测值(logits)与正确标签(label)送入损失函数(loss function)获得loss, 然后进行反向传播计算,求得梯度(gradie…

Kubernetes 中 ElasticSearch 中的 MinIO 审核日志

无论您是在本地还是在云中,您都希望确保以同构的方式设置工具和流程。无论在何处访问基础结构,您都希望确保用于与各种基础结构进行交互的工具与其他区域相似。 考虑到这一点,在部署您自己的 MinIO 对象存储基础架构时,深入了解您…

【Python】已解决:urllib模块设置代理ip

文章目录 一、分析问题背景二、可能出错的原因三、错误代码示例四、正确代码示例五、注意事项 已解决:urllib模块设置代理ip 一、分析问题背景 在使用Python的urllib模块进行网络请求时,有时我们需要通过代理服务器来发送请求,以达到隐藏真…

python中的<class ‘complex‘>

一般编程里面不怎么会讲&#xff0c;但是还是挺强大的一个类。 在 Python 中&#xff0c;<class complex> 表示复数类型。复数是一种包含实部和虚部的数学数&#xff0c;可以用 a bj 的形式表示&#xff0c;其中 a 表示实部&#xff0c;b 表示虚部&#xff0c;j 是虚数…

2024年广西三支一扶报名详细流程(附报名照处理流程)​

2024年广西将招募1650名高校毕业生到基层从事支农、支医、支教和帮扶乡村振兴工作&#xff08;简称“三支一扶”&#xff09;。 招募对象为全日制普通高校应届及择业期内2022年至2024年毕业的全日制普通高校毕业生。 ➡️招募条件。 1.具有全日制大专&#xff08;含高职高专&am…

【C++题解】1058 - 求出100至999范围内的所有水仙花数。

问题:1058 - 求出100至999范围内的所有水仙花数。 类型&#xff1a;简单循环 题目描述&#xff1a; 所谓水仙花数&#xff0c;就是指各位数字立方之和等于该数的数&#xff1b;a^3 称为 a 的立方&#xff0c;即等于 aaa 的值。 例如&#xff1a;因为 15313533^3 &#xff0c;…

【JavaEE 进阶(六)】Mybatis操作数据库

❣博主主页: 33的博客❣ ▶️文章专栏分类:JavaEE◀️ &#x1f69a;我的代码仓库: 33的代码仓库&#x1f69a; &#x1faf5;&#x1faf5;&#x1faf5;关注我带你了解更多进阶知识 目录 1.前言2.JDBC操作3.Mybatis3.1Mybatis入门3.1.1准备工作3.1.2配置数据库连接3.1.2写持久…

13 物理层介质及设备

物理层介质及设备 一、线缆的连接 &#xff08;一&#xff09;线序 ​ 线序&#xff1a; RJ-45连接头12345678568A绿白绿橙白蓝蓝白橙棕白棕568B橙白橙绿白蓝蓝白绿棕白棕 ​ 1、2发送&#xff0c;3、6接收 &#xff08;二&#xff09;线缆的应用 1.线缆的连接 ​ 标准…

OpenHarmony 5.0 纯血鸿蒙系统

OpenHarmony-v5.0-Beta1 版本已于 2024-06-20 发布。 OpenHarmony 5.0 Beta1 版本标准系统能力持续完善&#xff0c;ArkUI 完善了组件通过 C API 调用的能力&#xff1b;应用框架细化了生命周期管理能力&#xff0c;完善了应用拉起、跳转的能力&#xff1b;分布式软总线连接能力…

MindManager2024思维导图软件重磅发布更新!

大家好啊&#xff01;&#x1f44b; 今天我超级激动要分享给大家一款改变我工作和学习方式的工具——MindManager2024思维导图软件&#xff01;这可不仅仅是个工具哦&#xff0c;它更像是我的私人思维助手&#xff0c;帮我整理思绪&#xff0c;规划时间&#xff0c;还能激发创新…

HTML+CSS 3D旋转登录表单

效果演示 实现了一个具有3D旋转效果的登录框&#xff0c;背景为太空图片&#xff0c;登录框位于太空中心&#xff0c;可以通过输入用户名和密码进行登录。登录框使用了CSS3的3D变换和动画效果&#xff0c;使其具有立体感和动态效果。同时&#xff0c;登录框的样式也经过精心设计…

TMC2209驱动模式详解

TMC2209驱动模式详解 1.TMC2209封装2.TMC2209引脚定义 1.TMC2209封装 2.TMC2209引脚定义

关于ONLYOFFICE8.1版本桌面编辑器测评——AI时代的领跑者

关于作者&#xff1a;个人主页 目录 一.产品介绍 1.关于ONLYOFFICE 2.关于产品的多元化功能 二.关于产品体验方式 1.关于套件的使用网页版登录 2.关于ONLYOFFICE本地版 三.关于产品界面设计 四.关于产品文字处理器&#xff08;Document Editor&#xff09; 1.电子表格&a…

破碎的像素地牢探险:游戏分享

软件介绍 《破碎的像素地牢》是开源一款地牢冒险探索类的游戏&#xff0c;融合了日系RPG经典风格&#xff0c;玩家将控制主角进行未知场景的探索。除了经典地牢玩法外&#xff0c;游戏还添加了更多创意内容&#xff0c;如黑屏状态前的挑战性等&#xff0c;使得游戏更加富有挑战…

【源码】Spring Data JPA原理解析之Auditing执行原理

Spring Data JPA系列 1、SpringBoot集成JPA及基本使用 2、Spring Data JPA Criteria查询、部分字段查询 3、Spring Data JPA数据批量插入、批量更新真的用对了吗 4、Spring Data JPA的一对一、LazyInitializationException异常、一对多、多对多操作 5、Spring Data JPA自定…

C#的无边框窗体项目模板 - 开源研究系列文章

继续整理和编写代码及博文。 这次将笔者自己整理的C#的无边框窗体项目的基本模板进行总结&#xff0c;得出了基于C#的.net framework的Winform的4个项目模板&#xff0c;这些模板具有基本的功能&#xff0c;即已经初步将代码写了&#xff0c;直接在其基础上添加业务代码即可&am…

Maya 白膜渲染简单教程

零基础渲染小白&#xff0c;没关系&#xff0c;一篇超简单教程带你学会渲染白膜。 先打开Maya&#xff0c;看看面板有没有渲染器&#xff0c;这里以Arnold为主。 要是没有这个&#xff0c;就去找插件管理器&#xff0c; Arnold的是mtoa&#xff0c;在搜索栏搜&#xff0c;然后把…

uni-app 微信小程序开发到发布流程

1. uni-app 微信小程序开发到发布流程 1.1. 新建一个uni-app 项目 1.2. 发行微信小程序 1.3. 微信开发者平台的微信小程序appid 复制进来&#xff08;点击发行&#xff09; 1.4. IDE may already started at port xxxx, trying to connect &#xff08;1&#xff09;关闭微信…