神经网络中的「注意力」是什么?怎么用?

来源:转载自公众号「雷克世界」微信号:ROBO_AI

编译:嗯~阿童木呀、多啦A亮

概要:神经网络中的注意力机制(Attention mechanisms),也被称为“神经注意力”或“注意力”,最近吸引了广泛的注意力(双关语)。


神经网络中的注意力机制(Attention mechanisms),也被称为“神经注意力”或“注意力”,最近吸引了广泛的注意力(双关语)。而在接下来的这篇文章中,我将描述和实现两种软视觉注意力机制。


什么是注意力(attention)


一种非正式的说法是,神经注意力机制可以使得神经网络具备专注于其输入(或特征)子集的能力:选择特定的输入。这可以是x∈R^d一个输入,z∈R^k一个特征向量,a∈[0,1]^k一个注意力向量或f ϕ (x) 注意力网络。通常来说,注意力为

 


其中⊙是指元素对应乘法(element-wise multiplication)。下面我们可以谈论一下软注意力(soft attention),它将特征与一个值在0和1之间的掩码或当这些值被限定为0或1时的硬注意力(hard attention)相乘,即a∈{0,1}^k。在后一种情况下,我们可以使用硬注意力掩码直接索引特征向量:za =z[a](用Matlab表示法),可以改变其维度。


如果你想要弄明白为什么注意力机制如此至关重要,那我们就有必要思考一下一个神经网络的真正意义是什么:函数近似器。它的能够近似不同类别函数的能力主要依赖于它的架构。一个典型的神经网络可以被实现为一系列矩阵乘法(matrix multiplications)和元素对应非线性乘法(element-wise non-linearities),其中输入或特征向量的元素仅仅通过加法相互作用。


注意力机制会对一个用于与特征相乘的掩码后进行计算,这种看似简单的额扩展具有深远的影响:突然间,一个可以通过神经网络进行很好的近似的函数空间得到了极大的扩展,使得全新的用例成为可能。为什么会出现这种情况呢?直觉认为是以下原因,虽然没有足够的证据:这种理论认为神经网络是一个通用函数近似器,可以对任意函数进行近似为任意精度,但只能在无限数量的隐藏单位限定条件下进行。而在任何实际情况下,情况并非如此:我们受限于可以使用的隐藏单位的数量。考虑以下示例:我们要对N个输入的结果进行近似,前馈神经网络只能通过模拟具有许多加法(以及非线性)的乘法来实现,因此需要大量神经网络的实际空间。但如果我们引入乘法交互的理念,过程就会自然而然的变得简单而有便捷。 


上述将注意力定义乘法交互(multiplicative interactions)的做法使得我们如果想要放松对注意力掩码值的约束且a∈R^k,可以考虑一种更为广泛的类模型。例如,动态过滤网络(DFN)使用的是一个过滤器生成网络,它是基于输入来计算过滤器(或任意大小的权重),并将其应用于特征,这实际上是一种乘法交互。与软注意力机制的唯一区别就是,注意力权重值没有被限制在0和1之间。想要在这个方向上进行进一步研究,那么去了解哪些交互作用是相加的,哪些是相乘的,探讨加法和乘法神经元之间的可微分转换的概念这都将是非常有趣的。


视觉注意力


注意力可以应用于任何类型的输入而不管其形状如何。在矩阵值输入(如图片)的情况下,我们可以谈论视觉注意力。不管是I∈R^H×W图像还是g∈R^ h×w注意力的一角都可以说是将注意力机制运用于图像的结果。


硬注意力(Hard Attention)


硬注意力在图像中的应用已经被人们熟知多年:图像裁剪(image cropping)。从概念上来看是非常简单的,因为它只需要索引。硬注意力可以用Python(或Tensorflow)实现为:


g = I[y:y+h, x:x+w]


软注意力


软注意力,在其最简单的变体中,对于图像与和向量值来说没有什么不同,并在等式1中得到了完全实现。这种类型的注意力的最早的用途之一是来自于一篇叫做《Show, Attend and Tell》的论文:

 


该模型学习趋向于该图像的特定部分,同时生成描述该部分的单词。


然而,这种类型的软注意力在计算上是非常浪费的。输入的黑色部分对结果没有任何影响,但仍然需要处理。同时它也是过度参数化的:实现注意力的sigmoid 激活函数是彼此相互独立的。它可以一次选择多个目标,但实际操作中,我们经常希望具有选择性,并且只能关注场景中的一个单一元素。由DRAW空间变换网络(Spatial Transformer Networks)引入的以下两种机制很好地别解决了这个问题。它们也可以调整输入的大小,从而进一步提高性能。


