主要内容:
梯度下降法
反向传播
初始权重不要都置为0,可用高斯分布。 随机初始化的目的是使对称失效。如果所有权重初始化为相同初始值,那么所有的隐藏层单元最终会得到与输入值相关的、相同的函数。
import numpy as np
W = np.random.randn(m,n) * 0.001 # 正态分布随机数
在多维变量函数中,函数在某一点的切线的斜率(存在多个,如三维中所有切线组成一个切面)就是方向导数;梯度是一个矢量,其方向上的方向导数最大,其大小正好就是此最大方向导数。
数值梯度:由导数的定义来求解梯度,再迭代更新。特点是不容易出错,但是计算复杂,速度慢。
# 很多神经网络库的核心迭代代码
while True:
weights_grad = evaluate_gradient(loss_fun,data,weights)
weights += - step_size * weights_grad # 梯度下降更新权重参数
梯度检查\检测:可以选取部分样例先计算解析梯度和数值梯度,对比较结果和校正,然后采取解析梯度大胆进行解析计算,这个过程就叫做梯度检查。
Mini-Bacth: 对整个训练数据集的样本都算一篇损失函数,以完成参数的迭代是一件非常耗时的事情。通常的做法是采样出一个子集在其上计算梯度。
while True:
data_batch = sample_training_data(data,256) # 抽样256个样本作为一个batch
weights_grad = evaluate_gradient(loss_fun,data_batch,weights)
weights += - step_size * weights_grad # 更新权重参数
链式法则:若函数 u=ψ(t) , v=ϕ(t) 在点 t 可导, z=f(u,v) ,有
如图所示,是一个神经网络模型,每个圆圈代表一个神经元,标上 “ +1 ” 的圆圈是偏置点(bias)。用 nl 表示神经网络的层数,此图中 nl=3 ,将第 l 层记为 Ll ,有 L1 为输入层(input layer), Lnl 为输出层(output layer),其他层为隐藏层(hidden layer)。
神经网络的训练参数为 (W,b) ,此处有 (W,b)=(W(1),b(1),W(2),b(2)) , 其中 W(l)ij 表示第 l 层第 j 单元与第 l+1 单元之间的联结参数。本图中有 W(1)∈R3×3 , W(2)∈R3×3 。
我们用 z(l)i 表示第 l 层第 i 单元输入加权和(包括偏置单元),比如
这里如果将 a 、 z 、 f(⋅) 向量化处理,即
更一般的,有
上面的计算步骤叫做神经网络的前向传播 。
设有一个包含 m 个样例的固定样本集 {(x(1),y(1)),⋯,(x(m),y(m))} 。使用批量梯度下降法(Batch Gradient Descent) 来求解神经网络。具体地,单个样例 (x,y) ,其代价函数为
权重衰减参数 λ 用于控制公式中两项的相对重要性。
我们的目标是针对参数 W 和 b 求最小的代价 J(W,b) 。要求解神经网络,首先需使用上文提到的随机初始化方法对参数初始化,然后利用梯度下降法迭代求解。
梯度下降法 中每次迭代都按照如下公式对 W 和 b 进行更新:
未完待续。。。。