Transformer模型详解04-Encoder 结构

news2024/10/4 16:24:46

文章目录

  • 简介
  • 基础知识
    • 归一化
      • 作用
      • 常用归一化
    • 残差连接
  • Add & Norm
  • Feed Forward
  • 代码实现

简介

Transformer 模型中的 Encoder 层主要负责将输入序列进行编码,将输入序列中的每个词或标记转换为其对应的向量表示,并且捕获输入序列中的语义和关系。

具体来说,Transformer Encoder 层的作用包括:

  1. 词嵌入(Word Embedding):将输入序列中的每个词或标记映射为其对应的词嵌入向量。这些词嵌入向量包含了词语的语义信息,并且可以在模型中进行学习。

  2. 位置编码(Positional Encoding):因为 Transformer 模型不包含任何关于序列顺序的信息,为了将位置信息引入模型,需要添加位置编码。位置编码是一种特殊的向量,用于表示输入序列中每个词的位置信息,以便模型能够区分不同位置的词。

  3. 多头自注意力机制(Multi-Head Self-Attention):自注意力机制允许模型在处理每个词时,同时考虑到输入序列中所有其他词之间的关系。多头自注意力机制通过将输入进行多次线性变换并计算多组注意力分数,从而允许模型在不同的表示子空间中学习到不同的语义信息。

  4. 残差连接(Residual Connection):为了减轻梯度消失和加速训练,Transformer Encoder 层使用了残差连接。残差连接允许模型直接学习到输入序列的增量变换,而不是完全替代原始输入。

  5. 层归一化(Layer Normalization):在残差连接后应用层归一化,有助于提高模型的训练稳定性,加快训练速度。

Transformer Encoder 层的主要作用是将输入序列转换为其对应的向量表示,并且捕获输入序列中的语义和位置信息,以便后续的模型能够更好地理解和处理输入序列。

前面我们已经详解了三个点,词嵌入(Word Embedding),位置编码(Positional Encoding),多头自注意力机制(Multi-Head Self-Attention),这里详解Encoder结构的其他部分。
在这里插入图片描述
上图红色部分是 Transformer 的 Encoder block 结构,可以看到是由 Multi-Head Attention, Add & Norm, Feed Forward, Add & Norm 组成的。之前了解了 Multi-Head Attention 的计算过程,现在了解一下 Add & Norm 和 Feed Forward 部分。

基础知识

归一化

归一化是将数据转换为具有统一尺度的过程,常用于机器学习、数据挖掘和统计分析中。归一化可以确保不同特征或变量之间具有相似的数值范围,有助于提高模型的性能和收敛速度。

作用

让我用一个简单的例子来说明归一化的作用。

假设你有一个数据集,其中包含两个特征:年龄和收入。年龄的范围是 0 到 100 岁,而收入的范围是 1000 到 100000 美元。这两个特征的范围差异很大。

现在,你想要使用这些特征来训练一个机器学习模型,比如线性回归模型,来预测一个人是否会购买某种产品。由于特征的范围差异较大,这可能会导致某些问题:

收入的范围比年龄大得多,这可能会使得模型过度关注收入而忽略年龄,因为收入的变化可能会对预测产生更大的影响。
模型可能会受到数值范围的影响,而不是特征本身的重要性。
这时候,归一化就可以派上用场了。通过归一化,你可以将不同特征的值缩放到相似的范围内,从而消除数值范围差异带来的影响。比如,你可以将年龄和收入都缩放到 0 到 1 之间的范围内,或者使用其他归一化方法,如标准化 (standardization)。

通过归一化,你可以确保模型不会因为特征值的范围差异而偏向某个特定的特征,而是可以更平衡地利用所有的特征信息来进行预测。

常用归一化

下面是几种常用的归一化方式及其公式:

  1. Min-Max 归一化:

Min-Max 归一化将数据线性映射到一个指定的范围内,通常是 [0, 1] 或 [-1, 1]。其公式如下:

