ML(5)——神经网络3(随机初始化与梯度检验)
随机初始化
在线性回归和逻辑回归中,使用梯度下降法之前,将θ设置为0向量,有时会习惯性的将神经网络中的权重全部初始化为0,然而这在神经网络中并不适用。
以简单的三层神经网络为例,将全部权重都设置为0,如下图所示:

假设仅有一个训练数据,使用梯度下降,在第一次迭代时:


可以看到,第一次迭代的结果是:隐藏层的权重和激活值全部相等,输入层的权重相当于所有输入项放缩了相同的倍数。
在第二次迭代时:

此时,隐藏层的激活值又一次全部相等。继续迭代也会得到相同的结果,即a(2)的所有激活值和权重都一样,这显然不是我们期待的结果。
为了应对上述问题,我们使用一种被称为“随机初始化”的方法去初始化神经网络的权值,具体来说,就是将所有权值在一个范围内赋予随机值,通常这个范围取[-1, 1]。下面是代码示例:
Octave:
init_epsilon = 1;
Theta1 = rand(10, 15) * (init_epsilon * 2) - init_epsilon;
Theta2 = rand(1, 10) * (init_epsilon * 2) - init_epsilon;
Python:
import numpy as np init_epsilon = 1
theta1 = np.random.random((15,10)) * (init_epsilon * 2) - init_epsilon
theta2 = np.random.random((10,1)) * (init_epsilon * 2) - init_epsilon
梯度检验
反向传播算法很高效,但对梯度的求解异常繁琐,实际上,即使某处代码计算出错误的梯度,仍然会得到一个模型,尽管这个模型的J(Θ)很小,但对新数据的拟合非常差,此时不得不重新审视所有代码。
是否可以从一开始就知道梯度是否正确呢?答案是肯定的,这就是梯度检验法。
梯度检验法是通过一种简单的方法取得近似的梯度,将这个近似的梯度与真正的梯度对比,如果很接近,则认为梯度正确,否则认为梯度有误。
将J(θ)和θ放入直角坐标系,下图所示是θ取定值时J(θ)的导数:

ε 是一个很小的值:

如上图所示:

当ε→0时,这趋近于导数的定义:

我们也不希望ε太小,通常取ε = 10-4较为合适。
假设J(θ) = θ3,θ = 1,ε = 0.01,则:

如果J(θ) = J(θ1, θ2, …, θn),则θj 的偏导:

需要注意的是,梯度检验是数值计算,其代价远远高出能够使用向量矩阵计算的反向传播,所以一旦确认算法无误,就应当关闭梯度检验。
数据拟合
隐藏层节点越多,层数越多,神经网络的规模越大。在数据拟合上,神经网络的规模越大,拟合效果越好。

上图的三个神经网络解决的是同样的二分类问题,后两个的规模要大于第一个。需要注意的是,随着神经网络规模的增大,计算量也大大提高,同时更容易出现过拟合。在出现过拟合问题时,可以尝试调整正则化系数。关于正则化,可参考《ML(附录3)——过拟合与欠拟合》
作者:我是8位的
出处:http://www.cnblogs.com/bigmonkey
本文以学习、研究和分享为主,如需转载,请联系本人,标明作者和出处,非商业用途!
扫描二维码关注公众号“我是8位的”