高斯注意力(Gaussian Attention)


高斯注意力通过利用参数化的一维高斯滤波器来创建图像大小的注意力图。使 a y ∈R^h和a x ∈R^w是注意向量,它们分别指定在yy和xx轴中应该出现哪一部分图像。注意力掩码可以创建为:


 


在上图中,顶行显示ax,右边的列显示ay,中间的矩形显示结果a。这里,为了可视化的目的,向量只包含0和1。实际上,它们可以被实现为一维高斯的向量。通常,高斯数等于空间维度,每个向量由三个参数参数化:第一个高斯 μ的中心、连续高斯d的中心距离和高斯标准偏差 σ。通过这个参数,注意力和 glimpse在注意力参数方面是可以区分的,因此很容易学习。


上述形的注意力仍然是浪费的,因为它只选择一部分图像,同时遮挡所有剩余的部分。而不是直接使用向量,我们可以将它们分别放入矩阵 A y ∈R^h×H和 A x ∈R^w×W。现在,每个矩阵每行有一个高斯,参数 d 指定连续行中高斯中心之间的距离(以列为单位)。Glimpse现在实施为:

  


这里是左侧输入图像的示例,注意力glimpse在右侧; glimpse将显示主图像中标记的框为绿色:

 


下面的代码可以为Tensorflow中的一小批样本创建上述矩阵值的掩码。如果要创建Ay,你可以将其称为Ay = gaussian_mask(u, s, d, h, H),其中u,s,d为该顺序的μ,σ 和 d,以像素为单位指定。

 

def gaussian_mask(u, s, d, R, C):

  """

  :param u: tf.Tensor, centre of the first Gaussian.

  :param s: tf.Tensor, standard deviation of Gaussians.

  :param d: tf.Tensor, shift between Gaussian centres.

  :param R: int, number of rows in the mask, there is one Gaussian per row.

  :param C: int, number of columns in the mask.

  """

  # indices to create centres

  R = tf.to_float(tf.reshape(tf.range(R), (1, 1, R)))

  C = tf.to_float(tf.reshape(tf.range(C), (1, C, 1)))

  centres = u[np.newaxis, :, np.newaxis] + R * d

  column_centres = C - centres

  mask = tf.exp(-.5 * tf.square(column_centres / s))

  # we add eps for numerical stability

  normalised_mask /= tf.reduce_sum(mask, 1, keep_dims=True) + 1e-8

  return normalised_mask

 

我们还可以编写一个函数,直接从图像中提取glimpse:

 

def gaussian_glimpse(img_tensor, transform_params, crop_size):

  """

  :param img_tensor: tf.Tensor of size (batch_size, Height, Width, channels)

  :param transform_params: tf.Tensor of size (batch_size, 6), where params are  (mean_y, std_y, d_y, mean_x, std_x, d_x) specified in pixels.

  :param crop_size): tuple of 2 ints, size of the resulting crop

  """

  # parse arguments

  h, w = crop_size

  H, W = img_tensor.shape.as_list()[1:3]

  uy, sy, dy, ux, sx, dx = tf.split(transform_params, 6, -1)

  # create Gaussian masks, one for each axis

  Ay = mask(uy, sy, dy, h, H)

  Ax = mask(ux, sx, dx, w, W)

  # extract glimpse

  glimpse = tf.matmul(tf.matmul(Ay, img_tensor, adjoint_a=True), Ax)

  return glimpse

 

空间变换(Spatial Transformer)

 

空间变换(STN)允许进行更多的普通变换,与图像裁剪只有细微区别,但是图像裁剪是可能的用例之一。它由两个要素组成:网格生成器和采样器。网格生成器指定网格的点被采样,而采样器,只采样点。

 

def spatial_transformer(img_tensor, transform_params, crop_size):

  """

  :param img_tensor: tf.Tensor of size (batch_size, Height, Width, channels)

  :param transform_params: tf.Tensor of size (batch_size, 4), where params are  (scale_y, shift_y, scale_x, shift_x)

  :param crop_size): tuple of 2 ints, size of the resulting crop

  """

  constraints = snt.AffineWarpConstraints.no_shear_2d()

  img_size = img_tensor.shape.as_list()[1:]

  warper = snt.AffineGridWarper(img_size, crop_size, constraints)

  grid_coords = warper(transform_params)

  glimpse = snt.resampler(img_tensor, grid_coords)

  return glimpse

 

