pytorch实现transformer(1): 模型介绍

文章目录

    • 1. transformer 介绍
    • 2 Position Encoding
      • 2.1 位置编码原理
      • 2.2 代码实现
    • 3 Self-attention
    • 4 前馈层FFN
    • 5 残差连接与层归一化
    • 6 编码器和解码器结构

1. transformer 介绍

Transformer 模型是由谷歌在 2017 年提出并首先应用于机器翻译的神经网络模型结构。机器翻译的目标是从源语言(Source Language)转换到目标语言(Target Language)。Transformer 结构完全通过注意力机制完成对源语言序列和目标语言序列全局依赖的建模。当前几乎全部大语言模型都是基于 Transformer 结构,本节以应用于机器翻译的基于 Transformer 的编码器和解码器介绍该模型。

Transformer它的提出最开始是针对NLP领域的,在次之前大家主要用的是RNN,LSTM这类时序网络。像RNN这类网络其实它是有些问题的,首先它的记忆的长度是有限的,特别像RNN它的记忆长度就比较短,所以后面就有提出LSTM。但是他们还有另外一个问题就是无法并行化,也就是说我们必须先计算 t 0 t_0 t0时刻的输出,计算完之后我们才能进一步计算 t 1 t_1 t1时刻的数据。由于无法并行化,训练效率就比较低.

针对这一问题,Google提出了Transformer来替代之前的时序网络,

  • Transformer不受硬件限制的情况下,理论上记忆是可以无限长的。
  • 其次,它是可以做并行化的,这是一个非常大的优点

基于 Transformer 结构主要分两部分:编码器Encoder和解码器Decoder,它们均由若干个基本的 Transformer 块(Block)组成(对应着图中的灰色框)。每个 Transformer 块都接收一个向量序列 { x i } i = 1 t \{x_i\}_{i=1}^t {xi}i=1t作为输入,并输出一个等长的向量序列作为输出 { y i } i = 1 t \{y_i\}_{i=1}^t {yi}i=1t, 而 y i y_i yi是当前 Transformer 块对输入 x i x_i xi进一步整合其上下文语义后对应的输出。

在这里插入图片描述

图1:基于 Transformer 的编码器和解码器结构

主要涉及到如下几个模块:

  • Position Encoding: 使用位置编码来理解文本的顺序

  • 注意力层:使用多头注意力(Multi-Head Attention)机制 整合上下文语义 ,它使得序列中任意两个token之间的依赖关系可以直接被建模而不基于传统的循环结构,从而更好地解决文本的长程依赖

  • 位置感知前馈层(Position-wise FFN):通过全连接层对输入文本序列中的每个单词表示进行更复杂的变换

  • 残差连接:对应图中的 Add 部分。它是一条分别作用在上述两个子层当中的直连通路,被用于连接它们的输入与输出。从而使得信息流动更加高效,有利于模型的优化

  • 层归一化:对应图中的 Norm 部分。作用于上述两个子层的输出表示序列中,对表示序列进行层归一化操作,同样起到稳定优化的作用。

2 Position Encoding

2.1 位置编码原理

由于Transformer模型没有循环神经网络的迭代操作,所以我们必须提供每个token位置信息给Transformer, 这样它才能识别出语言中的顺序关系。

Positional Encoding(位置嵌入), 它的维度为[num_token,embedding_dimension], 位置嵌入的维度与词向量token的维度是相同的,都是embedding_dimension。其中max_sequence_length属于超参数,指的是限定每个句子最长由多少个词组成。

注意,我们一般以为单位训练Transformer模型,首先初始化字编码大小为[vocab_size,embedding_dimension], vocab_size 为字库中所有字的数量,embedding_dimension为字向量的维度,对应pytorch中,其实就是 nn.Embedding(vocab_size,embedding_dimension)

论文中使用了 s i n sin sin c o s cos cos函数的线性变换来提供给模型位置信息:

在这里插入图片描述
其中pos指的是一句话中某个字的位置,取值范围为[0,max_sequence_length], i i i指的是字向量的序号,取值范围是[0,embedding_dimension/2], d m o d e l d_{model} dmodel指的是embedding_dimension的值。

通过sincos处理,从而使得位置编码产生不同对的周期性变化,使得每个位置在embedding_dimension维度上都会得到不同周期的sincos函数的取值组合,从而产生独一的位置信息,最终使得模型学到位置之间的依赖关系和自然语言的时序特效

2.2 代码实现

