1. M-P Neuron Model

神经网络是由具有适应性的简单单元组成的广泛并行互连的网络, 它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应.

神经网络中最基本的成分是神经元 (Neuron)模型, 即上述定义中的”简单单元”. 在生物神经网络中, 每个神经元与其他神经元相连, 当它兴奋时, 就会向相连的神经元发送化学物质, 从而改变这些神经元内的电位; 如果某神经元的电位超过了一个阈值 (threshold), 那么它就会被激活, 即兴奋起来, 向其他神经元发送化学物质. 下图就是上述描述很好的抽象表示 $→$ M-P 神经元模型.

image-20201029203407575

在这个模型中, 神经元接受到来自 $n$ 个其他神经元传递过来的输入信号, 这些输入信号通过带权重的连接进行传递, 神经元接收到的总输入值将与神经元的阈值进行比较, 然后通过激活函数 (activation function) 处理以产生神经元的输出.

理想中的激活函数是图 (a) 所示的阶跃函数, 它将输入值映射为输出值 0 或 1. 0 对应神经元兴奋, 1 对应神经元抑制. 然而, 阶跃函数具有不连续, 不光滑等不友好的性质, 我们实际常用 Sigmoid 或者 ReLU 函数作为激活函数.

image-20201029204144054

把许多个这样的神经元按一定的层次结构连接起来, 我们就得到了神经网络. 事实上, 从计算机科学的角度看, 我们可以不先考虑神经网络是否真的模拟了生物神经网络, 只需将一个神经网络视为包含了许多参数的数学模型, 这个模型是若干个函数.

2. Perceptron

感知机 (Perceptron) 由两层神经元组成, 输入层接收外界输入信号后传递给输出层, 输出层是 M-P 神经元.

image-20201029205028551

给定训练数据集, 权重 $w_i (i=1,2,…,n)$ 以及阈值 $\theta$ 可通过学习得到. 阈值 $\theta$ 可看作一个固定输入为 -1.0 的“哑结点” (dummy node) 所对应的连接权重 $w_{n+1}$, 这样, 权重和阈值的学习就可统一为权重的学习. 感知机学习规则非常简单, 对训练样例 ($\mathbf{x},y$), 若当前感知机的输出为 $\hat{y}$, 则感知机权重将这样调整:

其中 $\eta\in(0,1)$ 称为学习率 (learning rate). 从上式可看出, 若感知机对训练样例 ($\mathbf{x},y$) 预测正确, 即 $\hat{y}=y$, 则感知机不发生改变, 否则将根据错误的程度进行权重调整.

感知机只有输出层神经元进行激活函数处理, 即只拥有一层功能神经元 (functional neuron), 其学习能力非常有限, 事实上, 若两类模式是线性可分的, 即存在一个线性超平面能够将它们分开, 如下图所示, 则感知机的学习过程一定会收敛 (converge) 而求得适当的权向量 $w$; 否则感知机学习过程将会发生振荡, $w$ 难以稳定下来, 不能求得合适解.

image-20201029211344492

3. Multi-Layer Feedforward Nerual Networks

要解决非线性可分问题, 需考虑使用多层功能神经元. 例如下图这个简单的两层感知机就能解决异或问题.

image-20201029212505038

计算过程如下:

image-20201029212628077

更一般的, 常见的神经网络是如下图所示的层级结构, 每层神经元与下一层神经元全互连, 神经元之间不存在同层连接, 也不存在跨层连接. 这样的神经网络结构通常称为多层前馈神经网络 (multi-layer feedforward neural networks). 神经网络的学习过程, 就根据训练数据来调整神经元之间的连接权 (connection weight) 以及每个功能神经元的阈值; 换言之, 神经网络学到的东西, 蕴含在连接权和阈值中.

image-20201029213027567

4. Error Backpropogation

多层神经网络的学习能力要比单层感知机强很多, 但是要训练多层神经网络, 单层感知机的学习规则就显得不够用了, 因此我们在这里将会介绍误差逆传播 (Error BackPropagation) 算法. 下面我们来以一个单隐层神经网络为例来推导一下 BP 算法.

image-20201029214352239

训练集 $D=\{(\mathbf{x}_1,y_1),(\mathbf{x}_2,y_2),…,(\mathbf{x}_m,y_m)\}$, 其中第 $k$ 个样本 $(\mathbf{x}_k,\mathbf{y}_k)$

假设隐层和输出层神经元都使用 Sigmoid 函数

待确定参数:

  • 输入层到隐层的 $d\times q$ 个权值 $v_{ih}\ (1\leq i\leq d,\ 1\leq h\leq q)$
  • 隐层到输出层的 $q\times l$ 个权值 $w_{hj}\ (1\leq h\leq q,\ 1\leq j\leq l)$
  • 隐层的 $q$ 个神经元的阈值 $\gamma_h\ (1\leq h \leq q)$
  • 输出层的 $l$ 个神经元的阈值 $\theta_j \ (1\leq j \leq l)$

