📃
Nielsen-NNDL
  • Introduction
  • 第1章 使用神经网络识别手写数字
    • 感知机神经元
    • sigmoid神经元
    • 神经网络的架构
    • 用于识别手写数字的简单网络
    • 梯度下降学习法
      • 准备工作
      • 梯度下降法
      • 应用到神经网络
    • 实现数字分类的神经网络
      • 数据集
      • 初始化
      • 向后传递
      • 随机梯度下降
      • 总结
  • 第2章 反向传播算法的工作原理
    • 热身:一种矩阵方法快速计算神经网络的输出
    • 关于代价函数的两个假设
    • Hadamard积
    • 反向传播算法中的4个等式
      • 一个新的定义
      • 4个等式
      • 等式的意义
    • 4个等式的证明
    • 反向传播算法
    • 代码解读
    • 反向传播算法为什么这么快
  • 第3章 提升神经网络的学习方法
    • cross-entropy代价函数
      • 当前神经网络存在的问题
      • 引入cross-entropy代价函数
      • 使用cross-entropy分类手写数字
      • cross-entropy代价函数是怎么推出来的
      • cross-entropy的数学意义
      • softmaxt+loglikelihood
    • 过拟合和正则化
      • 过拟合
      • L2正则化
      • 在当前神经网络中使用L2正则化
      • 其它问题
      • L1正则化
      • dropout正则化
      • 人为扩充训练数据
    • weights初始化
    • 回到手势识别代码
    • 怎样选择超参数
      • broad策略
      • 学习率eta
      • 迭代次数epochs
      • 正则化参数lambda
      • minibatch样本数m
      • 自动化技术
    • 其它技术
      • Hessian技术
      • momentum技术
      • tanh神经元
      • RectifiedLinear神经元
  • 第5章 训练深度神经网络难以训练
    • 梯度消失问题
    • 梯度消失的原因
  • 第6章 深度学习
    • 卷积神经网络介绍
      • LocalReceptiveField
      • SharedWeights
      • pooling层
      • 组装到一起
    • 卷积神经网络的实践与改进
    • 其它深度神经网络的方法
  • 术语中英文对照
Powered by GitBook
On this page
  • 当前的weight初始化算法遇到 的问题
  • 解决方法
  • weight不同初始化算法(简称旧、新)的比较
  • 代码

Was this helpful?

  1. 第3章 提升神经网络的学习方法

weights初始化

Previous人为扩充训练数据Next回到手势识别代码

Last updated 5 years ago

Was this helpful?

当前的weight初始化算法遇到 的问题

考虑只有一个神经元的情况:

z=∑jwjxj+bz = \sum_j w_j x_j+bz=j∑​wj​xj​+b

假设这个神经元有500个输入,w,b∼(μ=0,σ2=1)w,b \sim (\mu=0, \sigma^2=1)w,b∼(μ=0,σ2=1), 则,z∼(μ=0,σ2=501)z \sim (\mu=0, \sigma^2=501)z∼(μ=0,σ2=501) 可以看出z值较大(|z|>1)的概率很大。

∣z∣>1⇒σ(z)接近0或1⇒神经元是饱和的⇒学得慢|z|>1 \Rightarrow \sigma(z)接近0或1 \Rightarrow 神经元是饱和的 \Rightarrow 学得慢∣z∣>1⇒σ(z)接近0或1⇒神经元是饱和的⇒学得慢

因此很大概率,在初始化状态时这个神经元就“学得慢”。

解决方法

这里的“学得慢”和遇到的问题类似。 但解决方法只能解决output层神经元在初始化状态下“学得慢”的问题。并不能解决中间层神经元“学得慢”的问题。

解决方法:优化weights的初始化算法,使z的初始值尽量落在区间[-1,1]中。 如果一个神经元有n个输入,则令weight为高斯分布(μ=0,σ2=1n\mu=0, \sigma^2=\frac{1}{n}μ=0,σ2=n1​)的随机值。 b的初始化算法不变。 这样神经元在一开始就饱和的可能性会变低。

weight不同初始化算法(简称旧、新)的比较

  1. 最终结果差不多

  2. 在开始时候,新算法有明显的优化效果。

  3. 事实上,新算法对最终效果也有提升,见第4章。

L2正则化和weights初始化的原理相似,都是要限制weights的大小。

代码

network2.py实现此算法

self.weights = [np.random.randn(y, x)/np.sqrt(x) 
                for x, y in zip(self.sizes[:-1], self.sizes[1:])]

np.random.randn函数的默认分布为(μ=0,σ=1\mu=0, \sigma=1μ=0,σ=1)的高斯分布。 将随机值都除以np.sqrt(x)相当于得到的是(μ=0,σ=1x\mu=0, \sigma=\frac{1}{\sqrt{x}}μ=0,σ=x​1​)的高斯分布。

当前神经网络存在的问题
引入cross-entropy代价函数