BP算法(针对基本的S型层):
每一层有:带权输入z,激活值a,权重矩阵w,偏置向量b,神经元误差(调皮鬼,微小扰动,相对z比相对a代数简单),某一层L的某个节点j
两个假设:
1. 代价函数C可以被写为每个训练样本x的代价函数Cx的均值(注意对二次代价函数本身成立,其他代价也要满足),因为反向传播只能对一个独立训练样本计算w,b的偏导,然后对所有样本进行平均得到最终的w,b偏导,此时认为样本x被固定了,可将Cx看成C
2. 代价函数可以写成神经网络输出的函数(才能使用链式法则计算梯度,注意对二次代价本身成立)
四个基本方程:
1. 输出层误差方程 (根据链式法则很自然得到,即输出层/最后一层误差是C对z的偏导,可转化为C对a的偏导乘以a对z的偏导)
2. 使用下一层误差表示当前层误差 (误差向前传递;对下一层误差左乘权重矩阵w转置,看成沿网络反向移动误差,再乘当前层a对z的偏导)
结合方程1和2就能计算任意层的误差!
3. 代价函数C关于网络任意偏置的改变率或偏导:就是该节点对应的误差 (利用误差来计算偏置了!!!)
4. 代价函数C关于网络任意权重的改变率或偏导:误差乘以上一层节点激活值a (利用误差来计算权重了!!!),
注意有几个性质,低激活值神经元的权重会学习缓慢;更一般的,任何输入进一个饱和(过高或过低激活值)的神经元的权重会学习缓慢
四个方程对任意激活函数都成立;
反向传播从后往前,先计算误差,然后b(就是误差),然后w(依赖a和误差),整个过程只需传播一次;
一次前向传播+一次后向传播即可!后向和前向代价一样,所以总共是2倍的前向传播,所以bp是高效的!
(产品级bp算法都是对小批量数据基于矩阵的方式提升性能,而不是基于单个向量)
结合sgd时,对一批数据的每个样本分别利用bp计算误差,w和b,然后对w和b求平均,利用该均值对w和b进行更新一次,即一批数据只更新一次;
BP参考:
https://blog.csdn.net/csj941227/article/details/77150000
https://www.zhihu.com/question/27239198
将神经网络看成一个普通的函数,只不过是复合函数!!!求偏导就会涉及到链式法则,和普通的简单函数就这点不同,其中每一步都是简单函数;
- 前向模式:在每一层,需要维护当前层对之前所有权值的微分值 ,这样才可能在传播到损失函数时得到损失函数对所有这些权值的微分值。由此带来空间复杂度的增加。同时这样还引入了重复计算。
- 反向模式:在每一层,需要维护输出对当前层的微分值,该微分值相当于被复用于之前每一层里权值的微分计算。因此空间复杂度没有变化。同时也没有重复计算,每一个微分值都在之后的迭代中使用。
前向传播有2种含义:1. 根据输入计算输出 2. 前向计算梯度
反向传播只有1种含义:2. 反向计算梯度
在f(x1,x2)=3x1^2-2x2这种简单的多元函数中,求某一点的梯度可以直接按照公式计算梯度向量将节点代入即可,然后运用梯度下降法计算极小点;
在神经网络中,与f(x1,x2)对应的不是y,而是y与y’的差距,也就是损失函数或cost代价函数(通常是MSE或交叉熵),而与x1,x2对应的不再是x,而是w和b,也就是说,要优化的函数形式是H(w,b),即要找到一组w,b使得H函数取得极小值;
BP算法是求解多层复合函数的所有变量的偏导数的利器;
sigmoid缺点:
- Sa