持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第22天,点击查看活动详情
图的基础
图的基本定义
图由顶点和边组成。顶点表示研究对象,便表示两个对象之间的关系。图可以表示为顶点和边的集合,记为G=(V,E),V为顶点的集合,E为边的集合。
图的类型
有向图:边是有方向的,有向边e_ij=<v_i,v_j>,其中v_i为起点,v_j为终点。
无向图:边的方向可以认为是对称的。
加权图:每条边都有一个实数与之对应,该实数称为权值。
非加权图:与加权图相反即为非加权图,可以认为每条边上的权重是一样的。
非连通图:图中存在孤立点的图。
连通图:图中不存在孤立点的图。
二部图:将图中的顶点拆分为两个子集A、B,如果图的任意一条边的两个端点分别在A集合和B集合中,则称该图为二部图。
邻居和度
子图和路径
神经网络基础
这部分参照
卷积神经网络
卷积与池化
卷积定义
卷积神经网络中的卷积操作可以看做是输入和卷积核的内积运算。输出和卷积核通常都是矩阵。
以图片为例(假设通道数为1),卷积神经网络中的神经单元就是单个的像素点元素,比如10001000那就是,那输入就是10001000个神经元。
意义:提取特征,低层级特征 --> 中层级特征 --> 高层级特征,便于机器识别;简化问题,减少特征数量。
对于一张10001000像素的图片,大概需要10001000*3个特征确定一张图片。
对于图像而言,在大部分场景下,降维并不会影响结果。比如1000像素的图片缩小成200像素,并不影响肉眼认出来图片中是一只猫还是一只狗,机器也是如此。
单通道卷积
卷积核:可以认为是进行卷积操作的矩阵,卷积核是通过自动学习得到的,卷积核大小一般为奇数,卷积核的个数为输出结果的通道数。
①当卷积核为偶数时,p不为整数,假设是Same模式,若想使得卷积之后的维度和卷积之前的维度相同,则需要对图像进行不对称填充,较复杂。
②当kernel为奇数维时,有中心像素点,便于定位卷积核。
通道:对于图片而言,图像的色彩R、G、B就可以认为是通道,通道数为3
步长(stride):有时不需要对每个位置进行卷积,可以隔几个位置计算一次,这个间隔就是步长。也可以认为是进行卷积计算时窗口移动的距离。
填充(padding):有时进行卷积时需要对输入矩阵的边缘外进行补0操作,padding=1表示输入矩阵外补一圈0.
单通道卷积示例,padding=0,stride=1,卷积核个数为1,计算过程如下
上述padding=0,stride=1的卷积计算称为标准卷积,但这种卷积存在一些问题:
1、多次进行卷积计算,输出尺寸越来越小。
2、边缘的像素点对输出影响较小,因为参与次数少;中间像素点多次参与计算,影响较大,这就会导致边缘信息缺失。
这两个问题可以通过补0和控制步长来解决。
多个卷积核的单通道卷积,将输入矩阵分别与多个卷积核进行卷积,卷积的输出称为特征图,卷积核个数为特征图的通道数。对于输入矩阵的维数H* W,卷积核维数kkC',则输出结果维数为H‘*W'*C'。
卷积的三种模式
Full模式:第一个窗口只包含1个输入的元素,即从卷积核(fileter)和输入刚相交开始做卷积。没有元素的部分做补0操作。
Valid模式:卷积核和输入完全相交开始做卷积,这种模式不需要补0。
Same模式:当卷积核的中心C和输入开始相交时做卷积。没有元素的部分做补0操作。
多通道卷积
若输入含有多个通道,对于某个卷积核,分别对每个通道计算得到特征图(feature map),然后将多个特征图的对应位置相加得到最终的特征图,如下:
这里卷积核可以是单通道(输入的每个通道与这一个卷积核计算)也可以是多通道(卷积核通道数与输出的通道数相同,输入的每个通道分别与卷积核的通道计算),但最终特征图的通道数不受卷积核通道数影响。
如果存在M个卷积核,则上述最终得到的特征图的通道数为M。
池化
池化的主要目的是降维,降低计算量,常用的池化操作为:平均池化和最大值池化。
池化操作就是使用一个固定大小的滑窗在输入上移动,每次将滑窗内的元素聚合为一个值输出。聚合方式不同,对应平均池化和最大值池化。
池化同样也有步长的概念,池化不改变输入的通道数。
卷积神经网络
通过一系列的卷积或者池化,只是为了得到一个特征向量或者其他表示,最终还是需要利用这个特征向量进行学习,得到最终的结果。比如图片分类,输入一张图片,首先需要通过对图片学习得到图片的特征向量(可能利用了一系列的卷积和池化操作),对这个特征向量再进行处理得到最终的分类,0或者1或者其他等。
卷积神经网络结构
以AlexNet为例,学习卷积神经网络结构
卷积神经网络的特点
1、局部连接
图像具有局部相关性,每次卷积计算只在与卷积核大小对应的区域进行。
感知野指的是特征图上一个输出与多大区域的输入有关。
2、权值共享
对于图像,不同的区域使用相同的卷积核参数,减少参数量,另一方面也带来了平移不变性。平移不变性是指不管输入如何平移,总能够得到相同的输出。
3、层次化表达
卷积网络通过卷积层堆叠得到,每一次对前一层进行变换,提取的特征从低层次到高层次,逐渐变得抽象。高层次的卷积得到的特征更加抽象,感知野更大,据有更加全局性的特征,更利于计算机进行识别。
特殊的卷积形式
1*1卷积
卷积核大小为1*1,功能如下:
-
用于信息聚合,增加非线性,1*1卷积可以看作是对所有通道信息进行线性加权,即信息聚合,同时卷积之后可以使用非线性激活,增强模型的表达能力。
-
用于通道数的变换,可以增加或减少特征图的通道数。
转置卷积
常用于语义分割任务。
转置卷积可以完成长宽维度的增加,步长和填充设置与普通的卷积操作有所区别。卷积核大小为k,填充padding、步长stride,计算时在输入四周填充k-1-p个0,对于步长s,则在卷积元素之间插入s-1个0.
空洞卷积
空洞卷积就是通过在核元素之间插入空格来使核「膨胀」。新增的参数 l(扩张率)表示我们希望将核加宽的程度。具体实现可能各不相同,但通常是在核元素之间插入 l-1 个空格。下面展示了 l = 1, 2, 4 时的核大小。可以不添加参数量而快速扩大感知野。
利用扩张之后的卷积核进行卷积计算。
分组卷积
类似于二分法的思想,沿着深度方向划分,将通道划分为多组,每组计算之后再将结果拼接起来,可以减少参数量。
残差网络(Residual Network)ResNet
网络的深度对模型的性能很重要,网络层数增加,模型可以进行更加复杂的特征模式提取。但并非模型越深越好。网络加深,训练集的结果反而会下降,这个问题称为模型退化问题,优化困难导致。
残差网络从网络结构上解决上述问题,它在输入和输出之间添加了一条直接的通路,这条通路称为跳跃连接(skip connection)
表示学习
表示学习
特征工程:传统的机器学习,大部份工作在于数据的处理和转换上,通过将人的先验知识转化为可以被机器学习算法识别的特征,弥补机器学习算法的缺陷。
如果存在一种可以从数据中得到有判别性特征的方法,减少机器学习算法对特征工程的依赖,这就是表示学习的价值。
表示学习的任务就是学习一个映射:f:X -> R_d,即将输入映射到一个稠密的蒂维向量空间中。
离散表示和分布式表示
离散表示:独热向量编码(one-hot),例如x=[1,0,1,···,0]T
-
丢失语义信息
-
维度高,稀疏
相同特征不同特征值只能取1个,不如性别:“男 1”和”女 0”,那么性别这个特征就是10和01
分布式表示:低维度稠密向量,例如颜色的表示c=[255,182,193]
-
低维度,稠密
-
还能保留一些语义信息,比如颜色的表示可以通过数值判断哪些颜色比较接近
端到端学习
首先对原始输入完成自动特征提取,然后将提取的特征送入到分类器中进行分类。原始数据通过神经网络(可以看作是一个黑盒)得到最终的输出。这就是端到端的学习。
基于重构损失的方法——自编码器
自编码器
基本思路:将输入映射到某个特征空间,再从这个特征空间映射回输入空间进行重构。
最简单的自编码器由3层组成:1个输入层、1个隐藏层、1个输出层。输入串通过编码到隐藏层,隐藏层解码到输出层。
x通过f编码得到y,y通过解码还原得到x',不断训练减小x和x‘之间的误差,直到满足一定的阈值。然后再通过训练好的编码器f,就可以得到代表x的特征y,这就是编码器的主要工作。
通常希望训练编码器得到一些有用特征,常用方法是限定y的维度比x的维度小,符合这种条件的编码器称为欠完备自编码器。
正则自编码器
如果允许编码器的维度大于或等于输入的维度,即d>=n,那么这种编码器称为过完备自编码器。如果不对过完备自编码器进行限制,那么有可能不会学习到数据的任何有用信息。这是由于当赋予编码器和解码器过于强大的能力时,自编码器会倾向于直接数将输入拷贝到输出,不会从数据中提取到有价值的特征。因此,通常对模型添加一些正则化约束。
1、去噪自编码器
这个就是在原始输入的基础上加入了一些噪声作为编码器的输入,解码器需要重构出不加噪声的原始输入x,通过这个操作迫使编码器去从数据中提取特征,而非直接拷贝。
通常具体的做法就是将输入x的一部分置0,这就相当于得到了一个加入噪声的输入。
2、稀疏自动编码器
除了加入噪声,还可以通过对损失函数添加正则项的方式使得模型学习到有用的特征。
神经元活跃度。
变分自编码器
VAE和AE的不同点就在于,AE中间输出的是隐变量的具体取值,而VAE中间要输出的是隐变量的具体分布情况,这样一来,我们就可以从这个分布中另外取样,送入到decoder,就可以生成类似输入样本x的其他样本x'了,并且这两个会十分近似。
AE相当于是学习到一个具体的隐向量,学习的参数就是这个隐向量,然后送到解码器中,将得到的输出x‘与原始输出比较;
VAE是学习到隐向量中每个维度的概率分布,学习的参数是构成概率分布的参数,比如μ,σ等,在这个概率分布中取值构成一个隐向量,再把这个隐向量送到解码器中,将得到的输出x’与原始输出比较。
详细介绍可以参考——差分自动编码器介绍
基于对比损失的方法——Word2vec
将词汇表中的词根据上下文关系,映射成一个可以唯一表示这个词的词向量,且这个词向量蕴含了词之间的相似性,便于进行下游的任务学习。具体生成方法详见参考。
Skip-Gram模型参考,Skip-Gram算法的输入和输出都是同样大小的one-hot向量,需要得到的是中间的权重矩阵W
图信号处理和图卷积神经网络
图信号与图的拉普拉斯矩阵
给定图G=(V,E),图信号是一种描述V->R的映射,表示成向量的形式:x=[x1,x2,···,xn]T,其中xi表示的是节点vi上的信号强度。
图信号是定义在节点上的信号,节点之间有自己固定的关联结构。研究图信号,不仅需要考虑信号强度,还许哟啊考虑图的拓扑性质。
拉普拉斯矩阵(Laplacian Matrix)是用来研究图的结构性质的核心对象,定义如下:L=D-A,D是一个对角矩阵,D_ii表示v_i节点的度。拉普拉斯矩阵的元素级别定义如下:
拉普拉斯矩阵的正则化形式(symmetric normalized laplacian),元素级别定义如下:
拉普拉斯矩阵的定义来源于拉普拉斯算子(一个函数空间到另一个函数空间的映射),拉普拉斯算子被用来描述中心节点与邻居节点之间的信号差异。
示例:
拉普拉斯矩阵是一个反映图信号局部平滑度的算子,它让我们可以定义一个非常重要的二次型:
TV(x)为图信号的总变差(Total Variation):
总变差是一个标量,它将各条边上信号的差值进行加和,刻画了图信号整体的平滑度。
拉普拉斯矩阵的性质:
1、L的行和为0,即L*I=0,这里I为元素值全为1的n维列向量
2、L有一个特征值为0
3、L有n个非负特征值,n为图的顶点个数
4、L是半正定型矩阵,X_TLX>=0
5、设G为一个具有非负连接权重的无向图,由图G导出的拉普拉斯矩阵的零特征值的重数等于G的连通子图的个数
傅里叶变换
图信号傅里叶变换:将图信号由空域(spatial domain)视角转化到频域(frequency domain)视角,便于图信号处理理论的建立。
图G的拉普拉斯矩阵L是一个实对称矩阵,实对称矩阵都可以被正交对角化,于是有:
其中V是一个NN的正交矩阵,VV_T=I(单位矩阵),V=[v1,v2,v3,···,vN]表示L的N个特征向量,λ_k表示第k个特征向量对应的特征值
对于图G上的信号x,图傅里叶变换(Graph Fourier Transform,GFT)为:
特征向量v_k称为傅里叶基,等式左边 x_k 为信号x在第k个傅里叶基上的傅里叶系数,所有的傅里叶系数合在一起称为频谱。傅里叶系数本质上是图信号在傅里叶基上的投影,衡量了图信号与傅里叶基之间的相似度。
用矩阵形式计算所有的傅里叶系数:
逆傅里叶变换(Inverse Graph Fourier Transform,IGFT)定义如下:
从线性代数的角度来看,V中的特征向量组成了N维特征空间中的一组完备基向量,图G上的任意一个图信号都可以被表征成这些基向量的线性加权,权重就是图信号在对应傅里叶基上的傅里叶系数。
图傅里叶变换和图信号频率的关系
对总变差进行改写:
可以看出,图信号的总变差与图的特征值之间有着非常直接的线性对应关系,总变差是图的所有特征值的一个线性组合,权重是图信号相对应的傅里叶系数的平方。
特征值可以等价为频率,特征值越低,频率越低,节点信号越趋于一致;而傅里叶系数可以等价成对应频率分量上的幅值。频域视角是一个全局视角,反映了图信号大小和拓扑结构,相当于图的一种身份ID。
傅里叶系数就可以等价成图信号在对应频率分量上的幅值,反映了图信号在该频率分量上的强度。图信号在低频分量上的强度越大,该信号的平滑程度就越高;相反,图信号在高频分量上的强度越大,该信号平滑程度越低。
图信号的能量
上述的等量代换关系说明能量可以同时从空域和频域的角度进行等价定义。并且可知单位向量的图信号能量为1。
图滤波器
定义
在图信号处理中,图滤波器定义为对给定图信号的频谱中各个频率分量的强度进行增强或者衰减的操作。假设图滤波器为H(N*N维),输出图信号为 y,滤波操作定义:
化简可得H:
其中h(λ_i)组成的对角矩阵为滤波器H的频率响应矩阵。
图滤波器的性质:
-
线性:H(x+y)=H(x)+H(y)
-
滤波操作是顺序无关的:H1(H2(x))=H2(H1(x))
-
如果h(λ)不等于0,则该滤波操作是可逆的。
理论上,我们希望实现任意性质的图滤波器,也就是实现任意类型函数曲线的频率响应函数。通过逼近理论,**我们可以用泰勒展开 – 多项式逼近函数去近似任意函数。**一般的多项式扩展形式的滤波器定义如下:
K为滤波器的阶数,可以自定义,S为图位移算子,一般可以直接使用L或A,使用L作为位移算子的多项式形式滤波器定义:
空域角度
假设:
则
通过上式将输出图信号变成了(K+1)组图信号的线性加权。
x_k-1到x_k的变换只需要所有节点的一阶邻居参与。总的来看,x_k的计算只需要所有节点的k阶邻居参与。因此具有两点重要性质:
-
局部性,每个节点的输出信号只需要考虑K阶子图
-
可通过矩阵向量乘法完成滤波操作
空域角度的核心是图位移算子。
频域角度
则滤波器操作为:
变换过程:
-
通过傅里叶变换,V_t x 将图信号变换到频域空间(x左乘V_t)
-
通过频率响应矩阵 Λ_h 对频率分量的强度进行调节y'
-
通过逆傅里叶变换(y'左乘V),将y’反解成图信号y
上述变换过程需要进行矩阵分解。
频域角度的核心是图滤波器。
图卷积神经网络
卷积操作是为了聚合邻域内的信息。
图卷积运算定义如下:
⨀表示哈达玛积,就是频域中的矩阵点乘运算,同型矩阵对应位置元素相乘。
进一步推理,则:
由此可知,两组图信号的卷积计算总能转化为对应形式的图滤波计算,从这个层面看图卷积等于图滤波。
对频率响应矩阵进行参数化
对频率响应矩阵进行参数化,可定义如下神经网络层:
其中σ(⋅)是激活函数,θ = [ θ1 , θ2 , ⋅ ⋅ ⋅, θN]是需要学习的参数,N为顶点个数,Θ是对应的需要学习的图滤波器,X是输入的图信号矩阵,X’是输出的图信号矩阵。空域视角和频域视角理解:
-
空域视角来看,该层引入了一个自适应的图位移算子。
-
频域视角来看,该层在X与X‘之间训练了一个自适应的图滤波器。
参数化会引入大量的参数,参数过多容易导致过拟合。
对多项式系数进行参数化
为了拟合任意频率响应函数,使用多项式逼近,具体如下:
其中,θ = [ θ1 , θ2 , ⋅ ⋅ ⋅, θk]是多项式的系数向量,K为多项式阶数,是该层需要学习的参数。
与上述方法不同,这里的K可以自由控制,K为多项式的次数,可根据需要进行调整。一般来说,K<<N,大大降低了过拟合的风险。
设计固定的图滤波器
对上式进行限制,设K=1,则:
这里的θ是一个标量,相当于对L_做尺度变换,这种变换在神经网络中会被归一化替代,所以参数θ是不必要引入,设置θ = 1,就得到了一个固定的图滤波器L_
对L_~进行正则化,得到L_~sym,取值范围为(-1,1],可以有效防止多层网络优化时出现的梯度消失或者梯度爆炸问题。
为了加强网络的拟合能力,添加一个参数化的权重矩阵W对输入的图信号进行仿射变换,于是得到:
这就是通常所说的图卷积层。
图卷积层
卷积层操作公式为:
图卷积层是频率响应函数拟合形式上的极大简化,最后的滤波操作退化为L_~sym
,图卷积操作变成了 L_~sym X ,如果将X由信号矩阵转化到特征矩阵上,该卷积操作等价于对邻居节点的特征向量进行聚合操作,于是图卷积操作在节点层面的计算公式如下:
这里相当于拉普拉斯矩阵确定了,参数化权重矩阵W是需要学习的对象。
空域图卷积和频域图卷积
频域图卷积模型:一般来说,对于只能从频域出发进行矩阵特征分解的图卷积层而执行图卷积计算的模型称为频域图卷积模型。
空域图卷积模型:对于图卷积计算不需要进行矩阵特征分解,能在空域视角执行矩阵乘法计算的模型,称为空域图卷积模型。
GCN的性质
GCN与CNN的联系
本质上,二者都是聚合邻域信息的运算,只是作用的对象不同。
GCN的思想:把一个节点在图中的高纬度邻接信息降维到一个低维的向量表示,然后根据这个低维向量进行任务学习,GCN可以认为是表示学习+任务学习。
数据角度
CNN相较于GCN在计算时,最大的区别就是没有显示地表达出邻接矩阵,但实际运算时依然需要考虑数据之间的关系。比如33大小的卷积核地作用下,可以将中心点附件33的栅格内的点等价为自己的邻居。
连接方式
二者都是局部连接,单个节点来看,GCN计算作用在其一阶子图上;CNN计算作用在中心像素点的3*3的栅格内,这种节点下一层的特征计算只依赖于自身邻域的方式,在网络连接上表现为一种局部连接结构。
不同点在于CNN的卷积核设计了9组权重参数,而GCN的卷积核权重参数退化为一组。
卷积核权重处处共享
与CNN类似,GCN中的卷积核作用于全图所有的节点,在每个节点处的计算中权重参数是共享的,这样做可以减少单层网络的参数量,有效避免过拟合现象的出现。
模型层面
二者的感受域随着卷积层的增加而变大。
节点自身特征的更新于卷积运算强耦合在一起,每一个新卷积层的加入,都可以使节点获得更加抽象化的特征表示。
GCN能够对图数据进行端对端学习
端到端指的是输入是原始数据,输出是最后的结果,自动地从数据中提取特征、进行学习;原来输入端不是直接的原始数据,而是在原始数据中提取的特征。
要实现对于图数据的端对端学习,学习系统必须能够适配图数据的内在模式。
属性信息与结构信息
属性信息:描述了图中对象的固有性质,比如用户节点的姓名、性别等信息。
结构信息:描述了对象之间的关联性质,比如用户之间的关联。
图数据学习方式
图数据中属性信息的处理相对简单,按照属性的类型进行编码设计,然后拼接成表示节点属性的特征向量就可以了,核心在与如何处理图的结构信息。
基于手工特征方式
上图就是基于手动特征的方法,将图中节点的结构信息以图的统计特征进行替代,常见的比如节点的度、节点的中心度、节点的PageRank等,然后将代表节点结构信息的特征向量和属性信息的特征向量拼接起来,送到下游进行人物的学习。
基于随机游走的方式
随机游走的基本思想是将途中节点所满足的关系与结构的性质映射到一个新的向量空间去,比如图上距离近的两个点,在新的向量空间上的距离也更近。将映射得到的代表结构信息的特征向量和属性信息的特征向量拼接起来,送到下游的任务学习。
GCN的问题——过平滑
在使用多层GCN后,节点的区分性变得越来越差,节点的表示向量趋于一致,这使得相应的学习任务变得更加困难。这个现象称为多层GCN的过平滑(Over-Smooth)问题。
空域视角
GCN的本质是在聚合邻局信息,节点的特征每更新一次,就多聚合了更高一阶邻居节点的信息。
如果把最高邻居节点的阶数称为该节点的聚合半径,随着GCN层数增加,节点聚合半径不断增长,一旦到达某个阈值,该节点可覆盖的节点几乎与全图节点一致。
如果GCN层数足够多,每个节点能覆盖到的节点都会收敛到全图节点,这与是哪个节点是无关的。这种情况会大大降低每个节点局部网络的多样性,不利于节点自身特征的学习。
解决方法:
1、提出了自适应性聚合半径的学习机制,增加跳跃连接来聚合模型的每层节点的输出。
这种方式聚合后的节点具有混合性的聚合半径,上层任务可以对其进行选择性的监督学习。避免聚合半径过大导致过平滑问题;同时避免聚合半径过小使得节点的结构信息不能被充分学习。
2、重新分配权重方式来增加A中节点自连接的权重。
循环神经网络(Recurrent Neural Network)
为什么需要RNN?
卷积神经网络 – CNN 和普通的算法大部分都是输入和输出的一一对应,也就是一个输入得到一个输出。前面的输入和后面的输入是没有关系的。
但在一些场景中这种传统的方法没有很好的效果,***比如当我们在理解一句话意思时,孤立的理解这句话的每个词是不够的,我们需要处理这些词连接起来的整个序列,同一个词放在不同的上下文中可能会有不同的含义(“***``*今天下雨,我骑车差点摔倒,好在我一把把把把住了!”,*``***不同位置的“把”有不同的含义);当我们处理视频的时候,我们也不能只单独的去分析每一帧,而要分析这些帧连接起来的整个序列。***
为了更好地处理这种序列数据(一串相互依赖的数据流),RNN被提出。
RNN基本原理
RNN基本结构,如下图所示:
图1 RNN的抽象结构图
X是一个向量,为输入层的值;U为输入层到隐藏层的权重矩阵;S是一个向量,为隐藏层的值;V为隐藏层到输出层的权重矩阵;O是一个向量,为输出层的值;W为t-1时刻隐藏层到t时刻隐藏层的权重矩阵,表明了上一个时刻隐藏层对当前时刻隐藏层的影响。
将RNN抽象结构图具体化,如下图所示
从上图可以看出,S_t的输出不仅和X_t有关,还与S_t-1有关。
将RNN的抽象结构图按照时间线展开:
RNN时间线展开图
同样可以从RNN的时间线展开图,看出S_t的输出不仅和X_t有关,还与S_t-1有关。
所有循环神经网络都具有神经网络的链式重复模块(这个模块就是首先对当前输入X_t和上一时刻隐藏层S_t进行一个怎样的处理,然后再进行后续的处理)。在标准的 RNN 中,这个重复模块具有非常简单的结构,例如只有单个 tanh 层。
RNN工作流程
工作流程
根据上述的RNN按时间线展开的示意图提出几个问题:
-
数据是同时进入的吗?
-
在最开始的时候,第一个单元是否也会接受前一个神经元的输入?如果是,第一个神经元没有前一个神经元,那么这个输入来源于哪里?
-
在同一层的隐藏单元中进行传播的权值矩阵W,以及输入到隐层的权值矩阵U,隐层到输出的权值矩阵V,为什么是相同的?
步骤:
1、当输入时间序列的第一个数据点后,就把这时隐层的值用一个记忆单元存起来,这个记忆单元并不是一个实体,而是一个用来存取东西的结构。
2、此时memory单元的作用就存取了X1的特征,当输入时间序列的第二个数据点时,网络结构不变,将memory中的信息也输入到隐层中,即第二个数据点的隐层接受了第二个数据点的数据和第一个数据点的特征进行输出,同时将此时隐层的信息返回到memory,再次存起来:
3、第三个数据点输入的时候,隐藏层接收了第三个数据点和memory单元中的信息,在输入memory单元时,采用一个权值矩阵W参数化记忆单元,然后将隐藏层的数据存储到memory中,供下一个时间步的输入:
将输入、隐藏层、输出抽象层多维的,及得到了开始提到的展开图,如下:
上述便是RNN的工作流程。
对于开始的几个问题:
1、数据是同时进入的吗?
显然不是,数据是按照顺序进入,在处理序列化的数据时,往往会在用滑动窗口的办法来调整不同的结构。
2、在最开始的时候,第一个单元是否也会接受前一个神经元的输入?如果是,但第一个神经元没有前一个神经元,那么这个输入来源于哪里?
在第一个数据点进入时,需要对memory单元设置初始值,这个初始值可以作为一个参数,也可以将其简单的设置为零,表示前面没有任何信息。
3、在同一层的隐藏单元中进行传播的权值矩阵W,以及输入到隐层的权值矩阵U,隐层到输出的权值矩阵V,为什么是相同的?
这是一个非常重要的问题,也是无法从图中推断的知识。大大减少参数数量是一个原因,但不是本质上的。先不考虑矩阵W,只考虑普通的神经网络,因为在序列上不同数据,都是采用相同的神经网络。CNN用参数共享的卷积核来提取相同的特征,在RNN中,使用参数共享的U,V来确保相同的输入产生的输出是一样,比如一段文本中,可能会出现大量的“小狗”,参数共享使得神经网络在输入“小狗”的时候,产生一样的隐层和输出。此时,我们讨论矩阵W,参数共享的矩阵W确保了对于相同的上文,产生相同的下文,对每个输入”相对公平”。
工作流程示例
用一个示例说明RNN的工作流程,假如需要判断用户的说话意图(问天气、问时间、设置闹钟…),用户说了一句“what time is it?”
1、首先进行分词:
2、然后按照顺序输入RNN,先将 “what”作为 RNN 的输入,得到输出[01]
3、然后按照顺序,将“time”输入到 RNN 网络,得到输出 [02] 。这个过程中,输入 “time” 的时候,前面 “what” 的输出也产生了影响(隐藏层中有一半是黑色的)。
4、依此类推,得到最后结果,如下:
5、当判断提问者的意图时,只需要输出 [05] 即可,如下:
存在的问题
RNN 是一种死板的逻辑,越晚的输入影响越大,越早的输入影响越小,且无法改变这个逻辑。
正如工作流程中所示,最终的结果如下,短期的记忆影响较大(如橙色区域),但是长期的记忆影响就很小(如黑色和绿色区域),这就是 RNN 存在的短期记忆问题。
长期依赖问题:长期依赖是指当前系统的状态,可能受很长时间之前系统状态的影响。和短期记忆问题(过多考虑短期因素影响,忽略了长期因素影响)是一样的。
针对RNN的短期记忆问题,提出优化算法:长短期记忆(Long Short-Term Memory)和网络门控循环单元(Gate Recurrent Unit,GRU)
长短期记忆(Long Short-Term Memory)网络 LSTM
基本概念
LSTM简单来说就是抓重点,提取出时间序列中的重要信息,而不是根据时间序列的距离单一地判断信息的重要性。保留长序列数据中的「重要信息」,忽略不重要的信息。
例如,下图中的信息:
LSTM和标准的RNN一样,也具有链式重复模块,但结构不同,LSTM的链式重复模块相对复杂。如下:
理解LSTM
从标准的RNN结构想LSTM逐渐转化的一个过程
标准的RNN结构,依次输入序列化数据,前一个时间步的隐层会将得到的数据存放到memory单元,然后再将memory单元乘以矩阵W进入到下一个时间步的隐层。
在上图中,下一个时间步的memory单元的存储的信息(C_t)就是:
现在取消权重参数W,并对这个memory单元做重参数化:
-
由一个门(gate)来参数化存储的步骤,当这个门打开时,我们才会将信息存放到memory单元,这个门叫做输入门(Input Gate)。
-
memory单元要不要将信息流入到下一个时间步,也由一个门控制,只有当这个门打开时,我们才会将信息输入到下一个时间步,这个门叫做输出门(Output Gate)。
memory单元并非是一个实体,完全可以嵌入到隐藏层本身,我们在这个操作之上又增添了两个门,用来控制输入和输出,就得到了一个基本结构:
输入和输出由sigmoid函数控制,sigmoid函数的输出在[0,1],可以很好的刻画门的开启或者关闭状态,值的大小就可以表示门被开启的程度。将输入门的结果用一个函数Fi来表示,输出门的结果用Fo来表示,为了保证输入门的开启和关闭状态对输入的影响,将其直接相乘再一起进入memory,memory的状态用C来表示:
这样存入到memory的值就受到了输入门的调节,当其完全关闭时,就代表着信息没有流入。但是,直接相乘必然会导致当输入门很小时,输出门即便很大,也不会产生多少输出,所以,我们使用一个函数g作用在memory的结果上,再进行输出门的控制处理:
看起来memory单元没有必要,但在RNN中,我们必然采用权重W来控制流通的信息,在LSTM中,我们并没有使用权重,而只是采用简单的相加:
随着序列越来越长,memory单元存储的数值越来越大。此时,有两种可能的后果:
-
如果我们的函数g也是一个带有挤压性质的激活函数,那么过大的值将会使得这个激活函数永远处于激活状态,失去了学习能力。
-
如果我们的函数g是ReLU类型的函数,值变得非常巨大时,会使得输出门失效,因为输出门的值再小,当它乘以一个庞大的值时,也会变的非常大。
无论是哪种情况,都在表明需要在memory单元中丢弃一些信息,LSTM的解决办法是在原本的单元中加入一个遗忘门(forget gate),如下所示,它的作用是重参数化记忆单元,将记忆单元输入的信息乘以遗忘门的结果Ff,存入到记忆单元中作为信息,所以当前的信息就变为了:
输出为:
LSTM核心流程
这一部分就是理解LSTM小节部分的进一步细化,公式是对应的。
LSTM 的关键是细胞状态(cell state),即下图中上方的水平线。LSTM 可以通过所谓“门”的精细结构向细胞状态添加或移除信息。门可以选择性地以让信息通过。
门结构
上图中1为遗忘门、2为输入门、3为输出门
遗忘门决定什么是与先前步骤相关的。输入门决定从当前步骤添加哪些信息是相关的。输出门决定下一个隐藏状态应该是什么。
核心流程
1、LSTM 的第一步要决定从细胞状态中舍弃哪些信息。这一决定由所谓“遗忘门层”的 S 形网络层做出。它接收 h_t−1 和 x_t,并且对细胞状态 C_t−1 中的每一个数来说输出值都介于 0 和 1 之间。1 表示“完全接受这个”,0 表示“完全忽略这个”。
2、确定需要在细胞状态中保存哪些新信息,分成两部分。第一部分,一个所谓“输入门层”的 S 形网络层确定哪些信息需要更新。第二部分,一个 tanh 形网络层创建一个新的备选值向量—— C~t,可以用来添加到细胞状态。在下一步中,将上面的两部分结合起来,产生对状态的更新。
3、现在更新旧的细胞状态 C_t−1 更新到 C_t。先前的步骤已经决定要做什么,我们只需要照做就好。我们对旧的状态乘以 f_t,用来遗忘不重要的事。然后我们加上 i_t∗C~t,这是新的候选值,根据我们对每个状态决定的更新值按比例进行缩放。
4、最后,我们需要确定输出值。输出依赖于我们的细胞状态,但会是一个“过滤的”版本。首先我们运行 S 形网络层,用来确定细胞状态中的哪些部分可以输出。然后,我们把细胞状态输入 tanhtanh(把数值调整到 −1−1 和 11 之间)再和 S 形网络层的输出值相乘,这样我们就可以输出想要输出的部分。
上述就是LSTM的一个核心流程。
整个LSTM的最精华的部分是遗忘门的设计,它不通过权重W就可以解决掉信息冗余的问题。由
变为了
门控循环单元(Gate Recurrent Unit,GRU)
RNN应用场景
一般涉及到序列数据的处理问题,都会使用到。
文本生成:类似上面的填空题,给出前后文,然后预测空格中的词是什么。
机器翻译:翻译工作也是典型的序列问题,词的顺序直接影响了翻译的结果。
语音识别:根据输入音频判断对应的文字是什么。
生成图像描述:类似看图说话,给一张图,能够描述出图片中的内容。这个往往是 RNN 和 CNN 的结合。
总结
基于 RNN 出现了 LSTM 和 GRU 等变种算法。这些变种算法主要有几个特点:
-
长期信息可以有效的保留
-
挑选重要信息保留,不重要的信息会选择“遗忘”