变形金刚:第 2 部分:变形金刚的架构

目录

一、说明

二、实现Transformer的过程

        第 1 步:代币化(Tokenization)

        第 2 步:对每个单词进行标记嵌入

        第 3 步:对每个单词进行位置嵌入

        第 4 步:输入嵌入

第 5 步:编码器层

2.5.1 多头自注意力 

2.5.2 剩余连接(添加)

2.5.3 层归一化

2.5.4 前馈神经网络

第6步:解码器层

三、小结


一、说明

        本文对transformer的体系进行系统梳理,总的来说,transformer实现分五个步骤,除了一般化处理,token、词法、句法、词嵌入式,编码、解码过程。

二、实现Transformer的过程

        涉及的步骤是:

        第 1 步:代币化(Tokenization

        输入序列“how are you”被标记为单个单词或子单词。我们假设它被标记为以下标记:[“how”、“are”、“you”]。

        第 2 步:对每个单词进行标记嵌入

  • 嵌入“如何”:[0.5, 0.2, -0.1]
  • “are”的嵌入:[-0.3, 0.8, 0.4]
  • 嵌入“你”:[0.6,-0.5,0.3]
令牌嵌入和位置嵌入之间的区别
model_name = 'gpt2'  # Replace with the specific transformer model you want to use
model = GPT2Model.from_pretrained(model_name)
tokenizer = GPT2Tokenizer.from_pretrained(model_name)# Example input text
input_text = "Hello, how are you today?"# Tokenize input text
tokens = tokenizer.tokenize(input_text)
input_ids = tokenizer.convert_tokens_to_ids(tokens)
input_tensor = torch.tensor([input_ids])# Generate token embeddings
token_embeddings = model.transformer.wte(input_tensor)

      

        第 3 步:对每个单词进行位置嵌入

        位置输入嵌入是基于变压器的模型的关键组成部分,包括用于会话聊天机器人的模型。它们提供有关序列中标记相对位置的信息,使模型能够理解输入的顺序。

        在 Transformer 中,位置输入嵌入被添加到令牌嵌入中以对位置信息进行编码。

        生成位置嵌入有不同的方法。一种常见的方法是使用正弦函数来创建具有固定模式的嵌入。序列中每个标记的位置被映射到一个唯一的向量,其中向量的值对应于不同频率的正弦和余弦函数。这些频率控制每个位置嵌入对令牌的最终表示的贡献程度。

# Generate positional embeddings
position_ids = torch.arange(input_tensor.size(1), dtype=torch.long)
position_ids = position_ids.unsqueeze(0)
position_embeddings = model.transformer.wpe(position_ids)

        第 4 步:输入嵌入

        输入嵌入是令牌嵌入和位置嵌入的总和。

# Sum token embeddings and positional embeddings
input_embeddings = token_embeddings + position_embeddings

第 5 步:编码器层

2.5.1 多头自注意力 

        a.含义

        编码器层中的第一个子层是多头自注意力机制。它允许输入序列中的每个位置关注所有其他位置,捕获序列的不同元素之间的依赖关系

        b.自注意力机制

        自注意力机制通过考虑每个元素与所有其他元素的关系来计算每个元素的注意力权重。例如:

        输入:“你好吗”

        在自注意力机制中,每个元素的权重都是相对于其他元素计算的。这就是找到“如何”与“是”、“你”和“做”的关系。这种机制被并行地(头向)多次应用以捕获不同类型的依赖关系。

        问→查询

        K → 键

        V→值

        步骤a:为每个输入嵌入找到查询、键和值

        在自注意力中,从每个输入单词导出三个向量查询向量、键向量和值向量。这些向量用于计算注意力权重。单词的注意力权重表示在对特定单词进行编码时应该注意多少。

        这里的查询、键和值就像 YouTube 搜索引擎一样。给出查询(在搜索框中),像视频标题、描述这样的键用于查找值(这里是视频)。

        步骤b.注意力权重计算(Scores)

        使用 Matmul 找到注意力权重或分数

        分数矩阵将决定每个单词对另一个单词的重要性。分数越高,越受关注。

        每个词都会影响另一个词

        步骤c:在分数矩阵上进行缩放

        步骤 d:对分数矩阵进行 Softmax

        经过softmax之后,较高的分数会得到提高,较低的分数会受到抑制。这使得重要的分数在下一步中被削弱

        步骤 e:MatMul,其中注意力权重与值向量相乘

    

        将注意力权重与值相乘得到输出

        步骤f: 找到每个单词的上下文向量

        当涉及的向量数量较多时。它们连接成一个向量

        创建各种自注意力头

        自注意力头被连接起来并发送到线性块中。

        连接的输出被送入线性层进行处理,并找到每个单词的上下文向量。

2.5.2 剩余连接(添加)

添加输入嵌入和上下文向量

2.5.3 层归一化

剩余连接的输出进入层归一化。分层归一化有助于稳定网络。

“你好吗”的输出向量:

  • “如何”的上下文向量:[0.9,-0.4,0.2]
  • “are”的上下文向量:[-0.2, 0.6, -0.3]
  • “你”的上下文向量:[0.3,0.1,0.5]

2.5.4 前馈神经网络

现在,上下文向量通过位置前馈神经网络传递,该网络独立地对每个位置进行操作。

我们将前馈网络的权重和偏差表示如下:

  • 第一个线性变换权重:W1 = [[0.1, 0.3, -0.2], [0.4, 0.2, 0.5], [-0.3, 0.1, 0.6]]
  • 第一个线性变换偏差:b1 = [0.2, 0.1, -0.3]
  • 第二次线性变换权重:W2 = [[0.2, -0.4, 0.1], [-0.3, 0.5, 0.2], [0.1, 0.2, -0.3]]
  • 第二个线性变换偏差:b2 = [0.1, -0.2, 0.3]

对于每个上下文向量,具有Relu 激活函数的位置前馈神经网络应用以下计算:

位置前馈神经网络将上下文向量转换为每个单词的新表示。

  • 编码器可以堆叠n次,以便每个单词可以学习每个单词的不同表示。

描述编码器的代码:

import torch
import torch.nn as nn
import torch.nn.functional as Fclass EncoderLayer(nn.Module):def __init__(self, d_model, num_heads, d_ff, dropout):super(EncoderLayer, self).__init__()self.self_attention = nn.MultiheadAttention(d_model, num_heads)self.norm1 = nn.LayerNorm(d_model)self.feed_forward = nn.Sequential(nn.Linear(d_model, d_ff),nn.ReLU(),nn.Linear(d_ff, d_model))self.norm2 = nn.LayerNorm(d_model)self.dropout = nn.Dropout(dropout)def forward(self, x):# Multi-head self-attentionattn_output, _ = self.self_attention(x, x, x)x = x + self.dropout(attn_output)x = self.norm1(x)# Feed-forward networkff_output = self.feed_forward(x)x = x + self.dropout(ff_output)x = self.norm2(x)return x

第6步:解码器层

        转换器解码器从编码器获取编码表示并处理输出序列(“我很好”)以生成相应的序列。

在解码的每个步骤中,解码器都会关注:

  • 之前生成的单词
  • 使用自注意力和编码器-解码器注意力机制的编码输入表示。

解码器

目标:“<开始>I am

步骤 1:解码器接收序列开始标记“<start>”作为其初始输入。

步骤 2:解码器使用编码器-解码器注意机制关注编码的输入表示。这有助于解码器与输入中的相关信息保持一致。

步骤 3:解码器使用自注意力机制关注其之前生成的单词,并考虑到目前为止生成的嵌入。

步骤 4:解码器应用位置前馈神经网络来细化表示。

步骤5:解码器根据细化的表示生成第一个单词“I”。

步骤6-8:解码器对后续单词“am”和“fine”重复该过程,根据之前的上下文、自注意力和前馈网络生成它们。

(代码较为复杂,整理以后给出---更新中.... )

三、小结

        以上概括第给出transformer的实现提纲,至于每一个步骤还有更多细节,可以在此文的引导下继续细化完成。

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

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

相关文章

【MySQL】高度为2和3时B+树能够存储的记录数量的计算过程

文章目录 题目答案高度为2时的B树高度为3时的B树总结 GPT4 对话过程 题目 InnoDB主键索引的Btree在高度分别为 2 和 3 时&#xff0c;可以存储多少条记录&#xff1f; 答案 高度为2时的B树 计算过程&#xff1a; 使用公式 ( n 8 ( n 1 ) 6 16 1024 ) (n \times 8 …

二维数组及函数的非函数实现

2024年2月14日 1.请编程实现二维数组的杨慧三角 #include<stdio.h> #include<stdlib.h> #include<string.h> void Yanghui(int n,int (*p)[n]) {for(int i0;i<n;i){for(int j0;j<i;j){if(j0||ij){*(*(pi)j)1;}else{*(*(pi)j)*(*(pi-1)j-1)*(*(pi-1)j)…

相机图像质量研究(15)常见问题总结:光学结构对成像的影响--暗角

系列文章目录 相机图像质量研究(1)Camera成像流程介绍 相机图像质量研究(2)ISP专用平台调优介绍 相机图像质量研究(3)图像质量测试介绍 相机图像质量研究(4)常见问题总结&#xff1a;光学结构对成像的影响--焦距 相机图像质量研究(5)常见问题总结&#xff1a;光学结构对成…

456. 车站分级(拓扑排序,虚拟点建图)

活动 - AcWing 一条单向的铁路线上&#xff0c;依次有编号为 1, 2, …, n1,  的 n 个火车站。 每个火车站都有一个级别&#xff0c;最低为 1 级。 现有若干趟车次在这条线路上行驶&#xff0c;每一趟都满足如下要求&#xff1a;如果这趟车次停靠了火车站 x&#xff0c;…

Elasticsearch:特定领域的生成式 AI - 预训练、微调和 RAG

作者&#xff1a;来自 Elastic Steve Dodson 有多种策略可以将特定领域的知识添加到大型语言模型 (LLM) 中&#xff0c;并且作为积极研究领域的一部分&#xff0c;正在研究更多方法。 对特定领域数据集进行预训练和微调等方法使 LLMs 能够推理并生成特定领域语言。 然而&#…

【深入理解DETR】DETR的原理与算法实现

1 DETR算法概述 ①端到端 ②Transformer-model 之前的方法都需要进行NMS操作去掉冗余的bounding box或者手工设计anchor&#xff0c; 这就需要了解先验知识&#xff0c;增加从超参数anchor的数量&#xff0c; 1.1 训练测试框架 一次从图像中预测n个object的类别 训练阶段我们…

Attention Is All Your Need论文翻译

0.摘要 这个统治序列转换模型是基于复杂循环或者卷积神经网络&#xff0c;它包含编码器和解码器。表现最好的模型也通过注意力机制来连接编码器和解码器。我们提出了一个新的简单网络架构——Transformer,它仅仅是是基于注意力机制&#xff0c;完全免去递推和卷积。在两个机器…

C语言——函数(第五讲)(上)

C语言——函数&#xff08;第五讲&#xff09; 前言函数的概念库函数标准库和库函数库函数的使用方法 ⾃定义函数形式形参和实参形参和实参的关系 前言 Hello,各位C语言的小伙伴们&#xff0c;大家过年好&#xff0c;我是莹莹。停更差不多一个月了&#xff0c;都是懒惰作怪&am…

9 个管理 Windows 硬盘的最佳免费磁盘分区软件 [2024 排名]

管理分区可能是一项具有挑战性的任务。当您想到删除、缩小、移动、磁盘分区或合并分区等方面时&#xff0c;您会认为它们是很难做到的事情。然而&#xff0c;虽然 Windows 自己的磁盘管理可以处理大部分问题&#xff0c;但它无法处理管理分区的所有方面。 这时候优质的磁盘管理…

python-游戏篇-初级-超级画板

文章目录 开发环境要求运行方法PyCharmVScode 代码main.pytools.py 效果 开发环境要求 本系统的软件开发及运行环境具体如下。 操作系统&#xff1a;Windows 7、Windows 10。Python版本&#xff1a;Python 3.7.1。开发工具&#xff1a;PyCharm 2018。Python内置模块&#xff…

秒懂百科,C++如此简单丨第十九天:动态规划

目录 动态规划的初步理解 求最短路径数 洛谷 P1002 过河卒 题目描述 输入样例 输出样例 思路 AC Code 动态规划的初步理解 什么是动态规划&#xff1f;最直白的理解就是动态的规划。 那高级一点的理解呢&#xff1f;就是每时每刻都拿着一个小本本&#xff0c;也就是…

「优选算法刷题」:和可被K整除的子数组

一、题目 给定一个整数数组 nums 和一个整数 k &#xff0c;返回其中元素之和可被 k 整除的&#xff08;连续、非空&#xff09; 子数组 的数目。 子数组 是数组的 连续 部分。 示例 1&#xff1a; 输入&#xff1a;nums [4,5,0,-2,-3,1], k 5 输出&#xff1a;7 解释&…

C语言-----函数功能实现---strcpystrlen

1.函数功能参数介绍 该函数的功能就是把一个字符串复制到另外的一个数组&#xff0c;包括\0&#xff1b; 2.首先我们要明确字符串的复制也是包括最后的\0的&#xff1b; void mystrcpy(char* dest, char* src) {while (*src!\0){*dest *src;dest;src;}*dest *src;} int mai…

HGAME 2024 WEEK2 WP

文章目录 WEBWhat the cow say?Select More Coursesmyflask CryptomidRSAmidRSA revengebackpackbackpack revengebabyRSA奇怪的图片plus MISC我要成为华容道高手ek1ng_want_girlfriendezWord龙之舞 回老家了&#xff0c;初七晚上才回去&#xff0c;估计week3前几天不怎么能做…

类加载过程介绍

一、类的生命周期 类被加载到jvm虚拟机内存开始&#xff0c;到卸载出内存为止&#xff0c;他的生命周期可以分为&#xff1a;加载->验证->准备->解析->初始化->使用->卸载。 其中验证、准备、解析统一称为链接阶段 1、加载 将类的字节码载入方法区中&#xf…

docker (一)-简介

1.什么是docker Docker 是一个开源的应用容器引擎&#xff0c;由于docker影响巨大&#xff0c;今天也用"Docker" 指代容器化技术。 2.docker的优势 一键部署&#xff0c;开箱即用 容器使用基于image镜像的部署模式&#xff0c;image中包含了运行应用程序所需的一…

Selenium实战教程系列(二)---元素定位

Selenium webdriver能够模拟人对浏览器进行操作的前提是界面元素的定位。元素的定位可以说是Selenium自动化脚本的基础。这一小节笔者将介绍如何在selenium中进行元素的定位。 定位元素的方法 Selenium中提供了以下定位元素的方法&#xff1a; 首先看一个HTML文件 test_page.…

(14)Hive调优——合并小文件

目录 一、小文件产生的原因 二、小文件的危害 三、小文件的解决方案 3.1 小文件的预防 3.1.1 减少Map数量 3.1.2 减少Reduce的数量 3.2 已存在的小文件合并 3.2.1 方式一&#xff1a;insert overwrite (推荐) 3.2.2 方式二&#xff1a;concatenate 3.2.3 方式三&#xff…

OpenMVG(特征匹配、照片组重建点云、GPS位置信息、GMS)

目录 1 图像的特征匹配 2 图像中提取GPS位置信息 2.1 写入GPS信息到图像中 2.2 读取带有GPS的图像 3 SIFT/AKAZE/AKAZE_MLDB特征提取对比 4 GMS Filter 5 将球形全景图转换为6个透视视图 6 照片组重建点云 1 图像的特征匹配 #include "openMVG/features/feature.…