Transformer中Encoder的计算过程及各部分维度变化

Transformer模型中的维度变化主要发生在以下几个部分:输入嵌入(embedding)、多头注意力机制(Multi-Head Attention)、前馈神经网络(Feed-Forward Neural Network)以及残差连接和层归一化(Residual Connection and Layer Normalization)。下面详细说明各部分的维度变化:

1. 输入嵌入

输入序列 X X X 的维度通常为 ( n , d ) (n, d) (n,d),其中 n n n 是序列长度, d d d 是嵌入维度。假设输入是一个词汇表索引序列,经过嵌入层(Embedding Layer)后,每个索引被转换为一个 d d d 维的向量。

Input Embedding: X ∈ R n × d \text{Input Embedding:} \quad X \in \mathbb{R}^{n \times d} Input Embedding:XRn×d

2. 位置编码(Positional Encoding)

为了引入位置信息,Transformer会将位置编码(Positional Encoding)添加到输入嵌入中。位置编码的维度与输入嵌入的维度相同。

Positional Encoding: P ∈ R n × d \text{Positional Encoding:} \quad P \in \mathbb{R}^{n \times d} Positional Encoding:PRn×d
Input with Positional Encoding: X ′ = X + P \text{Input with Positional Encoding:} \quad X' = X + P Input with Positional Encoding:X=X+P

3. 多头注意力机制(Multi-Head Attention)

多头注意力机制将输入分成 h h h 个头,每个头的维度为 d k = d / h d_k = d / h dk=d/h。具体步骤如下:

  1. 线性变换生成查询、键、值矩阵:
    Q = X ′ W Q , K = X ′ W K , V = X ′ W V Q = X'W_Q, \quad K = X'W_K, \quad V = X'W_V Q=XWQ,K=XWK,V=XWV
    其中, W Q , W K , W V ∈ R d × d W_Q, W_K, W_V \in \mathbb{R}^{d \times d} WQ,WK,WVRd×d
  2. 分成多个头:
    Q i , K i , V i ∈ R n × d k Q_i, K_i, V_i \in \mathbb{R}^{n \times d_k} Qi,Ki,ViRn×dk
    其中, i = 1 , 2 , . . . , h i = 1, 2, ..., h i=1,2,...,h
  3. 每个头独立计算注意力得分和加权和:
    Attention i ( Q i , K i , V i ) = softmax ( Q i K i T d k ) V i \text{Attention}_i(Q_i, K_i, V_i) = \text{softmax}\left(\frac{Q_i K_i^T}{\sqrt{d_k}}\right) V_i Attentioni(Qi,Ki,Vi)=softmax(dk QiKiT)Vi
  4. 拼接所有头的输出:
    Concat ( head 1 , head 2 , . . . , head h ) ∈ R n × d \text{Concat}( \text{head}_1, \text{head}_2, ..., \text{head}_h) \in \mathbb{R}^{n \times d} Concat(head1,head2,...,headh)Rn×d
  5. 通过线性变换得到最终输出:
    Multi-Head Output = Concat ⋅ W O \text{Multi-Head Output} = \text{Concat} \cdot W_O Multi-Head Output=ConcatWO
    其中, W O ∈ R d × d W_O \in \mathbb{R}^{d \times d} WORd×d

4. 前馈神经网络(Feed-Forward Neural Network)

前馈神经网络包括两个线性变换和一个激活函数(通常是ReLU),其输入和输出维度均为 d d d

  1. 第一层线性变换:
    F F N 1 ( X ) = ReLU ( X W 1 + b 1 ) FFN_1(X) = \text{ReLU}(XW_1 + b_1) FFN1(X)=ReLU(XW1+b1)
    其中, W 1 ∈ R d × d f f , b 1 ∈ R d f f W_1 \in \mathbb{R}^{d \times d_{ff}}, b_1 \in \mathbb{R}^{d_{ff}} W1Rd×dff,b1Rdff,通常 d f f ≫ d d_{ff} \gg d dffd
  2. 第二层线性变换:
    F F N 2 ( X ) = F F N 1 ( X ) W 2 + b 2 FFN_2(X) = FFN_1(X)W_2 + b_2 FFN2(X)=FFN1(X)W2+b2
    其中, W 2 ∈ R d f f × d , b 2 ∈ R d W_2 \in \mathbb{R}^{d_{ff} \times d}, b_2 \in \mathbb{R}^{d} W2Rdff×d,b2Rd

