Attention(注意力)实际上就是权重的另一种应用的称呼,其具体结构与初始输入的 content \(\vec{x_{1}}, \vec{x_{2}}, \cdots, \vec{x_{n}} \in \mathcal{X}\) 紧密相关。其中, \(\vec{x_{1}}, \vec{x_{2}}, \cdots, \vec{x_{n}}\) 为维度相同(设为 \(d\),即 \(\vec{x_{i}} \in \mathbb{R}^{d}\) for \(\forall 1 \leq i \leq n\))的向量。所谓 word embedding,实质是用低维的向量表示物体,但是,表示时需要注意,对于任意两种不同物体的 embedding,若两物体本身有着相似的属性(这个定义可以比较抽象,例如,绿巨人与钢铁侠、在地理上相近的两个物体、相似的声音等等都能称作具有某种相似的属性,具体需要看模型的任务和目的是什么),那么它们的 embedding 向量经过某种计算出来的结果,或 “距离” 需要很近。反之,如果两件物体风马牛不相及,或者在模型中我们极力希望将它们分开,那么它们的 embedding 相计算出的 “距离” 应当很远。
例如,在NLP任务中每个 \(\vec{x_{i}}\) 代表了一个 word embedding(原论文中每个word embedding 的维度 = 512,i.e., \(d = 512\))。我们的实际任务是,对于每一个 \(\vec{x_{i}}\),分别计算其对应的 attention \(A_{i}\),具体计算方法如下:
对于每一个 word embedding \(\vec{x_{i}} \in \mathbb{R}^{d}\),分别计算
其中,\(W^{Q}, W^{K}, W^{V}\) 分别为 \(d \times d\) 的参数方阵,那么 \(\vec{q_{i}}, \vec{k_{i}}, \vec{v_{i}}\) 皆为 \(d\) 维行向量。对于 \(1 \leq i \leq n\),可以合并写为矩阵形式,i.e.,
如上所示,\(\vec{w^{Q}_{i}}, \vec{w^{K}_{i}}, \vec{w^{V}_{i}}\) 为 \(d \times 1\) 的列向量 for \(\forall 1 \leq i \leq d\)。
现在,对于 word embedding \(\vec{x_{i}}\),已求得其对应的\(\vec{q_{i}}, \vec{k_{i}}, \vec{v_{i}}\),因此 \(\vec{x_{i}}\) 的 attention 记作:
其中,\(q_{i}k_{i}^{T}\) 与 \(q_{j}k_{j}^{T}\) 代表了 query 与 key 的内积,结果为标量。则 \(A_{i}(q_{i}, K, V)\) 的维度与最后乘上的 value \(v_{i}\) 相同,即为 \(1 \times d\) 的行向量。由于一共有 \(n\) 个 word embedding (\(1 \leq i \leq n\)),对应地,最终也应有 \(n\) 个维度为 \(1 \times d\) 的attention。写作矩阵形式为:
\(A(X)\) 即为 \(n \times d\) 的矩阵,softmax 定义为:
注意,最终式中除以\(\sqrt{d}\) 的原因是,维度 \(d\) 的增大会导致整个向量的方差增大,因此更容易出现极端值(即非常大与非常小的值),使 softmax 的梯度变得极小。
Attention 其实就是 Nadaraya–Watson Kernel Regression 在 Deep Learning 中的应用,核心思想完全一致,实际上这种思想在机器学习中随处可见,尤其在非参估计(Non-parametric estimation)中。
线性回归及其衍生(e.g. Lasso, Ridge and etc.)存在的一个缺陷是,如果我们不知道independent variables 与 dependent variables 之间联系的参数形式,那么就无法建立模型并对参数进行估计。因此,Kernel Regression 所解决的便是在没有模型假设的情况下对一个新的 test point \(\vec{x}\) 进行 label 的预测。
一个顺应逻辑的想法是,将新的 test point \(\vec{x}\) 的 local neighborhood \(X\) 中所包含的全部 observed data (or training data)的 label 的平均值视为 estimate \(\hat{y}\),即:
也就是说,对于新的 test data \(\vec{x}\), 它的 label 可以被估计为邻域中所有已知数据的 label 的平均值。当然,我们对于邻域的选择是灵活的,并且 “平均值” 也只是其中一种估计法。总得来说,我们有 Kernel Regression 的一般式:
其中,\(w_{i}(\vec{x})\) 为突显 local observation 的权重,定义为:
对于 Kernel Regression 中 “核” (即kernel,或 localization function) 的选择,一般来说有:
Gaussian Kernal: \(\quad K_{h}(x, x^{'}) = e^{-\frac{||x - x^{'}||^{2}}{h}}\)
Box Kernel: \(\quad K_{h}(x, x^{'}) = \mathbb{I}_{\left\{ ||x-x^{'}|| \leq h \right\}}\)
Triangle Kernel: \(\quad K_{h}(x, x^{'}) = \left[ 1 - \frac{||x - x^{'}||}{h} \right]_{+}\)
Kernel 的选择是灵活的,其本质只是衡量任意 observed data 对一个新数据点的预测值的贡献程度。因此通常满足:对于距待预测数据 \(\vec{x}\) 越近的 \(\vec{x_{i}}\),所得到的函数结果 \(K_{h}(\vec{x}, \vec{x_{i}})\) 应越大。
到这里我们可以很清晰地发现,attention 就是一个运用了 exponential function 作为 kernel 的权重运算结果。因此,attention 的计算也可以形象地写为:
同时,这也揭示了为什么它的名字叫做 “attention(注意力)”,这个注意力就像 Kernel Regression 我们取的 local neighborhood,代表了我们在预测 \(\vec{x}\) 的 label 时,注意力放在了结果权重大的 neighborhood 中,而对于 neighborhood 以外,权重相对很小,因此不需要过分关注。
现在我们知道:
其中 \(Q = X W^{Q}, K = X W^{K}, V = X W^{V}\)。
我们知道,\(X W^{Q}\) (\(XW^{K}, XW^{V}\) 同理) 的本质是将 \(X\) 中的各行向量:\(\vec{x_{1}}, \vec{x_{2}}, \ldots, \vec{x_{n}}\) 变换到 \(W^{Q}\) 中以各列向量:\(\vec{w^{Q}_{1}}, \vec{w^{Q}_{2}}, \ldots, \vec{w^{Q}_{d}}\)为基所表示的向量空间中。所得新矩阵的第 \(m\) 列,为 \(X\) 在 \(W^{Q}\) 的第 m 个基(即 \(\vec{w^{Q}_{m}}\))上的投影。 那么, 对于公式中分子 \(Q K^{T}\),本质上是变换到两个向量空间中的 \(X\) 的矩阵相乘,
从实际意义上可以理解为:
以上的矩阵运算实际上是令 \(\vec{x_{1}}, \vec{x_{2}}, \ldots, \vec{x_{n}}\) 两两分别做内积(包括与自身),而向量内积:
其中 \(\theta\) 为向量 \(a, b\) 之间的夹角。因此,内积运算反映了两个向量相似度。当两个向量越相似,即夹角越小,i.e. \(\theta \rightarrow 0, \cos \theta \rightarrow 1\),导致内积越大,也就是其中一向量越能 “代表” 另一向量,通俗的解释即: “注意力在此处更集中”。
最近在学习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)在图
#app/models/product.rbclassProduct我从Controller调用方法1。当我运行程序时。我收到一个错误:method_missing(atlinemethod2(param2)).rbenv/versions/2.3.1/lib/ruby/gems/2.3.0/gems/activerecord-5.0.0/lib/active_record/relation/batches.rb:59:in`block(2levels)infind_each... 最佳答案 classProduct说明:第一个是类
我明白了defa(&block)block.call(self)end和defa()yieldselfend导致相同的结果,如果我假设有这样一个blocka{}。我的问题是-因为我偶然发现了一些这样的代码,它是否有任何区别或者是否有任何优势(如果我不使用变量/引用block):defa(&block)yieldselfend这是一个我不理解&block用法的具体案例:defrule(code,name,&block)@rules=[]if@rules.nil?@rules 最佳答案 我能想到的唯一优点就是自省(introspecti
关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。关闭3年前。Improvethisquestion我正处于学习Ruby的阶段,我想查看一些小型库的源代码以了解它们是如何构建的。我不知道什么是小型图书馆,但希望SO能推荐一些易于理解的图书馆来学习。因此,如果有人知道一两个非常小的库,这是新手Rubyists学习的好例子,请推荐!我想使用Manveru'sInnatelib,因为它试图保持在2000LOC以下,但我还不熟悉其中经常使用的Ruby速记。也许大约100-5
我正在尝试获得良好的Ruby编码风格。为防止意外调用具有相同名称的局部变量,我总是在适当的地方使用self.。但是现在我偶然发现了这个:classMyClass上面的代码导致错误privatemethodsanitize_namecalled但是当删除self.并仅使用sanitize_name时,它会起作用。这是为什么? 最佳答案 发生这种情况是因为无法使用显式接收器调用私有(private)方法,并且说self.sanitize_name是显式指定应该接收sanitize_name的对象(self),而不是依赖于隐式接收器(也是
由于匿名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
我的rails3.1.6应用程序中有一个自定义访问器方法,它为一个属性分配一个值,即使该值不存在。my_attr属性是一个序列化的哈希,除非为空白,否则应与给定值合并指定了值,在这种情况下,它将当前值设置为空值。(添加了检查以确保值是它们应该的值,但为简洁起见被删除,因为它们不是我的问题的一部分。)我的setter定义为:defmy_attr=(new_val)cur_val=read_attribute(:my_attr)#storecurrentvalue#makesureweareworkingwithahash,andresetvalueifablankvalueisgiven
我很难理解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: