第五章:深度生成模型

目录

➢Part One.深度生成模型概述

➢Part Two.Hopfield神经网络

➢一、神经网络的分类

➢二、Hopfiled神经网络

➢1.Hopfield神经网络优点

➢2.Hopfield神经网络计算

➢3.基于Hebb学习的参数训练

➢Part Three.玻尔兹曼机和受限的波尔兹曼机

➢一、玻尔兹曼机

➢1.玻尔兹曼机概述

➢ 2.玻尔兹曼机中的模拟退火算法

➢ 3.玻尔兹曼机的训练过程

➢二、受限玻尔兹曼机

➢1.受限玻尔兹曼机概述

➢2.受限玻尔兹曼机中的对比散度算法

➢ Part Four.深度玻尔兹曼机和深度信念网络

➢ 一、深度波尔兹曼机

➢ 二、深度信念网络

➢ Part Five.自编码器及其变种

➢ 一、自编码器

➢ 1.自编码器的概述

➢ 2.自编码器的训练

➢ 二、降噪自编码器

➢ 1.降噪自编码器的概述

➢ 三、稀疏自编码器

➢ 1.稀疏自编码器的概述

➢ 2.稀疏自编码器的训练

➢ 四、栈式自编码器

➢ 1.栈式自编码器的概述

➢ 2.栈式自编码器的训练

➢ 3.栈式自编码器在训练中的应用

➢ Part Six.中英文术语对照


➢Part One.深度生成模型概述

深度生成模型从整体上来说,是以某种方式寻找某种数据的概率分布,深度生成模型可以基于有向图或者无向图的形式来生成深层次的概率分布

常见的深度生成模型的结构图如下:深度玻尔兹曼机和深度信念网络都是以受限的玻尔兹曼机为基本单元,区别就是深度信念网络的最高层的两层是无向图的连接,下面的两层是采用有向图的连接;深度自编码网络可以看做由深度信念网络来进一步构成,它可以被认为和栈式自编码器是一种东西,他们都是通过信念网络的结构和形式(自编码器和自解码器这样的两个信念网络的连接)连接

如果自编码器的输入是带有噪声的,那么自编码器会提取出这些输入的数据中比较稳定的特征(这部分生成的特征我们是不需要带有标签的),并通过解码器重构出没有噪声的原始的信号,这个就可以看做是去躁的自编码器网络

下面这个是我们最常见的GAN网络,GAN网络是过去的十年中最有趣的发明,GAN引入了博弈论的思想,由生成网络和判别网络组成,生成网络不断的生成符合某种概率的数据,判别网络进行判别,直到判别网络判别不出生成网络中的是真实的数据还是生成的数据的时候,整个GAN就达到一种稳定的状态, 生成网络是一个无监督的过程,不需要提供带有标签的训练数据,生成网络可以帮助我们生成很多特征

➢Part Two.Hopfield神经网络

一、神经网络的分类

多层神经网络: 模式识别

相互连接型网络:通过联想记忆去除数据中的噪声

例如左图前馈型的多层神经网络,可以用于模式识别和回归等任务;例如中间的图,每个神经元节点与其他的神经元节点之间都是相互连接的,这样看不出来连接的层次,中间的图还可以展开成右图的形式,节点A既是其他节点的输入,也是当前节点的输出,其他节点也是相同的,这就是一种相互连接的神经网络

➢二、Hopfiled神经网络

Hopfield神经网络是最典型的相互连接型网络

➢1.Hopfield神经网络优点

单元之间的连接权重对称(w_{ij}=w_{ji}),因为采用的是无向图的连接方式

