Relu:Deep Sparse Rectifier Neural Networks论文浅读
本文的思想是基于对脑科学的研究,这才是人工神经网络的本质,要基于数学和生物学的研究,而不是炼丹,但是炼丹真香
0.知识点补充
正则化:L1正则化和L2正则化可以看做是损失函数的惩罚项, 也叫L1范数 和 L2范数,一般回归分析中w表示特征的系数,从上式可以看到正则化项是对系数做了处理。对于线性回归模型,使用L1正则化的模型建叫做Lasso回归,后面那一项才是。
使用L2正则化的模型叫做Ridge回归(岭回归),同上后面那个才是
dropout:
(1) 首先随机(临时)删掉网络中一半的隐藏神经元,输入输出神经元保持不变
(2) 然后把输入x通过修改后的网络前向传播,然后把得到的损失结果通过修改的网络反向传播。一小批训练样本执行完这个过程后,在没有被删除的神经元上按照随机梯度下降法更新对应的参数(w,b)。
(3)然后继续重复这一过程:
. 恢复被删掉的神经元(此时被删除的神经元保持原样,而没有被删除的神经元已经有所更新)
. 从隐藏层神经元中随机选择一个一半大小的子集临时删除掉(备份被删除神经元的参数)。
. 对一小批训练样本,先前向传播然后反向传播损失并根据随机梯度下降法更新参数(w,b) (没有被删除的那一部分参数得到更新,删除的神经元参数保持被删除前的结果)。
不断重复这一过程。
1.稀疏 Sparse
1.1传统的正则化
对脑能量消耗的研究表明,神经元以稀疏和分布的方式编码信息,同时活跃的神经元的百分比估计在 1% 到 4% 之间,然后就要模仿他来进行部分响应,好几种思路,来进行防止过拟合:
dropout—直接伪随机抛弃,不激活一些神经元;
l1、l2正则化——加一点规则来限制控制模型复杂度,减小过拟合
之前用的激活函数都是Sigmoid 和 Tanh 右图:
对于深层网络,sigmoid函数反向传播时,很容易就会出现梯度消失的情况(在sigmoid接近饱和区时,变换太缓慢,导数趋于0),从而无法完成深层网络的训练。
而左图是人类脑部神经元未激活时候电信号的表现,和relu很像
1.2稀疏的优点
信息分离: 原始数据中通常缠绕着高度密集的特征,从原始数据中分离出关键特征数据。
有效的大小可变表示: 不同的输入,信息量可能不同,这就要求我们的表示也是大小可变的。而改变激活神经元的数量就可以让模型控制表示的有效维度以及需要的精度。
线性可分: 稀疏特征有更大可能线性可分,或者对非线性映射机制有更小的依赖。
稠密分布和稀疏分布: 稠密缠绕分布着的特征是信息最富集的特征,往往比局部少数点携带的特征成倍的有效。而稀疏特征,正是从稠密缠绕区解离出来的。
反向传播容易: 采用sigmoid等函数,反向传播求误差梯度时,求导计算量很大,而Relu求导非常容易
Relu会使一部分神经元的输出为0,这样就造成了网络的稀疏性,并且减少了参数的相互依存关系,缓解了过拟合问题的发生
1.3缺点
太过强调稀疏性也会减少模型的有效容量,降低性能。
2.实验结果
作者证明了预训练的作用,而且在无预训练的情况下,relu函数是最优秀的激活函数。
3.个人实验
网络结构:
self.conv1 = nn.Sequential(
nn.Conv2d(1, 16, kernel_size=5, padding=2),
nn.BatchNorm2d(16),
nn.ReLU(),
nn.MaxPool2d(2))
self.conv2 = nn.Sequential(
nn.Conv2d(16, 32, kernel_size=5, padding=2),
nn.BatchNorm2d(32),
nn.Sigmoid(),
nn.MaxPool2d(2))
self.fc = nn.Linear(7 * 7 * 32, 10)
def forward(self, x):
out = self.conv1(x)
out = self.conv2(out)
out = out.view(out.size(0), -1) # reshape
out = self.fc(out)
return out
实验证明relu函数在一开始的训练时均有较好的表现
而sigmoid函数表现很差