cs231n-(5)神经网络-2:设置数据和Loss
数据预处理神经网络输入的数据往往要经过预处理。假设数据 减去均值最长用的就是减去每个特征的均值(均值常常有训练集计算得到),减去均值的几何意义是将数据中心大致移到零点。。使用 正则化正则化是指将数据各个维度归一化,即变化范围相同。一般有两种方法:1、将数据均值设为零(如减去均值),之后除以标准差: 下去就是原始数据,零中心化,正则化处理的效果。 PCA and WhiteningPCA是用来降维,假设已经完成了零中心化和归一化,降维过程如下: # Assume input data matrix X of size [N x D]
X -= np.mean(X,axis = 0) # zero-center the data (important)
cov = np.dot(X.T,X) / X.shape[0] # get the data covariance matrix
协方差矩阵中(i,j)位的数据表示i维度和j维度数据的协方差;对角线上数据表示某一维度的方差。协方差矩阵是对称的半正定矩阵,对它进行SVD分解: U,S,V = np.linalg.svd(cov) 得到 Xrot = np.dot(X,U) # decorrelate the data
其中 Xrot_reduced = np.dot(X,U[:,:100]) # Xrot_reduced becomes [N x 100]
通过这个操作,保留了前100维度数据(以方差大小为标准)。 经过PCA处理的数据,可以再经过白化Whitening处理。白化是指PCA处理后的数据,每个维度除以其特征值。几何解释就是服从多维度高斯分布的数据,经过白化处理后,服从均值为零,协方差相等的分布。 # whiten the data:
# divide by the eigenvalues (which are square roots of the singular values)
Xwhite = Xrot / np.sqrt(S + 1e-5)
上面处理为白化操作,分母加上 上图左边分布为原始数据。中间为PAC处理后的数据,可以看出PCA处理后,将坐标轴旋转,可以看出横轴信息量大,如果只保留一维数据,要丢弃纵轴数据。右边为白化处理后的数据,数据范围相同了 使用CIFAR-10来展示PCA和白化 注意:CNN不需要进行PCA和白化操作,这里提到只是讲解数据处理的一般方法。 权重初始化训练神经网络前,要先初始化权重。 全部初始化为零权重最终的值我们不知道,但是根据前面数据预处理过程,大概可以猜到,权重最终应该是一般为正,一般为负。但是权重不能全部初始化为零。如果全部初始化为零,那么所有神经元输出将相同,计算得到所有梯度都相同,权重更新相同,最终得到的权重也相同。 小的随机数因为正则化,权重要比较小,但是又不能对称;那么可以用小的随机数来初始化。这样计算得到不同梯度,迭代更新权重会趋向不同。例如这样初始化。 小的权重并不一定会得到好的效果。神经网络中,如果权重比较小,那么反向传播时,梯度就比较小。这样会减小梯度传播的信号,在深度神经网络中也是个问题。 校准方差如果神经元输出有着相似的分布,那么收敛速度回加快。前面提到的权重初始化方法,随着输入增大,输出的方差会增大。通过除以 不考虑非线性激活函数,假设输出
上面第三步中,用到了假设
论文Understanding the difficulty of training deep feedforward neural networks推荐初始化方式为
稀疏初始化首先将所有权重初始化为零,但是为了避免对称,随机在层之间连接个别神经全,权重初始化可以使用小的高斯分布,连接个数常常设置为10. 实际应用目录,使用ReLU激活函数的,建议初始化为 批归一化 Batch Normalization这是个最近出现的技术,参考论文。它在一定程度上减轻了如何初始化网络权重的问题。具体做法为让数据在输入激活函数前先通过一个网络,通过这个网络之后,输出数据(即输入激活函数的数据)服从标准高斯分布。因为归一化是一个可以简单的求导操作,因此方案可行。实际应用中,常常在全连接层(卷积层)和激活函数(非线性操作)之间插入一个BatchNormalization层。批归一化可以理解为在网络每一层之前都做了预处理。 正则化正则化用来阻止网络过拟合,有以下几种方法: L2 regularizationL2正则化是最常用的方法;它可以直接惩罚目标函数中任何一个权重平方的幅度。具体实现时对于每一个权重
L1 regularizationL1正则化也是常用的一种方法,在目标函数中,它给每个权重加上一项
Max norm constraintsMax norm正则化限制梯度幅度最大值,并使用投影梯度来确保限制。使用中,参数更新方式不变,只需要检查更新后满足
DropoutDrop是非常简单高效的正则化方法,在论文Dropout: A Simple Way to Prevent Neural Networks from Overfitting 中介绍,可以作为上面正则化方法的补充。它的思想为在训练时,让神经元以概率
3层网络Dropout代码 """ Vanilla Dropout: Not recommended implementation (see notes below) """
p = 0.5 # probability of keeping a unit active. higher = less dropout
def train_step(X):
""" X contains the data """
# forward pass for example 3-layer neural network
H1 = np.maximum(0,np.dot(W1,X) + b1)
U1 = np.random.rand(*H1.shape) < p # first dropout mask
H1 *= U1 # drop!
H2 = np.maximum(0,np.dot(W2,H1) + b2)
U2 = np.random.rand(*H2.shape) < p # second dropout mask
H2 *= U2 # drop!
out = np.dot(W3,H2) + b3
# backward pass: compute gradients... (not shown)
# perform parameter update... (not shown)
def predict(X):
# ensembled forward pass
H1 = np.maximum(0,X) + b1) * p # NOTE: scale the activations
H2 = np.maximum(0,H1) + b2) * p # NOTE: scale the activations
out = np.dot(W3,H2) + b3
在训练时使用了Dropout,在预测没有使用Dropout。在使用DropOut时,以概率
因为我们更加关心测试时的性能,在预测时增加计算会减低生产环境性能;一个解决的方法为在训练时,把使用DropOut的层除以概率
""" Inverted Dropout: Recommended implementation example. We drop and scale at train time and don't do anything at test time. """
p = 0.5 # probability of keeping a unit active. higher = less dropout
def train_step(X):
# forward pass for example 3-layer neural network
H1 = np.maximum(0,X) + b1)
U1 = (np.random.rand(*H1.shape) < p) / p # first dropout mask. Notice /p!
H1 *= U1 # drop!
H2 = np.maximum(0,H1) + b2)
U2 = (np.random.rand(*H2.shape) < p) / p # second dropout mask. Notice /p!
H2 *= U2 # drop!
out = np.dot(W3,X) + b1) # no scaling necessary
H2 = np.maximum(0,H1) + b2)
out = np.dot(W3,H2) + b3
更多内容可以参考 Theme of noise in forward passDropOut是在前向传播时引入一些随机行为,在预测时通过数值方法补偿这个随机行为。这样类似的方法还有DropConnect。 Bias regularization偏置不直接和输入数据相乘,它并不直接影响某一维度的数据,因此常常不用对偏置正则化。实际应用中,数据合理预处理后,对偏置正则化也很少导致算法性能变差;可能是因为权重系数远远多于偏置。 Per-layer regularization.不同的层使用不同的正则化方法。很少见。 实践1、全局使用L2正则化,
损失函数这里来讨论损失函数中的数据损失部分,在监督学习中常常用到,用来衡量预测值和真实值的差异程度。损失函数是输入数据的平均
分类问题这里假设每个样本都只有一个标签,最常用的两个损失函数为:
第一个是SVM分类中用到的,第二个时Softmax分类器用到的交叉熵loss。 Problem: Large number of classes.当标签集合特别大时(例如单词字典等),要使用Hierarchical Softmax。其思想为,把标签构建为一棵树,每个标签为树的一条路径,在树的每个结点训练Softmax分类器。树的结构要依具体问题而定。 Attribute classification如果一个样本的标签不止一个时,例如标签
还有一个方法,就是对每个标签训练一个分类器,那么loss函数为
这里
回归对于预测连续值,回归问题的loss函数有L2正则化和L1正则化形式,分别为
注意1、与更加稳定的loss(例如Softmax),L2 loss更加难以优化。L2 loss要求每个输入都要输出正确值;而Softmax的评分并不重要,只有当评分在适当量级时才有意义。 Structured prediction结构化预测是指标签是任意的形状(树,图等),通常假设结构空间非常大且难以遍历。其思想和结构化SVM类似,在正确分类和分值最高的错误分类间建立一个分类面。 总结1、数据预处理:零中心化,正则化把特征范围缩放为[-1,1]。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |