def attention(query, key, value, mask=None, dropout=None):# shape:query=key=value---->[batch_size,8,max_length,64]d_k = query.size(-1)# k的纬度交换后为:[batch_size,8,64,max_length]# scores的纬度为:[batch_size,8,max_length,max_length]scores = torch.matmul(query, key.transpose(-2, -1)) \/ math.sqrt(d_k)#padding maskif mask is not None:scores = scores.masked_fill(mask == 0, -1e9)#剖析点1p_attn = F.softmax(scores, dim = -1)if dropout is not None:p_attn = dropout(p_attn)return torch.matmul(p_attn, value), p_attn

源码剖析

剖析点1:scores.masked_fill(mask == 0, -1e9)

Transformer的Scaled dot product部分的scores.masked_fill(mask == 0, -1e9)把mask矩阵中为0的位置用-1e9这个极小值填充,这样的极小值在经过softmax之后为0
关于masked_fill函数参考:https://blog.csdn.net/qq_41568188/article/details/107281395
掩码操作,用value填充tensor中与mask中值为0位置相对应的元素。
mask的形状必须与要填充的tensor形状一致。

import torch
import torch.nn.functional as F
a = torch.randn(5,6)
print(a)
x = [5,4,3,2,1]
mask = torch.zeros(5,6,dtype=torch.int)
for e_id, src_len in enumerate(x):mask[e_id, src_len:] = 1
print(mask)
a.data.masked_fill_(mask==0,-float('inf'))
print(a)
print(F.softmax(a,dim=-1))
#输出
tensor([[-1.8453, -0.7031,  0.0066, -1.0771, -0.5282, -0.1669],[ 1.0285, -0.1086, -0.9871, -1.2061, -0.7845,  1.5072],[ 1.8313,  2.4513, -0.1615, -1.2768, -0.5887, -1.2990],[ 0.4653,  0.7976,  0.2020, -0.0886, -0.9101, -2.9927],[-0.5556, -0.5319, -0.1768, -0.4238,  1.2213, -1.9120]])
tensor([[0, 0, 0, 0, 0, 1],[0, 0, 0, 0, 1, 1],[0, 0, 0, 1, 1, 1],[0, 0, 1, 1, 1, 1],[0, 1, 1, 1, 1, 1]], dtype=torch.int32)
tensor([[   -inf,    -inf,    -inf,    -inf,    -inf, -0.1669],[   -inf,    -inf,    -inf,    -inf, -0.7845,  1.5072],[   -inf,    -inf,    -inf, -1.2768, -0.5887, -1.2990],[   -inf,    -inf,  0.2020, -0.0886, -0.9101, -2.9927],[   -inf, -0.5319, -0.1768, -0.4238,  1.2213, -1.9120]])
tensor([[0.0000, 0.0000, 0.0000, 0.0000, 0.0000, 1.0000],[0.0000, 0.0000, 0.0000, 0.0000, 0.0918, 0.9082],[0.0000, 0.0000, 0.0000, 0.2520, 0.5015, 0.2465],[0.0000, 0.0000, 0.4722, 0.3531, 0.1553, 0.0194],[0.0000, 0.1045, 0.1491, 0.1165, 0.6035, 0.0263]])