每个单元没有到自身的连接( w_{ii}=0

Hopfiled神经网络在 t 时刻的状态间接的和他 t-1 时刻的状态是有关的,因为不同单元都有连接

单元的状态采用随机异步更新方式,每次只有一个单元改变/更新状态

n个二值单元做成的二值神经网络,每个单元的输出只能是01的两个值

Hopfiled的网络是把训练数据的信息存储到权重上,这个可以看做是联想记忆的形式,这个就跟人类大脑记忆信息的形式是一样的。例如我们看到香蕉就会想到黄色,看到苹果就会想到红色,这就是联想记忆的形式

联想记忆就是当输入模式为某种状态时,输出端要给出与之相应的输出模式。如果输入模式与输出模式一致,称为自联想记忆,否则称为异联想记忆

➢2.Hopfield神经网络计算

假设有n个单元组成的Hopfield神经网络,第i 个单元在t时刻的输入记作u_{i}(t),输出记作x_{i}(t),神经单元ij之间的连接权重为w_{ij},阈值为b_{i}(t),则t+1时刻i单元的输出x_{i}(t+1)可表示为:

如果输入u_{i}(t)> 0,则表示其他神经元加权之后是超过这个阈值b_{i}(t)的,则该神经元被激活,所以下一时刻的输出状态值为1;

如果输入u_{i}(t)< 0,则表示其他神经元加权之后是没超过这个阈值b_{i}(t)的,则该神经元没被激活,所以下一时刻的输出状态值为0;

如果输入u_{i}(t)=0,则表示其他神经元加权之后是等于这个阈值b_{i}(t)的,则该神经元状态不变,所以下一时刻的输出状态值x_{i}(t+1)=x_{i}(t)

注意我们阈值一般是用减号,而偏置才是加号

 在Hopfield神经网络中,每个时刻只有一个随机选择的单元会发生状态变化

对于一个由n个单元组成的网络,如果要完成全部单元的状态变化,至少需要n个时刻

单元的状态变化会一直进行下去,直到网络达到稳定状态。各单元的最终状态就是输出模式  

那么怎么才算是网络达到稳定的状态呢?

这个我们就可以看做是应用Hopfiled神经网络或者说是进行测试的时候,比如,我们有一个测试样本,我们想看一下Hopfiled神经网络把它识别成什么了或者记住他是什么了没有,那这个时候和其他的网络一样,我们都需要先确定连接权重,因为连接权重确定了以后这个网络才是一个有意义的网络

根据输入模式联想输出模式时,需要事先确定连接权重𝑤𝑖𝑗,而连接权重𝑤𝑖𝑗要对输入模式的训练样本进行训练后才能确定

和多层神经网络一样,一次训练并不能确定连接权重,而是要不断重复这个过程,直到满足终止判断条件,而这个指标就是Hopfield神经网络的能量函数 𝐸( 公式如下),当输入模式与输出模式一致时,能量函数 𝐸 的结果是

Hopfield神经网络的能量函数 𝐸 的特点

根据前面定义的状态变化规则( 即:Hopfield神经网络的计算 )改变网络状态时,上式中定义的能量函数 𝐸 总是非递增的,即随时间的不断增加而逐渐减小,直到网络达到稳定状态为止。为什么是非递增的呢?我们可以进行简单的推导。能量函数是所有神经元构成的能量函数,所以,我们可以把能量函数分解成两部分:单元 k 的能量函数和 k 以外的单元的能量函数

第一步:首先把最外层的i最为index,根据 i 把神经元分为神经元 k k 以外的神经元的能量函数。把能量函数中的第一项:- \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} w_{ij}x_{i}x_{j}分解成两项i=ki\neq k;第二项:\sum_{i=1}^{n} b_{i}x_{i}也分解成两项i=ki\neq k

第二步:下一步我们把index j 所处的神经元也是分成j=kj\neq k两部分

第三步:去掉括号

第四步:我们根据Hopfiled网络发现,神经元是与自身没有连接的,w_{kk}=0,即:w_{kk}x_{k}^{2}=0

这些神经元每一次都是随机有一个神经元的状态更新,其他的神经元的状态都是保持不变的,我们要更新的神经元是第k个神经元,那么这个时候能量的变化就是从t+1 时刻到t-1时刻,只有这个神经元 k 在发生变化,其他的是不变的。 

\sum_{j\neq k}^{n}w_{kj}x_{j}\sum_{i\neq k}^{n}w_{ik}x_{i}其实表达的是一个意思,\sum_{j\neq k}^{n}w_{kj}x_{j}表示其他所有神经元到 k 这个神经元上连接的一个关系,\sum_{i\neq k}^{n}w_{ik}x_{i}也表示其他所有神经元到 k 这个神经元上连接的一个关系,也就是说把\sum_{i\neq k}^{n}w_{ik}x_{i}中的i\neq k中的下标 i 换成 j 即可,再利用单元之间的连接权重对称性,知道\sum_{j\neq k}^{n}w_{kj}x_{j}= \sum_{i\neq k}^{n}w_{ik}x_{i}。所以当第 k 个神经元发生状态改变的时候,能量函数的变化就是-u_{k}乘以这个第 k 个神经元状态改变量。

下面我们对第 k 个神经元状态的变化量进行分类讨论:

当∆x_{k} > 0时,x_{k}从 t 到 t+1 由0变成1,前提是保证u_{k}(t)> 0 ,神经元被激活,此时\Delta E_{k}< 0,也就是能量在减小

