深度学习中,稀疏自编码神经网络怎么微调训练

查看: 19114|回复: 0
Deep Learning(深度学习)系列:(四)稀疏编码与限制波尔兹曼机
主题帖子积分
本帖最后由 levycui 于
14:22 编辑
问题导读:
如何理解Sparse Coding稀疏编码?
Restricted Boltzmann Machine (RBM)限制波尔兹曼机原理是什么?
9.2、Sparse Coding稀疏编码
& && & 如果我们把输出必须和输入相等的限制放松,同时利用线性代数中基的概念,即O = a1*Φ1 + a2*Φ2+….+ an*Φn, Φi是基,ai是系数,我们可以得到这样一个优化问题:
Min |I – O|,其中I表示输入,O表示输出。
& && & 通过求解这个最优化式子,我们可以求得系数ai和基Φi,这些系数和基就是输入的另外一种近似表达。
& && & 因此,它们可以用来表达输入I,这个过程也是自动学习得到的。如果我们在上述式子上加上L1的Regularity限制,得到:
Min |I – O| + u*(|a1| + |a2| + … + |an |)
& && &&&这种方法被称为Sparse Coding。通俗的说,就是将一个信号表示为一组基的线性组合,而且要求只需要较少的几个基就可以将信号表示出来。“稀疏性”定义为:只有很少的几个非零元素或只有很少的几个远大于零的元素。要求系数 ai 是稀疏的意思就是说:对于一组输入向量,我们只想有尽可能少的几个系数远大于零。选择使用具有稀疏性的分量来表示我们的输入数据是有原因的,因为绝大多数的感官数据,比如自然图像,可以被表示成少量基本元素的叠加,在图像中这些基本元素可以是面或者线。同时,比如与初级视觉皮层的类比过程也因此得到了提升(人脑有大量的神经元,但对于某些图像或者边缘只有很少的神经元兴奋,其他都处于抑制状态)。
& && && &稀疏编码算法是一种无监督学习方法,它用来寻找一组“超完备”基向量来更高效地表示样本数据。虽然形如主成分分析技术(PCA)能使我们方便地找到一组“完备”基向量,但是这里我们想要做的是找到一组“超完备”基向量来表示输入向量(也就是说,基向量的个数比输入向量的维数要大)。超完备基的好处是它们能更有效地找出隐含在输入数据内部的结构与模式。然而,对于超完备基来说,系数ai不再由输入向量唯一确定。因此,在稀疏编码算法中,我们另加了一个评判标准“稀疏性”来解决因超完备而导致的退化(degeneracy)问题。(详细过程请参考:[url=9.2、Sparse Coding稀疏编码& && && &如果我们把输出必须和输入相等的限制放松,同时利用线性代数中基的概念,即O = a1*Φ1 + a2*Φ2+….+ an*Φn, Φi是基,ai是系数,我们可以得到这样一个优化问题:
&&Min |I – O|,其中I表示输入,O表示输出。
通过求解这个最优化式子,我们可以求得系数ai和基Φi,这些系数和基就是输入的另外一种近似表达。
_9315.jpg (2.98 KB, 下载次数: 2)
14:21 上传
因此,它们可以用来表达输入I,这个过程也是自动学习得到的。如果我们在上述式子上加上L1的Regularity限制,得到:&&
Min |I – O| + u*(|a1| + |a2| + … + |an |)&&
这种方法被称为Sparse Coding。通俗的说,就是将一个信号表示为一组基的线性组合,而且要求只需要较少的几个基就可以将信号表示出来。“稀疏性”定义为:只有很少的几个非零元素或只有很少的几个远大于零的元素。要求系数 ai 是稀疏的意思就是说:对于一组输入向量,我们只想有尽可能少的几个系数远大于零。选择使用具有稀疏性的分量来表示我们的输入数据是有原因的,因为绝大多数的感官数据,比如自然图像,可以被表示成少量基本元素的叠加,在图像中这些基本元素可以是面或者线。同时,比如与初级视觉皮层的类比过程也因此得到了提升(人脑有大量的神经元,但对于某些图像或者边缘只有很少的神经元兴奋,其他都处于抑制状态)。
稀疏编码算法是一种无监督学习方法,它用来寻找一组“超完备”基向量来更高效地表示样本数据。虽然形如主成分分析技术(PCA)能使我们方便地找到一组“完备”基向量,但是这里我们想要做的是找到一组“超完备”基向量来表示输入向量(也就是说,基向量的个数比输入向量的维数要大)。超完备基的好处是它们能更有效地找出隐含在输入数据内部的结构与模式。然而,对于超完备基来说,系数ai不再由输入向量唯一确定。因此,在稀疏编码算法中,我们另加了一个评判标准“稀疏性”来解决因超完备而导致的退化(degeneracy)问题。(详细过程请参考:UFLDL Tutorial稀疏编码)]UFLDL Tutorial稀疏编码[/url])
_5095.jpg (68.46 KB, 下载次数: 4)
14:06 上传
& && & 比如在图像的Feature Extraction的最底层要做Edge Detector的生成,那么这里的工作就是从Natural Images中randomly选取一些小patch,通过这些patch生成能够描述他们的“基”,也就是右边的8*8=64个basis组成的basis,然后给定一个test patch, 我们可以按照上面的式子通过basis的线性组合得到,而sparse matrix就是a,下图中的a中有64个维度,其中非零项只有3个,故称“sparse”。
& && & 这里可能大家会有疑问,为什么把底层作为Edge Detector呢?上层又是什么呢?这里做个简单解释大家就会明白,之所以是Edge Detector是因为不同方向的Edge就能够描述出整幅图像,所以不同方向的Edge自然就是图像的basis了……而上一层的basis组合的结果,上上层又是上一层的组合basis……(就是上面第四部分的时候咱们说的那样)
Sparse coding分为两个部分:
1)Training阶段:给定一系列的样本图片[x1, x 2, …],我们需要学习得到一组基[Φ1, Φ2, …],也就是字典。
& && & 稀疏编码是k-means算法的变体,其训练过程也差不多(EM算法的思想:如果要优化的目标函数包含两个变量,如L(W, B),那么我们可以先固定W,调整B使得L最小,然后再固定B,调整W使L最小,这样迭代交替,不断将L推向最小值。EM算法可以见我的博客:“”)。
& && & 训练过程就是一个重复迭代的过程,按上面所说,我们交替的更改a和Φ使得下面这个目标函数最小。
_5706.jpg (17.3 KB, 下载次数: 4)
14:07 上传
& && &每次迭代分两步:
a)固定字典Φ[k],然后调整a[k],使得上式,即目标函数最小(即解LASSO问题)。
b)然后固定住a [k],调整Φ [k],使得上式,即目标函数最小(即解凸QP问题)。
& && &不断迭代,直至收敛。这样就可以得到一组可以良好表示这一系列x的基,也就是字典。
2)Coding阶段:给定一个新的图片x,由上面得到的字典,通过解一个LASSO问题得到稀疏向量a。这个稀疏向量就是这个输入向量x的一个稀疏表达了。
_1398.jpg (18.15 KB, 下载次数: 1)
14:07 上传
_9524.jpg (24.38 KB, 下载次数: 3)
14:08 上传
9.3、Restricted Boltzmann Machine (RBM)限制波尔兹曼机
& && & 假设有一个二部图,每一层的节点之间没有链接,一层是可视层,即输入数据层(v),一层是隐藏层(h),如果假设所有的节点都是随机二值变量节点(只能取0或者1值),同时假设全概率分布p(v,h)满足Boltzmann 分布,我们称这个模型是Restricted BoltzmannMachine (RBM)。
_7932.jpg (34.94 KB, 下载次数: 1)
14:09 上传
& && & 下面我们来看看为什么它是Deep Learning方法。首先,这个模型因为是二部图,所以在已知v的情况下,所有的隐藏节点之间是条件独立的(因为节点之间不存在连接),即p(h|v)=p(h1|v)…p(hn|v)。同理,在已知隐藏层h的情况下,所有的可视节点都是条件独立的。同时又由于所有的v和h满足Boltzmann 分布,因此,当输入v的时候,通过p(h|v) 可以得到隐藏层h,而得到隐藏层h之后,通过p(v|h)又能得到可视层,通过调整参数,我们就是要使得从隐藏层得到的可视层v1与原来的可视层v如果一样,那么得到的隐藏层就是可视层另外一种表达,因此隐藏层可以作为可视层输入数据的特征,所以它就是一种Deep Learning方法。
_2427.jpg (32.56 KB, 下载次数: 2)
14:09 上传
如何训练呢?也就是可视层节点和隐节点间的权值怎么确定呢?我们需要做一些数学分析。也就是模型了。
_7276.jpg (34.76 KB, 下载次数: 1)
14:10 上传
联合组态(jointconfiguration)的能量可以表示为:
_3303.jpg (11.85 KB, 下载次数: 2)
14:10 上传
而某个组态的联合概率分布可以通过Boltzmann 分布(和这个组态的能量)来确定:
_1491.jpg (21.04 KB, 下载次数: 3)
14:10 上传
因为隐藏节点之间是条件独立的(因为节点之间不存在连接),即:
_9047.jpg (4.66 KB, 下载次数: 1)
14:11 上传
然后我们可以比较容易(对上式进行因子分解Factorizes)得到在给定可视层v的基础上,隐层第j个节点为1或者为0的概率:
_4178.jpg (6.46 KB, 下载次数: 2)
14:11 上传
同理,在给定隐层h的基础上,可视层第i个节点为1或者为0的概率也可以容易得到:
_2700.jpg (10.19 KB, 下载次数: 2)
14:12 上传
给定一个满足独立同分布的样本集:D={v(1), v(2),…, v(N)},我们需要学习参数θ={W,a,b}。
我们最大化以下对数似然函数(最大似然估计:对于某个概率模型,我们需要选择一个参数,让我们当前的观测样本的概率最大):
_7458.jpg (9.58 KB, 下载次数: 2)
14:12 上传
也就是对最大对数似然函数求导,就可以得到L最大时对应的参数W了。
_5666.jpg (14.58 KB, 下载次数: 0)
14:13 上传
如果,我们把隐藏层的层数增加,我们可以得到Deep Boltzmann Machine(DBM);如果我们在靠近可视层的部分使用贝叶斯信念网络(即有向图模型,当然这里依然限制层中节点之间没有链接),而在最远离可视层的部分使用Restricted Boltzmann Machine,我们可以得到DeepBelief Net(DBN)。
_3496.jpg (69.97 KB, 下载次数: 3)
14:13 上传
9.4、Deep Belief Networks深信度网络
& && &&&DBNs是一个概率生成模型,与传统的判别模型的神经网络相对,生成模型是建立一个观察数据和标签之间的联合分布,对P(Observation|Label)和 P(Label|Observation)都做了评估,而判别模型仅仅而已评估了后者,也就是P(Label|Observation)。对于在深度神经网络应用传统的BP算法的时候,DBNs遇到了以下问题:
(1)需要为训练提供一个有标签的样本集;
(2)学习过程较慢;
(3)不适当的参数选择会导致学习收敛于局部最优解。
_9432.jpg (71 KB, 下载次数: 2)
14:13 上传
& && &DBNs由多个限制玻尔兹曼机(Restricted Boltzmann Machines)层组成,一个典型的神经网络类型如图三所示。这些网络被“限制”为一个可视层和一个隐层,层间存在连接,但层内的单元间不存在连接。隐层单元被训练去捕捉在可视层表现出来的高阶数据的相关性。
& && & 首先,先不考虑最顶构成一个联想记忆(associative memory)的两层,一个DBN的连接是通过自顶向下的生成权值来指导确定的,RBMs就像一个建筑块一样,相比传统和深度分层的sigmoid信念网络,它能易于连接权值的学习。
& && & 最开始的时候,通过一个非监督贪婪逐层方法去预训练获得生成模型的权值,非监督贪婪逐层方法被Hinton证明是有效的,并被其称为对比分歧(contrastive divergence)。
& && & 在这个训练阶段,在可视层会产生一个向量v,通过它将值传递到隐层。反过来,可视层的输入会被随机的选择,以尝试去重构原始的输入信号。最后,这些新的可视的神经元激活单元将前向传递重构隐层激活单元,获得h(在训练过程中,首先将可视向量值映射给隐单元;然后可视单元由隐层单元重建;这些新可视单元再次映射给隐单元,这样就获取新的隐单元。执行这种反复步骤叫做吉布斯采样)。这些后退和前进的步骤就是我们熟悉的Gibbs采样,而隐层激活单元和可视层输入之间的相关性差别就作为权值更新的主要依据。
& && & 训练时间会显著的减少,因为只需要单个步骤就可以接近最大似然学习。增加进网络的每一层都会改进训练数据的对数概率,我们可以理解为越来越接近能量的真实表达。这个有意义的拓展,和无标签数据的使用,是任何一个深度学习应用的决定性的因素。
_1933.jpg (70.08 KB, 下载次数: 2)
14:14 上传
& && & 在最高两层,权值被连接到一起,这样更低层的输出将会提供一个参考的线索或者关联给顶层,这样顶层就会将其联系到它的记忆内容。而我们最关心的,最后想得到的就是判别性能,例如分类任务里面。
& && & 在预训练后,DBN可以通过利用带标签数据用BP算法去对判别性能做调整。在这里,一个标签集将被附加到顶层(推广联想记忆),通过一个自下向上的,学习到的识别权值获得一个网络的分类面。这个性能会比单纯的BP算法训练的网络好。这可以很直观的解释,DBNs的BP算法只需要对权值参数空间进行一个局部的搜索,这相比前向神经网络来说,训练是要快的,而且收敛的时间也少。
& && & DBNs的灵活性使得它的拓展比较容易。一个拓展就是卷积DBNs(Convolutional Deep Belief Networks(CDBNs))。DBNs并没有考虑到图像的2维结构信息,因为输入是简单的从一个图像矩阵一维向量化的。而CDBNs就是考虑到了这个问题,它利用邻域像素的空域关系,通过一个称为卷积RBMs的模型区达到生成模型的变换不变性,而且可以容易得变换到高维图像。DBNs并没有明确地处理对观察变量的时间联系的学习上,虽然目前已经有这方面的研究,例如堆叠时间RBMs,以此为推广,有序列学习的dubbed temporal convolutionmachines,这种序列学习的应用,给语音信号处理问题带来了一个让人激动的未来研究方向。
& && & 目前,和DBNs有关的研究包括堆叠自动编码器,它是通过用堆叠自动编码器来替换传统DBNs里面的RBMs。这就使得可以通过同样的规则来训练产生深度多层神经网络架构,但它缺少层的参数化的严格要求。与DBNs不同,自动编码器使用判别模型,这样这个结构就很难采样输入采样空间,这就使得网络更难捕捉它的内部表达。但是,降噪自动编码器却能很好的避免这个问题,并且比传统的DBNs更优。它通过在训练过程添加随机的污染并堆叠产生场泛化性能。训练单一的降噪自动编码器的过程和RBMs训练生成模型的过程一样。
积极上进,爱好学习
经常帮助其他会员答疑
站长推荐 /4
云计算hadoop视频大全(新增 yarn、flume|storm、hadoop一套视频
等待验证会员请验证邮箱
新手获取积分方法
技术类问答,解决学习openstack,hadoop生态系统中遇到的问题
Powered by深度学习笔记: 稀疏自编码器 - 冬之晓 - CSDN博客
深度学习笔记: 稀疏自编码器
深度学习笔记: 稀疏自编码器
hW,b(x)=f(∑i=13wix+b)fR→R : 激活函数\
选取sigmoid 作为激活函数\
f(z)=11+e-z(1)
需要注意的是f′(z)=f(z)*(1-f(z))
δ(nl)i=??z(nl)iJ(W,b;x,y)=-(yi-a(nl)i)f′(z(nl)i)
神经网络模型
+1 称为偏置节点
输入层 最左边
输出层 最右边
隐藏层 中间
三个输入单元1个输出单元 三个隐藏单元
nl 表示层数,将第l层记为Ll
输入层是L1, 输出层是Lnl
上图神经网络参数如下
{&W(1),b(1),W(2),b(2)}
其中 Wlij代表着第*l层的xj 与第l+1层的xi之间的关系*
bli是第l+1层的i单元的偏置项偏置项
在上图例子中 W(1)∈R3×3W(2)∈R1*3
偏置单元没有输入,输出总为+1,在计算节点数时,偏置单元也不计算在内.
用ali 表示第l层的第i个单元的激活值,即输出值,但l=1时,a1i等于xi 也就是第i个输入值
???????a(2)1=f(w(1)11x1+w(1)12x2+w(1)13x3+b(1)1)a(2)2=f(w(1)21x1+w()22x2+w(1)23x3+b12)a(2)3=f(w(1)31x1+w(1)32x2+w(1)33x3+b(1)3)
hw,b(x)=a(3)1=f(w(2)11a(2)1+w(2)(12)a(2)2+w(2)13a(2)3+b(2)1)
如果我们用z(l)i表示第l层的第i 个单元的加权输入和, 那么a(l)i=f(z(l)i).
如果我们将f扩展成向量表示:
f([z1,z2,z3])=[f(z1),f(z2),f(z3)]
则,上述结论有一种更加简洁的表示:
z(2)=w(1)x+b(1)a(2)=f(z(2))z(3)=w(2)a(2)h(w,b)(x)=a(3)=f(z(3))
我们把上面的步骤称之为前向传播(forward propagation),
1. 给定第1层的激活值a(1)=x(1).
2. 对于任何给定的第l层激活值,可以通过下面公式计算得到第l+1层的激活值:
z(1+1)=W(l)X(l)a(l+1)=f(z(l+1))
通过参数矩阵化,使用矩阵-向量的运算方式,我们就可以利用线性代数来对神经网络进行快速求解.
我们还可以构建多种神经网络结构(结构指的是神经元之间的连接方式)
## 反向传导算法
假设有一个固定的样本集{(x(1),y(1)),(x(2),y(2))...(x(m),y(m))} 包含m个样例.我们定义总体代价函数如下:
J(w,b)=[1m∑i=1mJ(w,b:x(i),y(i))]+λ2∑l=1nl∑i=1sl∑j=1sl+1(W(l)ij)2=[1m∑i=1m12∣hw,b(x(i))-y(i)&∣2]+λ2∑l=1nl∑i=1sl∑j=1sl+1(W(l)ji)2
注意Wji下标顺序
第一项是均方差项,第二项是规则化项,也叫权重衰减项,防止过度拟合,记住权重衰减项不考虑b
以上的代价函数经常被用于分类和回归问题。在分类问题中,我们用
1,来代表两种类型的标签(回想一下,这是因为 sigmoid激活函数的值域为
[0,1];如果我们使用双曲正切型激活函数,那么应该选用 -1 和
+1 作为标签)。对于回归问题,我们首先要变换输出值域(译者注:也就是 y),以保证其范围为 [0,1] (同样地,如果我们使用双曲正切型激活函数,要使输出值域为
[-1,1])。
我们的目标是求得是J(w,b)最小的w,b. 首先使用随机生成w,b,利用正态分布,均值为0,方差为0.01,
之后利用梯度下降法求得最优值.由于J(w,b)是非凸函数,所以未必会下降到最小值,但是实际一般效果还不错.
将参数进行随机初始化,不是全部取0,因为全部取0 的话,或者取相同的值的话将导致每一个隐藏单元的输出值一样, 随机初始化的目的是是对称失效
梯度下降法的的步骤如下:
W(l)ij=W(l)ij-α*??W(l)ijJ(W,b)b(l)i=b(l)i-α*??b(l)iJ(W,b)
其中α 成为学习速率. 其中计算偏导数比较重要,需要专门讲一讲,反向传导算法
??W(l)ijJ(W,b)和??b(l)iJ(W,b)是最重要的两个计算:
??W(l)ijJ(W,b)=??1m∑i=1m??W(l)ijJ(w,b:x(i),y(i))??+λW(l)ij??b(l)iJ(W,b)=??1m∑i=1m??b(l)iJ(w,b:x(i),y(i))??
反向传播算法的思路如下:
给定一个样例(x,y),
- 首先进行前向传导计算,计算出每个单元的激活值,包括hw,b(x)的输出值,
- 之后针对第l层的每一个节点i,我们计算其残差δ(l)i:残差表明该节点对最终输出值的残差产生了多少的影响,
对于输出层,我们可以直接用输出值和 理论值之间的差距,即δ(nl)i
那么对于隐藏层我们做什么处理呢? 我们将基于节点(l+1层)的残差加权计算δ(l)i,这些节点以a(l)I作为输入:
下面给出计算细节:
1. 进行前馈传导计算,利用前向传导公式,得到 L2,L3.....Lnl
2. 对于第nl层的(输出层)的每个输出单元i, 我们根据以下公式计算残差:
δ(nl)i=??z(nl)iJ(W,b;x,y)=-(yi-a(nl)i)f′(z(nl)i)
3. 对于隐藏层, 第l层的计算公式如下:
δ(l)i=(∑sl+1j=1W(l)jiδ(l)j)f′(z(l)i)
4. 计算我们所需要
??W(l)ijJ(W,b)=a(l)jδ(l)i
??b(l)iJ(W,b)=δ(l+1)i
如果用矩阵和向量来表示反向传播算法:
1. 利用前馈传导算法,得到L2,L3直到Lnl的激活值
2. 对输出层,计算:
δ(nl)i=-(y-a(nl))*f′(z(nl))
3. 对于隐藏层,计算:
δ(l)=((W(l))Tδ(l+1))*f′(z(l))
4. 计算最终的偏导数值:
?W(t)J=δ(l+1)(a(l))T
?b(t)J=δ(l+1)
实际中因注意: 在以上(2)和(3)中要计算f’(z), 可以利用f’(z)=f(z)(1-f(z))
f′(z(l)i)=a(l)i(1-a(l)i)
梯度下降法的一次迭代:
1. 对所有的l, 令ΔW和Δb全部为0;
2. 对于i=1到m:
a. 利用反向传播算法计算?W(t)J?b(t)J
b. 计算ΔW=ΔW+?W(t)J
c. 计算Δb=Δb+?b(t)J
3. 更新权重参数:
- W(l)=W(l)-α[(1mΔW(l))+λW(l)]
- b(l)=b(l)-α[1mΔb(l)]
重复梯度下降法的迭代步骤即可减小代价函数 J,继而求得神经网络的
梯度检验与高级优化
索引的缺位错误(off-by-one error)会导致只有部分层的权重得到训练,再比如忘记计算偏置项。这些错误会使你得到一个看似十分合理的结果(但实际上比正确代码的结果要差)。因此,但从计算结果上来看,我们很难发现代码中有什么东西遗漏了.本节将介绍一种对求导结果进行数值检验的方法,该方法可以验证求导代码是否正确。另外,使用本节所述求导检验方法,可以帮助你提升写正确代码的信心
for (i=0;i&m;i++)写成了for (for (i=0;i&=m;i++))
比如在梯度下降法当中θ:=θ-α??θJ(θ)
而导数的定义如下:
dJ(θ)d(θ)=lim?→0J(θ+?)-J(θ-?)2?
如果我们取?很小 比如10-4 那么计算出来的结果应当和实际求导出来的结果小数至少前四位一样. 注意? 不能取太小,否则会有舍入误差
如果是向量的话,也是类似,
将W,b 扩展成一个向量 J:Rn?R
自编码算法与稀疏性
输入是无标签数据,学习一个函数
如果我们加以限制,假设某个自编码神经网络的输入 x 是一张 10×10图像(共100个像素)的像素灰度值,于是 n=100,其隐藏层L2中有50个隐藏神经元。注意,输出也是100维的 y∈R100 。由于只有50个隐藏神经元,我们迫使自编码神经网络去学习输入数据的压缩表示,也就是说,它必须从50维的隐藏神经元激活度向量 a(2)∈R50 中重构出100维的像素灰度值输入 x 。
如果网络的输入数据是完全随机的,比如每一个输入 \textstyle x_i 都是一个跟其它特征完全无关的独立同分布高斯随机变量,那么这一压缩表示将会非常难学习。但是如果输入数据中隐含着一些特定的结构,比如某些输入特征是彼此相关的,那么这一算法就可以发现输入数据中的这些相关性。事实上,这一简单的自编码神经网络通常可以学习出一个跟主元分析(PCA)结果非常相似的输入数据的低维表示。
即使隐藏神经元的数量较大(可能比输入像素的个数还要多),我们仍然通过给自编码神经网络施加一些其他的限制条件来发现输入数据中的结构。比如稀疏性:
如果当神经元的输出接近于1的时候我们认为它被激活,而输出接近于0的时候认为它被抑制,那么使得神经元大部分的时间都是被抑制的限制则被称作稀疏性限制。
ρ^j=1m∑i=1m[a(2)j(x(i))] 表示表示隐藏神经元 j 的平均活跃度
我们可以加入一条限制
ρ 是稀疏性参数, ρ称之为稀疏性参数,通常很小,比如0.05,. 为了实现这个目标,我们常常加入一个惩罚因子
∑j=1s2ρlogρρ^j+(1-ρ)log1-ρ1-ρ^j.
这其实是相对熵,相对熵是一种标准的用来测量两个分布之间差异的方法
于是新的J函数编程如下:
Jsparse(W,b)=J(W,b)+β∑j=1s2KL(ρ||ρ^j),
为了对相对熵进行导数计算,我们可以使用一个易于实现的技巧,
前面在后向传播算法中计算第二层( \textstyle l=2 )更新的时候我们已经计算了
δ(2)i=??∑j=1s2W(2)jiδ(3)j??f′(z(2)i),
现在我们将其换成
δ(2)i=????∑j=1s2W(2)jiδ(3)j??β(-ρρ^i+1-ρ1-ρ^i)??f′(z(2)i).
可视化自编码器训练结果
训练完(稀疏)自编码器,我们还想把这自编码器学到的函数可视化出来,好弄明白它到底学到了什么。我们以在10×10图像(即n=100)上训练自编码器为例。在该自编码器中,每个隐藏单元i对如下关于输入的函数进行计算:
+a(2)i=f??∑j=1100W(1)ijxj+b(1)i??.
我们将要可视化的函数,就是上面这个以2D图像为输入、并由隐藏单元i计算出来的函数。它是依赖于参数W(1)ij的(暂时忽略偏置项bi)。需要注意的是,a(2)i可看作输入x的非线性特征。不过还有个问题:什么样的输入图像x可让a(2)i得到最大程度的激励?(通俗一点说,隐藏单元i要找个什么样的特征?)。这里我们必须给x加约束,否则会得到平凡解。若假设输入有范数约束||x||2=∑100i=1x2i≤1,则可证(请读者自行推导)令隐藏单元i得到最大激励的输入应由下面公式计算的像素xj给出(共需计算100个像素,j=1,…,100):
xj=W(1)ij∑100j=1(W(1)ij)2----------√.
当我们用上式算出各像素的值、把它们组成一幅图像、并将图像呈现在我们面前之时,隐藏单元i所追寻特征的真正含义也渐渐明朗起来。
当我们对稀疏自编码器(100个隐藏单元,在10X10像素的输入上训练 )进行上述可视化处理之后,结果如下所示:
上图的每个小方块都给出了一个(带有有界范数 的)输入图像
x,它可使这100个隐藏单元中的某一个获得最大激励。我们可以看到,不同的隐藏单元学会了在图像的不同位置和方向进行边缘检测
相关文章推荐忽悠神经网络指南:教你如何把深度学习模型骗得七荤八素
知己知彼,无论你是想成为黑客(最好不要!)或防范未来黑客的入侵,都有必要来了解一下如何骗过由海量数据训练出来的深度学习模型。只要有程序员还在编程,黑客们就会不遗余力地找寻利用这些程序的方法。恶意黑客更是会利用程序中最为微小的漏洞来侵入系统,窃取数据,对系统造成严重破坏。
知己知彼,无论你是想成为黑客(最好不要!)或防范未来黑客的入侵,都有必要来了解一下如何骗过由海量数据训练出来的深度学习模型。只要有程序员还在编程,黑客们就会不遗余力地找寻利用这些程序的方法。恶意黑客更是会利用程序中最为微小的漏洞来侵入系统,窃取数据,对系统造成严重破坏。
但由深度学习算法驱动的系统应该是能够避免人为干扰的,对吧? 一个黑客怎么能够突破被TB(兆兆字节)级数据训练的神经网络呢?
然而事实证明,即使是最先进的深层神经网络也是很容易被欺骗的。只需要使用一些小技巧,你就可以迫使模型预测出你想要的任何结果:
我们可以修改上面这幅喵星人照片好让它被模型识别为烤面包机。
因此,在你将启用由深层神经网络驱动的新系统之前,让我们详细了解一下如何去破坏系统以及如何保护自己的系统免受黑客的攻击。
神经网络帮助人们保护网络安全
现在我们假设自己经营着一个像Ebay这样的拍卖网站。在我们的网站上,我们想防止人们出售违禁物品——比如活的动物。
但是假如你有数百万的用户,执行这些规则将是非常困难的。我们可以聘请上百人去手动审查每一个拍卖清单,但这无疑将非常昂贵。相反,我们可以使用深度学习去自动检查拍卖照片是否属于违禁物品,并对那些违禁品照片进行标记。
这是一个典型的图像分类问题。为了搭建这个模型,我们将训练一个深层卷积神经网络来从合规物品中识别出违禁物品,之后将识别模型运行于网站上的所有照片。
首先,我们需要一个基于历史拍卖列表的含有成千上万个拍卖图片的数据集。 数据集需要既有合规物品图片又有违禁物品图片,以便于我们训练神经网络来区别他们:
然后着手开始训练神经网络,这里我们使用标准的反向传播算法。这个算法的原理是,我们通过一个训练图片,传递该图片的预期结果,然后回到神经网络中的每一层去轻微地调节他们的权重,从而使模型更好地产生该图片的正确输出:
我们使用数千张照片重复上述过程上千次,直到模型以可接受的准确性稳定地输出正确结果为止。
最终我们将得到一个可以稳定地将图像分类的神经网络模型:
但事情往往并不如他们看起来的那么可靠…
卷积神经网络在对图像进行整体识别和分类上是非常强大的。他们在识别复杂形状和图案时并不受其在画面中所处位置的影响。在许多图像识别任务中,它们的表现可以媲美甚至于击败人类的表现。
对于这样高端的模型,如果将图像中的一些像素加黑或者变亮,对最终的预测结果不应该有很大的影响,对吧?是的,它有可能会轻微改变预测结果的可能性概率,但不会将图像的预测结果从“违禁品”改判为“合规品”。
我们期望的是:输入照片的微小变化只会对最终预测结果造成微小的变化。
然而,2013年的著名论文《神经网络的有趣特性》发现了这并不总是真的。如果你确切地知道了要更改哪些像素点以及要对其做出多大的改变,你就可以有意地强制神经网络对于给定图像做出错误预测,而不需要对图像外观做出大的改动。
这意味着我们可以故意制作一张明显是违禁物品的照片,但使它完全骗过我们的神经网络模型。
怎么会这样?机器学习分类器的工作原理就是找到意图区分事物之间的分界线。 以下图示是一个简单的二维分类器,它学习的目标是将绿球(合规)与红球(违规)区分开来:
现在,分类器的精度达到100%。它找到了一条可以将所有的绿球与红球完美分开的区隔线。
但是,如果我们想要调整一下模型使得一个红球被故意区分成绿球呢?我们最少要将红球移动多少才会使得它被推到绿球的判定区域呢?
如果我们把分界线旁边那个红球的Y值少量增加,那么我们就几乎可以把它推到绿球的判定区域了:
所以要想欺骗一个分类器,我们只需要知道从哪个方向来推动这个点可以使它越过区隔线即可。如果我们不想使这个错误过于明显,理想情况下我们会使这个移动尽可能的小,以至于其看起来就像是一个无心之过。
在使用深层神经网络进行图像分类时,我们分类的每个“点”其实是由成千上万个像素组成的完整图像。这就给了我们成千上万个可以通过微调来使预测结果跨过决策线的可能值。如果我们可以确保自己对图像中像素点的调整不是肉眼可见般的明显,我们就可以做到在愚弄分类器的同时又不会使图像看起来是被人为篡改过的。
换句话说,我们可以选取一张真实物品的图像,通过对特定像素点做出非常轻微地修改使得图像被神经网络完全识别为另一件物品—而且我们可以精准地控制这个替代品是什么:
把一只猫变成烤面包机。图像检测结果来自与Keras.js的Web演示:
如何欺骗神经网络
我们之前已经讨论了训练神经网络以分类照片的基本过程:
1.添加一张训练用图片;
2.查看神经网络的预测结果,看看其距离正确答案有多远;
3.使用反向传播算法来调整神经网络中每一层的权重,使预测结果更接近于正确答案。
4.在数千张不同的训练照片上重复步骤1-3。
那么相比于调整神经网络每一层的权重,如果我们直接修改输入图像本身直到得到我们想要的答案为止呢?
所以我们选用了已经训练好的神经网络,并再次“训练”它,不过这次我们将使用反向传播算法来直接调整输入图像而不是神经网络层的权重:
所以这里是新的算法:
1.添加一张我们想要“黑”的照片。
2.检查神经网络的预测结果,看看其距离我们想要的答案有多远。
3.使用反向传播算法来调整照片本身,使预测结果更接近于我们想要的答案。
4.使用相同的照片重复步骤1-3上千次,直到神经网络输出结果为我们想要的答案为止。
在此之后,我们将会得到一张可以欺骗神经网络的图片,同时并不改变神经网络本身。
唯一的问题是,由于算法在调整上没有任何限制,允许以任何尺度来调整任何像素点,所以图像的最终更改结果可能会大到显而易见:他们会出现变色光斑或者变形波浪区域
一张被“黑”过的照片,由于没有对像素点可被调整的尺度做约束,你可以看到猫周围有了绿色光斑和白色墙壁上出现的波浪形图案。
为了防止这些明显的图形失真,我们可以将算法加上一个简单的限定条件。我们限定篡改的图片中每一个像素在原始的基础上的变化幅度取一个微量值,譬如0.01%。这就使算法在微调图片的时候仍然能够骗过神经网络却不会与原始图片差别太大。
在加入限定后重新生成的图片如下:
在每个像素只能在一定范围内变化的限制条件下生成的被“黑”的图片。
即使这张图对人眼来说篡改后没有区别,却可以骗过神经网络!
现在让我们来码代码
首先我们需要一个事先训练过的神经网络用来欺骗。我们不用重新开始训练,而是使用谷歌创建的神经网络。。
Keras是一个著名的深度学习框架,里面有几个预先训练过的神经网络。我们会使用其中的谷歌Inception v3 深度学习神经网络的拷贝。这个神经网络有过训练,曾经检测过超过一千种不同的物体。
下面是Keras中用此神经网络负责图像识别的基本代码。(文本代码详见链接)
在继续下去之前确保你预先安装了Python 3和Keras:
我们运行之后,它正确检测到了我们的图片是一只波斯猫:
现在我们微微篡改一下图片直到能够骗过这个神经网络让它认为图片是一个烤面包机。
Keras没有内置的可以通过输入图片训练的方法只有训练神经网络层,所以我只能提高技巧手动编写训练步骤的代码。
下面是我的代码:(文本代码详见链接)
运行后,最终我们可以得到能够骗过神经网络的图片。
注意:如果你没有GPU,这可能需要几个小时的时间运行。如果你有并且配置了Keras和CUDA,应该花不了几分钟。
现在我们将篡改后的图片放入原始模型中重新运行来测试其是否成功。
我们成功了!神经网络被我们欺骗了,把猫当成烤面包机了!
我们用被“黑”了的图片可以干什么?
这种被“黑”图片的操作被称为“创造对抗性的例子”。我们很有针对性的做出了让机器学习模型产生错误的一些数据。这个操作很巧妙,但在实际生活中有什么用呢?
研究者发现这些篡改图片有一些很令人惊喜的性质:
当被“黑”图片被打印出来后居然仍然可以欺骗神经网络!因此你可以用这些特殊的图片欺骗镜头和扫描仪,而不仅仅是电脑里上传图片的那种系统。
当神经网络被欺骗之后,如果其它的神经网络也是用类似的数据来训练的,即使设计完全不同,也能被这种特殊的图片欺骗。
因此我们可以用这些篡改图片做许多事情!
但是关于我们如何创造出这些特殊图片还具有很多限制——我们的操作需要能够直接进入神经网络的权限。因为我们实际上是“训练”神经网络来欺骗自身,我们需要它的拷贝版。在实际生活中,没有公司会让你下载的到他们受过训练的神经网络的代码,这也就意味着我们无法来进行这个攻击性的操作了……对吗?
并没有!研究者近日发现,我们可以利用探测另外一个神经网络的动向来镜像同步自己网络的方法,训练自己的替代性的神经网络。
然后你就可以用替代性的神经网络来生成被“黑”图片,这依然可以骗过原来的网络!这招叫做黑箱攻击。
这种攻击的范围没有限制,后果可以很可怕!下面是一些黑客能够做到的例子:
欺骗自动驾驶汽车使其认为看到的“停车”路标是一个绿灯——这可以引起车祸!
欺骗内容过滤系统使其无法识别出具有攻击性的和非法的信息。
欺骗ATM支票扫描系统使其错误的识别支票上面的实际金额信息。(如果你被抓到的话还可以很合理的推卸掉自己的罪责!)
这些攻击方法不仅限于图片篡改。你可以用同样的方式去欺骗处理其他种类数据的分类器。譬如,你可以欺骗病毒扫描仪将你的病毒错误地识别为安全的!
我们如何防止这样的攻击?
现在我们知道了神经网络是可以被欺骗的(包括其他的机器学习模型),我们如何防止呢?
简单来说,还没有人是能完完全全保证安全的。防止这类攻击的方法仍然在研究中。要始终紧跟最新的研究进展,最好的方式是跟进Ian Goodfellow和Nicolas Papernot写的cleverhans博客,他们俩是这一领域里最具有影响力的研究者。
但是我们目前已经知道的一些事情是:
如果你只是简单的创造很多被“黑”的图片,并将这些纳入到你之后的训练数据中,这会使你的神经网络更容易抵抗这些攻击。我们称之为对抗性训练,这也许是目前最可以考虑的一种防御手段。
有另外一种有效果的方法叫做防御性蒸馏法,这种方法是训练另一个模型来模仿你原有的模型。但这是一种新的方法并且相当复杂,所以除非有特殊的需求,我还不想继续研究这个方法。
目前为止,研究人员尝试了其他所有能想到的防御这些攻击的方法,都失败了。
既然我们还没有最后的定论,我建议你在使用神经网络的时候考虑一下这种攻击会对你的工作带来什么样的损失,至少可以降低一些风险。
譬如,如果你只有一个单一的机器学习模型作为鉴别保密信息源的唯一安全防线,即使它不会被欺骗,也并不是一个好主意。但是假如你只是用机器学习作为一个中间处理过程,还是有人工鉴别的操作,也许就会没事。
换句话说,将机器学习模型和其他手段一样看成不是完全可靠的技术。想一想如果某个用户故意黑进你的系统欺骗你的网络,这会带来什么样的后果,你需要怎么样处理来降低这种风险。
原文发布时间为:原作者:Adam Geitgey编译:吴双,大力,笪洁琼,Aileen本文来自云栖社区合作伙伴“大数据文摘”,了解相关信息可以关注“大数据文摘”微信公众号
如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:yqgroup@service.aliyun.com 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】中办国办印发《推进互联网协议第六版(IPv6)规模部署行动计划》加快推进基于 IPv6 的下一代互联网规模部署,计划指出2025年末中国 IPv6 规模要达到世界第一,阿里云也第一时间宣布了将全面提供IPv6服务,那么在全面部署 IPV6 前,你需要了解都在这儿&&
阿里云机器学习是基于阿里云分布式计算引擎的一款机器学习算法平台。用户通过拖拉拽的方式可视化的操作组件来进行试验,...
帮助您基于阿里云构建出一个隔离的网络环境。您可以完全掌控自己的虚拟网络,如选择自有 IP 地址范围、划分网段、配...
在云上签发Symantec、WoSign、CFCA证书,实现网站HTTPS化,使网站可信,防劫持、防篡改、防监听...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
Loading...}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信