单个神经元
1. Sigmoid:
1. 饱和使梯度消失--初始化权重选择难
2. 输出非零中心--影响梯度下降
2. Tanh
3. ReLU(主要利用)(max(0,x))
1. 容易死亡
4.Leak ReLU
5. Maxout
神经网络结构
1. 层组织
1. 不能循环
2. 分层,最普通的为全连接层(fully-connected layer)--与其前后两层是完全成对连接的,但是同一个全连接层内的神经元之间没有连接
3. 命名规则:当我们说N层神经网络的时候,我们没有把输入层算入。
4. 输出层无激活函数
5. E. 网络尺寸:神经元个数与参数个数(输入层不算) Net1:6个神经元,26个参数
6. F. 权重矩阵:以网络1为例,对第一层W1为[该层神经元个数4,上层神经元个数3] 当上层给出的输入为x[3,1]时,输出就直接为np.dot(W1,x)
2. 表达能力
1. 有证明:
给出任意连续函数f(x)和任意ε>0均存在一个至少含1个隐层的神经网络g(x)(并且网络中有合理选择的非线性激活函数,比如sigmoid),对于∀x,使得$|f(x)-g(x)| < ε$
换句话说,神经网络可以近似任何连续函数。
但神经网络,特别是卷积神经网络,层的深度很重要(一种解释是图像拥有层次化结构)
3. 设置层的数量与尺寸
1. 防止过拟合,L2正则化,dropout,输入噪声等方法,比减少神经元数量要好得多
设置数据和模型
1. 数据预处理
1. 均值减法(Mean subtraction)数据中每个独立特征减去平均值.X -=np.mean(X,axis=0) 或 X -= np.mean(X)
2. 归一化(Normalization):只有在确信不同的输入特征有不同的输入范围时才有意义
1. 做零中心化(zero-centered)再每个维度除其标准差 X /= np.std(X,axis=0)
2. 对每个维度做归一化,是的每个维度的最大值和最小值为1和-1
3. 图像由于在[0:255]之间,所有并不是很必
3. PCA与白化(Whitening)
2. 权重初始化
1. 小随机数初始化: `W= 0.01*np.random.radn(D,H)//返回D*H大小矩阵,元素为均值为0,方差为1的标准高斯分布`
2. 使用`1/sqrt(n)`校准方差: 小随机数初始化随着输入数据增长,随机初始化后输出分布中方差也增大,根据输入数据量的平方根来调整其数值范围即`W = np.random.randn(n)/sqrt(n)`
代码为`w = np.random.randn(n) * sqrt(2.0/n)`。这个形式是神经网络算法使用ReLU神经元时的当前最佳推荐。
3. 稀疏初始化(Sparse initialization)另一个处理非标定方差的方法是将所有权重矩阵设为0,但是为了打破对称性,每个神经元都同下一层固定数目的神经元随机连接(其权重数值由一个小的高斯分布生成)。一个比较典型的连接数目是10个。
4. 偏置(biases)的初始化。通常将偏置初始化为0,这是因为随机小数值权重矩阵已经打破了对称性。对于ReLU非线性激活函数,有研究人员喜欢使用如0.01这样的小数值常量作为所有偏置的初始值,这是因为他们认为这样做能让所有的ReLU单元一开始就激活,这样就能保存并传播一些梯度。然而,这样做是不是总是能提高算法性能并不清楚(有时候实验结果反而显示性能更差),所以通常还是使用0来初始化偏置参数。
5. 批量归一化(Batch Normalization)。[批量归一化](https://arxiv.org/abs/1502.03167)是loffe和Szegedy最近才提出的方法,该方法减轻了如何合理初始化神经网络这个棘手问题带来的头痛:),其做法是让激活数据在训练开始前通过一个网络,网络处理数据使其服从标准高斯分布。因为归一化是一个简单可求导的操作,所以上述思路是可行的。在实现层面,应用这个技巧通常意味着全连接层(或者是卷积层,后续会讲)与激活函数之间添加一个BatchNorm层。在实践中,使用了批量归一化的网络对于不好的初始值有更强的鲁棒性。最后一句话总结:批量归一化可以理解为在网络的每一层之前都做预处理,只是这种操作以另一种方式与网络集成在了一起。
3. 正则化 Regularization
1. L2正则:损失函数加上$\frac{1}{2}\lambda w^2 $.L2正则化可以直观理解为它对于大数值的权重向量进行严厉惩罚,倾向于更加分散的权重向量.使网络更倾向于使用所有输入特征,而不是严重依赖输入特征中某些小部分特征。最后需要注意在梯度下降和参数更新的时候,使用L2正则化意味着所有的权重都以$W += -\lambda * W$向着0线性下降。
2. L1正则化:损失函数加上$\lambda |w $它会让权重向量在最优化的过程中变得稀疏(即非常接近0)。也就是说,使用L1正则化的神经元最后使用的是它们最重要的输入数据的稀疏子集.如果不是特别关注某些明确的特征选择,一般说来L2正则化都会比L1正则化效果好。