当∆x_{k} < 0时,x_{k}t 到 t+1 由1变成0,前提是保证u_{k}(t)< 0 ,神经元被抑制,此时\Delta E_{k}< 0,也就是能量在减小

当∆x_{k} = 0时,x_{k}从 t 到 t+1状态不变

综上:是非递增的!

注意不同的教材上的区别

➢3.基于Hebb学习的参数训练

Hebb学习规则是Donald Hebb1949年提出的一种学习规则,用来描述神经元的行为是如何影响神经元之间的连接的,通俗的说,就是如果相连接的两个神经元同时被激活,显然我们可以认为这两个神经元之间的关系应该比较近,因此将这两个神经元之间连接的权值增加,而一个被激活一个被抑制,显然两者间的权值应该减小。我们把权重写成这样的形式:w_{ij}=x_{i}x_{j}。此时网络如果要记忆P个模式,那么w_{ij}=\frac{1}{p}\sum_{s=1}^{p}x_{i}^{s}x_{j}^{s}s是训练样本的index,s_{1}表示样本1,s_{p}表示样本pi 和 j 相当于模式,例如我们的输入样本有好几个维度,比如说输入是5\times 5的图像块x_{1}^{5}x_{2}^{5},这样就相当于有25个神经元,这样的话,我们的权重w_{ij}就会记住要训练的模式,由于每次只更新一个神经元的状态,所以我们需要好多步才能使得这个网络达到稳定的状态,所以这里的权重w_{ij}也是在不断的变化,以此达到稳定。

达到稳定就是训练好了,训练好了以后,权重w_{ij}就会把的训练样本的模式记住,这个时候我们就可以进行测试。使用训练样本(a)进行训练,这个时候网络记住了我们训练样本(a)的模式,当我们使用测试样本(b)进行测试时,我们发现,网络能够正确的输出,虽然测试样本中的4和训练样本中的4差异较大,但是网络的拟合能力也是很不错的。这个过程实际上是对测试样本具有一定程度的识别和去躁。

 当需要记忆的模式之间的较为相似,或者需要记忆的模式太多时,Hopfield神经网络就不能正确地辨别模式。这种相互干扰、不能准确记忆的情况称为串扰(crosstalk)  

Hopfield神经网络能够记忆的模式数量有限,大约是网络单元数的15%左右,为了防止串扰,可以采用先把模式正交化再进行记忆等方法。正交化可以避免模式之间的相似性,例如神经网络有n个单元的话,他应该可以包含2^{n}种模式,也就是记住2^{n}种模式,但是这么多的模式他记不住,只能够记住15%。但是正交化方法并不能完全解决问题,而接下来讲到的玻尔兹曼机可以解决这一问题。

Part Three.玻尔兹曼机和受限的波尔兹曼机

➢一、玻尔兹曼机

1.玻尔兹曼机概述

❑玻尔兹曼机也是相互连接型网络。玻尔兹曼机和Hopfield神经网络很相似,但是Hopfield神经网络如果发生串扰或陷入局部最优解的话,Hopfield神经网络就不能正确的辨别模式。而玻尔兹曼机则可以通过让每个单元按照一定的概率分布发生状态变化,来避免陷入局部最优解

❑玻尔兹曼机保持了Hopfield神经网络的假设:权重对称;自身无连接;二值输出

❑玻尔兹曼机的输出是按照某种概率分布决定的

𝑇(>0)表示温度系数,当 𝑇 趋近于无穷时,无论u_{i} 取值如何,下一时刻的状态 x_{i} 等于1 或 0 的概率都是1/2,这种状态称为稳定状态。k是玻尔兹曼常数,x是一个能量变化的函数,和x_{i} 没有关系。

下面是概率曲线随着温度的变化情况:当T越来越大的时候,基本上趋于均匀分布,概率为 \frac{1}{2} ;当T越来越小的时候,曲线在0附近变得越来越陡。 

➢ 2.玻尔兹曼机中的模拟退火算法

玻尔兹曼机选择模拟退火算法进行求解,可以先采用较大的温度系数及进行粗调,然后逐渐减小温度系数进行微调。温度系数越大,跳出局部最优解的概率越高,因为他的概率就在 \frac{1}{2} 附近,相当于输出是1或者输出是0的随机性比较大,所以跳出局部最优解的概率就会大一些。但是温度系数增大时,获得能量函数极小值的概率就会降低;反之,温度系数减小时,虽然获得能量函数极小值的概率增加了,但是玻尔兹曼机需要经历较长时间才能达到稳定状态。(疑问:能量函数极小值的概率增加怎么就增加了?????)