高斯注意力(Gaussian Attention)与空间变换(Spatial Transformer)

 

高斯注意力和空间变换都可以实现非常相似的行为。我们如何选择使用哪一个?这里有几个细微差别:

 

•高斯注意力是一个超参数的裁剪机制:它需要六个参数,但只有四个自由度(y、x、height 、width)。空间变换(STN)只需要四个参数。

 

•我还没有运行任何测试,但是STN应该更快。它依赖于采样点的线性插值,而高斯注意李必须执行两个巨大的矩阵乘法。STN可以快一个数量级(以输入图像的像素为单位)。

 

•高斯注意力应该(没有测试运行)更容易训练。这是因为所发生的glimpse中的每个像素可以是源图像相对大的像素块的凸组合,这样可以更容易地找到任何错误的原因。另一方面,STN依赖于线性插值,这意味着每个采样点的梯度对于两个最近的像素而言都是非零的。

 

结论

 

注意力机制扩展了神经网络的能力:它们能接近更复杂的函数,或者更直观地说,它们可以专注于输入的特定部分。它们使自然语言基准测试的性能得到改进,以及赋予图像字幕、记忆网络和神经程序的全新能力。

 

我认为注意力最重要的案例尚未发现。例如,我们知道视频中的对象是一致的和连贯的,它们不会消失在框架中。注意力机制可以用来表达这种一致性,后续将如何发展,我们会持续关注。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/498433.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

redis配置mysql缓存_Redis做mysql的缓存服务器

一redis简介:redis 是一个高性能的 key-value 数据库。 redis 的出现,很大程度补偿了memcached 这类 keyvalue 存储的不足,在部分场合可以对关系数据库起到很好的补充作用。它提供了 Python,Ruby,Erlang,PHP 客户端,使用很方便。Redis 的所有数据都是保存在内存中,然…

2018 年将打响 AI 战争,7 条实战经验帮你战胜恐惧

来源:36氪 概要:不管是对科技巨头还是对创业公司,人工智能可以说是移动互联网时代以来最大的一个机遇。但是,人工智能同时也是让大多数人感到非常困惑的一项新技术,对它的发展现状和未来都非常迷惑。 不管是对科技巨头…

debconf-set-selections mysql_docker 静默安装mysql

1.功能作用在debconf database中插入默认值2.位置/usr/bin/debconf-set-selections3.格式用法debconf-set-selections [-vcu] [file]4.主要参数123-v,--verbose显示运行过程信息-c,--checkonly只检查输入文件的格式-u,--unseen在预置参数时,不设置‘seen‘标识5.应用…

人工智能对医疗行业影响的专题研究:基本结论

来源:本翼资本 概要:从未来5-7年的中期来看,我们认为计算智能和部分感知智能将迎来机会,计算智能的基因检测和药物发现、感知智能中的医疗智能语音、医疗智能视觉、可穿戴医疗设备等将迎来爆发。 从未来5-7年的中期来看&#x…

谷歌的量子计算机如何改变世界

来源:网易科技 概要:“可正常运作的话,量子计算机将会改变整个世界,改变事物的运作方式。”硅谷知名风投Andreessen Horowitz合伙人、物理学家维贾伊潘德(Vijay Pande)说道。 10月17日消息,华尔…

layer加载的页面偶尔出现空白_Layer-Cake 模式的设计

人们通常不会阅读网页,应用程序甚至文章或文本段落中的每个单词。相反,他们经常进行浏览 -因为他们在许多网站上的经验告诉他们,浏览可以用更少的时间和精力来提供几乎相同的价值(即信息量)。页面的可视化布局结构方式在人们浏览内容方面起着…

未来30年的科技发展趋势

来源:DeepTech深科技、全球创新论坛 概要:20项最值得关注的科技发展趋势,带你通向未来。 美国公布了一份长达35页的《2016-2045年新兴科技趋势报告》。该报告是在美国过去五年内由政府机构、咨询机构、智囊团、科研机构等发表的32份科技趋势相…

mysql dns反向解析_Mysql DNS反向解析导致连接超时过程分析(skip-name-resolve)