import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns 
import mathdef get_positional_encoding(max_seq_len,embed_dim):# 初始化一个positional encoding# embed_dim: 字嵌入的维度# max_seq_len: 最大的序列长度positional_encoding = np.array([[pos/np.power(1000,2*i/ embed_dim) for i in range(embed_dim)] if pos !=0 else \np.zeros(embed_dim) for pos in range(max_seq_len)])positional_encoding[1:,0::2] = np.sin(positional_encoding[1:,0::2]) #dim 2i 偶数positional_encoding[1:,1::2] = np.cos(positional_encoding[1:,1::2]) #dim 2i+1 奇数return positional_encodingpositional_encoding = get_positional_encoding(max_seq_len=100,embed_dim=16)
plt.figure(figsize=(10,10))
sns.heatmap(positional_encoding)
plt.title('Sinusoidal Function')
plt.xlabel('hidden dimension')

在这里插入图片描述

plt.figure(figsize=(8,5))
plt.plot(positional_encoding[1:,1],label="dimension 1")
plt.plot(positional_encoding[1:,2],label="dimension 2")
plt.plot(positional_encoding[1:,3],label="dimension 3")
plt.legend()
plt.xlabel("Sequence length")
plt.ylabel("Period of Positional Encoding")

在这里插入图片描述

3 Self-attention

自注意力(Self-Attention)操作是基于 Transformer 的机器翻译模型的基本操作,在源语言的编码和目标语言的生成中频繁地被使用以建模源语言、目标语言任意两个单词之间的依赖关系。给定由单词语义嵌入及其位置编码叠加得到的输入表示 { x i ∈ R d } i t \{x_i \in R^d\}_i^t {xiRd}it, 为了实现对上下文语义依赖的建模,进一步引入在自注意力机制中涉及到的三个元素:查询 q i q_i qi

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

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

相关文章

23.右值引用_c++11(左值引用的使用场景、右值引用的使用场景、左值引用和右值引用的对比、移动构造、移动赋值、右值引用完美转发)

传统的C语法中就有引用的语法,而C11中新增了的右值引用语法特性,所以从现在开始我们之前学习的引用就叫做左值引用。无论左值引用还是右值引用,都是给对象取别名。 4.右值引用 4.1 左值引用和右值引用 什么是左值?什么是左值引…

2024年常用的几款透明加密软件大全

文件透明加密软件是一种特殊类型的加密工具,它们能够在后台自动加密和解密文件,对用户来说,加密和解密是透明的,不需要额外的操作。以下是几种常见的文件透明加密软件: 1、Ping32: Ping32透明加密软件还具…

4000定制网站,因为没有案例,客户走了

接到一个要做企业站点的客户,属于定制开发,预算4000看起来是不是还行的一个订单? 接单第一步:筛客户 从客户询盘的那一刻开始就要围绕核心要素:预算和工期,凡是不符合预期的一律放掉就好了,没必…

Python | Leetcode Python题解之第74题搜索二维矩阵

题目&#xff1a; 题解&#xff1a; class Solution:def searchMatrix(self, matrix: List[List[int]], target: int) -> bool:row,col len(matrix),len(matrix[0])row_l,row_r 0,row-1while row_l < row_r:m (row_lrow_r)//2if target < matrix[m][0]:row_r m-1…

[已解决]oneforAll ImportError: cannot import name ‘sre_parse‘ from ‘re‘

在使用 oneforall中&#xff0c;配置环境时出现了这个报错&#xff1a; 实际上是因为高版本python中re模块没有了sre_parse模块&#xff0c;可以修改exrex.py 代码&#xff0c;直接导入sre_parse模块&#xff0c;如下&#xff1a;

Pspice for TI学习

Pspice for TI中PSpice Part Search空白解决方法 配置环境变量 Cad_PSpice_TI_Regr_Srvr https://software-dl.ti.com/pspice/S009 重新安装2023版的Pspice Pspice安装链接 打开新安装的软件即可发现PSpice Part Search可以正常使用了 VSIN各参赛的含义 VOFF直流偏置VAMPL…

重生奇迹MU获取宝石方法

1、商城&#xff1a;商场分为钻石商城和绑钻商城&#xff0c;钻石是直接充值的&#xff0c;绑钻是系统赠送的&#xff0c;两个地方所出售的道具都不一样&#xff0c;绑钻不能在钻石商城中购买。钻石商城中有各个等级的宝石出售&#xff0c;越高级的钻石越贵&#xff0c;不建议平…

网络安全之ACL

ACL&#xff1a;访问控制列表——控制列表&#xff08;策略列表&#xff09;&#xff0c;是一个控制工具。 功能&#xff1a;&#xff01;、定义感兴趣路由&#xff08;控制层面&#xff09;。2、定义感兴趣流量&#xff08;数据层面&#xff09;。 例如&#xff1a; 假设在该…

Python 中 “yield“ 的不同行为

