transformer求解过程
时间: 2024-12-30 15:16:32 浏览: 6
### Transformer模型的工作流程
#### 输入表示
在处理输入序列时,每个位置上的词会被转换成高维空间中的向量形式。具体来说,对于给定的一个单词,会为其创建两个嵌入(embedding): word embedding 和 position embedding, 这两种embedding最终相加以形成该单词的位置感知表征 X[^3]。
#### 多头自注意力机制(Multi-head Self-Attention)
这是Transformer的核心组件之一。通过线性变换将输入矩阵映射到查询(Query)、键(Keys)以及值(Values),之后计算这些向量之间的相似度得分来决定哪些部分应该被更多关注。为了增强表达能力,采用了多个并行运行的不同参数设置下的self-attention子层——即所谓的“heads”。最后再把这些head的结果拼接起来并通过另一个线性投影得到输出[^1]。
```python
import torch.nn as nn
class MultiHeadedSelfAttention(nn.Module):
def __init__(self, d_model=512, num_heads=8):
super().__init__()
self.d_k = d_model // num_heads
self.h = num_heads
# Linear layers for Q,K,V projections
self.linear_qkv = nn.Linear(d_model, 3 * d_model)
def forward(self, query, key, value, mask=None):
batch_size = query.size(0)
# Project inputs to get queries/keys/values and split into heads
qkv = self.linear_qkv(query).view(batch_size, -1, self.h, 3*self.d_k)
q,k,v = qkv.chunk(3,dim=-1)
...
```
#### 前馈全连接网络 (Feed Forward Network)
每一个位置的数据都会经过两层线性的前馈神经网络,在这两者之间加入ReLU激活函数作为非线性成分引入。值得注意的是这个操作是对整个序列平行执行的,并不会影响不同token间的关系学习。
```python
class PositionwiseFeedForward(nn.Module):
"Implements FFN equation."
def __init__(self, d_model, d_ff, dropout=0.1):
super(PositionwiseFeedForward, self).__init__()
self.w_1 = nn.Linear(d_model, d_ff)
self.w_2 = nn.Linear(d_ff, d_model)
self.dropout = nn.Dropout(dropout)
def forward(self, x):
return self.w_2(self.dropout(F.relu(self.w_1(x))))
```
#### 编码器与解码器结构
编码器由一系列相同类型的层堆叠而成,每一层内部包含一个多头自注意模块加上一个简单的前馈网络;而在解码器这边除了上述提到的部分外还额外增加了一个针对目标端自身的掩蔽版多头自注意机制(masked multi-head attention), 它的作用是在预测下一个词语时不考虑未来的信息从而保持因果关系不变。此外还有一个跨域注意力(cross-attention)用来关联源语句和目的语句间的依赖[^2]。
阅读全文