该节课中主要讲述了针对神经网络输入数据的一些预处理操作,例如:均值化,归一化,PCA与白化等,另外还讲述了损失函数及其正则化。数据预处理在深度学习算法中起着重要作用,在实际的计算过程中,将数据做归一化和白化等处理后,算法往往能够取得较好的效果。

数据预处理之:归一化

均值减法:即将样本数据减去它们的均值。python中操作:

X=X-np.mean(X,axis=0);

示例:

import numpy as np
x=[2 ,4 ,-2 ,-6 ,1]
y1=x-np.mean(x,axis=0)
y1
array([ 2.2,  4.2, -1.8, -5.8,  1.2])

如果数据是平稳的(即数据每一个维度的统计都服从相同的分布),那么可以考虑将每个样本数据都减去它们的平均值(逐样本计算)。对于图像,可以移除图像的平均亮度值,因为很多情况下我们对图像照度并不感兴趣,而是关注其内容,所以将图像整体减去像素均值是有意义的。注意:在处理彩色图像时需要格外小心,因为不同色彩通道中的像素并不都存在平稳特性。
归一化是:将数据的所有维度都归一化,使数值范围近似相等,归一化可以将有量纲的表达式,变换为无量纲的表达式,成为纯量。有两种常用的归一化方法:

(1)先对数据进行零中心化(zero-centered),然后每个维度都除以标准差,由上面的实例继续:

>>> y2=y1/np.std(y1,axis=0)
>>> y2
array([ 0.63089327,  1.2044326 , -0.5161854 , -1.66326407,  0.3441236 ])

对于y2,其标准差为1,证明过程见下图:

(2)对每个维度都做归一化,使每个维度的最大和最小值分别为1和-1。该方法的前提是不同的输入特征具有不同的数值范围(或计量单位)。

上图1中,左边是原始的2维输入数据;中间是数据每个维度上都减去其平均值,得到零中心化数据;右边是数据每个维度都除以其标准差得到的数据。红线表示数据各维度上的数值范围,我们发现零中心化的数据,其范围并不相同,但右边归一化后的数据的范围是相同的。

数据与处理之:PCA和白化

PCA:先对数据进行零中心化处理,然后计算其协方差矩阵,展示数据的相关性结构。

# 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

协方差矩阵是对称和半正定的,可以对协方差矩阵进行奇异值分解(SVD):

U,S,V = np.linalg.svd(cov)

其中,U的列是特征向量,S是含有奇异值的一维数组。为了去除数据相关性,可以将零中心化后的数据投影到特征基准上:

Xrot = np.dot(X, U) # decorrelate the data

其中,U的列是范式为1的标准正交集,所以可以将其看作标准正交基向量。Xrot的协方差矩阵是对角线对称的。np.linalg.svd 的返回值U中,特征向量是按照特征值的大小进行排列的。利用这个性质可以对数据降维,只选用前面的小部分特征向量,这个过程就是主成分分析(PCA)。例如:

Xrot_reduced = np.dot(X, U[:,:100]) # Xrot_reduced 变成 [N x 100]

上面的语句将原始数据集大小降到[N x 100],即只留下数据中包含最大方差的100个维度。使用降维数据训练线性分类器和神经网络会有非常好的性能,同时还能节省时间和存储空间。
白化:白化操作的输入是特征基准上的数据,然后对每个维度的数据除以其特征值来归一化。其几何解释是:如果数据服从多变量高斯分布,白化后数据是具有零均值和恒定协方差矩阵的高斯分布:

# whiten the data:
# divide by the eigenvalues (which are square roots of the singular values)
Xwhite = Xrot / np.sqrt(S + 1e-5)

代码中,分母加了1e-5(或更小的常数)防止分母出现为0的情况。该变换的缺陷是可能夸大数据中的噪声,因为它将所有维度都拉伸到相同的数值范围,而这些维度中含有噪声的维度才是大多数的。在实际操作中,可以使用更强的平滑来解决上述问题(如采用比1e-5更大的值)。

