如果以面向对象(OOP)的方式进行BP神经网络系统的设计与实践的话,因为权值的初始化以及类的构造都只进行一次(而且发生在整个流程的开始阶段),所以自然地将权值(全部层layer之间的全部权值)初始化的过程放在类的构函数中,而权值的初始化,一种trivial常用的初始化方法为,对各个权值使用均值为0方差为1的正态分布(也即np.random.randn(shape))进行初始化,也即:

class Network(object):# topology:表示神经网络拓扑结构,用list或者tuple来实现,# 比如[784, 30, 10],表示784个神经元的输入层,30个neuron的隐层,以及十个neuron的输出层def __init__(self, topology):self.topology = topologyself.num_layers = len(topology)self.biases = [np.random.randn(y, 1) for y in topology[1:]]self.weights = [np.random.randn(y, x) for x, y in zip(self.weights[:-1], self.weights[1:])]

我们不妨以一个简单的具体例子,分析这种初始化方法可能存在的缺陷,如下图所示:

为了简化问题,我们只以最左一层向中间一层的第一个神经元(neuron)进行前向(forward)传递为例进行分析,假设一个输入样本(特征向量, xx,维度为1000),一半为1,一半为0(这样的假设很特殊,但也很能说明问题),根据前向传递公式,z=∑jwjxj+bz=\sum_jw_jx_j+b, zz即为输入层向中间隐层第一个神经元的输入。因为输入的一半为0的缘故,再根据前文以及代码也即权重和偏置初始化为独立同分布的标准高斯随机变量,zz为501(500个权值+1个偏置)个标准正太随机变量的和,由 独立随机变量和的方差等于方差的和可知,因此 zz的分布服从0均值,标准差为501−−−√≈22.4\sqrt{501}\approx 22.4,标准差从1升高到22.4,由高斯密度函数 f(x)=12π√σexp(−(x−μ)2σ2)f(x)=\frac1{\sqrt{2\pi}\sigma}\exp(\frac{-(x-\mu)^2}{\sigma^2})可知,方差越大,密度函数的分布越扁平,也即分布越均匀而不是集中在一段区域,其概率密度函数为(可见十分平坦):

以上的平坦的概率密度函数为zz的pdf(概率密度函数),因为pdf较为均匀,|z||z|的值就不会像N∼(0,1)\mathcal{N}\sim(0,1)那样集中于均值附近(越远离均值中心,密度值会迅速衰减),而会以更大的概率取更大的值。这中初始化机制可能带来什么样的问题呢?|z||z|取值很大,也即z≫1z\gg 1或者z≪−1z\ll -1,相应的该神经元的activation值σ(z)\sigma(z)就会接近0或者1,而我们知道,如下图示,σ(z)\sigma(z)越靠近0或者1其变化率越小,也即是达到一种饱和(saturate)状态。

而权值更新公式为:

∂C∂wL=(aL−y)σ′(z)

\frac{\partial\,C}{\partial\,w^L}=(a^L-y)\sigma'(z)
也就意味着越小的 σ′(z)\sigma'(z),越小的梯度更新,同等学习率(learning rate: η\eta)的情况下,越小的学习速率。

如何进行改进呢?假使输入层有ninn_{in}个神经元,我们可将这些神经元对应的权重初始化为0均值,标准差为1/(√nin)1/\sqrt(n_{in}),这样,高斯pdf的形式将会趋于陡峭,而不是上文的平坦,σ′(z)\sigma'(z)将以较小的概率达到饱和状态。仍以上文的设置为基础,我们来分析,现在zz的pdf,均值为0,标准差为500/1000−−−−−−−−√≈0.707\sqrt{500/1000}\approx 0.707,其形式如下:

相关代码:

def default_weight_init(self):self.biases = [np.random.randn(y, 1)/y for y in self.topology[1:]] self.weights = [np.random.rand(y, x)/np.sqrt(x) for x, y in zip(self.topology[:-1], self.topology[1:])]def large_weight_init(self):self.biases = [np.random.randn(y, 1) for y in self.topoloy[1:]]self.weights = [np.random.randn(y, x)/np.sqrt(x) for x, y in zip(self.topology[:-1], self.topology[1:])]

我们看到正是这样一种np.random.randn(y, x)np.random.randn(y, x)/np.sqrt(x)小小的改变,却暗含着丰富的概率论与数理统计的知识,可见无时无刻无处不体现着数学工具的强大。