【源码解读】Transformer的Scaled dot product部分详解相关推荐

  1. KBQA_多轮对话——模型源码解析(一)Pickle模块功能详解

    KBQA_多轮对话--模型源码解析(一)Pickle模块功能详解 pickle --- Python 对象序列化的基本功能 1.pickle基本概念 2.pickle 与 json 模块的比较 3.p ...

  2. 【SA8295P 源码分析】53 - mifs.build.tmpl 脚本详解:启动QNX procnto-smp-instr微内核、启动QNX串口终端shell、加载解析并执行ifs2_la.img

    [SA8295P 源码分析]53 - mifs.build.tmpl 脚本详解:启动QNX procnto-smp-instr微内核.启动QNX串口终端shell.加载解析并执行ifs2_la.img ...

  3. Vue.js 源码分析(二十三) 指令篇 v-show指令详解

    v-show的作用是将表达式值转换为布尔值,根据该布尔值的真假来显示/隐藏切换元素,它是通过切换元素的display这个css属性值来实现的,例如: <!DOCTYPE html> < ...

  4. FatFs 之一 R0.13c版源码目录文件、函数、全配置项详解及移植说明

      FatFs 是用于小型嵌入式系统的通用 FAT/exFAT 文件系统模块.FatFs 模块的编写符合 ANSI C(C89),并与磁盘 I/O 层完全分离,因此它独立于硬件平台. 它可以集成到资源 ...

  5. 类加载器源码、双亲委派、自定义类加载器详解

    文章目录 jdk的类加载器 双亲委派 自定义类加载器 打破双亲委派 jdk的类加载器 查看一个类的类加载器: ClassLoader classLoader = boy.class.getClassL ...

  6. bootstrap源码之滚动监听组件scrollspy.js详解

    其实滚动监听使用的情况还是很多的,比如导航居于右侧,当主题内容滚动某一块的时候,右侧导航对应的要高亮. 实现功能 1.当滚动区域内设置的hashkey距离顶点到有效位置时,就关联设置其导航上的指定项 ...

  7. statement执行insert into语句_【图文并茂】源码解析MyBatis ShardingJdbc SQL语句执行流程详解...

    源码分析Mybatis系列目录: 1.源码分析Mybatis MapperProxy初始化[图文并茂] 2.源码分析Mybatis MappedStatement的创建流程 3.[图文并茂]Mybat ...

  8. 从源码分析RocketMQ系列-消息拉取PullMessageProcessor详解

    导语   在之前的分析中分析了关于SendMessageProcessor,并且提供了对应的源码分析分析对于消息持久化的问题,下面来看另外一个PullMessageProcessor,在RocketM ...

  9. (01)ORB-SLAM2源码无死角解析-(37) EPnP 算法原理详解→理论基础一:控制点选取、透视投影约束

    讲解关于slam一系列文章汇总链接:史上最全slam从零开始,针对于本栏目讲解的(01)ORB-SLAM2源码无死角解析链接如下: (01)ORB-SLAM2源码无死角解析-(00)目录_最新无死角讲 ...

最新文章

  1. 求解最长单调递增子串
  2. Ubuntu GNOME单击任务栏图标最小化设置
  3. Scala enumeration
  4. python基础应用_【复习】mysql+python基础应用(20190815)
  5. EMUI10还有哪些看点?分布式技术能力、开放与工具链...
  6. C++ Semaphore信号量使用
  7. JAVA设计模式《四》
  8. Delphi调用外部程序详解
  9. ubuntu网络正常连接但无法上网
  10. 不读后悔:风口上的仓储自动化
  11. matlab中注释多行
  12. 移动端人脸识别活体检测,高效集成
  13. c语言中1和0什么意思啊,精讲LOOKUP公式中1和0的含义,这1500字的详细解析值得收藏一份...
  14. 喜欢看电影来哦!教你如果使用Python网络爬虫爬取豆瓣高分电影!
  15. 博通无线网卡驱动 linux,debian 安装博通无线网卡驱动
  16. centos7上运行 ultravnc repeater
  17. 【汇编与接口】并行接口8255芯片实验
  18. 致大学生——成为博主半年了,谈谈博客对于就业和考研的重要性
  19. 什么是框架?框架和库有什么区别?
  20. 百度CEO 李彦宏 简介

热门文章

  1. NFT+DAO,改变流行IP难以融合的制胜法宝
  2. idea好用插件收集,总有一款适合你
  3. Ubuntu 16.04 下部署Node.js+MySQL微信小程序商城 1
  4. GNU/Linux下如何设计PCB印刷电路板
  5. python在生活中的应用-制作图片九宫格
  6. 腾讯云分布式数据库TDSQL的十年自主可控之路
  7. 智慧校园让校园管理更智慧
  8. 新建实例启动S7-PLCSIM Advanced V2.0失败:Error Code: -30, LicenseNotFound
  9. ABLIC Inc.推出具有宽工作电压范围的汽车用零点漂移运算放大器S-19630AB
  10. if 结构matlab,matlab中if语句and