PaddlePaddle深度学习教程:Nadaraya-Watson核回归中的注意力机制

PaddlePaddle深度学习教程:Nadaraya-Watson核回归中的注意力机制

awesome-DeepLearning 深度学习入门课、资深课、特色课、学术案例、产业实践案例、深度学习知识百科及面试题库The course, case and knowledge of Deep Learning and AI awesome-DeepLearning 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-DeepLearning

引言

注意力机制是深度学习中的重要概念,它模仿了人类认知过程中的注意力分配方式。在本教程中,我们将通过Nadaraya-Watson核回归这一经典机器学习模型,深入浅出地讲解注意力机制的基本原理和实现方式,并使用PaddlePaddle框架进行实践。

注意力机制概述

注意力机制的核心思想是:在处理输入数据时,不是平等对待所有信息,而是根据任务需求有选择性地关注重要部分。这种机制通常包含三个关键组件:

  1. 查询(Query):代表当前需要关注的内容
  2. 键(Key):表示输入数据的特征
  3. 值(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')

总结

  1. Nadaraya-Watson核回归展示了注意力机制的基本原理
  2. 非参数版本具有一致性,但灵活性有限
  3. 带参数版本通过可学习参数增强了模型表达能力
  4. 注意力权重决定了不同输入对输出的影响程度

扩展思考

  1. 增加训练数据量对非参数模型的影响
  2. 可学习参数w如何影响注意力权重的分布
  3. 如何引入超参数来改进模型性能
  4. 设计新的注意力汇聚函数的可能性

通过本教程,我们不仅理解了注意力机制的基本原理,还掌握了如何在PaddlePaddle中实现各种注意力汇聚方法。这对于后续学习更复杂的注意力模型(如Transformer)奠定了坚实基础。

awesome-DeepLearning 深度学习入门课、资深课、特色课、学术案例、产业实践案例、深度学习知识百科及面试题库The course, case and knowledge of Deep Learning and AI awesome-DeepLearning 项目地址: https://gitcode.com/gh_mirrors/aw/awesome-DeepLearning

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

石顺垒Dora

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值