ML(5)——神经网络3(随机初始化与梯度检验)的更多相关文章
- ubuntu之路——day7.4 梯度爆炸和梯度消失、初始化权重、梯度的数值逼近和梯度检验
梯度爆炸和梯度消失: W[i] > 1:梯度爆炸(呈指数级增长) W[i] < 1:梯度消失(呈指数级衰减) *.注意此时的1指单位矩阵,W也是系数矩阵 初始化权重: np.random. ...
- 机器学习算法的调试---梯度检验(Gradient Checking)
梯度检验是一种对求导结果进行数值检验的方法,该方法可以验证求导代码是否正确. 1. 数学原理 考虑我们想要最小化以 θ 为自变量的目标函数 J(θ)(θ 可以为标量和可以为矢量,在 Numpy 的 ...
- 贝叶斯分类器,随机森林,梯度下载森林,神经网络相关参数的意义和data leakage
构建的每一颗树的数据都是有放回的随机抽取的(也叫bootstrap),n_estimators参数是你想设置多少颗树,还有就是在进行树的结点分裂的时候,是随机选取一个特征子集,然后找到最佳的分裂标准.
- [AI]神经网络章2 神经网络中反向传播与梯度下降的基本概念
反向传播和梯度下降这两个词,第一眼看上去似懂非懂,不明觉厉.这两个概念是整个神经网络中的重要组成部分,是和误差函数/损失函数的概念分不开的. 神经网络训练的最基本的思想就是:先“蒙”一个结果,我们叫预 ...
- 改善深层神经网络_优化算法_mini-batch梯度下降、指数加权平均、动量梯度下降、RMSprop、Adam优化、学习率衰减
1.mini-batch梯度下降 在前面学习向量化时,知道了可以将训练样本横向堆叠,形成一个输入矩阵和对应的输出矩阵: 当数据量不是太大时,这样做当然会充分利用向量化的优点,一次训练中就可以将所有训练 ...
- 神经网络权值初始化方法-Xavier
https://blog.csdn.net/u011534057/article/details/51673458 https://blog.csdn.net/qq_34784753/article/ ...
- Coursera ML笔记 - 神经网络(Representation)
前言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归.逻辑回归.Softmax回归.神经网络和SVM等等,主要学习资料来自Standford Andrew N ...
- TensorFlow中权重的随机初始化
一开始没看懂stddev是什么参数,找了一下,在tensorflow/python/ops里有random_ops,其中是这么写的: def random_normal(shape, mean=0.0 ...
- OpenCV 2.x/3.x 随机初始化矩阵
简介 在测试算法的时候,或者某些算法需要使用随机数,本文介绍如何使用OpenCV的随机数相关功能. 主要内容: 1. cv::RNG类 -- random number generator 2. cv ...
随机推荐
- Redis部署与基本操作
1.安装 1)不指定安装位置,则会把redis的可执行文件安装到 redis-2.8.6/src/目录下 [root@CentOS6 ~]# ls anaconda-ks.cfg httpd-2. ...
- centos installation of matlab R2015b
the source of installation is in the website: http://blog.csdn.net/hejunqing14/article/details/50265 ...
- nginx——防盗链功能
我们经常会看到在浏览某一图片时会弹出一“403权限禁止”错误,这说明有可能正在浏览的这个网站用到的图片在盗用别的网站图片,而被盗用的网站采用了防盗链技术.那么怎样才能不让自己的网站受害呢? 下面我来介 ...
- php优秀框架codeigniter学习系列——CI_Utf8类
CI_Utf8类用来对Utf8编码环境提供支持.(Provides support for UTF-8 environments). 从构造函数看,只有当开启了PCRE模式,加载了iconv或者mbs ...
- javascript性能优化之Dom编程性能调优总结
1.最小化的Dom访问,在一次Dom访问做尽可能多的操作: 2.使用局部变量存放指向反复访问的元素节点的Dom引用,原则上js代码中不应该重复获取同一个元素节点,除非它在运行过程中发生改变: 3.对元 ...
- python 常用的高阶函数
前言 高阶函数指的是能接收函数作为参数的函数或类:python中有一些内置的高阶函数,在某些场合使用可以提高代码的效率. map() map函数可以把一个迭代对象转换成另一个可迭代对象,不过在pyth ...
- python中字符串的操作方法
python中字符串的操作方法大全 更新时间:2018年06月03日 10:08:51 作者:骏马金龙 我要评论这篇文章主要给大家介绍了关于python中字符串操作方法的相关资料,文中通过示例代码详细 ...
- spring 事务控制 设置手动回滚 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//假设这是一个service类的片段 try{ //出现异常 } catch (Exception e) { e.printStackTrace(); //设置手动回滚 TransactionAsp ...
- CompletableFuture
若你的意图是并发,而非并行,或者你的主要目标是在同一个CPU上执行几个松耦合的任务,充分利用CPU的核,让其足够忙碌,从而最大化程序的吞吐量,那么其实真正想做的避免因为等待远程服务的返回,或对数据库的 ...
- PHP实现二叉树的深度优先遍历(前序、中序、后序)和广度优先遍历(层次)
前言: 深度优先遍历:对每一个可能的分支路径深入到不能再深入为止,而且每个结点只能访问一次.要特别注意的是,二叉树的深度优先遍历比较特殊,可以细分为先序遍历.中序遍历.后序遍历.具体说明如下: 前序遍 ...