另外, 隐层的神经元个数 $q$ 以及训练轮数 epoch 也都是需要确定的超参数.

BP 算法首先在 $(0,1)$ 范围内随机初始化网络中所有连接权和阈值, 在每一轮迭代中采用梯度下降策略逐步对权重进行更新, 而标准 BP 算法在每一轮迭代中是依次仅针对一个训练样例更新连接权和阈值.

现在我们来开始推导 BP 算法. 首先, 神经网络在一个训练样例 $(\mathbf{x}_k,\mathbf{y}_k)$ 上的均方误差为:

任意参数的更新估计式为:

BP 算法基于梯度下降策略, 以目标的负梯度方向对参数进行调整. 对式 (5.4) 的误差 $E_k$, 给定学习率 $\eta$, 有:

根据导数运算的规律, 我们能够得到:

其中:

同理, 我们能够得到:

其中:

按照这种思路继续往前推, 我们能得到 $\frac{\partial E_k}{\partial v_{ih}}$ 的计算公式:

其中:

$\frac{\partial E_k}{\partial \gamma_h}$ 的推导也同上, 在这里我就不赘述了. 到此, 我们的 BP 算法的推导就完成了! 但是你有没有觉得这种单个参数的计算太麻烦了!!! 我们不妨借用矩阵来使我们的运算更方便!

4.1 Matrix Solution

image-20201029225819384

Network Overview

输入层有 6 个特征: $\mathbf{x}=[x_1,…,x_6]^T$

隐层有 4 个神经元: $\mathbf{z}=[z_1,…,z_4]^T$

输出层是一个概率分布: $\mathbf{y}=[y_1,y_2,y_3]^T$

We also allow for a bias term by adding a constant one to the input, $x_0=1$ and a constant one to the hidden layer $z_0=1$.

$\alpha$ 是从输入层到隐层的权重矩阵. $\beta$ 是隐层到输出层的参数矩阵.

$\alpha_{j,i}$ represents the weight going to the node $z_j$ in the hidden layer from the node $x_i$ in the input layer (e.g. $\alpha_{1,2}$ is the weight from $x_2$ to $z_1$ ), and $\beta$ is defined similarly. We will use a sigmoid activation function for the hidden layer and a softmax for the output layer.

Network Details Equivalently, we define each of the following.

The input:

image-20201029231839772

Linear combination at the first (hidden) layer:

image-20201029232006997

Activation at the first (hidden) layer:

image-20201029232117730

Linear combination at the second (output) layer:

image-20201029232201528

Activation at the second (output) layer:

image-20201029232255460

不含 bias 参数的 $\alpha$:

image-20201029232424679

不含 bias 参数的 $\beta$:

image-20201029232457503

含 bias 参数的 $\alpha$:

image-20201029232545404

含 bias 参数的 $\beta$:

image-20201029232601815

And we set our first value of our input vectors to always be 1 ($x_0=1$), so our input becomes:

image-20201029232758945

Loss

We will use cross entropy loss, $\ell(\hat{y},y)$. If $\mathbf{y}$ represents our target output, which will be a one-hot vector representing the correct class, and $\hat{\mathbf{y}}$ represents the output of the network, the loss is calculated by:

image-20201029234909511

Feed Forward

$\mathbf{a}=\alpha\mathbf{x}$

$\mathbf{z}=sigmoid(\mathbf{a})$

$\mathbf{b}=\beta\mathbf{z}$

$\hat{\mathbf{y}}=softmax(\mathbf{b})$

Backpropagation

$\frac{\partial \ell}{\partial \mathbf{b}}=-\mathbf{y}+\hat{\mathbf{y}}$

$\frac{\partial \ell}{\partial \beta}=\frac{\partial \ell}{\partial \mathbf{b}}\mathbf{z}^T$

$\frac{\partial \ell}{\partial \mathbf{z}}=(\beta^{*})^T\frac{\partial \ell}{\partial \mathbf{b}}$

$\frac{\partial \ell}{\partial \mathbf{a}}=\frac{\partial \ell}{\partial \mathbf{z}}\odot\mathbf{z}\odot(1-\mathbf{z})$

$\frac{\partial \ell}{\partial \alpha}=\frac{\partial \ell}{\partial \mathbf{a}}\mathbf{x}^T$

符号 $\odot$ 表示矩阵哈达玛积, 即两个大小相同的矩阵对应位置元素相乘.

image-20201030000623806

5. Implementation

项目地址: https://github.com/alvisdeng/OCR-Letter-Recognizer