Transformer架构概述
Transformer架构由Vaswani等人在2017年提出,彻底改变了自然语言处理领域。该架构摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN),完全依赖自注意力机制(Self-Attention)来处理序列数据。其核心优势在于并行化处理能力和对长距离依赖关系的有效建模。
自注意力机制
自注意力机制是Transformer的核心组件,允许模型在处理每个位置时动态关注输入序列的不同部分。给定输入序列$X \in \mathbb{R}^{n \times d}$,自注意力的计算过程如下:
-
将输入通过线性变换生成查询(Query)、键(Key)和值(Value)矩阵: $$Q = XW_Q, \quad K = XW_K, \quad V = XW_V$$
-
计算注意力分数并应用缩放点积: $$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$
以下是一个自注意力机制的PyTorch实现示例:
import torch
import torch.nn.functional as F
class SelfAttention(torch.nn.Module):
def __init__(self, embed_size, heads):
super(SelfAttention, self).__init__()
self.embed_size = embed_size
self.heads = heads
self.head_dim = embed_size // heads
self.values = torch.nn.Linear(self.head_dim, self.head_dim, bias=False)
self.keys = torch.nn.Linear(self.head_dim, self.head_dim, bias=False)
self.queries = torch.nn.Linear(self.head_dim, self.head_dim, bias=False)
self.fc_out = torch.nn.Linear(heads * self.head_dim, embed_size)
def forward(self, values, keys, query, mask):
N = query.shape[0]
value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1]
# Split embedding into self.heads pieces
### Transformer架构概述
Transformer架构由Vaswani等人在2017年提出,彻底改变了自然语言处理领域。该架构摒弃了传统的循环神经网络(RNN)和卷积神经网络(CNN),完全依赖自注意力机制(Self-Attention)来处理序列数据。其核心优势在于并行化处理能力和对长距离依赖关系的有效建模。
### 自注意力机制
自注意力机制是Transformer的核心组件,允许模型在处理每个位置时动态关注输入序列的不同部分。给定输入序列$X \in \mathbb{R}^{n \times d}$,自注意力的计算过程如下:
1. 将输入通过线性变换生成查询(Query)、键(Key)和值(Value)矩阵:
$$Q = XW_Q, \quad K = XW_K, \quad V = XW_V$$
2. 计算注意力分数并应用缩放点积:
$$\text{Attention}(Q, K, V) = \text{softmax}\left(\frac{QK^T}{\sqrt{d_k}}\right)V$$
以下是一个自注意力机制的PyTorch实现示例:
```python
import torch
import torch.nn.functional as F
class SelfAttention(torch.nn.Module):
def __init__(self, embed_size, heads):
super(SelfAttention, self).__init__()
self.embed_size = embed_size
self.heads = heads
self.head_dim = embed_size // heads
self.values = torch.nn.Linear(self.head_dim, self.head_dim, bias=False)
self.keys = torch.nn.Linear(self.head_dim, self.head_dim, bias=False)
self.queries = torch.nn.Linear(self.head_dim, self.head_dim, bias=False)
self.fc_out = torch.nn.Linear(heads * self.head_dim, embed_size)
def forward(self, values, keys, query, mask):
N = query.shape[0]
value_len, key_len, query_len = values.shape[1], keys.shape[1], query.shape[1]
# Split embedding into self.heads pieces
1429

被折叠的 条评论
为什么被折叠?



