博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
稀疏自动编码之反向传播算法(BP)
阅读量:5899 次
发布时间:2019-06-19

本文共 1506 字,大约阅读时间需要 5 分钟。

假设给定m个训练样本的训练集,用梯度下降法训练一个神经网络,对于单个训练样本(x,y),定义该样本的损失函数:

那么整个训练集的损失函数定义如下:

第一项是所有样本的方差的均值。第二项是一个归一化项(也叫权重衰减项),该项是为了减少权连接权重的更新速度,防止过拟合。

我们的目标是最小化关于 b 的函数J(W,b). 为了训练神经网络,把每个参数W^{(l)}_{ij} 和b^{(l)}_i初始化为很小的接近于0的随机值(例如随机值由正态分布Normal(0,ε2)采样得到,把 ε 设为0.01), 然后运用批量梯度下降算法进行优化。由于 J(W,b) 是一个非凸函数,梯度下降很容易收敛到局部最优,但是在实践中,梯度下降往往可以取得不错的效果。最后,注意随机初始化参数的重要性,而不是全部初始化为0. 如果所有参数的初始值相等,那么所有的隐层节点会输出会全部相等,因为训练集是一样的,即输入一样,如果每个模型的参数还都一样,输出显然会相同,这样不论更新多少次参数,所有的参数还是会相等。随机初始化各个参数就是为了防止这种情况发生。

梯度下降每一次迭代用下面的方式更新参数和 b:

 

其中 α 是学习率。上述迭代的关键是计算偏导数。我们将给出一种方向传播算法,能够高效地计算这些偏导数。

由上面的总体的损失函数公式, 很容易得到偏导数公式如下:

 

反向传播算法的思想是:给定某个训练样本(x,y),首先进行“前向传播”计算出整个网络中所有节点的激活值,包括输出节点的输出值。那么对于 l 层的节点 i ,计算它的“残差” \delta^{(l)}_i ,这个残差用来衡量该节点对输出的残差产生了多大程度的影响。对于输出节点,我们可以直接比较出网络的激活值与真正的目标值之间的残差,即\delta^{(n_l)}_i (nl  层就是输出层) 。对于隐层节点,我们用 l+层残差的加权平均值和 l 层的激活值来计算\delta^{(l)}_i .

下面详细给出了反向传播算法的步骤:

1. 进行前馈传播,计算每一层的中所有节点的激活值

2. 对于输出层(第nl )的节点 i 的残差:

这里需要注意:z^{(l)}_i 表示第 l 层节点 i 的所有输出之和,f 是激活函数,例如等,另外,最后一层(输出层)的假设函数的输出值就是该层节点的激活值。

3. 对于 l = n_l-1, n_l-2, n_l-3, \ldots, 2

\delta^{(l)}_i = \left( \sum_{j=1}^{s_{l+1}} W^{(l)}_{ji} \delta^{(l+1)}_j \right) f'(z^{(l)}_i)

4. 计算偏导数:

下面用矩阵-向量化的操作方式重写这个算法。其中"\textstyle \bullet"表示matlab中的点乘。对于\textstyle f(\cdot)同样向量化,\textstyle f'(\cdot) 也作同样处理,即\textstyle f'([z_1, z_2, z_3]) = [f'(z_1), f'(z_2), f'(z_3)].

BP算法重写如下:

1. 进行前馈传播,计算每一层的中所有节点的激活值

2. 对于输出层(第n层)的节点 i 的残差:

\begin{align} \delta^{(n_l)} = - (y - a^{(n_l)}) \bullet f'(z^{(n_l)}) \end{align}

3.  对于 l = n_l-1, n_l-2, n_l-3, \ldots, 2

\begin{align}                  \delta^{(l)} = \left((W^{(l)})^T \delta^{(l+1)}\right) \bullet f'(z^{(l)})                  \end{align}

4. 计算偏导数:

\begin{align} \nabla_{W^{(l)}} J(W,b;x,y) &= \delta^{(l+1)} (a^{(l)})^T, \\ \nabla_{b^{(l)}} J(W,b;x,y) &= \delta^{(l+1)}. \end{align}

注意:在上面的第2步和第3步,,我们需要为每一个 节点 i 计算其 \textstyle f'(z^{(l)}_i) . 假设\textstyle f(z)是sigmoid激活函数,在前向传播的过程中已经存储了所有节点的激活值\textstyle a^{(l)}_i,因此利用我们在

中推导出的sigmoid激活函数的导数求法:对于sigmoid函数f(z) = 1 / (1 + exp( − z)),它的导函数为f'(z) = f(z)(1 − f(z)).可以提前算出\textstyle f'(z^{(l)}_i) = a^{(l)}_i (1- a^{(l)}_i),这里用到我们上面提到的.

最后,给出完整的梯度下降法.在下面的伪代码中\textstyle \Delta W^{(l)}\textstyle W^{(l)}都是矩阵,\textstyle \Delta b^{(l)}\textstyle b^{(l)}是向量。

1.  对于每一层,即所有 l , \textstyle \Delta W^{(l)} := 0\textstyle \Delta b^{(l)} := 0 (设置为全零矩阵或者向量)

2. 从第一个训练样本开始,一直到最后一个(第 m 个训练样本):

  a. 用反向传播计算\textstyle \nabla_{W^{(l)}} J(W,b;x,y) 和\textstyle \nabla_{b^{(l)}} J(W,b;x,y)

  b. \textstyle \Delta W^{(l)} := \Delta W^{(l)} + \nabla_{W^{(l)}} J(W,b;x,y).

  c. \textstyle \Delta b^{(l)} := \Delta b^{(l)} + \nabla_{b^{(l)}} J(W,b;x,y).

3. 更新参数:

现在,我们可以重复梯度下降法的迭代步骤来减小损失函数\textstyle J(W,b) 的值,进而训练出我们的神经网络。

 

学习来源:

 

转载于:https://www.cnblogs.com/90zeng/p/Backpropagation_Algorithm.html

你可能感兴趣的文章
Apache HTTP服务器扩展模块的工具-apxs
查看>>
Linux服务器ssh登录很慢解决方法
查看>>
Web Service简介特点,优点,缺点
查看>>
MessageContext和传输头之续一(实例演示:SIB中访问消息上下文)
查看>>
#10# SCCM规划 - 边界、边界组和站点系统 - 3
查看>>
Office365跨订阅迁移邮箱-批量导入用户PST文件
查看>>
关于Objective-c内存管理的一些笔记
查看>>
用Allegro对s3c2410的BGA封装布线
查看>>
江苏电信:SOC建设介绍
查看>>
android 应用开发:android studio使用笔记
查看>>
Centos7 YUM安装MariaDB 10.0
查看>>
Windows 2008 R2 远程桌面服务(八)远程桌面服务器安全设置
查看>>
Spring data jpa模糊查询,根据某一个字段,或者多个字段进行模糊查询
查看>>
制作QQ2011绿色版不求人
查看>>
c++filt 命令
查看>>
android控件EditText
查看>>
shell编程学习之tr
查看>>
maven多web合并项目
查看>>
Wget用法、参数解释的比较好的一个文章
查看>>
activiti学习笔记01_20130909
查看>>