[ X norm = X − X min X max − X min ] [X_{\text{norm}} = \frac{{X - X_{\text{min}}}}{{X_{\text{max}} - X_{\text{min}}}}] [Xnorm=XmaxXminXXmin]

其中, ( X norm ) (X_{\text{norm}}) (Xnorm) 是归一化后的数据,(X) 是原始数据, ( X min ) (X_{\text{min}}) (Xmin) ( X max ) (X_{\text{max}}) (Xmax)分别是数据的最小值和最大值。

  1. Z-Score 标准化:

Z-Score 标准化将数据转换为均值为 0,标准差为 1 的正态分布。其公式如下:

[ X norm = X − μ σ ] [X_{\text{norm}} = \frac{{X - \mu}}{{\sigma}}] [Xnorm=σXμ]

其中, ( X norm ) (X_{\text{norm}}) (Xnorm)是归一化后的数据, ( X ) (X) (X) 是原始数据, μ \mu μ是数据的均值, ( σ ) (\sigma) (σ)是数据的标准差。

  1. Decimal Scaling 归一化:

Decimal Scaling 归一化将数据缩放到[-1,1]或者[0,1]的范围内,通过除以数据中的最大绝对值来实现。其公式如下:

[ X norm = X max ⁡ ( ∣ X ∣ ) ] [X_{\text{norm}} = \frac{{X}}{{\max(|X|)}}] [Xnorm=max(X)X]

其中, ( X norm ) (X_{\text{norm}}) (Xnorm) 是归一化后的数据, ( X ) (X) (X) 是原始数据, ( max ⁡ ( ∣ X ∣ ) ) (\max(|X|)) (max(X)) 是数据中的最大绝对值。

  1. Robust Scaling:

Robust Scaling 是一种针对离群值鲁棒的归一化方法,通过除以数据的四分位距(IQR)来缩放数据。其公式如下:

[ X norm = X − Q 1 Q 3 − Q 1 ] [X_{\text{norm}} = \frac{{X - Q_1}}{{Q_3 - Q_1}}] [Xnorm=Q3Q1XQ1]

其中, ( X norm ) (X_{\text{norm}}) (Xnorm) 是归一化后的数据, ( X ) (X) (X)是原始数据, ( Q 1 ) (Q_1) (Q1) 是数据的第一四分位数(25th percentile), ( Q 3 ) (Q_3) (Q3) 是数据的第三四分位数(75th percentile)。

这些是常用的归一化方式,选择适合你的数据和模型的归一化方法可以提高模型的性能和稳定性。

残差连接

残差连接(Residual Connection)是一种在深度神经网络中用于解决梯度消失和梯度爆炸问题的技术。它通过将输入直接添加到神经网络的某些层的输出中,从而允许梯度直接通过残差路径传播,减轻了梯度消失的问题,加速了训练过程。

具体来说,假设我们有一个包含多个层的神经网络,每个层都由输入 x x x 经过一些变换 F ( x ) F(x) F(x)得到输出 H ( x ) H(x) H(x)。传统的神经网络会直接将 H ( x ) H(x) H(x) 作为下一层的输入,而残差连接则是将 x x x H ( x ) H(x) H(x) 相加,即 H ( x ) + x H(x)+x H(x)+x,然后再输入到下一层。这样做可以使得网络学习到的变换是相对于输入的增量,而不是完全替代原始输入。

残差连接的作用包括:

  1. 缓解梯度消失:通过保留原始输入的信息,使得梯度可以更容易地传播到较浅层,从而减轻了梯度消失问题。
  2. 加速训练:残差连接可以使得神经网络更快地收敛,因为它减少了训练过程中的信息丢失。
  3. 提高模型性能:残差连接使得神经网络可以更深,更复杂,从而能够更好地捕捉输入数据的特征和模式。

