图文阐述神经网络模型、激活函数和独特推导反向传播算法
今天学习深度学习的基本概念,网络模型组成和最重要的一个算法:反向传播算法。
背景介绍
深度学习可以用更多的数据或更好的算法来提高学习算法的结果。对于某些应用而言,深度学习在大数据集上的表现比其他机器学习(ML)方法都要好。
性能表现方面,深度学习探索了神经网络的概率空间,与其他工具相比,深度学习算法更适合无监督和半监督学习,更适合强特征提取,也更适合于图像识别领域、文本识别领域、语音识别领域等。
为什么深度学习会如此被热衷,因为它不以任何损失函数为特征,也不会被特定公式所限制,这使得该框架模型能以比其他传统机器学习工具更好的方式进行使用和扩展。
模型基本组成
一般地,神经网络模型包括输入层(input layer)、隐含层(hidden layers)、输出层(output layer)。

如上图所示,数据传输是从输入层 -> 隐含层 -> 输出层,这种网络叫做前向传播神经网络(feedforward neural networks),在这种网络中没有环,数据传播总是前向的,从不反向,也就是说输入层会通过隐含层 1、隐含层 2……,间接地影响到输出层。
上面示意图中的输入层有 6 个神经元节点组成,第一个隐含层由 4 个神经元节点组成,第二个隐含层由 4 个神经元节点组成,输出层由 1 个神经元节点组成。
权重参数
每一层中每个神经元节点都指向下一层的每个神经元节点。
如下图,输入层的第一个神经元节点指向第一个隐含层中所有节点,每一条连接线形成一个权重参数 WW,这就是待学习的参数。
输入层共有 6 个节点,第一个隐含层 4 个节点,形成的权重参数形状为 (6,4)(6,4) 的数组。第一个隐含层与第二个隐含层形成的权重参数形状为 (4,3)(4,3) 。第二个隐含层与输出层形成的权重参数形状为 (3,1)(3,1)。

提示:当输出层只有一个神经元节点时,意味着只输出一个值。这个值可以看做是回归问题的一个取值,二分类问题如泰坦尼克乘客获救的可能性等。
除了学习层间的权重参数 WW 外,每层间的神经元节点还有附加信息需要学习,被称为偏移项 bb,如下图所示。

激活函数
输入层 XX 与权重参数 W1W1 和偏移项 b1b1 运算 X×W1+b1X×W1+b1 后,会经过一个函数 ff 处理,这个函数被称为激活函数,它的作用实现非线性,实现拟合任意函数曲线。

如上图,激活函数的输出项会作为下一层的输入。
列举目前常用的三种激活函数:Sigmoid 函数、ReLU 函数、Softmax 函数。
下面分别绘制:
import tensorflow as tf # TensorFlow 版本 '2.1.0'
import numpy as np
import matplotlib.pyplot as plt
h = np.linspace(-10,10,100)
# Sigmoid 激活函数
y = tf.sigmoid(h)
plt.title('sigmoid')
plt.grid()
plt.plot(h,y,c='blue')
plt.hlines(0.5, -10, 10, colors='red', linestyle='--' ,label='0.5')
plt.show()

绘制 ReLU 激活函数:
h = np.linspace(-10,10,100)
y = tf.nn.relu(h)
plt.title('relu')
plt.grid()
plt.plot(h,y,c='blue')
plt.show()

绘制 Softmax 激活函数:
h = np.linspace(-5,5,100)
y = tf.nn.softmax(h)
plt.title('softmax')
plt.grid()
plt.plot(h,y,c='blue')
plt.show()

正向传播
如果对输入层与第一个隐含层间的参数 WW 做一个微小的调整,改变大小为 ΔWΔW,这个改变就会层层传播,直到输出层传播结束,如下图所示,这种微从输入层传播到输出层的微小改变的传播调整称为正向传播。

对于有监督学习任务,神经网络的输出层与实际标签值的差值被称为损失函数,这与传统机器学习模型的损失函数理解起来是一样的。
反向传播
第 5 篇介绍参数的正向传播,下面介绍反向传播。反向传播是用来最小化损失函数的一项重要机制,通过反向传播算法,有策略地调整权重参数和偏移项,反复迭代,直到损失函数值达到最小。

下面介绍重要的反向传播算法,图中符号的含义详情下面解释。

符号含义:
- WljkWjkl:第 l−1l−1 层的第 kk 个神经元节点与第 ll 层的第 jj 个神经元节点间的权重参数;
- bljbjl:第 ll 层第 jj 个神经元节点的偏移量;
- zljzjl:第 ll 层第 jj 个神经元节点的输入,容易得出:zlj=∑kwljkal−1k+bljzjl=∑kwjklakl−1+bjl
- aljajl:第 ll 层第 jj 个神经元节点的激活函数值,也就是神经元节点的输出:alj=σ(zlj)ajl=σ(zjl)
- δljδjl:第 ll 层第 jj 个神经元节点的输入误差,并且定义为:δlj=∂C∂zljδjl=∂C∂zjl
综合上面第一个和第三个公式,根据链式求导法则,进行如下推导。
先求损失函数 CC 与偏移参数 bb 的偏导数:
∂C∂blj=∂C∂zjl×∂zlj∂blj=δlj×1=δlj∂C∂bjl=∂C∂zjl×∂zjl∂bjl=δjl×1=δjl
同理求得损失函数 CC 与权重参数 ww 的偏导数:
∂C∂wljk=∂C∂zjl×∂zjl∂wljk=δlj×al−1k∂C∂wjkl=∂C∂zjl×∂zjl∂wjkl=δjl×akl−1
至此,我们已经求出损失函数 CC 与所有权重参数 ww 和 bb 的偏导数,不过有一个未知变量 δljδjl 还没有求出来。
因此,只要求出任意一层的任意一个神经元节点的 δljδjl,我们便能得到任意节点权重参数的偏导数。
δljδjl 的求法就是使用神经网络最重要的一个算法——反向传播算法,求得的。其实基本思想也是动态规划。求解过程如下。
下面开始反向传播算法的推导,反向传播是从最后一层开始的,所以构思问题的起点也是从最后一层,示意图如下所示:

得到公式:
δLj=∂C∂aLjσ′(zLj)δjL=∂C∂ajLσ′(zjL)
至此求出最后一层:LL 层的第 jj 个神经元节点的输入误差 δLjδjL。
反向传播算法也是动态规划思想的典型应用范例之一,求出最后一层的输入误差项后,如何推导出递推关系式,即反向推导求出第 L−1L−1 层的输入误差项,只有这样才有可能准确实施达到修正参数的目的,进而尽可能减少损失函数值。

得到公式:
δl=((wl+1)Tδl+1)⋅σ′(zl)δl=((wl+1)Tδl+1)⋅σ′(zl)
至此,我们已经总结出反向传播算法的推导算法,从最后一层开始(见公式:
δLj=∂C∂aLjσ′(zLj)δjL=∂C∂ajLσ′(zjL)
经过递推公式 δl=((wl+1)Tδl+1)⋅σ′(zl)δl=((wl+1)Tδl+1)⋅σ′(zl) 求得第 L−1L−1 层的 δl−1δl−1,依次递推求得任意层的误差项。
至此反向传播就完全讲解透了,希望大家能够真正理解。
小结
今天学习神经网络的背景知识、网络模型的基本组成、权重参数、常用的 3 个激活函数,文章最后详细推导出反向传播算法。