多头注意力
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
在实践中,当给定相同的查询、键和值的集合时, 我们希望模型可以基于相同的注意力机制学习到不同的行为, 然后将不同的行为作为知识组合起来, 捕获序列内各种范围的依赖关系 (例如,短距离依赖和长距离依赖关系)。 因此,允许注意力机制组合使用查询、键和值的不同 子空间表示(representation subspaces)可能是有益的。
为此,与其只使用单独一个注意力汇聚, 我们可以用独立学习得到的 组不同的线性投影(linear projections)来变换查询、键和值。 然后,这组变换后的查询、键和值将并行地送到注意力汇聚中。 最后,将这 个注意力汇聚的输出拼接在一起, 并且通过另一个可以学习的线性投影进行变换, 以产生最终输出。 这种设计被称为多头注意力(multihead attention)。 对于 个注意力汇聚输出,每一个注意力汇聚都被称作一个头(head)
notion image

模型

给定查询 、 键 和 值 , 每个注意力头 )的计算方法为:
其中,可学习的参数包括 , 以及代表注意力汇聚的函数可以是加性注意力和缩放点积注意力。 多头注意力的输出需要经过另一个线性转换, 它对应着 个头连结后的结果,因此其可学习参数是
基于这种设计,每个头都可能会关注输入的不同部分, 可以表示比简单加权平均值更复杂的函数。
 
自注意力和位置编码
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
 
 
 

Why self-attention

RNN有什么样的问题呢?它的问题就在于:RNN很不容易并行化 (hard to parallel)
CNN、RNN共享单元和滑动结构类似,区别在于RNN具有记忆功能,被遍历的单元具有因果联系作用(记忆信息传送),上一时刻隐层的状态参与到了这个时刻的计算过程中,所以当前单元必须等上一单元计算结束,有多少单元就需要计算多少次。而CNN同一层次单元没有因果关系都是等价的,这样就可以依据单元核直接复制出所需所有单元核(参数相同),然后采用矩阵并行运算,只需计算一次。
notion image
表面上CNN和RNN可以做到相同的输入和输出,但是CNN只能考虑非常有限的内容。CNN也不是没有办法考虑很长时间的dependency的,只需要堆叠filter,多堆叠几层,上层的filter就可以考虑比较多的资讯,只要叠很多层,就能够看很长时间的资讯。
但是必须要叠很多层filter,才可以看到长时的资讯,所以有了一个想法:self-attention,使用self-attention layer取代RNN所做的事情
Transformer
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
 
 
自注意力同时具有并行计算和最短的最大路径长度这两个优势,因此使用自注意力来设计深度架构是很有吸引力的。对比之前仍然依赖循环神经网络实现输入表示的自注意力模型 ,transformer模型完全基于注意力机制,没有任何卷积层或循环神经网络层 。尽管transformer最初是应用于在文本数据上的序列到序列学习,但现在已经推广到各种现代的深度学习中,例如语言、视觉、语音和强化学习领域。
 

模型

Transformer作为编码器-解码器架构的一个实例,其整体架构下图展示。正如所见到的,transformer是由编码器和解码器组成的。与基于Bahdanau注意力实现的序列到序列的学习相比,transformer的编码器和解码器是基于自注意力的模块叠加而成的,源(输入)序列和目标(输出)序列的嵌入(embedding)表示将加上位置编码(positional encoding),再分别输入到编码器和解码器中。
notion image
notion image
🐡 受限玻尔兹曼机 RBM
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的结构,它是一个个两层的神经网络,如下图所示:
notion image
上面一层神经元组成隐藏层(hidden layer), 用向量隐藏层神经元的值。下面一层的神经元组成可见层(visible layer),向量表示可见层神经元的值。隐藏层和可见层之间是全连接的,这点和DNN类似, 隐藏层神经元之间是独立的,可见层神经元之间也是独立的。连接权重可以用矩阵 表示。和DNN的区别是,RBM不区分前向和反向,可见层的状态可以作用于隐藏层,而隐藏层的状态也可以作用于可见层。隐藏层的偏倚系数是向量,而可见层的偏倚系数是向量
常用的RBM一般是二值的,即不管是隐藏层还是可见层,它们的神经元的取值只为0或者1,这里只讨论二值RBM。
总结RBM模型结构的结构:主要是权重矩阵, 偏倚系数向量,隐藏层神经元状态向量和可见层神经元状态向量

RBM概率分布

RBM是基于基于能量的概率分布模型。怎么理解呢?分两部分理解,第一部分是能量函数,第二部分是基于能量函数的概率分布函数。
对于给定的状态向量 ,则RBM当前的能量函数可以表示为:
初识java
type
status
date
slug
summary
tags
category
icon
password
Property
 
 
随着Java的发展,SUN给Java又分出了三个不同版本:
notion image
  • 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标识符,最好见名知意,可以使用驼峰标示
 

关键字

🐰 变量和常量
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
     
    数据类型有什么用?
    数据类型不同,程序在执行的过程中,给变量分配的空间大小也是不一样的。所以不同的数据类型为变量分配不同大小的空间。
     
    Java总共有两种数据类型,主要有基本类型和引用类型,引用类型包括数组、类、接口。
    基本数据类型是CPU可以直接进行运算的类型
    基本数据类型(四大类八小种)
    • 整型:byte 、short 、int 、long
    • 浮点型:float 、 double
    • 字符型:char
    • 布尔型:boolean
    notion image
    🐰 运算符
    type
    status
    date
    slug
    summary
    tags
    category
    icon
    password
    Property
     

    Java运算符

    假设整数变量A的值为10,变量B的值为20
     
    算术运算符数学运算的
    notion image
    整数的数值表示不但是精确的,而且整数运算永远是精确的,即使是除法也是精确的,因为两个整数相除只能得到结果的整数部分:
     
    注意++写在前面和后面计算结果是不同的,++n表示先加1再引用n,n++表示先引用n再加1
     
    整数的除法对于除数为0时运行时将报错,但编译不会报错
    🐰 字符串
    type
    status
    date
    slug
    summary
    tags
    category
    icon
    password
    Property
     
     
    字符串类型String是引用类型,用双引号"..."表示字符串,一个字符串可以存储0个到任意个字符:
    如果字符串本身恰好包含一个"字符怎么表示?例如,"abc"xyz",编译器就无法判断中间的引号究竟是字符串的一部分还是表示字符串结束,这个时候需要借助转义字符\
     
    常见的转义字符包括:
    notion image
     
     
    🐰 数组
    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获取数组大小:
     
    数组是引用类型,在使用索引访问数组元素时,如果索引超出范围,运行时将报错:
    🐰 命令行参数
    type
    status
    date
    slug
    summary
    tags
    category
    icon
    password
    Property
     
     
    Java程序的入口是main方法,而main方法可以接受一个命令行参数,它是一个String[]数组。
    这个命令行参数由JVM接收用户输入并传给main方法:
    可以利用接收到的命令行参数,根据不同的参数执行不同的代码。例如,实现一个-version参数,打印程序版本号:
    notion image