d2l Nadaraya-Waston核回归

文章介绍了如何使用注意力机制来拟合带有噪声的数据。通过对训练样本x_train和y_train(含噪声)的处理,构造了非参数注意力汇聚方法,利用softmax函数计算距离权重。在给定的测试样本x_test上,通过注意力权重与y_train加权求和得到y_hat,从而实现无噪声的y_truth的拟合。这种方法关注于与给定点距离更近的训练样本,权重随着距离增加而减小。

注意力机制里面的非参数注意力汇聚

目录

1.目标任务

2.数据生成

2.1构造原始数值

3.非参数注意力汇聚

4.对注意力机制的理解


1.目标任务

使用y_train(有噪声),拟合y_truth(没噪声)。给你所有的y_train,构造注意力权重生成拟合曲线。

2.数据生成

n_train = 50 # 训练样本数
x_train, _ = torch.sort(torch.rand(n_train) * 5) # 排序后的训练样本

其中:对于sort的返回值:

 sort返回两个值,第一个是拍好了从小到大的顺序后的values,另一个是对应原数据的indices

2.1构造原始数值

噪声服从u=0;std=0.5的正态分布:

 y_train为上述计算式,包含噪声;y_truth为上式不包含噪声

def f(x):
    return 2 * torch.sin(x) + x**0.8

y_train = f(x_train) + torch.normal(0.0, 0.5, (n_train,)) # 训练样本的输出
x_test = torch.arange(0, 5, 0.1) # 测试样本
y_truth = f(x_test) # 测试样本的真实输出
n_test = len(x_test) # 测试样本数
n_test

训练样本是有噪声的x_train与y_train;真实数据是不带噪声的y_truth

3.非参数注意力汇聚

# X_repeat的形状:(n_test,n_train),
# 每⼀⾏都包含着相同的测试输⼊(例如:同样的查询)
X_repeat = x_test.repeat_interleave(n_train).reshape((-1, n_train))
# x_train包含着键。attention_weights的形状:(n_test,n_train),
# 每⼀⾏都包含着要在给定的每个查询的值(y_train)之间分配的注意⼒权重
attention_weights = nn.functional.softmax(-(X_repeat - x_train)**2 / 2, dim=1)
# y_hat的每个元素都是值的加权平均值,其中的权重是注意⼒权重
y_hat = torch.matmul(attention_weights, y_train)
plot_kernel_reg(y_hat)

上块代码中:

repeat_interleave就是将原来的x_test中的每一个元素赋值n_train次,得到一个一维tensor,再使用reshape操作使复制的相同元素都在同一行中。

 对dim=1进行softmax,即将每个Xi与给定x的距离首先进行:1.映射非负(exp)+2.归一化。此时attention_weights表示各个候选Xi与给定x的距离的归一化权重。

 

 由图可见,在第一行给定的x=0,距离Xi中对应的X1距离最近,其余该行上的值绝对值都比它大,所以最后的softmax它得分最多,权重最多;对于倒数第二行对应的x=4.8,最后一个X50=4.8466距离最近,所以对应位置的softmax得分最高

X_repeat - x_train,形状为(50,50)-(50),第一个tensor中的每一行的各个元素减去第二个tensor里面的每个元素,用来计算给定x(0.1等分)与候选Xi的距离

 dim=1表示的是沿着列增的方向操作,本质是对每一行操作!!!

4.对注意力机制的理解

 给定x时(0.1等距分布),对所有候选Xi(rand)计算一下与x的距离(得到的X_repeat - x_train是(50,50)的tensor,其中每一行表示单个指定的x与各个Xi的距离。

  任务的目的使用y_train(有噪声),拟合y_truth(没噪声)。给你所有的y_train,构造权重生成拟合曲线。

  至于具体的在某个拟合点x(0.1等分),用attention_weights与所有的y_train相乘,每一行表示的是各个x_train(候选Xi)与x的距离的softmax值,距离越近权重越大,考虑的就越多。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值