type
status
date
slug
summary
tags
category
icon
password
Property
在实践中,当给定相同的查询、键和值的集合时, 我们希望模型可以基于相同的注意力机制学习到不同的行为, 然后将不同的行为作为知识组合起来, 捕获序列内各种范围的依赖关系 (例如,短距离依赖和长距离依赖关系)。 因此,允许注意力机制组合使用查询、键和值的不同 子空间表示(representation subspaces)可能是有益的。
为此,与其只使用单独一个注意力汇聚, 我们可以用独立学习得到的 组不同的线性投影(linear projections)来变换查询、键和值。 然后,这组变换后的查询、键和值将并行地送到注意力汇聚中。 最后,将这 个注意力汇聚的输出拼接在一起, 并且通过另一个可以学习的线性投影进行变换, 以产生最终输出。 这种设计被称为多头注意力(multihead attention)。 对于 个注意力汇聚输出,每一个注意力汇聚都被称作一个头(head)。
模型
给定查询 、 键 和 值 , 每个注意力头 ( )的计算方法为:
其中,可学习的参数包括 、 和 , 以及代表注意力汇聚的函数。 可以是加性注意力和缩放点积注意力。 多头注意力的输出需要经过另一个线性转换, 它对应着 个头连结后的结果,因此其可学习参数是 :
基于这种设计,每个头都可能会关注输入的不同部分, 可以表示比简单加权平均值更复杂的函数。
type
status
date
slug
summary
tags
category
icon
password
Property
Why self-attention
RNN有什么样的问题呢?它的问题就在于:RNN很不容易并行化 (hard to parallel)
CNN、RNN共享单元和滑动结构类似,区别在于RNN具有记忆功能,被遍历的单元具有因果联系作用(记忆信息传送),上一时刻隐层的状态参与到了这个时刻的计算过程中,所以当前单元必须等上一单元计算结束,有多少单元就需要计算多少次。而CNN同一层次单元没有因果关系都是等价的,这样就可以依据单元核直接复制出所需所有单元核(参数相同),然后采用矩阵并行运算,只需计算一次。
表面上CNN和RNN可以做到相同的输入和输出,但是CNN只能考虑非常有限的内容。CNN也不是没有办法考虑很长时间的dependency的,只需要堆叠filter,多堆叠几层,上层的filter就可以考虑比较多的资讯,只要叠很多层,就能够看很长时间的资讯。
但是必须要叠很多层filter,才可以看到长时的资讯,所以有了一个想法:self-attention,使用self-attention layer取代RNN所做的事情
type
status
date
slug
summary
tags
category
icon
password
Property
自注意力同时具有并行计算和最短的最大路径长度这两个优势,因此使用自注意力来设计深度架构是很有吸引力的。对比之前仍然依赖循环神经网络实现输入表示的自注意力模型 ,transformer模型完全基于注意力机制,没有任何卷积层或循环神经网络层 。尽管transformer最初是应用于在文本数据上的序列到序列学习,但现在已经推广到各种现代的深度学习中,例如语言、视觉、语音和强化学习领域。
模型
Transformer作为编码器-解码器架构的一个实例,其整体架构下图展示。正如所见到的,transformer是由编码器和解码器组成的。与基于Bahdanau注意力实现的序列到序列的学习相比,transformer的编码器和解码器是基于自注意力的模块叠加而成的,源(输入)序列和目标(输出)序列的嵌入(embedding)表示将加上位置编码(positional encoding),再分别输入到编码器和解码器中。
🐡
type
status
date
slug
summary
tags
category
icon
password
Property
前面讲到了深度学习的两类神经网络模型的原理,第一类是前向的神经网络,即DNN和CNN。第二类是有反馈的神经网络,即RNN和LSTM。今天总结下深度学习里的第三类神经网络模型:玻尔兹曼机。主要关注于这类模型中的受限玻尔兹曼机(Restricted Boltzmann Machine,以下简称RBM), RBM模型及其推广在工业界比如推荐系统中得到了广泛的应用。
RBM模型结构
玻尔兹曼机是一大类的神经网络模型,但是在实际应用中使用最多的则是RBM。RBM本身模型很简单,只是一个两层的神经网络,因此严格意义上不能算深度学习的范畴。不过深度玻尔兹曼机(Deep Boltzmann Machine,以下简称DBM)可以看做是RBM的推广。理解了RBM再去研究DBM就不难了,因此本文主要关注于RBM。
回到RBM的结构,它是一个个两层的神经网络,如下图所示:
上面一层神经元组成隐藏层(hidden layer), 用向量隐藏层神经元的值。下面一层的神经元组成可见层(visible layer),用 向量表示可见层神经元的值。隐藏层和可见层之间是全连接的,这点和DNN类似, 隐藏层神经元之间是独立的,可见层神经元之间也是独立的。连接权重可以用矩阵 表示。和DNN的区别是,RBM不区分前向和反向,可见层的状态可以作用于隐藏层,而隐藏层的状态也可以作用于可见层。隐藏层的偏倚系数是向量,而可见层的偏倚系数是向量。
常用的RBM一般是二值的,即不管是隐藏层还是可见层,它们的神经元的取值只为0或者1,这里只讨论二值RBM。
总结RBM模型结构的结构:主要是权重矩阵, 偏倚系数向量和 ,隐藏层神经元状态向量和可见层神经元状态向量
RBM概率分布
RBM是基于基于能量的概率分布模型。怎么理解呢?分两部分理解,第一部分是能量函数,第二部分是基于能量函数的概率分布函数。
对于给定的状态向量 和 ,则RBM当前的能量函数可以表示为:
type
status
date
slug
summary
tags
category
icon
password
Property
随着Java的发展,SUN给Java又分出了三个不同版本:
- Java SE:Standard Edition
- Java EE:Enterprise Edition
- Java ME:Micro Edition
Java SE
是标准版,包含标准的JVM和标准库;Java EE
是企业版,它只是在Java SE
的基础上加上了大量的API和库,以便方便开发Web应用、数据库、消息服务等,Java EE
的应用使用的虚拟机和Java SE
完全相同;Java ME
就和Java SE
不同,它是一个针对嵌入式设备的“瘦身版”,Java SE
的标准库无法在Java ME
上使用,Java ME
的虚拟机也是“瘦身版”。JDK、JRE、JVM
🐰
type
status
date
slug
summary
tags
category
icon
password
Property
变量
变量是java中的一个最基本的单元,是内存中的一块区域,Java中的变量有四个基本属性:变量名,数据类型,存储单元和变量值
- 变量名:合法的标识符
- 变量的数据类型:可以是基本类型和引用类型(必须包含类型)
- 存储单元:存储单元大小是由数据类型决定的,如:int为4个字节32位
- 变量值:在存储单元中放的就是变量值(如果是基本类型放的就是具体值,如果是引用类型放的是内存地址,如果null,表示不指向任何对象)
变量的声明与赋值:
变量必须先声明再赋值,才能访问。变量赋值的时候有要求,字面值的数据类型必须和变量的数据类型一致。
注:成员变量如果不写初始值,系统给它指定了默认值,但局部变量不会;未初始化的局部变量是不可以使用的。最好在定义变量的时候赋一个初始值。
🐰
type
status
date
slug
summary
tags
category
icon
password
Property
定义一个数组类型的变量,使用数组类型“
类型[]
”,例如,int[]
。和单个基本类型变量不同,数组变量初始化必须使用new int[5]
表示创建一个可容纳5个int
元素的数组。Java的数组有几个特点:
- 数组所有元素初始化为默认值,整型都是
0
,浮点型是0.0
,布尔型是false
;
- 数组一旦创建后,大小就不可改变。
要访问数组中的某一个元素,需要使用索引,数组索引从
0
开始可以使用赋值语句修改数组中的某一个元素,例如
ns[1] = 79;
可以用
数组变量.length
获取数组大小:数组是引用类型,在使用索引访问数组元素时,如果索引超出范围,运行时将报错: