PaddlePaddle深度学习教程:Nadaraya-Watson核回归中的注意力机制
引言
注意力机制是深度学习中的重要概念,它模仿了人类认知过程中的注意力分配方式。在本教程中,我们将通过Nadaraya-Watson核回归这一经典机器学习模型,深入浅出地讲解注意力机制的基本原理和实现方式,并使用PaddlePaddle框架进行实践。
注意力机制概述
注意力机制的核心思想是:在处理输入数据时,不是平等对待所有信息,而是根据任务需求有选择性地关注重要部分。这种机制通常包含三个关键组件:
- 查询(Query):代表当前需要关注的内容
- 键(Key):表示输入数据的特征
- 值(Value):实际要聚合的信息
数据准备
我们首先生成一个非线性函数的数据集,用于演示注意力机制的效果:
n_train = 50 # 训练样本数
x_train = paddle.sort(paddle.rand([n_train]) * 5) # 排序后的训练样本
def f(x):
return 2 * paddle.sin(x) + x**0.8
y_train = f(x_train) + paddle.normal(0.0, 0.5, (n_train,)) # 带噪声的训练输出
x_test = paddle.arange(0, 50, 1) * 0.1 # 测试样本
y_truth = f(x_test) # 测试样本的真实输出
简单平均汇聚
作为基线方法,我们首先尝试最简单的平均汇聚:
y_hat = paddle.tile(y_train.mean(), [n_test])
这种方法忽略了输入特征,预测结果与真实函数相差较大。
非参数注意力汇聚
Nadaraya-Watson核回归引入了基于输入位置的加权策略:
$$f(x) = \sum_{i=1}^n \frac{K(x - x_i)}{\sum_{j=1}^n K(x - x_j)} y_i$$
其中K是核函数,我们使用高斯核:
attention_weights = nn.functional.softmax(-(X_repeat - x_train)**2 / 2, axis=1)
y_hat = paddle.matmul(attention_weights, y_train)
这种方法能产生更平滑且更接近真实函数的预测结果。
带参数注意力汇聚
为了增强模型的表达能力,我们引入可学习参数w:
class NWKernelRegression(nn.Layer):
def __init__(self, **kwargs):
super().__init__(**kwargs)
self.w = paddle.create_parameter((1,), dtype='float32')
def forward(self, queries, keys, values):
queries = queries.reshape((queries.shape[0], 1)).tile([keys.shape[1]]).reshape((-1, keys.shape[1]))
self.attention_weight = nn.functional.softmax(-((queries - keys) * self.w)**2 / 2, axis=1)
return paddle.bmm(self.attention_weight.unsqueeze(1), values.unsqueeze(-1)).reshape((-1, ))
训练过程如下:
net = NWKernelRegression()
loss = nn.MSELoss(reduction='none')
trainer = paddle.optimizer.SGD(learning_rate=0.5, parameters=net.parameters())
for epoch in range(5):
trainer.clear_grad()
l = loss(net(x_train, keys, values), y_train)
l.sum().backward()
trainer.step()
带参数模型能够更好地拟合训练数据,但预测曲线会变得不那么平滑。
注意力权重可视化
通过热力图可以直观地看到注意力权重的分布:
d2l.show_heatmaps(net.attention_weight.unsqueeze(0).unsqueeze(0),
xlabel='Sorted training inputs',
ylabel='Sorter testing inputs')
总结
- Nadaraya-Watson核回归展示了注意力机制的基本原理
- 非参数版本具有一致性,但灵活性有限
- 带参数版本通过可学习参数增强了模型表达能力
- 注意力权重决定了不同输入对输出的影响程度
扩展思考
- 增加训练数据量对非参数模型的影响
- 可学习参数w如何影响注意力权重的分布
- 如何引入超参数来改进模型性能
- 设计新的注意力汇聚函数的可能性
通过本教程,我们不仅理解了注意力机制的基本原理,还掌握了如何在PaddlePaddle中实现各种注意力汇聚方法。这对于后续学习更复杂的注意力模型(如Transformer)奠定了坚实基础。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考