深度学习笔记:稀疏自编码器(3)——稀疏自编码算法

  有了神经网络和反向传播的基础,我们就可以将其应用到稀疏自编码器中了。稀疏自编码器属于非监督学习,主要通过尝试学习一个 hW,b(x)x 的函数,来提取输入值 x 中的特征。

0.本文中使用的符号

  本文中使用的符号大体与上一篇文章相同,在此仅列出一些新增加的符号和需要注意的符号

符号 描述
m 样本总数 a(2)j 第2层第 j 个神经元的激活度
a(2)j(x) 在给定输入值为 x 的情况下,第2层第j个神经元的激活度 ρj^ ρj^=1mmi=1[a(2)j(x(i))] 表示第2层第 j 个隐藏神经元在训练集上的平均活跃度
ρ 表示稀疏性参数,通常是一个接近0的值(如 ρ=0.05 ),可以令 ρj^=ρ ,来对神经元 a(2)j 的稀疏度进行限制 s2 第2层(隐藏层)神经元的数量 hW,b(x) 输入值为 x ,神经网络中权值和偏置项分别为W,b的情况下的输出值

1.什么是稀疏自编码器

  先上图:
此处输入图片的描述
  上图为有一个隐藏层的稀疏自编码器示意图。稀疏自编码器为非监督学习,其所使用的样本集 {x(1),x(2),...,x(m)} 为没有类别标记的样本,我们希望令输出值 hW,b(x) 与输入值 x 近似相等。

2.为什么要用稀疏自编码器

  由于为数据人工增加类别标记是一个非常麻烦的过程,我们希望机器能够自己学习到样本中的一些重要特征。通过对隐藏层施加一些限制,能够使得它在恶劣的环境下学习到能最好表达样本的特征,并能有效地对样本进行降维。这种限制可以是对隐藏层稀疏性的限制。

3.稀疏性限制

3.1稀疏性

  当使用sigmoid函数作为激活函数时,若神经元输出值为1,则可认为其被激活,若神经元输出值为0,则可认为其被抑制(使用tanh函数时,代表激活和抑制的值分别为1和-1)。稀疏性限制就是要保证大多数神经元输出为0,即被抑制的状态。

3.2如何限制隐藏层稀疏性

  在本文开始所给出的稀疏自编码网络中,为了限制隐藏结点稀疏性,可以进行如下表示:
1. 使用a(2)j表示第2层第 j 个神经元的激活度。
2. 使用a(2)j(x)表示在给定输入值为 x 的情况下,第2层第j个神经元的激活度。
3. 使用 ρj^=1mmi=1[a(2)j(x(i))] 表示第2层第 j 个隐藏神经元在训练集上的平均活跃度。
4. 使用ρ表示稀疏性参数,通常是一个接近0的值(如 ρ=0.05 ),可以令 ρj^=ρ ,来对神经元 a(2)j 的稀疏度进行限制。
  我们希望 ρj^ ρ 越接近越好,因此我们要对这两者有显著差异的情况进行惩罚,惩罚使用KL散度。


PS. 什么是KL散度?
  KL散度又称相对熵,是对两个概率分布P和Q差异的非对称性度量,非对称性意味着 D(PQ)D(QP) D(PQ) 表示用概率分布 Q 来拟合概率分布P时所产生的信息损耗。其定义为:
给定随机变量 s ,若为
离散型随机变量:D(PQ)=(p(i)log(p(i)q(i))),此处p和q表示随机变量的分布律, p(i) 表示随机变量 s i的概率
连续型随机变量: D(PQ)=p(s)log(p(s)q(s))d(s) ,此处 p q表示随机变量 s 的概率密度
  KL散度的性质是,当P=Q时值为0,随着 P Q差异增大而递增。


  在这里,我们是要用 ρj^ 去逼近 ρ ,这里的KL散度是:
s2j=1KL(ρρ^j)=s2j=1ρlogρρ^j+(1ρ)log1ρ1ρ^j
  于是我们在代价函数中加入这一惩罚因子,代价函数就变成:
Jsparse(W,b)=J(W,b)+βs2j=1KL(ρρ^j)
  代价函数改变了,在反向传导时残差公式也要做出相应的改变,之前隐藏层第 i 个结点残差为:
δ(2)i=(s3j=1W(2)jiδ(3)j)f(z(2)i)
现在应该将其换成:
δ(2)i=(s3j=1W(2)jiδ(3)j+β(ρρ^i+1ρ1ρ^i))f(z(2)i)


注意:在ufldl的自编码算法和稀疏性中的后向传播算法里,提到隐藏层第 i 个结点残差为:
此处输入图片的描述
但根据ufldl教程反向传导算法一节的推导,残差递推公式为:
此处输入图片的描述
笔者自己根据公式推了一遍,同时加上自己的理解,笔者认为在此处输入图片的描述中,累加的上限应该是s3而不是 s2 ,因此在本文最后处的公式里写的是 s3 ,但笔者由于还是在校学生,知识有限,此处还是存在疑问,恳请看到本文的同学能在这里指点一二,感激不尽!

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
KMP算法是一种字符串匹配算法,用于在一个文本串S内查找一个模式串P的出现位置。它的时间复杂度为O(n+m),其中n为文本串的长度,m为模式串的长度。 KMP算法的核心思想是利用已知信息来避免不必要的字符比较。具体来说,它维护一个next数组,其中next[i]表示当第i个字符匹配失败时,下一次匹配应该从模式串的第next[i]个字符开始。 我们可以通过一个简单的例子来理解KMP算法的思想。假设文本串为S="ababababca",模式串为P="abababca",我们想要在S中查找P的出现位置。 首先,我们可以将P的每个前缀和后缀进行比较,得到next数组: | i | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | --- | - | - | - | - | - | - | - | - | | P | a | b | a | b | a | b | c | a | | next| 0 | 0 | 1 | 2 | 3 | 4 | 0 | 1 | 接下来,我们从S的第一个字符开始匹配P。当S的第七个字符和P的第七个字符匹配失败时,我们可以利用next[6]=4,将P向右移动4个字符,使得P的第五个字符与S的第七个字符对齐。此时,我们可以发现P的前五个字符和S的前五个字符已经匹配成功了。因此,我们可以继续从S的第六个字符开始匹配P。 当S的第十个字符和P的第八个字符匹配失败时,我们可以利用next[7]=1,将P向右移动一个字符,使得P的第一个字符和S的第十个字符对齐。此时,我们可以发现P的前一个字符和S的第十个字符已经匹配成功了。因此,我们可以继续从S的第十一个字符开始匹配P。 最终,我们可以发现P出现在S的第二个位置。 下面是KMP算法的C++代码实现:

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值