模拟退火是一种贪心算法,但是它的搜索过程引入了随机因素,以一定的概率来接受一个比当前解要差的解,因此有可能会跳出这个局部的最优解,达到全局的最优解, 而且这个概率随着时间推移逐渐降低(逐渐降低才能趋向稳定)

例如我们要求一条曲线的最大值。求最小值的时候,我们是沿着梯度的负方向进行求解,求最大值的时候我们就是沿着梯度的正方向找这个最大值,也就是爬山算法。首先我们达到了C这个点,然后我们到达了A这个局部最优解,这个时候,他就跳不出这个局部最优解(因为A附近周围的任何一个值,都没有A大),他觉得在这就是稳定了,此时我们希望A能够以一定的概率接受一个当前情况下,比A自身次的点,使得其能够跳出这样的局部最优解A。比如我们当前找的是D,我们就有可能跳出这个局部最优解,因为我们在D附近再找的时候,就会慢慢的接近B这个点,所以说模拟退火算法不一定百分之百能够保证你得到一个全局最优解,他是说具有一定的概率跳出这个局部最优解从而找到一个更好的解,降低陷入局部最优解得可能性。

➢ 3.玻尔兹曼机的训练过程

玻尔兹曼机的训练过程
– 1. 训练准备:初始化连接权重w_{ij}和偏置b_{i}  (输入输出的连接关系就是\sum_{j=1} w_{ij}x_{j}+b_{i} )
– 2. 调整参数

– 2.1 选取一个单元 i ,求输入u_{i} (和Hopfield类似,玻尔兹曼机也是每次随机选择一个单元进行更新,其他的单元不变)

– 2.2 根据u_{i}的值,计算输出x_{i} (和Hopfield不类似,玻尔兹曼机引入了概率,按照某种概率分布来决定它输出是0还是1)

– 2.3 根据输出x_{i}x_{j}的值,调整连接权重w_{ij}和偏置b_{i}

重复步骤 2 ,直到满足终止判断条件

具体而言,当初始化连接权重后,选取一个单元 i 

– 2.1计算单元激活值u_{i}(这一步和Hopfiled一样)

– 2.2计算x_{i} 等于 1 0 的概率,这个概率还要和随机数进行比较

根据概率x_{i} 等于10的概率,调整x_{i} 的取值。一般是随机产生一个(0,1)之间的随机数λ,如果p, 确认状态改变,否则不改变。不能将计算所得概率直接作为x_{i}的值,而是作为概率来决定x_{i}的值

– 2.3调整连接权重w_{ij}和偏置b_{i} , 这里用似然函数𝐿(θ)导出调整值,θ 表示所有的连接权重和偏置

s_{k}代表训练样本,给定参数θ 的情况下,以最大概率出现这个训练样本的情况,就是让𝐿(θ )最大。有很多训练样本,所有的样本都要以最大概率出现自身训练样本的情况,所以这些所有训练样本的出现的概率要相乘。训练样本就是我们网络要记住的这个模式

其中,概率分布的定义如下,训练样本S={s_{1},s_{2} ,…,s_{k} ,…,s_{K} } ,𝐸表示能量函数,𝑍(θ)是归一化常数,是对所有的样本的能量函数的求和。能量越小,出现的概率就会越大一些,如果能量是0的话,概率就是\frac{1}{Z(\theta )}

前面连乘的形式不太方便计算,所以我们在似然函数求解的时候把连乘的形式变成求和的形式,求和的形式就是取对数。所以通常,使用对数似然函数求解

当对数似然函数的梯度为0时,就可以得到最大似然估计量,即通过求连接权重w_{ij}和偏置b_{i}的相关梯度,可以求出调整值。也就是说,求极值点,极值点是梯度等于0的时候(极大值极小值都是),如果求极大值的话,修正的方向是沿着梯度的正方向;求极小值的时候我们就是沿着梯度的负方向,所以我们是可以进行求导调整权重w_{ij}和偏置b_{i}

求解困难:似然函数是基于所有单元组合来计算的,所以单元数过多将导致组合数异常庞大,无法进行实时计算。为了解决这个问题,人们提出了一种近似算法,对比散度算法(稍后介绍)

➢二、受限玻尔兹曼机

1.受限玻尔兹曼机概述