BP神经网络——如何进行权值的初始化相关推荐

  1. MAT之GA:GA优化BP神经网络的初始权值、阈值,从而增强BP神经网络的鲁棒性

    MAT之GA:GA优化BP神经网络的初始权值.阈值,从而增强BP神经网络的鲁棒性 目录 输出结果 实现代码 输出结果 实现代码 global p global t global R global S1 ...

  2. utilities(matlab)—— 前馈网络权值矩阵初始化方式

    我们知道一个好的权值矩阵的初始化方式将会带来收敛效率的提升. 本文所实现的前馈网络的权值矩阵初始化方式来源于: Xavier Glorot,Yoshua Bengio,Understanding th ...

  3. CNN卷积神经网络学习过程(权值更新)

    卷积神经网络采用BP算法学习网络参数,BP算法是基于梯度下降原则来更新网络参数.在卷积神经网络中,需要优化的参数有卷积核参数k.下采样层权值β.全连接层网络权值w及各层偏置b.我们以卷积神经网络的期望 ...

  4. 神经网络中的权值共享

    2012年的AlexNet网络是深度学习的开端,但是CNN的开端最早其实可以追溯到LeNet5模型,它的几个特性在2010年初的卷积神经网络研究中被广泛的使用--其中一个就是权值共享. 神经网络的输入 ...

  5. 如何理解卷积神经网络中的权值共享

    权值共享这个词最开始其实是由LeNet5模型提出来,在1998年,LeCun发布了LeNet网络架构,就是下面这个: 虽然现在大多数的说法是2012年的AlexNet网络是深度学习的开端,但是CNN的 ...

  6. 卷积神经网络中的权值共享

    一.起源 权值共享这个词最开始其实是由LeNet5模型提出来,在1998年,LeCun发布了LeNet网络架构 其实权值共享这个词说全了就是整张图片在使用同一个卷积核内的参数,比如一个3*3*1的卷积 ...

  7. 理解卷积神经网络中的权值共享

    首先介绍单层网络实行的权重共享袁力介绍 简单从共享的角度来说:权重共享即filter的值共享 卷积神经网络两大核心思想: 1.网络局部连接(Local Connectivity) 2.卷积核参数共享( ...

  8. 神经网络权值和阈值范围,神经网络的权值和阈值

    BP神经网络中初始权值和阈值的设定 1.首先需要了解BP神经网络是一种多层前馈网络.2.以看一下在matlab中BP神经网络的训练函数,有梯度下降法traingd,弹性梯度下降法trainrp,自适应 ...

  9. 神经网络阈值是什么意思,神经网络的权值和阈值

    BP神经网络中初始权值和阈值的设定 1.首先需要了解BP神经网络是一种多层前馈网络.2.以看一下在matlab中BP神经网络的训练函数,有梯度下降法traingd,弹性梯度下降法trainrp,自适应 ...

最新文章

  1. linux 重定向 2gt;gt;,编写我自己的linux shell I / O重定向’gt;’函数
  2. 不推荐重写service
  3. 【CyberSecurityLearning 40】网络地址配置(Kali/CentOS)
  4. 使用Apache Storm和Kite SDK Morphlines的可配置ETL处理
  5. JS 学习笔记--11---内置对象(Global/Math)
  6. 冈萨雷斯《数字图像处理》读书笔记(十一)——表示和描述
  7. ie11不识别html5影片,IE11无法显示flash?IE11无法播放视频的解决方法
  8. java父类的私有方法可以被继承吗_简单通俗的解释java中的继承
  9. 银监计算机类 考试题库,银监会(计算机类)笔试资料-微观经济学试题库 .doc...
  10. 广域网宽带接入技术九ADSL技术
  11. 位深度8位什么水平_佳能1DX3视频12位RAW拍摄和8位mp4拍摄的色彩有多大差别
  12. IDEA项目名称的中文和数字乱码文字
  13. 蓝桥杯单片机学习记录(8)(PWM脉宽调制)
  14. mysql删去root用户无法登录_MySQL误删root用户导致无法登陆解决方法
  15. Http状态码大全(100、200、300、404、500等)
  16. 炒股的智慧:股票投资93条秘籍
  17. DTCMS4.0建站流程
  18. python 学习笔记 8.4 (54-按时打卡-QQ)
  19. window 7 计算机配置文件,怎么用WIN7转移整台老电脑配置与文件到新电脑
  20. 迈向2015,你的智能手环还在戴吗?

热门文章

  1. hive 的 left semi join 讲解与left jion的区别
  2. linux内核版本2 3 20,redhat9装配RTLINUX-3.2,内核版本为Kernel-2.4.23
  3. Python基础——全局变量与局部变量
  4. ​​​​​​​CUDA ---- Shared Memory
  5. opencv将图像转换成二维数组再将数组数据传给新图像
  6. configparser模块简介
  7. 可变、不可变数据类型
  8. 用原生JS写PHP里的Ajax
  9. Flask jQuery ajax
  10. .NET框架的各个版本