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 math


def 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_encoding

positional_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

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

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

相关文章

数字化校园的发展阶段

现代化技能虽然能很大程度上给人们日子带来很大的便利,可是许多新兴的科技被人们所接纳需求一个按部就班的进程。数字化学校也是如此。把高新科技引入到学校中,完全推翻之前的教育形式,关于学校来说也是一个巨大的挑战。所以数字化学校也不可…

怿星 × NI丨联合成功打造行业领先的L4自动驾驶数据回灌系统

怿星NI 联合成功打造行业领先的L4自动驾驶数据回灌系统(终版) 怿星与于NI(恩艾)公司联合打造的L4自动驾驶数据回灌系统,在支持多种数据同步回灌、实时模拟故障、高带宽数据传输的同时,具有视频链路扩展性高…

2024年钉钉群直播回放怎么保存

钉钉群直播回放下载插件我已经打包好了,有需要的自己下载一下 小白钉钉工具打包链接:百度网盘 请输入提取码 提取码:1234 --来自百度网盘超级会员V10的分享 1.首先解压好我给大家准备好的压缩包 2.再把逍遥一仙下载器解压出来&#xff0…

护眼台灯什么牌子好一点?五款专业护眼灯品牌排行分享

台灯作为家庭中不可或缺的桌面照明设备,在儿童和青少年的学习生活中扮演着至关重要的角色。对于这个年龄段的孩子来说,台灯的选择尤为关键,因为不恰当的照明可能对他们娇嫩的视力造成损害。护眼台灯什么牌子好一点?家长们在挑选台…

ERROR 1045 (28000) Access denied for user ‘root‘@‘IP‘(using password YES/NO)

查看权限 要查看MySQL用户的权限,您可以使用SHOW GRANTS语句。这将列出用户的权限,包括授予的权限和可以授予其他用户的权限。 以下是查看当前用户权限的SQL命令: SHOW GRANTS; 如果您想查看特定用户的权限,可以使用以下命令&…

delphi6直连redis服务(用lua脚本redis模块)

一、创建一个exe程序 创建一个exe程序,引用LuaRedis.pas单元(此单元自己封装的代码,目前主要封装了获取key和设置key/value功能),代码如下: unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls;type…

仅为娱乐,Python中如何重定义True为False?

在Python中,True 和 False 是内建的布尔常量,分别代表逻辑上的真和假。它们是不可变的,且在Python语言规范中具有特殊地位,不能被用户直接重定义。尝试给 True 或 False 赋予新的值是违反Python语言规则的,这样的操作会…

​在英特尔至强 CPU 上使用 Optimum Intel 实现超快 SetFit 推理

在缺少标注数据场景,SetFit 是解决的建模问题的一个有前途的解决方案,其由 Hugging Face 与Intel 实验室以及UKP Lab合作共同开发。作为一个高效的框架,SetFit 可用于对Sentence Transformers模型进行少样本微调。 SetFit 仅需很少的标注数据…

【JavaEE精炼宝库】计算机是如何工作的

目录 前言: 一、冯诺依曼体系 二、CPU基本知识 2.1 硬盘|内存|CPU关系: 2.2 指令: 2.3 CPU是如何执行指令的(重点): 2.4 小结: 三、编程语言 3.1 程序: 3.2 编程语言发展&a…

游戏全自动打金搬砖,单号收益300+ 轻松日入1000+

详情介绍 游戏全自动打金搬砖,单号收益300左右,多开收益更多,轻松日入1000 可矩阵操作。 项目长期稳定,全自动挂机无需人工操作,小白,宝妈,想做副业的都可以。

【链表-双向链表】

链表-双向链表 1.链表的分类1.1 分类依据1.2 常用类型 2.双向链表的2.1 双向链表的结构2.2 双向链表的操作2.2.1 **初始化**2.2.2 **尾插**2.2.3 **头插**2.2.4 **尾删**2.2.5 **头删**2.2.6 在pos位置之后插入数据2.2.7 删除pos节点2.2.8 查找2.2.9 销毁 1.链表的分类 1.1 分…

翻译技巧早操练-(减译法)

hello,大家好,今天继续来学习翻译的技巧篇第二个-减译法。 往期回顾 翻译早操练-(增译法)-CSDN博客 减译法的目的就是为了译入语表达的通顺,如果原文的一些表达直接翻译到译入语即累赘还不合时宜,那么可以采…

【启明智显技术分享】基于ESP32-S3方案的彩屏固件烧录指南

前言: 【启明智显】专注于HMI(人机交互)及AIoT(人工智能物联网)产品和解决方案的提供商,我们深知彩屏显示方案在现代物联网应用中的重要性。为此,我们一直致力于为客户提供彩屏显示方案相关的技…

主播美颜技术探秘:计算机视觉赋能的直播美颜SDK

今天,我们将深入探讨直播美颜技术背后的计算机视觉原理,以及赋能这一技术的直播美颜SDK。 一、计算机视觉与直播美颜 计算机视觉是一门研究如何使机器“看”的学科,它利用数字图像处理和模式识别等技术,使计算机能够模拟人类视觉…

STL速查

容器 (Containers) 图解容器 支持随机访问 stringarrayvectordeque支持支持支持支持 string 类 构造函数 string(); ------创建一个空的字符串 例如: string str;string(const char* s); ------使用字符串s初始化string(const string& str); ------拷贝构造 赋值操作…

打破次元壁!Stable Diffusion将现实影像转成二次元动画,推特转赞10k+,网友:都可以重做《神奇宝贝》动漫了

破次元壁计划已启动! 就在最近,有网友分享了一个用Stable Diffusion打造二次元动画的工具,直接在网上爆火。 先快来看一波效果。 万物皆可妙化为二次元,耳机也可蜕变成小兔兔: 瞧!连易拉罐的拉环也化身成…

【GPT调用】本地使用python调用GPT接口

python调用GPT接口 环境变量设置主调用方法执行结果 环境变量设置 .env文件中配置GPT环境变量 api_key"你的GPT-API-KEY" urlhttps://ai-proxy.ksord.com/wps.openai.azure.com/openai/deployments/gpt-4-32k/chat/completions?api-version2023-09-01-preview主调…

Oracle SQL Developer导出数据库表结构,表数据,索引以及序列号等对象

通过Oracle SQL Developer软件将指定oralce数据库中的表结构,表数据,索引以及序列号等对象导出成SQL文件。 数据库版本:Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production 软件版本:Oracle SQL Develo…

【千帆平台】使用AppBuilder零代码创建应用,Excel表格数据转为Markdown格式文本

欢迎来到《小5讲堂》 这是《千帆平台》系列文章,每篇文章将以博主理解的角度展开讲解。 温馨提示:博主能力有限,理解水平有限,若有不对之处望指正! 目录 前言创建应用应用名称应用描述应用头像角色指令组件能力开场白推…

【Python】一道字典题目

题目:输入一段文本,统计每个字符的个数 in_inputinput(“输入:”) dic{} for char in in_input: if char in dic: dic[char]1 # 字典添加键值对的方法,给字典给键和值的方法 else: dic[char]1 print(dic) 输出台: