深度学习中的数学基础笔记

挺火的一个概念,选了一节公选课上,不过最后也就学了个皮毛。截图是来自 3Blue1Brown 数学频道,以文字识别为例

神经网络的架构

  1. 神经元:神经元就相当于一个函数,输入以上一层为输入,输出给下一层。在文字识别中,一个神经元就是一个文字图像中一个像素的颜色深浅。这些深浅不一的像素(神经元)就组成了我们的文字。
  2. 在神经网络中,神经元将自己的数据一层一层的传递,最后得到了最终的结果。例如文字识别中,第一层识别小的笔画,然后将自己的数据传递给下一层,然后再识别大的笔画,最终识别出来的文字

  1. 识别的过程:以第二层的神经元为例,第一层的一个神经元要想识别小笔画,就必须要对第一层的每一个数据$a$,赋予一个权重$w$(表示第一层的那个神经元对这个地方的敏感程度)然后求和,得到这个神经元所代表的的数值

    在实际情况中需要这个值在 0~1 之间,因此需要给它将这个数据减去加上一个函数(比如Sigmoid函数)

    不过,$w_1a_1+w_2a_2+…+w_na_n$ 的出来可以是任何数,直接用上面的公式表示会出现过早激发的现象,因此需要减去一个偏置值$b$

    这样的话就得到了第二层神经元的数据,以此类推,可以得到最终结果。

    用向量表示,可以得到下面的($a^{(0)}$ 为第0层神经元的数值(激活值))

梯度下降法

上面我们得到了那个可以计算激活值的递推方程,但是一开始的时候,上面所有的系数都是随机的,因此此时得到的结果误差会非常大。梯度下降算法能够使得这些系数得到的偏差最小。为了表示这个偏差,引出代价函数的概念,下面是一种常见的代价函数

我们的目标就是使得这个函数的值最小。而沿着这个函数的负梯度方向走,这个函数的函数值就下降的越快,因此让这个函数变小的算法就出来了:

1
2
3
4
5
6
7
8
9
st=>start: 开始
op1=>operation: 计算梯度
op2=>operation: 按照梯度反方向走一小步下山
op3=>condition: 精度要求是否达到
e=>end: 结束

st->op1->op2->op3
op3(yes)->e
op3(no)->op1

相关的数学公式为

反向传播算法

反向传播算法的核心就是计算上面提到的梯度 $\bigtriangledown C$

先考虑两个神经元之间的传播。

记第一个神经元的所有参数上角标为$(L-1)$,下角标为$L$ .

因此有以下参数:

  • $a^{(L-1)},a^{(L)}$ 两个神经元的激活值
  • $w^{(L)},b^{(L)}$ 从(L-1)层到(L)层的权重
  • $y^{(L)}$ 想要达到的激活值

为了计算的方便,记 $z^{(L)}=w^{(L)}a^{(L-1)}+b^{(L)}$,则有

由$a^{(L-1)}$到$a^{(L)}$ 的计算的过程是

1
2
3
4
5
w=>operation: w(L),a(L-1),b(L)
z=>operation: z(L)
a2=>operation: a(L)
C=>operation: C(L)
w->z->a2->C

而要求的是

根据上面的方程可以得到

同理

将这个简单的两个神经元之间的传播扩展到一般情况

其中,i是上层的第i个神经元;j为下层的第j个神经元

实际举例

构建一个四层的BP人工神经网络,不少于16个神经元结点,自定义一个样本,模拟计算一次完整的样本训练过程,整个过程必须包括各个神经元结点的输入值、输出值以及反馈过程中对权向量的修改情况。

构建的网络

其中:

  • 输入层 $a^{(0)}=\left[4\ 3\ 2\ 1 \right]^T$
  • 权重 $w^{(1)}=\left[
    \begin{matrix}
    0.01 & 0.06 & 0.11 & 0.16\\
    0.02 & 0.07 & 0.12 & 0.17\\
    0.03 & 0.08 & 0.13 & 0.18\\
    0.04 & 0.09 & 0.14 & 0.19\\
    0.05 & 0.10 & 0.15 & 0.20\\
    \end{matrix}
    \right],w^{(2)}=\left[
    \begin{matrix}0.21 & 0.22 & 0.23 &0.24 & 0.25\\
    0.16 & 0.17 & 0.18 &0.19 & 0.20\\
    0.11 & 0.12 & 0.13 &0.14 & 0.15\\
    0.06 & 0.07 & 0.08 & 0.09 & 0.10\\
    0.01 & 0.02 & 0.03 & 0.04 & 0.05\\\end{matrix}
    \right],w^{(3)}=\left[
    \begin{matrix}
    0.16 & 0.21 \\0.17 & 0.22 \\ 0.18 &0.23\\0.19 & 0.24\\0.20 & 0.25\\
    \end{matrix}
    \right]^T$
  • 期望输出层 $y^{(3)}=[0.10\ 0.24]^T$
  • 每个节点没有偏置
  • 节点激活函数 $\sigma(x)=1/{(1+e^{-x})}$,导数$\sigma’(x)=\sigma(x)(1-\sigma(x))$

符号说明

  • $a_i^{(L)}$:第 (L) 层节点的第 i 个元素的 输出值
  • $z_i^{(L)}$:第 (L) 层节点的第 i 个元素的 输入值
  • $w_{ij}^{(L)}$:第 (L-1) 层 的第 i 个节点 到 第 (L) 层 的第 j 个节点的 权重

正向传播

0层→1层

第一层输入值为:

第一层输出值为:

1层→2层

第二层输入值为:

第二层输出值为:

2层→3层

第三层输入值为:

第三层输出值为:

误差

反向传播

3层→2层

有以下数学关系:

因此 权重梯度

修正后权重:

2层→1层

有以下数学关系:

因此 权重梯度

其中

修正后权重:

1层→0层

有以下数学关系:

因此 权重梯度

其中

修正后权重:

一次完整的样本训练过程就结束了

训练后误差

计算过程

Matlab代码,比较低级,算是半个手工计算。。。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
Y = [0.10 0.24]';
W10 = [0.01:0.05:0.16;...
0.02:0.05:0.17;...
0.03:0.05:0.18;...
0.04:0.05:0.19;...
0.05:0.05:0.20];
A0 = [4 3 2 1]';
W20 = [0.21:0.01:0.25;...
0.16:0.01:0.20;...
0.11:0.01:0.15;...
0.06:0.01:0.10;...
0.01:0.01:0.05];
W30 = [0.16:0.01:0.20;...
0.21:0.01:0.25];
Z1 = W10*A0;
A1 = 1./(1.+exp(-Z1));
Z2 = W20*A1;
A2 = 1./(1.+exp(-Z2));
Z3 = W30*A2;
A3 = 1./(1.+exp(-Z3));
C = 0.5.*(Y - A3).*(Y - A3);
DW3 = (A3-Y).*(A3).*(1-A3)*A2';
W3 = W30 - DW3;
DA3 = A3-Y;
DA2 = (DA3.*A3.*(1-A3))'*W3;
DA2 = DA2';
DW2 = DA2.*A2.*(1-A2)*A1';
W2 = W20 - DW2;
DA1 = (DA2.*A2.*(1-A2))'*W2;
DA1 = DA1';
DW1 = DA1.*A1.*(1-A1)*A0';
W1 = W10 - DW1;

Z11 = W1*A0;
A11 = 1./(1.+exp(-Z11));
Z21 = W2*A11;
A21 = 1./(1.+exp(-Z21));
Z31 = W3*A21;
A31 = 1./(1.+exp(-Z31));
C1 = 0.5.*(Y - A31).*(Y - A31);

2018-10-21


深度学习中的数学基础笔记
https://fu-qingchen.github.io/2019/01/25/WHUT/MachineLearning/
作者
FU Qingchen
发布于
2019年1月25日
许可协议