Transformer模型详解04-Encoder 结构

2024-05-14 23:04

本文主要是介绍Transformer模型详解04-Encoder 结构,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

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

简介

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 层通过特征变换和非线性变换有助于模型学习到数据的高级抽象表示,这有助于提高模型对新样本的泛化能力,使得模型更好地适应未见过的数据。

组成 Encoder

通过上面描述的 Multi-Head Attention, Feed Forward, Add & Norm 就可以构造出一个 Encoder block,Encoder block 接收输入矩阵 X ( n ∗ d ) X_(n*d) X(nd), 并输出一个矩阵 O ( n ∗ d ) O_(n*d) O(nd),通过多个 Encoder block 叠加就可以组成 Encoder。
第一个 Encoder block 的输入为句子单词的表示向量矩阵,后续 Encoder block 的输入是前一个 Encoder block 的输出,最后一个 Encoder block 输出的矩阵就是编码信息矩阵 C,这一矩阵后续会用到 Decoder 中。
在这里插入图片描述

代码实现

import torch
import torch.nn as nn
import torch.nn.functional as Fclass 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-attentionsrc2 = self.self_attn(src, src, src, attn_mask=src_mask)[0]src = src + self.dropout(src2)src = self.norm1(src)# Feed Forward Layersrc2 = self.linear2(F.relu(self.linear1(src)))src = src + self.dropout(src2)src = self.norm2(src)return srcclass 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

这篇关于Transformer模型详解04-Encoder 结构的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/990107

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

usaco 1.3 Mixing Milk (结构体排序 qsort) and hdu 2020(sort)

到了这题学会了结构体排序 于是回去修改了 1.2 milking cows 的算法~ 结构体排序核心: 1.结构体定义 struct Milk{int price;int milks;}milk[5000]; 2.自定义的比较函数,若返回值为正,qsort 函数判定a>b ;为负,a<b;为0,a==b; int milkcmp(const void *va,c

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

【生成模型系列(初级)】嵌入(Embedding)方程——自然语言处理的数学灵魂【通俗理解】

【通俗理解】嵌入(Embedding)方程——自然语言处理的数学灵魂 关键词提炼 #嵌入方程 #自然语言处理 #词向量 #机器学习 #神经网络 #向量空间模型 #Siri #Google翻译 #AlexNet 第一节:嵌入方程的类比与核心概念【尽可能通俗】 嵌入方程可以被看作是自然语言处理中的“翻译机”,它将文本中的单词或短语转换成计算机能够理解的数学形式,即向量。 正如翻译机将一种语言