用vit的时候读了一下transformer的思想,前几天面试结束之后发现对QKV又有点忘记了, 写一篇文章来记录一下
参考链接: 哔哩哔哩:在线激情讲解transformer&Attention注意力机制(上)
更具体的介绍可以去阅读论文
在Attention is all you need这篇文章中提出了著名的Transformer模型
Transformer中抛弃了传统的CNN和RNN,整个网络结构完全是由Attention机制组成。
更准确地讲,Transformer由且仅由self-Attenion和Feed Forward Neural Network组成。
一个基于Transformer的可训练的神经网络可以通过堆叠Transformer的形式进行搭建,作者的实验是通过搭建编码器和解码器各6层,总共12层的Encoder-Decoder,并在机器翻译中取得了BLEU值得新高。
在深度学习中,注意力机制的目标是从大量的信息中选择出更有用的信息。
而Attention is all you need这篇文章体现注意力机制的核心就是下面这个公式了

刚刚看到这个公式的时候我也是很蒙的,查了很多资料才搞懂,这里再次推荐一个B站的up主,讲的很形象, 本文的素材也是部分来自于此
在线激情讲解transformer&Attention注意力机制(上)
Q,K,V是由输入的词向量x经过线性变换得到的,其中各个矩阵w可以经过学习得到, 这种变换可以提升模型的拟合能力, 得到的Q,K,V 可以理解为
Q: 要查询的信息
K: 被查询的向量
V: 查询得到的值
总结一下:
首先Q、K、V都源于输入特征本身,是根据输入特征产生的向量,但目前我们现在无需关注是如何产生这组向量的。
V可以看做表示单个输入特征的向量。当我们直接把一组V输入到网络中进行训练,那这个网络就是没有引入Attention机制的网络。
但如果引入Attention,就需要将这组V分别乘以一组权重
α
\alpha
α,那么就可以做到有重点性地关注输入特征,如同人的注意力一般。

下面就用一个通俗的例子来解释如何学习到
α
\alpha
α并且使用attention机制
有一个海王,有N个备胎,他想要从自己的备胎中寻找出最符合自己期望的那个,便于他分配注意力并且来管理时间。

在这个案例中
Q 表示渣男对备胎的要求
K 表示渣男自身的条件 因为备胎们也会看渣男的条件是否让她们满意
V 表示匹配的结果
无论是渣男还是备胎, 都有着自己的一套Q K V 来记录他们选择的情况

现在我们的渣男要开始筛选备胎了, 对他来说,当然是备胎的条件越符合他的理想越好
放在Q,K,V上来讲就是渣男的Q与备胎的K之间的相似度越高越好

现在的问题就是如何计算他们的相似度了
点乘拓展:
在向量中,AB点乘的结果反应了他们之间的相似度, (A在B上的投影与B的模相乘得到的结果)
如果AB垂直,那么他们点乘为0, 也就是他们的相似度为0
因此AB点乘的结果越大, 我们就可以认为两个向量的相似度越高
在渣男选择备胎的过程中, 由于他们选择的条件Q,K是矩阵的形式, 因此计算矩阵之间的相似度我们采用
Q
∗
K
T
Q*K^T
Q∗KT 来实现
相当于计算了Q的每一行与K的每一行的点乘结果(结合下图中2行3列的例子来理解) 也就得到了Q的每一行与K的每一行之间的相似度结果
最后通过softmax来进行归一化, 得到一个直观的0~1之间的相似度结果

渣男与备胎之间的这些结果共同构成了权值, 也就是核心式中的左半部分。
α
=
s
o
f
t
m
a
x
(
Q
K
T
d
k
)
\alpha = softmax(\frac{QK^T}{\sqrt{d_k}})
α=softmax(dkQKT)
对于
d
k
{\sqrt{d_k}}
dk也许很多人会有疑问,为什么要除以
d
k
{\sqrt{d_k}}
dk ,能不能除以其他的东西呢,为什么是除不是乘呢? 主要原因如下
0.9这种高注意力的权重,那么会导致注意力几乎都被它所分走,除以一个数可以让注意力的分布更加均匀)q*k的符合N(0,1)的分布,类似于归一化。利用上面计算后得到的权重矩阵来对每个备胎加权,也就是
A
t
t
e
n
t
i
o
n
(
K
,
Q
,
V
)
=
α
∗
V
Attention(K,Q,V) = \alpha * V
Attention(K,Q,V)=α∗V
这样渣男就知道自己该对谁付出更多的注意力了,也有可能渣男比较自恋, 备胎都不太满足他的要求, 他的理想型可能是自己这种类型的, 那么他最需要关注的就是他自己

