(二)自然语言处理笔记——Seq2Seq架构、注意力机制

(二)自然语言处理笔记------Seq2Seq架构、注意力机制

1、注意力机制


2、Seq2Seq架构


3、Seq2Seq架构中添加注意力机制

4、注意力机制常见计算规则



注意力机制代码实现:

python 复制代码
import torch
import torch.nn as nn
import torch.nn.functional as F


# MyAtt类实现思路分析
# 1 init函数 (self, query_size, key_size, value_size1, value_size2, output_size)
# 准备2个线性层 注意力权重分布self.attn 注意力结果表示按照指定维度进行输出层 self.attn_combine
# 2 forward(self, Q, K, V):
# 求查询张量q的注意力权重分布, attn_weights[1,10]
# 求查询张量q的注意力结果表示 bmm运算, attn_applied[1,1,32]
# q 与 attn_applied 融合,再按照指定维度输出 output[1,1,32]
# 返回注意力结果表示output:[1,1,32], 注意力权重分布attn_weights:[1,10]
class MyAtt(nn.Module):
    #                   32          32          10          32          32
    def __init__(self, query_size, key_size, value_size1, value_size2, output_size):
        super(MyAtt, self).__init__()
        self.query_size = query_size
        self.key_size = key_size
        self.value_size1 = value_size1
        self.value_size2 = value_size2
        self.output_size = output_size

        # 注意力权重分布self.attn
        self.attn = nn.Linear(query_size+key_size, value_size1)
        # 注意力结果表示按照指定维度进行输出层
        self.attn_combine = nn.Linear(query_size+value_size2, output_size)

    def forward(self, Q, K, V):
        # 求查询张量q的注意力权重分布, attn_weights[1,10]
        tmp1 = torch.cat((Q[0], K[0]), dim=-1) # [1,1,32],[1,1,32] -->[1,32],[1,32] --> [1,64]
        tmp2 = self.attn(tmp1) # [1,64] --> [1,10]
        tmp3 = F.softmax(tmp2, dim=-1)  # [1,10]
        print('tmp3-->', tmp3.shape, tmp3)
        attn_weights = F.softmax(self.attn(torch.cat((Q[0], K[0]), dim=-1)), dim=-1)

        # 求查询张量q的注意力结果表示 bmm运算, attn_applied[1,1,32]
        attn_applied = torch.bmm(attn_weights.unsqueeze(0), V) # [1,10]-> [1,1,10]@[1,10,32]->[1,1,32]

        # q 与 attn_applied 融合,再按照指定维度输出 output[1,1,32]
        output = torch.cat((Q[0], attn_applied[0]),dim=-1) # [1,1,32],[1,1,32]->[1,32],[1,32] ==>[1,64]==>[1,32]
        output = self.attn_combine(output).unsqueeze(0)

        # 返回注意力结果表示output:[1,1,32], 注意力权重分布attn_weights:[1,10]
        return  output, attn_weights


if __name__ == '__main__':
    # 先验知识: 假设qkv的特征属性(也就是特征尺寸/特征数是32)(这里特征属性实在想不明白: 每个人有32门功课)
    # 有QKV:q是查询张量其形状[1,1,32];k索引张量[1,1,32];v是内容10个单词,每个单词32个特征[1,10,32]
    # 我们的任务:输入查询张量q,通过注意力机制来计算如下信息:
    # 1、查询张量q的注意力权重分布:查询张量q(要生成的目标)和source原文(10个单词)相关性 [1, 10]
    # 2、查询张量q的结果表示:有一个普通的q升级成一个更强大q;用q和v做bmm运算 []

    query_size = 32
    key_size = 32
    value_size1 = 10  # 单词个数
    value_size2 = 32
    output_size = 32

    # 1 准备数据
    Q = torch.randn(1, 1, 32)
    K = torch.randn(1, 1, 32)
    V = torch.randn(1, 10, 32)

    # 2 实例化MyAtt
    myattention = MyAtt(32, 32, 10, 32, 32)
    print('myattention-->', myattention)

    # 3 给模型喂数据
    output, attn_weights = myattention(Q, K, V)
    # 4 打印结果
    print('查询张量q的注意力结果表示(更加强大的q):output-->', output.shape, output)
    print('查询张量q的注意力权重分布attn_weights-->', attn_weights.shape, attn_weights)
    print('注意力机制 End')
相关推荐
冷雨夜中漫步7 小时前
Python快速入门(6)——for/if/while语句
开发语言·经验分享·笔记·python
33三 三like7 小时前
《基于知识图谱和智能推荐的养老志愿服务系统》开发日志
人工智能·知识图谱
芝士爱知识a7 小时前
【工具推荐】2026公考App横向评测:粉笔、华图与智蛙面试App功能对比
人工智能·软件推荐·ai教育·结构化面试·公考app·智蛙面试app·公考上岸
腾讯云开发者8 小时前
港科大熊辉|AI时代的职场新坐标——为什么你应该去“数据稀疏“的地方?
人工智能
工程师老罗9 小时前
YoloV1数据集格式转换,VOC XML→YOLOv1张量
xml·人工智能·yolo
Coder_Boy_9 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
Gain_chance9 小时前
34-学习笔记尚硅谷数仓搭建-DWS层最近一日汇总表建表语句汇总
数据仓库·hive·笔记·学习·datagrip
啊森要自信9 小时前
CANN ops-cv:面向计算机视觉的 AI 硬件端高效算子库核心架构与开发逻辑
人工智能·计算机视觉·架构·cann
2401_836235869 小时前
中安未来SDK15:以AI之眼,解锁企业档案的数字化基因
人工智能·科技·深度学习·ocr·生活