为什么要用稀疏自编码而不直接设更少的隐层节点
来源:互联网 发布:维码器使用软件下载 编辑:程序博客网 时间:2024/06/04 19:56
刚学自编码,以下是本人关于题目问题的一点思考。
自编码器是一种非常简单的BP神经网络,是一种无监督学习算法。
使用一个三层(只有一个隐含层)的自编码网络,然后设置隐含节点的数量少于输入层节点,就能够轻松地实现特征降维。如图:
Fig1. 自编码器网络结构(图片来自网络)
refer to: Deep Learning(深度学习)学习笔记整理系列之(四)
如果隐藏节点比可视节点(输入、输出)少的话,由于被迫的降维,自编码器会自动习得训练样本的特征(变化最大,信息量最多的维度)。但是如果隐藏节点数目过多,甚至比可视节点数目还多的时候,自编码器不仅会丧失这种能力,更可能会习得一种“恒等函数”——直接把输入复制过去作为输出。这时候,我们需要对隐藏节点进行稀疏性限制。
Fig2. 稀疏自编码器模型(图片来自网络)
这里说当隐含节点数量太大的时候,需要通过引入正则项(比如上图的L1限制)来使得每次表达的code尽量稀疏。
那么这样和用更少的隐含节点相比,有什么用呢?
其实可以和SVM比较:
1. 原本使用的是比较少的隐含节点数,相当于使用线性核的SVM。这时候模型很简单,但是它的表现能力是比较有限的。
2. 增加节点的数量,相当于使用了多项式核的SVM。这时候的模型表示能力变强了,但是容易过拟合(如用9项式来拟合10个样本点)。
3. 添加限制,让每次得到的表达code尽量系数,相当于给多项式的SVM添加了正则约束项(如还是用9项式来拟合10个样本点,但是我们限制之后只能有两项不是0),这是就不会再过拟合了。
总结就是: 使用了更多的隐含节点之后,模型具有了更强大表达能力;但是同时会导致过拟合的问题,所以需要通过添加约束条件来限制,这时候模型依然具有很强的表达能力(和少隐含节点的模型比),却又避免了过拟合的问题。而且因为实际上不为0(或不接近0)的权值很少,所以网络被迫用少量的节点来学习到网络的整体信息,这些被学习到的特征都非常有代表性。
- 为什么要用稀疏自编码而不直接设更少的隐层节点
- 为什么要用sizeof(int),而不直接使用2?
- 为什么用datastage而不直接用sql
- java 字符串拼接为什么要用 StringBuilder 而不直接用 String 相加连接
- 为什么局域网要用mac地址而不直接使用IP地址
- C++中为什么要用指针,而不直接使用对象?
- 稀疏自编码
- 稀疏自编码
- 稀疏自编码
- 稀疏自编码
- 稀疏自编码
- 稀疏自编码
- 稀疏编码自编码表达
- 为什么不直接使用Response.Write而要使用Response.Output.WriteLine
- 为什么是List list = new ArrayList(),而不直接用ArrayList
- 为什么计算函数极值用梯度下降算法而不直接令导数为0求解
- "为什么是List list = new ArrayList(),而不直接用ArrayList"?
- 为什么service层要打成war包而不打成jar包?
- C 【NOIP2017提高组模拟12.18】
- OJ.字符串查找
- Row-oriented layout & Column-oriented layout
- 翻译《有关编程、重构及其他的终极问题?》——12.当使用拷贝黏贴,一定要特别注意最后一行
- ViewStub?
- 为什么要用稀疏自编码而不直接设更少的隐层节点
- 【codeforces 572C】Lengthening Sticks
- protobuf windows x64 bat 编译
- 挖财面试总结
- c# 源码深度剖析 list
- 软键盘的隐藏、显示。
- 获取当前运行的进程名?
- Python环境配置
- 矩阵分解总结