随机初始化

  在线性回归和逻辑回归中,使用梯度下降法之前,将θ设置为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(随机初始化与梯度检验)的更多相关文章

  1. ubuntu之路——day7.4 梯度爆炸和梯度消失、初始化权重、梯度的数值逼近和梯度检验

    梯度爆炸和梯度消失: W[i] > 1:梯度爆炸(呈指数级增长) W[i] < 1:梯度消失(呈指数级衰减) *.注意此时的1指单位矩阵,W也是系数矩阵 初始化权重: np.random. ...

  2. 机器学习算法的调试---梯度检验(Gradient Checking)

    梯度检验是一种对求导结果进行数值检验的方法,该方法可以验证求导代码是否正确. 1. 数学原理   考虑我们想要最小化以 θ 为自变量的目标函数 J(θ)(θ 可以为标量和可以为矢量,在 Numpy 的 ...

  3. 贝叶斯分类器,随机森林,梯度下载森林,神经网络相关参数的意义和data leakage

    构建的每一颗树的数据都是有放回的随机抽取的(也叫bootstrap),n_estimators参数是你想设置多少颗树,还有就是在进行树的结点分裂的时候,是随机选取一个特征子集,然后找到最佳的分裂标准.

  4. [AI]神经网络章2 神经网络中反向传播与梯度下降的基本概念

    反向传播和梯度下降这两个词,第一眼看上去似懂非懂,不明觉厉.这两个概念是整个神经网络中的重要组成部分,是和误差函数/损失函数的概念分不开的. 神经网络训练的最基本的思想就是:先“蒙”一个结果,我们叫预 ...

  5. 改善深层神经网络_优化算法_mini-batch梯度下降、指数加权平均、动量梯度下降、RMSprop、Adam优化、学习率衰减

    1.mini-batch梯度下降 在前面学习向量化时,知道了可以将训练样本横向堆叠,形成一个输入矩阵和对应的输出矩阵: 当数据量不是太大时,这样做当然会充分利用向量化的优点,一次训练中就可以将所有训练 ...

  6. 神经网络权值初始化方法-Xavier

    https://blog.csdn.net/u011534057/article/details/51673458 https://blog.csdn.net/qq_34784753/article/ ...

  7. Coursera ML笔记 - 神经网络(Representation)

    前言 机器学习栏目记录我在学习Machine Learning过程的一些心得笔记,涵盖线性回归.逻辑回归.Softmax回归.神经网络和SVM等等,主要学习资料来自Standford Andrew N ...

  8. TensorFlow中权重的随机初始化

    一开始没看懂stddev是什么参数,找了一下,在tensorflow/python/ops里有random_ops,其中是这么写的: def random_normal(shape, mean=0.0 ...

  9. OpenCV 2.x/3.x 随机初始化矩阵

    简介 在测试算法的时候,或者某些算法需要使用随机数,本文介绍如何使用OpenCV的随机数相关功能. 主要内容: 1. cv::RNG类 -- random number generator 2. cv ...

随机推荐

  1. git中误删提交(commit)后,怎么恢复

    “xml文件存储数据”提交被我误操作,即使用reset  --hard删除了,然后又进行了三次提交,发现删除的提交有用,需要找回来, 于是找了好久,找到好方法: 1.进入工程下的.git文件下,git ...

  2. mybatis mapper配置文件 CustomerMapper.xml

    Dao @Repositorypublic interface CustomerDAO {    public void create(CustomerModel cm);    public voi ...

  3. centos/7下安装mysql5.7

    本文参考自:https://blog.csdn.net/fanshujuntuan/article/details/78077433 背景:在ubuntu下用vagrant搭建了一个集群环境, 每个虚 ...

  4. 70 多表查询的分组F 聚合 Q 查询

    聚合查询和分组查询 聚合 aggregate()是QuerySet 的一个终止子句,意思是说,它返回一个包含一些键值对的字典.键的名称是聚合值的标识符,值是计算出来的聚合值.键的名称是按照字段和聚合函 ...

  5. golang切片类型

    切片slice 其本身并不是数组,它指向底层的数组 作为变长数组的替代方案,可以关联底层数组的局部或全部 为引用类型 可以直接创建或从底层数组获取生成 使用len()获取元素个数,cap()获取容量 ...

  6. NodeJs -- URL 模块.

    1. url.parse(网址): 将字符串 解析成对象.  1-1) 一个参数 : 或者  参数1, false(默认), false(默认) var url = require('url'); c ...

  7. MFC 关于new出一个新对话框时,退出对话框内存泄漏的问题解决

    问题: 在进行点击按钮弹出对话框时,我是用了new来生成一个新的对话框,但是在新对话框关闭的时候,经过检查发现,新对话框存在内存泄漏问题. 原因: 因为使用了new,但是当时没有找到地方进行delet ...

  8. winform 异性窗体的实现

    效果图 首先需要在vs里添加控件  AlphaForm.dll 添加完了有这来两个控件 1.把第二个控件拖入窗体里把窗体铺满 2.找一张至少有一个闭合图形的透明图片 设置为AlphaFormTrans ...

  9. ipv6地址管理

    为了彻底解决IPv4存在的问题,国际互联网工程任务组从1995年开始,着手研究开发下一代IP协议,即IPv6.可彻底解决IPv4地址不足的问题,除此之外,IPv6还采用分级地址模式.高效IP包头.主机 ...

  10. python day16--面向对象(01)

    一.概念 类:具有相同属性的一类事物 比如人类是类,人类中的某个人是对象.食物是一类,米饭是一个对象 class Person: '''类体:两部分:变量部分,方法(函数)部分''' mind = ' ...