前面介绍的玻尔兹曼机默认了所有单元都为可见单元,各单元之间是等同地位的,在实际应用上,玻尔兹曼机还可以由可见单元和隐藏单元共同构成,例如下图中h是隐藏单元,v是可见单元。隐藏单元与输入数据没有直接联系,但输入数据会影响可见单元的概率。假设可见单元为可见变量 𝑣 ,隐藏单元为隐藏变量 。玻尔兹曼机含有隐藏变量时,概率分布仍然与前面计算的结果相同。对玻尔兹曼机的训练困难没有起到任何的作用。

含有隐藏变量的波尔兹曼机训练非常困难,为了让训练变得可行,有人提出了受限玻尔兹曼机

由可见层和隐藏层构成,可见层只有可见单元,隐藏层只有隐藏单元
层内单元之间无连接,层层之间有连接
信息可双向流动,权重对称,自身没有到自己的权重

前面我们定义的玻尔兹曼机的能量函数是:E=神经元的偏置\times该神经元,而我们定义受限玻尔兹曼机的能量函数为:

利用能量函数,可以给出状态(v,h)的联合概率分布,这个和前面的玻尔兹曼机就非常相似了,这里面他是一个联合概率分布,因为它分为隐藏层和可见层,而玻尔兹曼机呢仅表示为神经元,没有区分什么隐藏层和可见层,表示为p(u_{i}|\theta )。  Z_{}\theta是一个归一化向量,这个归一化向量是所有神经元的能量函数的求和

观测数据S=\left \{ v^{1}, v^{2}, ...,v^{n_{s}} \right \}的概率分布, 也就是可见层状态变量的概率分布。有n_{s}个观测数据,v^{1}是一个观测数据的样本,其中例如v^{1}v^1=\left \{ v_{1}^1,v_{2}^1,v_{3}^1,... \right \}对应的是可见层的神经元。我们在实际中,更关心的是,参数\theta取什么值的时候,训练样本的概率最大,所以后面我们会更多的用到p(\overrightarrow{v}|\theta )

类似地,有关于隐藏层状态变量的概率分布

在我们后面推导受限玻尔兹曼机参数更新的时候,我们会用到下面这两个概率分布:

给定可见层上所有神经元的状态时,隐藏层上的第 k 个神经元被激活(即取值为1)的概率

给定隐藏层上所有神经元的状态时,可见层上的第 k 个神经元被激活(即取值为1)的概率

我们把隐藏层神经元的状态分成两部分:第一部分是包含第 k 个神经元;第二部分是不包含第 k 个神经元。不包含第 k 个神经元的其他的所有神经元记为向量的形式\overrightarrow{h}_{-k},这样划分以后,相应的能量也是可以被划分为两部分:第一部分是第 k 个神经元所包含的能量;第二部分是不包含第 k 个神经元的其他的所有神经元所拥有的能量。

能量函数可以表达为

以推导p(h_{k}=1|\overrightarrow{v})为例,紫色圈加入等号仍然相等的原因是受限的玻尔兹曼机规定了同一层内是没有连接的,所以他们是不相关的,所以不加上第 k 个神经元也是没有关系的;下一步的绿色部分是去掉第 k 个隐藏层神经元单元和可见层所有的神经元单元的联合概率分布;绿色部分的概率可以进一步拆分成两部分(相当于全概率公式的拆分):红色部分和青色部分,在第 k 个神经元上做累加,第k 个神经元的取值有两种情况0和1,

给定训练样本S=\left \{ v^{1}, v^{2}, ...,v^{n_{s}} \right \},调整参数 θ 训练RBM,\overrightarrow{v_i}=(v_{1}^i , v_{2}^i ,...,v_{n_{v}}^i)^Tn_{v}个可见层的神经元单元,i=1,2,...,n_{s},这些训练样本是独立同分布的,训练RBM是最大化似然函数

和玻尔兹曼机一样,计算时通常使用对数似然函数:

最大化时就沿着梯度的正方向更新:我们会更新三个参数:w,a,b

梯度求解:由于是求和形式,所以仅以一个样本为例

以上的推导很繁琐复杂,所以改良后的受限玻尔兹曼机依然在计算上存在着问题:\sum𝑣 𝑃(𝑣)是所有输入模式的总和,不可避免会产生庞大的算量,要想解决这个问题,可以使用常规蒙特卡罗MCMC采样估,但算法进行迭代计算求近似解,但即使这样处理,迭代次数也仍然非常多。于是,人们提出了对比散度算法,前面玻尔兹曼机里面,我们也提到了这个算法,我们现在正式介绍。

➢2.受限玻尔兹曼机中的对比散度算法

2002Hinton提出, MCMC的状态以训练样本为起点,这样只需很少的状态转移就可以得到RBM的分布

对比散度算法的训练过程(和玻尔兹曼机的训练过程是一样的)

