64注意力机制 10章

 

 

 

 

 






 

 

自主性提示:  我想。。。、看想看的东西

非自主提示:随意一看     、看环境中现眼的东西

     环境的东西就是键和值  我想要是查询

 

 

#@save
def show_heatmaps(matrices, xlabel, ylabel, titles=None, figsize=(2.5, 2.5),
                  cmap='Reds'):
    """显示矩阵热图"""
    d2l.use_svg_display()
    num_rows, num_cols = matrices.shape[0], matrices.shape[1]
    fig, axes = d2l.plt.subplots(num_rows, num_cols, figsize=figsize,
                                 sharex=True, sharey=True, squeeze=False)
    for i, (row_axes, row_matrices) in enumerate(zip(axes, matrices)):
        for j, (ax, matrix) in enumerate(zip(row_axes, row_matrices)):
            pcm = ax.imshow(matrix.detach().numpy(), cmap=cmap)
            if i == num_rows - 1:
                ax.set_xlabel(xlabel)
            if j == 0:
                ax.set_ylabel(ylabel)
            if titles:
                ax.set_title(titles[j])
    fig.colorbar(pcm, ax=axes, shrink=0.6);

 

 

attention_weights = torch.eye(10).reshape((1, 1, 10, 10))
show_heatmaps(attention_weights, xlabel='Keys', ylabel='Queries')

 上面没讲哇。。。。








 

n_train = 50  # 训练样本数
x_train, _ = torch.sort(torch.rand(n_train) * 5)   # 排序后的训练样本
0-5之间随机生成50个数字 然后排序

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

y_train = f(x_train) + torch.normal(0.0, 0.5, (n_train,))  # 训练样本的输出
真实函数加上噪音 噪音是0均值 0.5方差 高斯
x_test = torch.arange(0, 5, 0.1)  # 测试样本 
0-5之间按0.1均匀的东西
y_truth = f(x_test)  # 测试样本的真实输出  
n_test = len(x_test)  # 测试样本数
n_test
50、

画图函数

def plot_kernel_reg(y_hat):
    d2l.plot(x_test, [y_truth, y_hat], 'x', 'y', legend=['Truth', 'Pred'],
             xlim=[0, 5], ylim=[-1, 5])
    d2l.plt.plot(x_train, y_train, 'o', alpha=0.5);

 

 

 

# X_repeat的形状:(n_test,n_train),
# 每一行都包含着相同的测试输入(例如:同样的查询)
X_repeat = x_test.repeat_interleave(n_train).reshape((-1, n_train))
repeat 吧1234变成1111 222 333 444  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)

 最上角

最深

应该就是距离最近   所以权重最大  然后最右下角也是这样

 

 

weights = torch.ones((2, 10)) * 0.1
values = torch.arange(20.0).reshape((2, 10))
torch.bmm(weights.unsqueeze(1), values.unsqueeze(-1))
tensor([[[ 4.5000]],

        [[14.5000]]])

 

class NWKernelRegression(nn.Module):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.w = nn.Parameter(torch.rand((1,), requires_grad=True))

    def forward(self, queries, keys, values):
        # queries和attention_weights的形状为(查询个数,“键-值”对个数)
        queries = queries.repeat_interleave(keys.shape[1]).reshape((-1, keys.shape[1]))
        self.attention_weights = nn.functional.softmax(
            -((queries - keys) * self.w)**2 / 2, dim=1)
        # values的形状为(查询个数,“键-值”对个数)
        return torch.bmm(self.attention_weights.unsqueeze(1),
                         values.unsqueeze(-1)).reshape(-1)

# X_tile的形状:(n_train,n_train),每一行都包含着相同的训练输入
X_tile = x_train.repeat((n_train, 1))
# Y_tile的形状:(n_train,n_train),每一行都包含着相同的训练输出
Y_tile = y_train.repeat((n_train, 1))
# keys的形状:('n_train','n_train'-1)
keys = X_tile[(1 - torch.eye(n_train)).type(torch.bool)].reshape((n_train, -1))
# values的形状:('n_train','n_train'-1)
values = Y_tile[(1 - torch.eye(n_train)).type(torch.bool)].reshape((n_train, -1))
net = NWKernelRegression()
loss = nn.MSELoss(reduction='none')
trainer = torch.optim.SGD(net.parameters(), lr=0.5)
animator = d2l.Animator(xlabel='epoch', ylabel='loss', xlim=[1, 5])

for epoch in range(5):
    trainer.zero_grad()
    l = loss(net(x_train, keys, values), y_train)
    l.sum().backward()
    trainer.step()
    print(f'epoch {epoch + 1}, loss {float(l.sum()):.6f}')
    animator.add(epoch + 1, float(l.sum()))

# keys的形状:(n_test,n_train),每一行包含着相同的训练输入(例如,相同的键)
keys = x_train.repeat((n_test, 1))
# value的形状:(n_test,n_train)
values = y_train.repeat((n_test, 1))
y_hat = net(x_test, keys, values).unsqueeze(1).detach()
plot_kernel_reg(y_hat)

 

d2l.show_heatmaps(net.attention_weights.unsqueeze(0).unsqueeze(0),
                  xlabel='Sorted training inputs',
                  ylabel='Sorted testing inputs')

 都没咋讲。。。。

