窗外的鹏城湾在晨曦中泛起粼粼波光,林晨已经坐在电脑前两个小时了。
书桌上摊开着打印出来的论文——《Attention Is All You Need》。A4纸上用红蓝两色笔画满了圈圈线线,旁边是他密密麻麻的手写笔记。三个月深度学习计划进入第二周,他终于开始啃这块硬骨头。
“注意力机制……”林晨喃喃自语,手指在键盘上敲下一行注释,“就像人读文章时,不会平均关注每个字,而是会把重点放在关键词上”。
这个概念听起来简单,但数学表达却让他头疼。Q(查询)、K(键)、V(值)三个矩阵的运算,缩放点积注意力,多头注意力……他打开Jupyter Notebook,决定从最基础的开始实现。
import torch
import torch.nn as nn
import math
class ScaledDotProductAttention(nn.Module):
def __init__(self, dropout=0.1):
super.__init__
self.dropout = nn.Dropout(dropout)
def forward(self, Q, K, V, mask=None):
# 计算注意力分数: Q * K^T / sqrt(d_k)
d_k = K.size(-1)
scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(d_k)
if mask is not None:
scores = scores.masked_fill(mask == 0, -1e9)
# Softmax归一化
attention_weights = torch.softmax(scores, dim=-1)
attention_weights = self.dropout(attention_weights)
# 加权求和
output = torch.matmul(attention_weights, V)
(本章节未完结,点击下一页翻页继续阅读)