上图2中,左边是二维的原始输入数据;中间是经过PCA操作的数据,其结果是零中心化的,并且变换到了数据协方差矩阵的基准轴上。右边是白化后的数据,每个维度的数据都通过特征值调整范围,协方差矩阵变为恒等矩阵(这里理解的不是很好)。几何意义是将数据在各个方向上进行伸缩,使之服从高斯分布。

备注:课中提到了在实际的卷积神经网络应用中并不一定采用PCA和白化操作,但对数据进行零中心化、对图像像素进行归一化却是很常见的。并且正确的处理策略应该是:先将样本数据分成训练/验证/测试集,只是从训练集中求图片平均值,然后将各个集(训练/验证/测试集)中的图像再减去这个平均值。

权重初始化

对于一个神经网络结构,在开始训练之前,需要初始化网络参数。

首先,全零初始化是一个错误的方法。因为如果权重被初始化为相同的值,神经元就失去了不对称性的源头。正确的初始化方法应该是小随机数初始化,即权重初始值要接近0但又不能是0,此时可以将权重初始化为很小的数值,以此来打破对称性。实现方法:W = 0.01* np.random.randn(D,H),其中randn函数是基于零均值和标准差的高斯分布。当然,并不是初始权重越小越好,因为太小的权重会导致在反向传播过程中计算出的梯度非常小(因为梯度与权重是线性相关的),这会减小反向传播中的“梯度信号”,这在深度网络中可能会出现问题。

上面的方法还存在一个问题是:随着输入数据量的增长,随机初始神经元输出数据的方差也增大。解决方法是:除以输入数据量的平方根来调整数值范围,使神经元输出的方差归一化为1。实现方法:w = np.random.randn(n) / sqrt(n),其中n是输入数据的数量。

偏置初始化

通常将偏置初始化为0,因为小随机数初始权重已经打破了对称性。对于ReLU非线性激活函数,有研究人员喜欢使用如0.01这样的小数值作为所有偏置的初始值,他们认为这样能够让所有的ReLU单元从开始就被激活,从而保存和传播一些梯度。然而,这样做并不一定总能提高算法的性能,通常还是使用0来初始化偏置参数。

在论文《Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification》中,作者He等人给出了一种针对ReLU神经元的特殊初始化方法,并给出结论:网络中神经元的方差应为:2.0/n。实现方法为:

w = np.random.randn(n) * sqrt(2.0/n)。这也是当前神经网络算法使用ReLU神经元时的最佳推荐。

参考:

http://cs231n.github.io/neural-networks-2/

https://zhuanlan.zhihu.com/p/21560667?refer=intelligentunit

https://en.wikipedia.org/wiki/Variance

http://blog.csdn.net/pipisorry/article/details/52247379

https://uqer.io/community/share/56c3e9c6228e5b0fe6b17d95

斯坦福大学深度学习公开课cs231n学习笔记(6)神经网路输入数据预处理(归一化,PCA等)及参数初始化相关推荐

  1. 斯坦福大学深度学习公开课cs231n学习笔记(10)卷积神经网络

    前记:20世纪60年代,Hubel和Wiesel在研究猫脑皮层中用于局部敏感和方向选择的神经元时,发现其独特的网络结构可以有效地降低反馈神经网络的复杂性,继而提出了卷积神经网络(Convolution ...

  2. 斯坦福大学 iOS 开发公开课总结

     斯坦福大学 iOS 开发公开课总结 前言 iPhone 开发相关的教程中最有名的,当数斯坦福大学发布的 "iPhone 开发公开课 " 了.此公开课在以前叫做<iPhone ...

  3. ios专题 - 斯坦福大学iOS开发公开课总结

    转自:http://blog.devtang.com/blog/2012/02/05/mvc-in-ios-develop/ 前言 iphone开发相关的教程中最有名的,当数斯坦福大学发布的" ...

  4. 斯坦福大学iOS开发公开课总结

    前言 iphone开发相关的教程中最有名的,当数斯坦福大学发布的"iphone开发公开课"了.此公开课在以前叫做<iphone开发教程>,今年由于平板电脑的流行,所以也 ...

  5. 转:深度学习课程及深度学习公开课资源整理

    http://www.52nlp.cn/%E6%B7%B1%E5%BA%A6%E5%AD%A6%E4%B9%A0%E8%AF%BE%E7%A8%8B%E6%B7%B1%E5%BA%A6%E5%AD%A ...

  6. 学习:深度学习公开课

    [转] http://www.leiphone.com/news/201701/0milWCyQO4ZbBvuW.html 导语:入门机器学习不知道从哪着手?看这篇就够了. 在当下的机器学习热潮,人才 ...

  7. Deep Learning 9_深度学习UFLDL教程:linear decoder_exercise(斯坦福大学深度学习教程)...

    前言 实验内容:Exercise:Learning color features with Sparse Autoencoders.即:利用线性解码器,从100000张8*8的RGB图像块中提取颜色特 ...

  8. 谷歌深度学习公开课任务 5: Word2VecCBOW

    为什么80%的码农都做不了架构师?>>>    本文由码农场同步,最新版本请查看原文:http://www.hankcs.com/ml/cbow-word2vec.html 课上讲的 ...

  9. 斯坦福大学深度学习与自然语言处理第二讲:词向量

    斯坦福大学在三月份开设了一门"深度学习与自然语言处理"的课程:CS224d: Deep Learning for Natural Language Processing,授课老师是 ...

  10. 斯坦福大学深度学习与自然语言处理第四讲:词窗口分类和神经网络

    斯坦福大学在三月份开设了一门"深度学习与自然语言处理"的课程:CS224d: Deep Learning for Natural Language Processing,授课老师是 ...

最新文章

  1. nagios报警的问题
  2. 搭建PHP环境遇到的问题!!
  3. csu 1976: 搬运工小明
  4. java访问控制度_菜鸡的Java笔记 - java 访问控制权限
  5. python爬虫文字全是乱码_pythone爬虫编码自适应 解决网页乱码
  6. 面向数据流的设计方法
  7. 对计算机组装和维护课的总结,计算机组装与维护教师工作总结
  8. resnet预训练模型_干货 | NLP中的十个预训练模型
  9. 如何才能快速匹配到大号?
  10. 使用Maven 插件构建docker 镜像和推送仓库
  11. DB2 9 根本(730 磨练)认证指南,第 3 部门: 谋面 DB2 数据(4)
  12. 斯维尔密码狗使用方法(附安装资源)
  13. Python 爬虫之 Beautifulsoup4,爬网站图片
  14. 【Prometheus】PrometheusGrafana 监控
  15. RL 笔记(3)PPO(Proximal Policy Optimization)近端策略优化
  16. 《算法导论3rd第一章》算法在计算中的作用
  17. 【Python】批量修改照片日期和文件名
  18. Altium Designer 14.1.5 Build 30772
  19. 我不知道 我知道你不知道 现在我知道了 我也知道了
  20. 不需要邮箱 修改Gitlab账号密码(亲测可用)

热门文章

  1. Amazon AWS S3 上传文件 并获取公用url
  2. 进程间通信学习APUE学习---进程间通信(4)
  3. easyui 分页保存checkbox的选中状态
  4. poj 2828 线段树
  5. phpmyadmin安装出错,缺少 mysqli 扩展。请检查 PHP 配置
  6. 语句删除数据库表中有默认字段值的字段
  7. 分享:将XML(VS提取注释时生成)转换为Chm的一个方法
  8. Jquery—JQuery对checkbox的操作(01)
  9. uniapp 按钮固定在底部
  10. 数据库JDBCUtil 工具类 增加连接池操作