Pytorch 注意力机制_哇咔咔负负得正的博客-CSDN博客环境使用 Kaggle 里免费建立的 Notebook教程使用李沐老师的 动手学深度学习 网站和 视频讲解小技巧:当遇到函数看不懂的时候可以按 查看函数详解。不随意线索(无意识注意):想读书:随意线索(有意识地注意)非参就是不学习参数。​1​exp(−2u2​)那么:f(x)=∑i=1nexp⁡(−12(x−xi)2)∑j=1nexp⁡(−12(x−xj)2)yi=∑i=1nsoftmax⁡(−12(x−xi)2)yi\begin{aligned}f(x) &=\sum_{i=1}^{n} \https://blog.csdn.net/qq_39906884/article/details/125245275?spm=1001.2014.3001.5502







 


 

 query和keys做注意力分数函数 然后丢到softmax 变成注意力权重 对每个map做加权和做输出

 

 






65 注意力分数【动手学深度学习v2】_哔哩哔哩_bilibili动手学深度学习 v2 - 从零开始介绍深度学习算法和代码实现课程主页:https://courses.d2l.ai/zh-v2/教材:https://zh-v2.d2l.ai/, 视频播放量 54299、弹幕量 410、点赞数 920、投硬币枚数 771、收藏人数 312、转发人数 45, 视频作者 跟李沐学AI, 作者简介 ,相关视频:66 使用注意力机制的seq2seq【动手学深度学习v2】,人工智能研究生现状,在线激情讲解transformer&Attention注意力机制(上),【Transformer模型】曼妙动画轻松学,形象比喻贼好记,华智冰的真身和AI同步,用自己训练的AI玩王者荣耀,GAN论文逐段精读【论文精读】,【原来如此】深度学习中注意力机制(attention)的真实由来,PyTorch深度学习快速入门教程(绝对通俗易懂!)【小土堆】,手推transformerhttps://www.bilibili.com/video/BV1Tb4y167rb?p=3&spm_id_from=pageDriver&vd_source=eba877d881f216d635d2dfec9dc10379

10.3. 注意力评分函数 — 动手学深度学习 2.0.0-beta0 documentationhttps://zh.d2l.ai/chapter_attention-mechanisms/attention-scoring-functions.htmlPytorch 注意力分数_哇咔咔负负得正的博客-CSDN博客环境使用 Kaggle 里免费建立的 Notebook教程使用李沐老师的 动手学深度学习 网站和 视频讲解小技巧:当遇到函数看不懂的时候可以按 查看函数详解。注意力汇聚(Pooling)表达式:f(x)=∑iα(x,xi)yi=∑i=1nsoftmax(−12(x−xi)2)yif(x) = \sum_i{\alpha(x, x_i)y_i} = \sum_{i=1}^{n}softmax(-\frac{1}{2}(x-x_i)^2)y_if(x)=i∑​α(x,xi​)yi​=i=1∑n​softmahttps://blog.csdn.net/qq_39906884/article/details/125248680?spm=1001.2014.3001.5502

3. Q&A

Q:mask_softmax 是啥意思?
A:有时候一个句子不够长,假如说一个句子 4 个单词,输入格式要求 10 个单词,那么需要填充 6 个无意义的词,然后用 mask_softmax 告诉 Query 计算的时候不需要考虑后 6 个词。

这块没有学习

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Transformer中的自注意力机制(Self-Attention)是一种用于建模序列数据之间关系的机制。它通过计算每个输入元素与其他元素之间的相关性得分,从而为每个元素分配一个权重。这些权重用于加权求和,以生成每个元素的表示。 自注意力机制的计算过程如下: 1. 首先,通过将输入序列映射到查询(Query)、键(Key)和值(Value)空间来生成查询、键和值向量。 2. 接下来,计算查询向量与所有键向量的点积,然后对结果进行缩放以控制梯度大小。 3. 将缩放后的点积结果输入到softmax函数中,以获得注意力权重。 4. 使用注意力权重对值向量进行加权求和,得到自注意力机制的输出。 通过自注意力机制,Transformer能够在不同位置的输入元素之间建立长距离的依赖关系,从而更好地捕捉序列中的上下文信息。 以下是一个使用自注意力机制的Transformer示例代码: ```python import torch import torch.nn as nn class SelfAttention(nn.Module): def __init__(self, input_dim, hidden_dim): super(SelfAttention, self).__init__() self.query = nn.Linear(input_dim, hidden_dim) self.key = nn.Linear(input_dim, hidden_dim) self.value = nn.Linear(input_dim, hidden_dim) self.softmax = nn.Softmax(dim=-1) def forward(self, x): q = self.query(x) k = self.key(x) v = self.value(x) scores = torch.matmul(q, k.transpose(-2, -1)) scores = scores / torch.sqrt(torch.tensor(q.size(-1), dtype=torch.float32)) attention_weights = self.softmax(scores) output = torch.matmul(attention_weights, v) return output # 使用自注意力机制的Transformer模型 class Transformer(nn.Module): def __init__(self, input_dim, hidden_dim, num_layers): super(Transformer, self).__init__() self.attention = SelfAttention(input_dim, hidden_dim) self.layers = nn.ModuleList([nn.Linear(hidden_dim, hidden_dim) for _ in range(num_layers)]) def forward(self, x): output = self.attention(x) for layer in self.layers: output = layer(output) return output # 创建一个输入序列 input_seq = torch.randn(10, 20) # 输入序列长度为10,每个元素的维度为20 # 创建一个Transformer模型 transformer = Transformer(input_dim=20, hidden_dim=64, num_layers=2) # 使用Transformer模型进行前向传播 output = transformer(input_seq) print(output.shape) # 输出:torch.Size([10, 20]) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值