举个例子,考虑一个包含残差连接的深度残差网络(Residual Network,ResNet)。在这个网络中,每个残差块都由两个或多个卷积层组成,其中第一个卷积层产生特征图 H ( x ) H(x) H(x),而第二个卷积层则对 H ( x ) H(x) H(x) 进行进一步变换。然后,原始输入 x x x 被添加到 H ( x ) H(x) H(x) 上,得到 F ( x ) = H ( x ) + x F(x)=H(x)+x F(x)=H(x)+x。这样,输出 F ( x ) F(x) F(x) 就包含了相对于输入 x x x 的增量,网络可以更轻松地学习到残差部分,从而更有效地优化模型。

Add & Norm

在这里插入图片描述

Add & Norm 层由 Add 和 Norm 两部分组成,其计算公式如下:
在这里插入图片描述
第一个Add&Norm中Add指 X+MultiHeadAttention(X),是一种残差连接,通常用于解决多层网络训练的问题,可以让网络只关注当前差异的部分,在 ResNet 中经常用到:
在这里插入图片描述
Norm指 Layer Normalization,通常用于 RNN 结构,Layer Normalization 会将每一层神经元的输入都转成均值方差都一样的,这样可以加快收敛。

Feed Forward

Feed Forward 层比较简单,是一个两层的全连接层,第一层的激活函数为 Relu,第二层不使用激活函数,对应的公式如下。
FFN ( x ) = ReLU ( x W 1 + b 1 ) W 2 + b 2 \text{FFN}(x) = \text{ReLU}(xW_1 + b_1)W_2 + b_2 FFN(x)=ReLU(xW1+b1)W2+b2
也就是:
在这里插入图片描述
在这个公式中:

  • ( X ) (X) (X) 是输入的隐藏表示,维度为 ( d model ) (d_{\text{model}}) (dmodel),是Add&Norm输出;
  • ( W 1 ) (W_1) (W1) ( W 2 ) (W_2) (W2) 是权重矩阵,分别用于第一层和第二层的线性变换,维度分别为 ( d model × d ff ) (d_{\text{model}} \times d_{\text{ff}}) (dmodel×dff) ( d ff × d model ) (d_{\text{ff}} \times d_{\text{model}}) (dff×dmodel)
  • ( b 1 ) (b_1) (b1) ( b 2 ) (b_2) (b2) 是偏置项;
  • ( ReLU ) (\text{ReLU}) (ReLU) 表示修正线性单元,是一种非线性激活函数,用于引入模型的非线性性。

Feed Forward 最终得到的输出矩阵的维度与X一致。

Feed Forward 层在深度学习模型中具有重要意义,它主要有以下几个方面的作用:

  1. 特征变换与组合: Feed Forward 层通过线性变换和非线性激活函数将输入数据进行特征变换和组合,使得模型能够学习到更高级、更复杂的特征表示。这有助于模型更好地理解数据的内在结构和规律。

  2. 引入非线性: 非线性激活函数(如 ReLU、sigmoid、tanh 等)可以引入非线性变换,从而使得模型能够学习到非线性关系,提高模型的表达能力。如果没有非线性变换,多个线性变换的组合仍然只会得到线性变换,模型的表达能力将受到限制。

  3. 增加模型的深度: Feed Forward 层通常是深度神经网络中的一个组成部分,通过堆叠多个 Feed Forward 层可以构建深度模型。深度模型能够学习到更多层次、更抽象的特征表示,从而提高模型的性能和泛化能力。

  4. 提高模型的泛化能力: Feed Forward 层通过特征变换和非线性变换有助于模型学习到数据的高级抽象表示,这有助于提高模型对新样本的泛化能力,使得模型更好地适应未见过的数据。

代码实现

import torch
import torch.nn as nn
import torch.nn.functional as F


