变形金刚:第 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 F

class 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-attention
        attn_output, _ = self.self_attention(x, x, x)
        x = x + self.dropout(attn_output)
        x = self.norm1(x)
        
        # Feed-forward network
        ff_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的实现提纲,至于每一个步骤还有更多细节,可以在此文的引导下继续细化完成。

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

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

相关文章

红队笔记Day4 -->多层代理(模拟企业拓扑)

声明&#xff1a;本机文章只用于教育用途&#xff0c;无不良引导&#xff0c;禁止用于从事任何违法活动 前几天的红队笔记的网络拓扑都比较简单&#xff0c;今天就来模拟一下企业的真实网络拓扑&#xff0c;以及攻击方法 一般的大企业的网络拓扑如下&#xff1a;&#xff1a;…

c语言操作符(上

目录 ​编辑 原码、反码、补码 1、正数 2、负数 3、二进制计算1-1 移位操作符 1、<<左移操作符 2、>>右移操作符 位操作符&、|、^、~ 1、&按位与 2、|按位或 3、^按位异或 特点 4、~按位取反 原码、反码、补码 1、正数 原码 反码 补码相同…

Linux——网络通信TCP通信常用的接口和tco服务demo

文章目录 TCP通信所需要的套接字socket()bind()listen()acceptconnect() 封装TCP socket TCP通信所需要的套接字 socket() socket()函数主要作用是返回一个描述符&#xff0c;他的作用就是打开一个网络通讯端口&#xff0c;返回的这个描述符其实就可以理解为一个文件描述符&a…

Days 31 ElfBoard 自启脚本中打开看门狗

1.在开机自启脚本中打开看门狗 rootELF1:~# vi /etc/rc.local 2.在自启脚本中添加上之后&#xff0c;然后在咱们的QT界面中找到看门狗应用&#xff0c; 发现显示打开看门狗失败&#xff1a; 3.修改看门狗源码&#xff0c;设置了超时时间后&#xff0c;关闭/dev/dev/watchdog节…

上位机图像处理和嵌入式模块部署(借鉴与学习)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 对于很多学院派的同学来说&#xff0c;他们对市场的感觉一般是比较弱的。如果写一个软件的话&#xff0c;或者说开发一个项目的话&#xff0c;他们…

OpenGL-ES 学习(1)---- AlphaBlend

AlphaBlend OpenGL-ES 混合本质上是将 2 个片元的颜色进行调和(一般是求和操作)&#xff0c;产生一个新的颜色 OpenGL ES 混合发生在片元通过各项测试之后&#xff0c;准备进入帧缓冲区的片元和原有的片元按照特定比例加权计算出最终片元的颜色值&#xff0c;不再是新&#xf…

LabVIEW伺服阀动静态测试系统

LabVIEW伺服阀动静态测试系统 基于LabVIEW开发了一套伺服阀动静态测试系统&#xff0c;提高伺服阀在电液伺服控制系统中的性能测试精度和效率。通过设计合理的液压系统、电控系统及软件系统&#xff0c;实现了伺服阀的动态和静态特性测试&#xff0c;采用流量-压力双闭环稳态控…

【Spring】定义过滤器Filter和拦截器Interceptor

# 定义过滤器 package com.holen.filter;import jakarta.servlet.Filter; import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.ServletRequest; import jakarta.servlet.ServletResponse; import java.io.IOException;pub…

Web安全研究(六)

文章目录 HideNoSeek: Camouflaging(隐藏) Malicious JavaScript in Benign ASTs文章结构Introjs obfuscationmethodologyExample HideNoSeek: Camouflaging(隐藏) Malicious JavaScript in Benign ASTs CCS 2019 CISPA 恶意软件领域&#xff0c;基于学习的系统已经非常流行&am…

JavaScript中的Symbol:加密与安全性

JavaScript中的Symbol是一种唯一且不可变的数据类型&#xff0c;引入了一种新的基本数据类型&#xff0c;用于表示独一无二的标识符。在本文中&#xff0c;我们将深入介绍JavaScript中的Symbol&#xff0c;讨论如何将其应用于JS加密中&#xff0c;提供案例代码&#xff0c;并说…

Codeforces Round 923(Div.3) A~G

A.Make it White (模拟) 题意&#xff1a; 给一个字符串 s s s&#xff0c;找出最左边的 B B B和最右边的 B B B&#xff0c;以这两个字母为左右端点的区间包含有多少个字母。 分析&#xff1a; 按照要求&#xff0c;遍历一遍字符串找到左右端点即可。 代码&#xff1a; …

TCP高频知识点

本篇文章主要讲述一下在面试过程中TCP的高频知识点 1.TCP三次握手流程图: 客户端发送一个SYN&#xff08;同步&#xff09;报文段给服务器&#xff0c;选择一个初始序列号&#xff0c;并设置SYN标志位为1。服务器接收到客户端的SYN报文段后&#xff0c;回复一个ACK&#xff08…

AI短视频一键换脸小程序源码/带流量主

微信云开发AI一键视频换脸小程序源码是由极客二改后发布的&#xff0c;小程序增加了广告控制&#xff0c;插屏广告&#xff0c;激励广告和原生广告&#xff0c;由于采用了微信云开发没有后台&#xff0c;所以不需要域名和服务器也可以正常搭建使用&#xff0c;所有的配置都可以…

面试技术栈 —— 2024网易雷火暑期实习真题

面试技术栈 —— 2024网易雷火暑期实习真题 1. 最长递增子序列。2. 集中限流和单机限流你觉得哪个好&#xff1f;3. redis部署服务器配置&#xff0c;为什么不用哨兵&#xff1f;4. 讲讲分布式session的原理。5. 数据库&#xff1a;表数据量大了&#xff0c;如何分表&#xff1…

FT2232调试记录(1)

FT2232调试记录&#xff08;1&#xff09; FT2232调试记录&#xff08;2&#xff09; FT2232调试记录&#xff08;3&#xff09; &#xff08;1&#xff09;FT2232简介&#xff1a; FT2232是一种通用的USB转串口芯片&#xff0c;用于在计算机和外部设备之间建立通信连接。它…

Hive的相关概念——架构、数据存储、读写文件机制

目录 一、架构及组件介绍 1.1 Hive整体架构 1.2 Hive组件 1.3 Hive数据模型&#xff08;Data Model&#xff09; 1.3.1 Databases 1.3.2 Tables 1.3.3 Partitions 1.3.4 Buckets 二、Hive读写文件机制 2.1 SerDe 作用 2.2 Hive读写文件流程 2.2.1 读取文件的过程 …

VS Code主题设置(美化VS Code)(主题+背景+图标+特效+字体)

目录 切换整体主题&#xff08;整体主题&#xff09; 切换文件图标主题 设置VS Code背景图案 字体特效 连击特效 字体设置 主题的具体效果放在了文章末尾&#xff0c;这篇文章后续也会进行更新 ————————————————————————————…

探讨深度学习

深度学习 深度学习概述进展崛起框架 主页传送门&#xff1a;&#x1f4c0; 传送 深度学习 概述 深度学习是机器学习领域的一个分支&#xff0c;它是一种基于人工神经网络的学习方法&#xff0c;旨在让 计算机模仿人类大脑的神经结构和学习方式&#xff0c;从大量数据中学习并…

主板指示灯亮着,电脑却无法开机怎么办?这里提供几个解决方法

如果你的电脑无法开机,但主板指示灯亮着,最可能的原因可能是机箱上的电源按钮有故障。或者,连接按钮和主板电源开关头的接线坏了。在这种情况下,你仍然可以启动电脑。 但是,如果备用启动方法失败,你可能正在处理有故障的硬件部件。但是,你可以查找POST代码或将零件与备…

MATLAB实现朴素贝叶斯分类

朴素贝叶斯&#xff08;Naive Bayes&#xff09;是一种基于贝叶斯定理的分类算法&#xff0c;它假设特征之间相互独立&#xff0c;从而简化了计算复杂性。该算法常用于文本分类、垃圾邮件过滤、情感分析等应用场景。 MATLAB实现鸢尾花数据集分类代码如下&#xff1a; clear lo…