Mysql DNS反向解析导致连接超时过程分析(skip-name-resolve)时间:2019-01-19 11:28作者:网友投稿MySQL数据库收到一个网络连接后,首先拿到对方的IP地址,然后对这个IP地址进行反向DNS解析从而得到这个IP地址对应的主机名。用主机名…

[机器人-3]:开源MIT Min cheetah机械狗设计(三):嵌入式硬件设计

目录 概述: 1、硬件组成 2、通信速率 3、通信协议 4、mbedOS 概述: 以1条腿进行设计,其它腿也一样: 腿部硬件组成 1、硬件组成 1)UP board计算机板卡(Linux OS): 腿部控制器…

AlphaGo Zero的伟大与局限——ResNet作者、旷视研究院院长孙剑深度评述

来源:Megvii旷视科技 概要:2017年10月19日,Deepmind 团队发布强化版的 AlphaGo Zero,该版本的 AlphaGo 实现了在 AI 发展中非常有意义的一步——“无师自通”,这也让去年败在未升级版本 AlphaGo Master 下的中国棋手柯…

mysql 窗口函数最新一条_MySQL 8.0 窗口函数(window functions)

窗口函数(window functions)是数据库的标准功能之一,主流的数据库比如Oracle,PostgreSQL都支持窗口函数功能,MySQL 直到 8.0 版本才开始支持窗口函数。窗口函数,简单来说就是对于一个查询SQL,将其结果集按指定的规则进…

《人类简史》作者:应对 AI 革命,要打造新的经济、社会和教育体系

来源:36氪 概要:正在进行的人工智能革命将改变几乎所有的工作,给社会和经济的发展带来机遇和挑战。一些人认为,人工智能将把人类赶出就业市场,创造一个新的“无用的阶层”;另一些人则认为,自动化…

php mysql 胚子_php mysql数据库连接浅识

1、连接数据库连接函数:a、mysql_connect() :函数打开非持久的 MySQL 连接b、mysql_pconnect() :函数打开持久的MySQL 连接mysql_connect()格式:mysql_connect(server,user,pwd,newlink,clientflag)注:脚本一结束&…

全球厂商已向自动驾驶投入800亿美元 依然群龙无首 | 厚势

来源: 腾讯科技 概要:近日发表的一份权威研究报告指出,全球厂商已经在自动驾驶领域投资 800 亿美元,但是迄今为止,仍然没有一家明显处于领先优势的厂商。 自动驾驶和电动车成为当下科技行业两大热点之一,几…

promise的状态值_什么是Promise,Promise的三种状态

什么是Promise对象:Js中进行异步编程的新的解决方案,用于表示一个异步操作的最终完成 (或失败), 及其结果值.。语法上:promise是一个构造函数简单来说,promise对象用来封装一个异步操作并可以获取其结果语法:new Promi…

埃森哲报告:2017年数字化浪潮下的医疗行业五大趋势

来源:AI掘金志 概要:日前,埃森哲发布了《2017年数字化健康技术展望》报告,分析了数字化浪潮下的医疗护理行业的实际落地情况和发展前景,主要围绕着AI、生态系统建设、新型医疗人才挖掘、新的监督法规等五个方面进行解…

python修改xpath节点_Xpath python在特定文本后查找节点

这里是HTML代码:Specific text 1link1 inside specific text 1link2 inside specific text 1link3 inside specific text 1Specific text 2link1 inside specific text 2link2 inside specific text 2link3 inside specific text 2link4 inside specific text 2Spec…

人类如何从不同角度识别物体?你需要对「小样本学习」有所了解

来源:转载自公众号「雷克世界」微信号:ROBO_AI 编译:嗯~阿童木呀、多啦A亮 概要:在视觉层次结构的较低层次,不变性使你可以识别矩形或线条,即使它是倾斜、旋转或缩放的;而在更高的层次上&#x…

python链表和树实验报告_关于Python实现树结构和链表结构的一点想法

关于Python实现树结构和链表结构的一点想法Python由于内置的数据结构具有很高的灵活性,所以可以用很多种方式来构建树、图、链表等结构1. 树的Python实现python自然可以使用class来创建Node结点类和Trie类,然后通过left和right属性保存Node结点来实现树P…

摩尔定律已死?GPU会取代CPU的位置吗?

来源:全球人工智能 概要:CPU和GPU之所以大不相同,是由于其设计目标的不同,它们分别针对了两种不同的应用场景。 京举办的NVIDIA GTC China会议中,无论是AI智能运算,还是服务器数据中心、智能城市&#xff…