– 1. 训练准备:初始化连接权重和偏置
– 2. 调整参数

• 2.1 在可见层v^{(0)}设置输入模式(训练样本输入的时候设置训练样本的初值)

• 2.2 调整隐藏层中单元h^{(0)}的值(根据h^{(0)}的值,再进一步得到可见层的状态的值)

• 2.3根据输出x_{i}x_{j}的值,调整连接权重w_{ij}、偏置a_{i}、偏置b_{j}

重复步骤 2 ,直到满足终止判断条件

具体来看:

初始化连接权重和偏置:随机数初始化

调整参数:在可见层设初值v^{(0)}(根据训练样本设置),根据参数初始值计算隐藏层为状态1的概率:

根据这个概率计算符合二项分布的隐藏层中单元h^{(0)} _{j}的状态,其中\sigma表示sigmoid函数

图解神经网络教材中例子:我现在有训练样本{1,0,1,1},我们可以把它作为可见层的初值,然后给w_{ij}一个随机初始化的值,那么我就可以得到隐藏层神经单元状态的值,也就是可以根据上面的这个公式得到隐藏层神经元状态的概率,根据前面讲的玻尔兹曼机的知识,我们知道这个概率值并不是隐藏层神经元状态的值,而是需要和一个随机的值Random进行比较,大于这个概率值的时候,就把这个神经元的状态置为1,反之置为0。

进一步,根据隐藏层的状态,计算在可见层各单元状态为1的概率 。因为我们得到h^{(0)}之后,我们还可以计算可见层的状态,更新一下可见层的状态。

根据这个概率计算各可见单元v^{(1)}_{i}的状态,下图中绿色的圆圈表示可见层神经元的概率,由概率我们在根据一个随机数Random进行比较,从而得到可见层神经元状态{1,1,....,0,....,1}这样我就得到这次迭代过程中,可见层神经元更新的状态

再次根据可见层神经元的值\overrightarrow{v}^{1}计算隐层单元h^{(1)}_{j}状态为1的概率,计算完之后,在更新参数即可

以此,由隐藏层神经元的状态在计算出可见层神经元状态\overrightarrow{v}^{2},不断迭代下去进行参数更新,当然上述过程还可以继续进行k(k步的Gibbs采样),称为k步对比散度法,记做CD-k

连接权重 w_{ij}、偏置 a_{i}、偏置 b_{j} 的调整值分别为下图中所示。粉色表示经过一步迭代后,神经元新的状态的概率,紫色表示根据样本可以计算的得到。这样就相当于对每一个训练样本计算更新的状态,就不用在所有的样本上计算概率和。

原来的方法的复杂度高在于:需要对所有的样本求概率(蓝色部分),而且每次我们需要在所有的样本上求和。现在只需要计算神经元状态的概率,不需要计算在对所有训练样本计算概率再求和。

玻尔兹曼机中调整参数时也可以Mini-Batch为单位进行计算时效果更佳

– Stochastic GD (SGD)

• 每次一个样本,更新参数(这样会导致参数有偏,因为单独的样本具有个体性)

– Batch GD

每次迭代的梯度方向计算由所有训练样本共同决定(最准,但是复杂度很高,效率很低)

– Mini-batch GD(折中的方案,更常用)

每个mini-batch(训练集的一个子集)更新参数,Batch size(一个Batch里面有多少个训练样本)

– Epoch, iteration

Epoch:当一个完整的数据集通过了神经网络称为一个epoch

Iteration处理一个Batch称为一次迭代(一个epoch里面有多少次迭代,就有多少个Batch)

➢ Part Four.深度玻尔兹曼机和深度信念网络

深度玻尔兹曼机(左:DBM)和深度信念网络(右:DBN)的结构很相似。他们都是由受限玻尔兹曼机堆叠构成。

➢ 一、深度波尔兹曼机

以深度波尔兹曼机为主介绍:

深度玻尔兹曼机采用与多层神经网络不同的训练方法,在训练时采用对比散度算法,逐层来调整连接权重和偏置

具体做法:

首先训练输入层和隐藏层之间的参数,把训练后得到的参数作为下一层的输入

再调整该层与下一个隐藏层之间的参数

然后逐次迭代,完成多层网络的训练

深度玻尔兹曼机既可以当作生成模型,也可以当作判别模型:

作为生成模型使用时:

网络会按照某种概率分布生成训练数据。例如前面我们有很多带躁的样本,它会根据自己的记忆,生成出新的不带躁的样本。概率分布可根据训练样本导出,但是覆盖全部数据模式的概率分布很难导出,所以通常选择最大似然估计法训练参数,得到最能覆盖训练样本的概率分布