在我们使用Python编译过程中&#xff0c;yield 关键字用于定义生成器函数&#xff0c;它的作用是将函数变成一个生成器&#xff0c;可以迭代产生值。yield 的行为在不同的情况下会有不同的效果和用途。 1、问题背景 在 Python 中&#xff0c;“yield” 是一种生成器&#xff0…

武汉星起航:亚马逊欧洲站:丰富商品与卓越服务铸就高客单价典范

亚马逊&#xff0c;作为全球最大的电商平台之一&#xff0c;其欧洲站在全球电商市场中占据着举足轻重的地位。其中&#xff0c;亚马逊欧洲站的人均客单价更是高居世界前列&#xff0c;这背后究竟隐藏着哪些原因呢&#xff1f; 首先&#xff0c;亚马逊具有丰富且高质量的商品品…

设计模式:命令模式

文章目录 一、什么是命令模式二、命令模式结构三、命令模式实现步骤四、命令模式应用场景 一、什么是命令模式 它允许将请求封装为对象&#xff0c;一个请求对应于一个命令&#xff0c;将发出命令的责任和执行命令的责任分割开。每一个命令都是一个操作&#xff1a;请求的一方…

【@ohos.events.emitter (Emitter)】

ohos.events.emitter (Emitter) 本模块提供了在同一进程不同线程间&#xff0c;或同一进程同一线程内&#xff0c;发送和处理事件的能力&#xff0c;包括持续订阅事件、单次订阅事件、取消订阅事件&#xff0c;以及发送事件到事件队列的能力。 说明&#xff1a; 本模块首批接…

zlib编译后静态库调用时遇到的无法解析的外部符号问题

编译zlib的静态库后引用到项目中使用&#xff0c;发现报下面的链接错误&#xff1a; error LNK2019: 无法解析的外部符号 _zlibVersion error LNK2019: 无法解析的外部符号 _deflateEnd error LNK2019: 无法解析的外部符号 _deflate error LNK2019: 无法解析的外部符号 _deflat…

什么牌子充电宝质量耐用且性价比高、充电宝性价比高品牌合集

在现代社会&#xff0c;手机几乎成了我们生活中不可或缺的一部分。无论是工作、学习还是娱乐&#xff0c;我们都离不开手机的陪伴。然而&#xff0c;随着手机使用频率的增加&#xff0c;电量焦虑也逐渐成为了我们共同面临的问题。出门时&#xff0c;我们可能会忘记带钱包&#…

已解决-你需要trustedinstaller权限才能执行此操作

欢迎关注我👆,收藏下次不迷路┗|`O′|┛ 嗷~~ 目录 一.前言 二.解决方法 一.前言 我想删除C:\Windows\System32\drivers文件夹下面的内容,可是报错: 怎么办呢? 二.解决方法 右键要删除的文件

OpenCV 入门(六) —— Android 下的人脸识别

OpenCV 入门系列&#xff1a; OpenCV 入门&#xff08;一&#xff09;—— OpenCV 基础 OpenCV 入门&#xff08;二&#xff09;—— 车牌定位 OpenCV 入门&#xff08;三&#xff09;—— 车牌筛选 OpenCV 入门&#xff08;四&#xff09;—— 车牌号识别 OpenCV 入门&#xf…

二手手机店需要用专业erp软件进行管理吗?

2024年在科技发展迅速的今天&#xff0c;手机批发和零售行业正迎来前所未有的革新。为了在这个变革中抓住机遇&#xff0c;提升竞争力&#xff0c;二手手机店需要寻找一种全面、高效、智能的管理工具。基于这个原因&#xff0c;超机商城为众多二手手机店商家量身打造的一款二手…

水电站泄洪安全声光预警广播系统建设方案

一、水电站泄洪安全声光预警广播系统建设方案背景 水电站建成运行以后&#xff0c;会使河道水文情势发生改变&#xff0c;为了加强水电站工程安全管理&#xff0c;保证水库泄洪放水工作安全有序进行&#xff0c;保护下游河道沿岸人民群众生命和财产安全&#xff0c;根据《中华…

DevSecOps 是什么?你知道吗?

使用工具自动进行安全检查和扫描。这些工具包括静态应用程序安全测试 (SAST)、动态应用程序安全测试 (DAST) 和依赖性扫描。 什么是 DevSecOps&#xff1f; DevSecOps 是 DevOps 实践的自然演进&#xff0c;其重点是将安全集成到软件开发和部署流程中。 DevSecOps 一词代表了…

elk + filebeat 8.4.3 收集nginx日志(docker部署)

ELK filebeat docker部署 一、 elasticsearch部署1、运行elasticsearch临时配置容器2、拷贝文件目录到本地3、检查elasticsearch.yml4、删除之前elastic&#xff0c;运行正式容器5、docker logs记录启动日志 二、部署kibana1、运行kibana临时配置容器2、docker拷贝配置文件到本…