cs231n笔记04:神经网络训练(上)

lecture6

  • 前向传播计算举例。神经网络按层组织的重要原因是,这个结构可以通过矩阵运算简单高效评估神经网络。所有样本会被并行化高效计算出来。
  • 表达能力。神经网络全连接层定义了权重向量的函数族,这些函数表达能力是什么?不能用神经网络建模吗?事实上,一个隐含层的神经网络可以近似任何函数。那为什么采用更多层数的原因是,数学上可以近似,但实践中效果较差。实践中深度网络效果比单层网络好。3层比2层好,但是4,5,6层有时候帮助很小。CNN不同,CNN层数多好,原因可能是图像拥有层次化结构,如脸由眼睛组成,眼睛由边缘组成。

确定网络层数

  • 增加隐含层数及规模,网络容量增加。 因为神经元表达不同函数,表达函数空间增长。
  • 神经网络利用更多神经元表达更复杂的函数,但也可能造成过拟合,泛化能力差。如果数据不是太复杂,看上去优先选择小一点的神经网络。但这是不对的,因为我们有很多方式防止过拟合,如L2正则化,dropout,输入噪音等。因为小神经网络很难利用梯度下降训练。损失函数虽然有较少的局部最小,这些局部最小很容易收敛,但这些最小值一般很差,损失值很高。

数据预处理

主要有三种预处理形式。
- 均值减法,每个特征减去平均值,使每个维度中心移到原点。
- 归一化,使数据在各个维度规模差不多。如果是0中心的,可以用数据除它的标准差,另一种形式是最大最小归一化,使数据在[-1,1]。
- PCA和白化。首先,将数据中心化,再计算数据协方差矩阵。协方差矩阵SVD分解,U的列是特征向量,将已经零中心化的数据投影到特征基准上。留下方差大的维度,实现降维。白化输入特征基准上的数据,每个维度除以特征值进行归一化。数据服从多变量的高斯分布,白化后是一个均值为零,协方差相等矩阵的高斯分布。这种转换不用在CNN中。

X -= np.mean(X,axis=0) #零中心化
cov = np.dot(X.T,X)/(X.shape[0]) #对角线是方差
U,S,V = np.linalg.svd(cov) #协方差矩阵svd分解
Xrot = np.dot(X,U)
Xrot_reduced = np.dot(X,U[:100]) #选方差大的维度,降维 
Xwhite = Xrot/np.sqrt(S+1e-5) #白化,可以增加1e-5使更平滑
  • 注意任何预处理策略都只能在训练集计算。

权重初始化

  • 错误:零初始化。数据是归一化的,权重大约是一半正一半负。如果权重初始值为0,每个神经元都计算同样输出,神经元之间失去了不对称的源头。
  • 小随机数。可以设置神经元初始值从多维高斯分布取值,接近0.但小权重也不是一定好,这样计算出非常小的梯度,减小反向传播中的梯度信号,深度网络可能出问题。
  • 使用1/sqrt(n)校准方差。保证神经元初始时有近似同样的输出分布。最近研究ReLU神经网络用1*sqrt(2/n)校准方差更合适。
  • 稀疏初始化。权重设为0,为了打破对称性,神经元与下一层一定数量神经元随机连接,权重由高斯分布产生,数量一般设为10.
  • 偏置一般设为0.
  • 批量归一化。激活数据通过网络使其服从高斯分布。对不好的初值有鲁棒性。一般在全连接层之后,在非线性激活函数之前。提高了网络中的梯度流动,更高学习效率,减少对初值的强依赖。

正则化

  • L2正则化,倾向更分散的权重向量,对大数值的权重向量惩罚。
  • L1正则化,让权重向量在最优化过程中变的稀疏,一般L2正则化效果更好。
  • 最大范式约束。
  • 随机失活。神经元以超参数p的概率被激活或被设置为0.实践中更倾向使用反向随机失活,只在前向传播中有随机行为。一般设置p=0.5,与L2正则结合使用。

猜你喜欢

转载自blog.csdn.net/qq_33476409/article/details/82050106