class TransformerEncoderLayer(nn.Module):
    def __init__(self, d_model, n_heads, d_ff, dropout=0.1):
        super(TransformerEncoderLayer, self).__init__()
        self.self_attn = nn.MultiheadAttention(d_model, n_heads, dropout=dropout)
        self.linear1 = nn.Linear(d_model, d_ff)
        self.linear2 = nn.Linear(d_ff, d_model)
        self.dropout = nn.Dropout(dropout)
        self.norm1 = nn.LayerNorm(d_model)
        self.norm2 = nn.LayerNorm(d_model)
        
    def forward(self, src, src_mask=None):
        # Multi-head self-attention
        src2 = self.self_attn(src, src, src, attn_mask=src_mask)[0]
        src = src + self.dropout(src2)
        src = self.norm1(src)
        
        # Feed Forward Layer
        src2 = self.linear2(F.relu(self.linear1(src)))
        src = src + self.dropout(src2)
        src = self.norm2(src)
        
        return src


class TransformerEncoder(nn.Module):
    def __init__(self, num_layers, d_model, n_heads, d_ff, dropout=0.1):
        super(TransformerEncoder, self).__init__()
        self.layers = nn.ModuleList([TransformerEncoderLayer(d_model, n_heads, d_ff, dropout) for _ in range(num_layers)])
        
    def forward(self, src, src_mask=None):
        for layer in self.layers:
            src = layer(src, src_mask)
        return src

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

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

相关文章

(超详细讲解)实现将idea的java程序打包成exe (新版,可以在没有java的电脑下运行,即可以发给好朋友一起玩)

目录 实现打包到exe大概步骤 工具准备 1.将java程序文件打包成jar文件 2.准备好jre文件 3.使用exe4j软件打包好 4.最终打包 实现打包到exe大概步骤 1.打包需要满足的条件:将java文件转成jar文件的工具exe4j、 以及需要满足jdk1.8以上(因安装exe4…

Android面试题之Kotlin和Java之间互操作

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 互操作性和可空性 要注意Java中所有类型都是可空的String!表示平台数据类型 public class JavaTest {public String generateName() {return …

2024中国(重庆)无人机展览会8月在重庆举办

2024中国(重庆)无人机展览会8月在重庆举办 邀请函 主办单位: 中国航空学会 重庆市南岸区人民政府 招商执行单位: 重庆港华展览有限公司 报名:【交易会I 59交易会2351交易会9466】 展会背景: 为更好的培养航空航天产业和无人…

Python 数据处理 合并二维数组和 DataFrame 中特定列的值

🍉 CSDN 叶庭云:https://yetingyun.blog.csdn.net/ 示例代码如下: import numpy as np import pandas as pddata {label: [1, 2, 3, 4]} df pd.DataFrame(data)values_array df[["label"]].values random_array np.random.ran…

CSDN使用

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

Python-VBA函数之旅-sum函数

目录 一、sum函数的常见应用场景 二、sum函数使用注意事项 三、如何用好sum函数? 1、sum函数: 1-1、Python: 1-2、VBA: 2、推荐阅读: 个人主页: https://myelsa1024.blog.csdn.net/ 一、sum函数的常…

AI绘画神级Stable Diffusion入门教程|快速入门SD绘画原理与安装

什么是Stable Diffusion,什么是炼丹师?根据市场研究机构预测,到2025年全球AI绘画市场规模将达到100亿美元,其中Stable Diffusion(简称SD)作为一种先进的图像生成技术之一,市场份额也在不断增长&…

Llama3-Tutorial(Llama 3 超级课堂)-- 笔记

第1节—Llama 3 本地 Web Demo 部署 端口转发 vscode里面设置端口转发 https://a-aide-20240416-b4c2755-160476.intern-ai.org.cn/proxy/8501/ ssh -CNg -L 8501:127.0.0.1:8501 rootssh.intern-ai.org.cn -p 43681参考 https://github.com/SmartFlowAI/Llama3-Tutorial/b…

每日一练2024.5.9

题目: 给定一个非负整数数组 nums, nums 中一半整数是 奇数 ,一半整数是 偶数 。 对数组进行排序,以便当 nums[i] 为奇数时,i 也是 奇数 ;当 nums[i] 为偶数时, i 也是 偶数 。 你可以返回 …

防伪溯源一体化管理系统基于FastAdmin+ThinkPHP和Uniapp(源码搭建/上线/运营/售后/维护更新)

一款基于FastAdminThinkPHP和Uniapp进行开发的多平台(微信小程序、H5网页)溯源、防伪、管理一体化独立系统,拥有强大的防伪码和溯源码双码生成功能(内置多种生成规则)、批量大量导出防伪和溯源码码数据、支持代理商管理…

活动预告|“AI+Security”系列第1期:大模型网络空间安全前沿探索活动火热报名中

由Wisemodel社区、安全极客主办的 “AISecurity”系列第1期: 大模型网络空间安全前沿探索 线下活动 将于2024年5月18日下午14:00 在苏州街16号神州数码大厦5层举行 本活动旨在汇聚业界专家和实践者共同探讨和推进AI自身安全、AI赋能安全与AI给安全带来的挑战等关…

产品设计中的“注册”说明

​在使用网站或应用的时候必不可少的就是账号系统,账号系统有些人可能觉得简单,无非就是账号密码。真的是这样吗? 一个完整的账号系统通常大家会分成四部分: 1.注册(手机号、邮箱、用户名/密码限制/验证码)…

项目8-头像的上传

js实现头像上传并且预览图片功能以及提交 - 掘金 (juejin.cn) 我们简单建立一个表 1.前端知识储备 1.1 addClass的使用 1.基本语法 addClass() 方法向被选元素添加一个或多个类。 该方法不会移除已存在的 class 属性,仅仅添加一个或多个 class 属性。 提示&…

隧道建设的数字眼睛:盾构机实时可视化技术

盾构机可视化技术可以展现盾构机在隧道掘进过程中的各项工作状态。这种技术能够将复杂的数据和参数转化为直观的图像和动画,包括盾构机的推进速度、土压力、刀盘转速和位置信息等关键性能指标。 通过 HT 可视化,工程师可以实时监控盾构机的运行状况&…

网站域名SSL证书怎么获取和安装

一、获取SSL证书 1、选择证书颁发机构(CA): 选择一个受信任的SSL证书颁发机构,如JoySSL、Comodo、DigiCert、GlobalSign等。 2、生成证书签名请求(CSR): 在您的服务商的网站上生成CSR。CSR中…

云相册APP

简介 一款用于云存照片的app,支持批量上传和下载照片。 平台技术 Android客户端:Kotlin 协程 Retrofit Server服务后端:Java SpringBoot 部署云服务器:华为云耀云服务器L实例 下载网址 小鲸鱼相册 Ps: 由于网站域名备案审核…

学校能源消耗监测管理系统,打造智能监测系统

学校能源消耗监测管理系统是一款针对,水、电、煤、气、热等能源的在线监测、分析与处理的系统,为学校管理者提供全面的能源使用情况,为学校管理工作提供了有力的支持。 为什么要建设能源管理系统? 用能需求增加 随着学校的快速…

星戈瑞SH-PEG3-OH一种多功能生物相容性PEG小分子

SH-PEG3-OH是一种含有硫基(-SH)、三个乙二醇单元和羟基(-OH)的小分子化合物。其分子结构中的硫基赋予了其独特的化学反应性,能够与其他含有不饱和键的化合物发生点击化学反应,如迈克尔加成反应等。同时&…

idea无法识别加载pom.xml文件

有时idea无法识别加载pom.xml文件,直接打开pom.xml文件,然后添加到maven就行

重塑产业效率:RFID赋能的智能挂衣系统方案

应用背景 服装生产属于劳动密集型行业,服装生产从原料布料开始到裁剪、打样、缝制、包烫等每个岗位都需要很多工人来作业,是流水式作业。尤其是缝制部门,每台缝纫机或其他设备都有一个工人来完成一道工序,比如前身,后…