5. 残差连接和层归一化(Residual Connection and Layer Normalization)

Transformer中的每个子层(包括多头注意力和前馈神经网络)后面都包含残差连接和层归一化。

Output = LayerNorm ( X + SubLayer ( X ) ) \text{Output} = \text{LayerNorm}(X + \text{SubLayer}(X)) Output=LayerNorm(X+SubLayer(X))

综上所述,Transformer模型在各个部分的维度变化如下:

  1. 输入嵌入: R n × d \mathbb{R}^{n \times d} Rn×d
  2. 位置编码: R n × d \mathbb{R}^{n \times d} Rn×d
  3. 多头注意力: R n × d \mathbb{R}^{n \times d} Rn×d
  4. 前馈神经网络: R n × d \mathbb{R}^{n \times d} Rn×d
  5. 残差连接和层归一化: R n × d \mathbb{R}^{n \times d} Rn×d
    每个部分的输出维度保持不变,使得整个Transformer模型能够轻松堆叠多层,从而增加模型的深度和表达能力。
### Transformer 输入维度详解 Transformer 的输入主要包括以下几个部分,每部分都有其特定的作用和意义: #### 1. **词嵌入 (Word Embedding)** 词嵌入是将离散的单词转换为连续向量表示的过程。在 Transformer 中,输入序列中的每个 token 都会被映射到一个固定大小的向量空间中[^1]。这个向量的空间维度通常由超参数定义,称为 `d_model` 或者 `embedding dimension`。 - **作用**: 将自然语言中的词语转化为数值化的向量形式以便于后续处理。 - **含义**: 这些向量捕捉了词语之间的语义关系以及上下文信息。 #### 2. **位置编码 (Positional Encoding)** 由于 Transformer 不像 RNN 那样具有固有的顺序特性,因此引入了位置编码来提供关于序列中令牌相对或绝对位置的信息。 - **作用**: 提供序列中各 token 的位置信息给自注意力机制。 - **含义**: 它是一个固定的函数或者预训练好的矩阵,叠加在原始的词嵌入上以保留次序特征。 #### 3. **掩码 (Masking)** 为了防止解码器看到未来的时间步数据,在训练过程中会应用一种叫做因果掩码的技术;而在实际推理阶段,则可能采用填充掩码等方式忽略掉无意义的部分。 - **作用**: 控制哪些部分可以被注意机制访问, 特别是在目标端生成时避免泄露未来的预测结果。 - **含义**: 掩码是一种二元张量结构,用于屏蔽某些不必要的计算区域。 #### 超参数的影响 除了上述具体输入组成部分外,还有几个重要的超参数会影响整个模型的表现效果,比如前面提到过的词嵌入尺寸、多头注意力数量等等[^2]: - **词嵌入维度 (`d_model`)**: 决定了最终输出状态向量宽度同时也影响着内部操作规模. - **注意力头数 (`num_heads`)**: 并行执行多个独立子空间内的点积相似度运算从而增强表达能力. - **层数 (`N` or `n_layers`)**: 表明堆叠了多少层完整的 Encoder/Decoder 结构单元. 综上所述,理解这些不同类型的输入及其背后的设计理念对于掌握如何有效配置并优化 Transformer 架构至关重要。 ```python import torch import math def positional_encoding(max_len, d_model): pe = torch.zeros(max_len, d_model) position = torch.arange(0, max_len).unsqueeze(1) div_term = torch.exp(torch.arange(0, d_model, 2) * -(math.log(10000.0) / d_model)) pe[:, 0::2] = torch.sin(position * div_term) pe[:, 1::2] = torch.cos(position * div_term) return pe.unsqueeze(0) pe_example = positional_encoding(50, 64) print(pe_example.shape) # 输出应为 [1, 50, 64], 即批量大小为1的位置编码形状 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值