反向传输
简介
上一章介绍了使用梯度下降法求目标损失函数的最小值。在神经网络模型中反向传播算法的作用就是要求出这个梯度值,从而后续用梯度下降去更新模型参数。反向传播算法从模型的输出层开始,利用函数求导的链式法则,逐层从后向前求出模型梯度。使用反向计算可以避免重复计算,从而加快计算速度。优化的对象是参数,反向传播算法是一种优化参数的方法。
链式法则
根据链式法则公式:
计算整体梯度可以求出每一个局部梯度将结果相乘。
上图中绿色的数字为正向计算结果,下面的红色数字为得到的局部梯度,从后往前递归地向前计算梯度。
对几种不同的门:
加法门不改变梯度,乘法门交换梯度,最大值门梯度只传递给最大值。
上述讨论的输入都是一维标量的情况,下面讨论在高维时如何对向量进行计算。
向量的计算和标量的计算是相似的,只是引入了Jacobian 矩阵用于储存梯度。
2维Jacobian 矩阵:
上图中的两个问题:
Q1:这个雅可比矩阵的大小是多少?
A:[4096*4096].
(它每一行是输出向量的元素对输入向量的元素求偏导的结果)
Q2:这个矩阵是什么样的?
A:是一个对角矩阵。
注意上面公式的使用。
小结
通过前向传播中计算节点的输出,反向传播中计算梯度。
反向传播的目的是得到所有梯度,它是神经网络的核心技术 。
参考:
https://blog.csdn.net/kinggerui/article/details/88879195
神经网络
简介
神经网络就是由简单函数构成的一组函数,在顶层堆叠在一起(用一种层次化的方式将它们堆叠,为了形成一个更复杂的非线性函数)。
神经元
在基本模型中,树突将信号传递到细胞体,信号在细胞体中相加。如果最终之和高于某个阈值,那么神经元将会**,向其轴突输出一个峰值信号。将神经元的**率建模为**函数,它表达了轴突上**信号的频率。
对于一个单独的神经元,只要在神经元的输出端有一个合适的损失函数。就可以用来实现一个二分类分类器,比如二分类的Softmax或者SVM分类器。
**函数
**函数就是在神经网络中,上一层的输出节点和下一层的输入节点之间的函数关系。
如果不使用**函数,那么上一层神经网络和下一层会一直是一种线性的关系,那么神经网络的深度就失去了意义。
常见的**函数:
| 名称 | Sigmoid函数 | Tanh函数 | ReLU函数 | Leaky ReLU函数 | Maxout函数 |
|---|---|---|---|---|---|
| 公式 | |||||
| 优点 | 把输入的连续实值变换为0和1之间的输出 | 把输入的连续实值变换为0和1之间的输出 | (1)计算迅速(2)收敛速度远快于sigmoid和tanh(3)解决梯度消失问题 | 解决“ReLU死亡”问题 | 是对ReLU和leaky ReLU的一般化归纳,拥有ReLU单元的所有优点(线性操作和不饱和),而没有它的缺点(死亡的ReLU单元)。 |
| 缺点 | (1)函数饱和使梯度消失(2)输出不是零中心 | 函数饱和使梯度消失 | 比较脆弱并且可能“死掉”,即某些神经元可能永远不会被**,导致相应的参数永远不能被更新。 | 它每个神经元的参数数量增加了一倍,这就导致整体参数的数量激增。 | |
| 图像 |
全连接层
全连接层中的神经元与其前后两层的神经元是完全成对连接的,但是在同一个全连接层内的神经元之间没有连接。
输出层:和神经网络中其他层不同,输出层的神经元一般是不会有**函数的(或者也可以认为它们有一个线性相等的**函数)。这是因为最后的输出层大多用于表示分类评分值,因此是任意值的实数,或者某种实数值的目标数(比如在回归中)。
确定网络尺寸:用来度量神经网络的尺寸的标准主要有两个:一个是神经元的个数,另一个是参数的个数,用上面图示的两个网络举例:
- 第一个网络有4+2=6个神经元(输入层不算),[3x4]+[4x2]=20个权重,还有4+2=6个偏置,共26个可学习的参数。
- 第二个网络有4+4+1=9个神经元,[3x4]+[4x4]+[4x1]=32个权重,4+4+1=9个偏置,共41个可学习的参数。
参考:
https://blog.csdn.net/tyhj_sf/article/details/79932893
https://zhuanlan.zhihu.com/p/21462488?refer=intelligentunit
https://zhuanlan.zhihu.com/p/21513367?refer=intelligentunit