最近在学习CAN,记录一下,也供大家参考交流。推荐几个我觉得很好的CAN学习,本文也是在看了他们的好文之后做的笔记首先是瑞萨的CAN入门,真的通透;秀!靠这篇我竟然2天理解了CAN协议!实战STM32F4CAN!原文链接:https://blog.csdn.net/XiaoXiaoPengBo/article/details/116206252CAN详解(小白教程)原文链接:https://blog.csdn.net/xwwwj/article/details/105372234一篇易懂的CAN通讯协议指南1一篇易懂的CAN通讯协议指南1-知乎(zhihu.com)视频推荐CAN总线个人知识总
Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正处于学习Ruby的阶段,我想查看一些小型库的源代码以了解它们是如何构建的。我不知道什么是小型图书馆,但希望SO能推荐一些易于理解的图书馆来学习。因此,如果有人知道一两个非常小的库,这是新手Rubyists学习的好例子,请推荐!我想使用Manveru'sInnatelib,因为它试图保持在2000LOC以下,但我还不熟悉其中经常使用的Ruby速记。也许大约100-5
由于匿名block和散列block看起来大致相同。我正在玩它。我做了一些严肃的观察,如下所示:{}.class#=>Hash好的,这很酷。空block被视为Hash。print{}.class#=>NilClassputs{}.class#=>NilClass为什么上面的代码和NilClass一样,下面的代码又显示了Hash?puts({}.class)#Hash#=>nilprint({}.class)#Hash=>nil谁能帮我理解上面发生了什么?我完全不同意@Lindydancer的观点你如何解释下面几行:print{}.class#NilClassprint[].class#A
我正在学习Ruby,遇到了inject。我正处于理解它的风口浪尖,但当我是那种需要真实世界的例子来学习一些东西的人时。我遇到的最常见的例子是人们使用inject来添加一个(1..10)范围的总和,我不太关心这个。这是一个任意的例子。在实际程序中我会用它做什么?我正在学习,所以我可以继续使用Rails,但我不必有一个以Web为中心的示例。我只需要一些我可以全神贯注的目标。谢谢大家。 最佳答案 inject有时可以通过它的“其他”名称reduce更好地理解。它是一个对Enumerable进行操作(迭代一次)并返回单个值的函数。它有许多有
我很难理解Ruby中sender和receiver的实际含义。它们一般是什么意思?到目前为止,我只是将它们理解为方法调用和获取其返回值的调用。但是,我知道我的理解还远远不够。谁能给我一个Ruby中发送者和接收者的具体解释? 最佳答案 面向对象中的一个核心概念是消息传递和早期概念化,这在很大程度上借鉴了计算的Actor模型。艾伦·凯(AlanKay)创造了面向对象一词并发明了最早的OO语言之一SmallTalk,他拥有voicedregretatusingatermwhichputthefocusonobjectsinsteadofo
rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:
我正在使用RubyonRailsv3.0.9,我想“转换”一个句子中的字符串数组,包括标点符号。也就是说,如果我有如下数组:["element1","element2","element3"]我想得到\构建:#Note:Iadded'Elementsare:'atthebegin,','betweenelementsand'.'at#theend."Elementsare:element1,element2,element3."我该怎么做? 最佳答案 Rails有Array#to_sentence与array.join(',')相同
我在某些代码中遇到了三元组,但我无法理解条件:str.split(/',\s*'/).mapdo|match|match[0]==?,?match:"somestring"end.join我确实理解我是在某些点上拆分字符串并将总结果转换为数组,然后依次处理数组的每个元素。除此之外,我不知道发生了什么。 最佳答案 一种(稍微)不那么令人困惑的写法是:str.split(/',\s*'/).mapdo|match|ifmatch[0]==?,matchelse"somestring"endend.join我认为多行三元语句很糟糕,尤其是
有没有人成功地将S3存储桶读取为子文件夹?文件夹1--子文件夹2----文件3----文件4--文件1--文件2文件夹2--子文件夹3--文件5--文件6我的任务是读取文件夹1。我希望看到子文件夹2、文件1和文件2,但看不到文件3或文件4。现在,因为我将存储桶键限制为prefix=>'folder1/',你仍然会得到file3和4,因为它们在技术上具有folder1前缀。似乎真正做到这一点的唯一方法是吸收folder1下的所有键,然后使用字符串搜索从结果数组中实际排除file3和file4。有没有人有过这方面的经验?我知道像Transmit和Cyberduck这样的FTP风格的S3