这种生成模型能够:去除输入数据中含有的噪声,得到新的数据,对输入数据压缩和特征表达,因为通过这样的训练找到了训练数据中稳定的部分

 – 作为判别模型使用时:

需要在模型顶层添加一层Softmax实现分类进行分类时,需要同时提供训练样本和期望输出,在最顶层级联一个𝑆𝑜𝑓𝑡𝑚𝑎𝑥层

❑ 训练方法  

除最顶层外,其他各层都可以使用无监督学习进行训练

把训练得到的参数作为初始值,使用误差反向传播算法对包含最顶层的神经网络进行训练

最顶层的参数使用随机数进行初始化

➢ 二、深度信念网络

深度信念网络和深度玻尔兹曼机很相似。

深度信念网络的结构:

深度信念网络的训练过程:(和玻尔兹曼机的训练过程相似)

➢ Part Five.自编码器及其变种

➢ 一、自编码器

➢ 1.自编码器的概述

自编码器现在还是应用非常广泛的。

自编码器(Autoencoder)是一种有效的数据维度压缩降维算法,主要应用在以下两个方面:

构建一种能够重构输入样本并进行特征表达的神经网络。特征表达:是指对于分类会发生变动的不稳定模式,例如手写字体识别中由于不同人的书写习惯和风格的不同造成字符模式不稳定,或者输入样本中包含噪声等情况,神经网络也能将其转换成可以准确识别的特征,也就是在不同中找出共性。

训练多层神经网络时,通过自编码器训练样本得到参数初始值

自编码器的基本形式如下图所示:和RBM类似,由输入层输出层组成。输入数据向量𝑥与对应的连接权重矩阵𝑊相乘,再加上偏置向量𝑏,并经过激活函数𝑓(∙)变换后,就可以得到输出𝑦。自编码器是前馈的神经网络,它是由输入到输出的方向。这里面的偏置 𝑏 也是向量的形式,因为每一个神经元都有一个偏置。这里的输出的方法和玻尔兹曼机有所不同。玻尔兹曼机的输出先是一个概率值,这个概率值还要和一个随机数Random比较,最后才能确定这个输出的值是0还是1。自编码器的训练过程就是使用BP算法,不需要使用对比散度算法。

➢ 2.自编码器的训练

自编码器是一种基于无监督学习的神经网络,目的在于通过不断调整参数,重构经过维度压缩的输入样本。一种能够重构输入样本的三层神经网络如下图。让输入输出尽可能的接近,中间层尽可能的小。这里,𝑓(∙)表示编码器的激活函数, \widetilde{f}(\cdot )表示解码器的激活函数。中间层和重构层之间的连接权重及偏置分别记为\widetilde{W}\widetilde{b},重构值记作\widetilde{x}

自编码器的训练就是确定编码器和解码器的参数W, \widetilde{W} , 𝑏, \widetilde{b}的过程。其中𝑊\widetilde{W}可以相同,这称为权值(参数)共享。好处是参数减少了,训练的时候简单一些,但是训练以后得到的性能不一定是最好的。训练的目的是尽可能重构其原始输入 。重构和输入的误差尽可能小。参数的训练使用误差反向传播算法,误差函数可以使用小二乘误差函数或交叉熵代价函数

比较有代表性的自编码器:当样本中包含噪声时,如果神经网络能够消除噪声,则被称为降噪自编码器。还有一种称为稀疏自编码器的网络,它在自编码器中引入了正则化项,约束神经元的激活程度,以去除冗余信息。

➢ 二、降噪自编码器

1.降噪自编码器的概述

降噪自编码器的网络结构和自编码器一样,只是对训练方法进行了改进。自编码器是把训练样本直接输入给输入层,而降噪自编码器则是把通过向训练样本中加入随机噪声得到的带躁的样本\widetilde{x}输入给输入层。\widetilde{x}=x+\epsilon  

因为我们的输入是带躁的,而我们期望的输出是不带躁的,所以假设随机噪声𝜀服从均值为0,方差为\sigma^{2}的正态分布,我们需要训练神经网络,使得输出的重构结果和不含噪声的样本之间的误差收敛于极小值。(这一点和前面的自编码器不同,自编码器是让输入和输出尽可能的逼近)误差函数会对不含噪声的输入样本进行计算,故降噪自编码器可以完成以下两项训练 :

保持输入样本不变的条件下,能够更好地反映样本属性的特征

消除输入样本中包含的噪声

➢ 三、稀疏自编码器

1.稀疏自编码器的概述

在多层自编码器中,由于我们要做压缩,中间层的单元数太少会导致维度压缩的太厉害,使得神经网络很难重构输入样本,而单元数太多,会感觉没有怎么压缩,使得又会产生单元冗余,降低压缩效率。那我们怎么选择设置多少个神经元比较合适呢?

为了解决这个问题,人们将稀疏正则化引入到自编码器中,提出了稀疏自编码器:通过增加正则化项,大部分单元的输出都变成了0,只有少数单元是被激活的,这样就能利用少数单元完成压缩或重构。也就是我们不用去设置具体应该有多少个神经元数目,但是我们要约束神经元的激活程度。

加入正则化后的误差函数 𝐸 如下所示:有N个训练样本,每一个训练样本在激活后都会产生一个激活值。

2.稀疏自编码器的训练

KL距离反映了平均激活度和目标值的差异。𝜌我们一般设置的比较小,例如0.05,这就意味着平均激活度是5%。𝜌值越接近于0,中间层的平均激活度\hat \rho_{j}就越小。也就是说,虽然你中间可以设置很多个神经元,但实际平均激活度很小的话,那么实际上中间很多的神经元都是0。这样就避免了多个神经元导致压缩效率降低的问题。稀疏自编码器的训练也需要用到误差反向传播算法,对误差函数求导时须考虑KL(\rho ||\hat \rho_{j} )的导数

平均激活度是根据所有样本计算出来的,所以在计算任何单元的反向传播之前,需要对所有样本计算一遍正向传播,从而获取平均激活度(也就是我们在每次训练的时候,要把所有的样本都计算一遍,得到误差,然后再反向传播,这样相当于Batch,计算复杂度高),所以使用小批量梯度下降法进行训练时的效率很低。为了解决此问题,可以只计算Mini-Batch中包含的样本的平均激活度,然后在Mini-Batch之间计算加权平均并求近似值。

假设时刻(𝑡−1)Mini-Batch的平均激活度为\hat \rho ^{(t-1)}_{j}   ,当前tMini-Batch的平均激活度如下。这里的𝜆权重,𝜆越大,则时刻(𝑡 − 1)的Mini-Batch所占的比重也越高。

➢ 四、栈式自编码器

1.栈式自编码器的概述

自编码器、降噪自编码器、稀疏自编码器都是包括编码器和解码器的三层结构,中间只有一个隐藏层。但是在进行维度压缩时,可以只包括输入层和中间层。这样的网络比较浅,参数有限,所以网络的表达能力并不是很高的。这个时候我们可以借鉴前面的深度玻尔兹曼机或者深度信念网络等,输入层和中间层多层堆叠后,然后就可以得到栈式(深度)自编码器。

2.栈式自编码器的训练

栈式自编码器和深度信念网络一样,都是逐层训练。但两种网络的训练方法不同,深度信念网络是一种概率型的网络。它是利用对比散度算逐层训练两层之间参数。而栈式自编码器的训练过程采用的是误差的后向传递的方式,训练如下 :

首先训练第一个自编码器(有输入层和中间层),然后保留第一个自编码器的编码器部分

把第一个自编码器的中间层作为第二个自编码器的输入层进行训练

反复地把前一个自编码器的中间层作为后一个编码器的输入层,进行迭代训练

这个流程上和深度玻尔兹曼机很相似的,仅是训练方法不一样而已。

3.栈式自编码器在训练中的应用

栈式自编码器每层都能得到有效的参数,所以我们可以把训练后的参数作为神经网络或卷积神经网络的参数初始值,这种方法叫作预训练。预训练属于无监督学习,接下来需要使用有监督学习来调整整个网络的参数,这也叫作微调( fine tuning )

➢ Part Six.中英文术语对照

❑ 串扰:Crosstalk            

❑ 能量函数: Energy function

❑ 模拟退火算法:Simulated Anneal

❑ 对数似然函数: Log-likelihood function

❑ 小批量:Mini-batch

❑ 可见变量:Visible variables

❑ 隐藏变量:Hidden variables

❑ 玻尔兹曼机:Boltzmann Machine

❑ 受限玻尔兹曼机: Restricted Boltzmann Machine

❑ 深度信念网络:Deep Belief Network

❑ 对比散度算法:Contrastive Divergence

❑ 稀疏自编码器:Sparse Autoencoder

❑ 栈式自编码器:Stacked Autoencoder

❑ 降噪自编码器:Denoising Autoencoder             

  • 6
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bertama

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值