Basic knowledge of neural network

一、人工智能发展

一、人工智能的定义

\[机器学习\left\{ \begin{matrix} 监督学习 \\ 无监督学习 \\ 强化学习 \end{matrix} \right. \]

神经元模型

Basic knowledge of neural network

二、范式的演化

Basic knowledge of neural network

三、神经网络基本工作原理

1.神经元细胞的数学模型

输入 input

\((x_1,x_2,x_3)\) 是外界输入信号,一般是一个训练数据样本的多个属性,比如,我们要预测一套房子的价格,那么在房屋价格数据样本中,\(x_1\) 可能代表了面积,\(x_2\) 可能代表地理位置,\(x_3\) 可能代表朝向。另外一个例子是,\((x_1,x_2,x_3)\) 分别代表了(红,绿,蓝)三种颜色,而此神经元用于识别输入的信号是暖色还是冷色。

权重 weights

\((w_1,w_2,w_3)\) 是每个输入信号的权重值,以上面的 \((x_1,x_2,x_3)\) 的例子来说,\(x_1\) 的权重可能是 \(0.92\),\(x_2\) 的权重可能是 \(0.2\),\(x_3\) 的权重可能是 \(0.03\)。当然权重值相加之后可以不是 \(1\)。

偏移 bias

还有个 \(b\) 是怎么来的?一般的书或者博客上会告诉你那是因为 \(y=wx+b\),\(b\) 是偏移值,使得直线能够沿 \(Y\) 轴上下移动。这是用结果来解释原因,并非 \(b\) 存在的真实原因。从生物学上解释,在脑神经细胞中,一定是输入信号的电平/电流大于某个临界值时,神经元细胞才会处于兴奋状态,这个 \(b\) 实际就是那个临界值。亦即当:

\[w_1 \cdot x_1 + w_2 \cdot x_2 + w_3 \cdot x_3 \geq t \]

时,该神经元细胞才会兴奋。我们把t挪到等式左侧来,变成\((-t)\),然后把它写成 \(b\),变成了:

\[w_1 \cdot x_1 + w_2 \cdot x_2 + w_3 \cdot x_3 + b \geq 0 \]

于是 \(b\) 诞生了!

求和计算 sum

\[\begin{aligned} Z &= w_1 \cdot x_1 + w_2 \cdot x_2 + w_3 \cdot x_3 + b \\\\ &= \sum_{i=1}^m(w_i \cdot x_i) + b \end{aligned} \]

在上面的例子中 \(m=3\)。我们把\(w_i \cdot x_i\)变成矩阵运算的话,就变成了:

\[Z = W \cdot X + b \]

激活函数 activation

求和之后,神经细胞已经处于兴奋状态了,已经决定要向下一个神经元传递信号了,但是要传递多强烈的信号,要由激活函数来确定:

\[A=\sigma{(Z)} \]

如果激活函数是一个阶跃信号的话,会像继电器开合一样咔咔的开启和闭合,在生物体中是不可能有这种装置的,而是一个渐渐变化的过程。所以一般激活函数都是有一个渐变的过程,也就是说是个曲线。

小结

  • 一个神经元可以有多个输入。
  • 一个神经元只能有一个输出,这个输出可以同时输入给多个神经元。
  • 一个神经元的 \(w\) 的数量和输入的数量一致。
  • 一个神经元只有一个 \(b\)。
  • \(w\) 和 \(b\) 有人为的初始值,在训练过程中被不断修改。
  • \(A\) 可以等于 \(Z\),即激活函数不是必须有的。
  • 一层神经网络中的所有神经元的激活函数必须一致。

2.神经网络的训练过程

Basic knowledge of neural network

3.神经网络中的矩阵运算

神经网络中的各种符号约定

\[z1_1 = x_1 \cdot w1_{1,1}+ x_2 \cdot w1_{2,1}+b1_1 \]

\[z1_2 = x_1 \cdot w1_{1,2}+ x_2 \cdot w1_{2,2}+b1_2 \]

\[z1_3 = x_1 \cdot w1_{1,3}+ x_2 \cdot w1_{2,3}+b1_3 \]

变成矩阵运算:

\[z1_1= \begin{pmatrix} x_1 & x_2 \end{pmatrix} \begin{pmatrix} w1_{1,1} \\\\ w1_{2,1} \end{pmatrix} +b1_1 \]

\[z1_2= \begin{pmatrix} x_1 & x_2 \end{pmatrix} \begin{pmatrix} w1_{1,2} \\\\ w1_{2,2} \end{pmatrix} +b1_2 \]

\[z1_3= \begin{pmatrix} x_1 & x_2 \end{pmatrix} \begin{pmatrix} w1_{1,3} \\\\ w1_{2,3} \end{pmatrix} +b1_3 \]

再变成大矩阵:

\[Z1 = \begin{pmatrix} x_1 & x_2 \end{pmatrix} \begin{pmatrix} w1_{1,1}&w1_{1,2}&w1_{1,3} \\\\ w1_{2,1}&w1_{2,2}&w1_{2,3} \\\\ \end{pmatrix} +\begin{pmatrix} b1_1 & b1_2 & b1_3 \end{pmatrix} \]

最后变成矩阵符号:

\[Z1 = X \cdot W1 + B1 \]

然后是激活函数运算:

\[A1=a(Z1) \]

同理可得:

\[Z2 = A1 \cdot W2 + B2 \]

注意:损失函数不是前向计算的一部分。

4.神经网络的主要功能

1.回归(Regression)或者叫做拟合(Fitting)

​ 所谓回归或者拟合,其实就是给出x值输出y值的过程,并且让y值与样本数据形成的曲线的距离尽量小,可以理解为是对样本数据的一种骨架式的抽象。

2.分类(Classification)

​ 可以理解为是对两类或多类样本数据的边界的抽象

5.激活函数

\[Z1 = X \cdot W1 + B1 \]

\[Z2 = Z1 \cdot W2 + B2 \]

\[Z3 = Z2 \cdot W3 + B3 \]

展开:

\[\begin{aligned} Z3&=Z2 \cdot W3 + B3 \\\\ &=(Z1 \cdot W2 + B2) \cdot W3 + B3 \\\\ &=((X \cdot W1 + B1) \cdot W2 + B2) \cdot W3 + B3 \\\\ &=X \cdot (W1\cdot W2 \cdot W3) + (B1 \cdot W2 \cdot W3+B2 \cdot W2+B3) \\\\ &=X \cdot W+B \end{aligned} \]

不管有多少层,总可以归结到 \(XW+B\) 的形式,这和单层神经网络没有区别。

二、反向传播与梯度下降

一、线性反向传播

1.正向计算

假设有一个函数:

\[z = x \cdot y \tag{1} \]

其中:

\[x = 2w + 3b \tag{2} \]

\[y = 2b + 1 \tag{3} \]

当 \(w = 3, b = 4\) 时:

\[z = x \cdot y \ = 162 \]

2.反向传播求w变化值

当需要 \(z\) 从 \(162\) 变到 \(150\) 时,\(w\) 需要变化多少?

\[\frac{\partial{z}}{\partial{w}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{w}}=y \cdot 2=18 \tag{4} \]

\[\Delta z = 18 \cdot \Delta w \]

则:

\[\Delta w = {\Delta z \over 18}=\frac{162-150}{18}= 0.6667 \]

所以:

\[w = w - 0.6667=2.3333 \]

\[x=2w+3b=16.6667 \]

\[z=x \cdot y=16.6667 \times 9=150.0003 \]

3.反向传播求b变化值

\[\frac{\partial{z}}{\partial{b}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{b}}+\frac{\partial{z}}{\partial{y}}\cdot\frac{\partial{y}}{\partial{b}}=y \cdot 3+x \cdot 2=63 \tag{5} \]

\[\Delta z = 63 \cdot \Delta b \]

则:

\[\Delta b = \frac{\Delta z}{63}=\frac{162-150}{63}=0.1905 \]

所以:

\[b=b-0.1905=3.8095 \]

\[x=2w+3b=17.4285 \]

\[y=2b+1=8.619 \]

\[z=x \cdot y=17.4285 \times 8.619=150.2162 \]

4.反向传播同时求w和b变化值

已知 \(\Delta z=12\),我们不妨把这个误差的一半算在 \(w\) 的账上,另外一半算在 \(b\) 的账上:

\[\Delta b=\frac{\Delta z / 2}{63} = \frac{12/2}{63}=0.095 \]

\[\Delta w=\frac{\Delta z / 2}{18} = \frac{12/2}{18}=0.333 \]

\(w = w-\Delta w=3-0.333=2.667\)

\(x=2w+3b=2 \times 2.667+3 \times 3.905=17.049\)

\(y=2b+1=2 \times 3.905+1=8.81\)

\(z=x \times y=17.049 \times 8.81=150.2\)

5.易出现的问题

  1. 在检查 \(\Delta z\) 时的值时,注意要用绝对值,因为有可能是个负数
  2. 在计算 \(\Delta b\) 和 \(\Delta w\) 时,第一次时,它们对 \(z\) 的贡献值分别是 \(1/63\) 和 \(1/18\),但是第二次时,由于 \(b,w\) 值的变化,对 \(z\) 的贡献值也会有微小变化,所以要重新计算。具体解释如下:

\[\frac{\partial{z}}{\partial{b}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{b}}+\frac{\partial{z}}{\partial{y}}\cdot\frac{\partial{y}}{\partial{b}}=y \cdot 3+x \cdot 2=3y+2x \]

\[\frac{\partial{z}}{\partial{w}}=\frac{\partial{z}}{\partial{x}} \cdot \frac{\partial{x}}{\partial{w}}+\frac{\partial{z}}{\partial{y}}\cdot\frac{\partial{y}}{\partial{w}}=y \cdot 2+x \cdot 0 = 2y \]

所以,在每次迭代中,要重新计算下面两个值:

\[\Delta b=\frac{\Delta z}{3y+2x} \]

\[\Delta w=\frac{\Delta z}{2y} \]

二、非线性反向传播

正向过程

  1. 第1个人,输入层,随机输入第一个 \(x\) 值,\(x\) 的取值范围 \((1,10]\),假设第一个数是 \(2\);
  2. 第2个人,第一层网络计算,接收第1个人传入 \(x\) 的值,计算:\(a=x^2\);
  3. 第3个人,第二层网络计算,接收第2个人传入 \(a\) 的值,计算:\(b=\ln (a)\);
  4. 第4个人,第三层网络计算,接收第3个人传入 \(b\) 的值,计算:\(c=\sqrt{b}\);
  5. 第5个人,输出层,接收第4个人传入 \(c\) 的值

反向过程

  1. 第5个人,计算 \(y\) 与 \(c\) 的差值:\(\Delta c = c - y\),传回给第4个人
  2. 第4个人,接收第5个人传回\(\Delta c\),计算 \(\Delta b = \Delta c \cdot 2\sqrt{b}\)
  3. 第3个人,接收第4个人传回\(\Delta b\),计算 \(\Delta a = \Delta b \cdot a\)
  4. 第2个人,接收第3个人传回\(\Delta a\),计算 \(\Delta x = \frac{\Delta}{2x}\)
  5. 第1个人,接收第2个人传回\(\Delta x\),更新 \(x \leftarrow x - \Delta x\),回到第1步

提出问题:假设我们想最后得到 \(c=2.13\) 的值,\(x\) 应该是多少?(误差小于 \(0.001\) 即可)

数学解析

\[c=\sqrt{b}=\sqrt{\ln(a)}=\sqrt{\ln(x^2)}=2.13 \]

\[x = 9.6653 \]

梯度迭代解

\[\frac{da}{dx}=\frac{d(x^2)}{dx}=2x=\frac{\Delta a}{\Delta x} \tag{1} \]

\[\frac{db}{da} =\frac{d(\ln{a})}{da} =\frac{1}{a} = \frac{\Delta b}{\Delta a} \tag{2} \]

\[\frac{dc}{db}=\frac{d(\sqrt{b})}{db}=\frac{1}{2\sqrt{b}}=\frac{\Delta c}{\Delta b} \tag{3} \]

因此得到如下一组公式,可以把最后一层 \(\Delta c\) 的误差一直反向传播给最前面的 \(\Delta x\),从而更新 \(x\) 值:

\[\Delta c = c - y \tag{4} \]

\[\Delta b = \Delta c \cdot 2\sqrt{b} \tag{根据式3} \]

\[\Delta a = \Delta b \cdot a \tag{根据式2} \]

\[\Delta x = \Delta a / 2x \tag{根据式1} \]

我们给定初始值 \(x=2\),\(\Delta x=0\),依次计算结果

方向 公式 迭代1 迭代2 迭代3 迭代4 迭代5
正向 \(x=x-\Delta x\) 2 4.243 7.344 9.295 9.665
正向 \(a=x^2\) 4 18.005 53.934 86.404 93.233
正向 \(b=\ln(a)\) 1.386 2.891 3.988 4.459 4.535
正向 \(c=\sqrt{b}\) 1.177 1.700 1.997 2.112 2.129
标签值y 2.13 2.13 2.13 2.13 2.13
反向 \(\Delta c = c - y\) -0.953 -0.430 -0.133 -0.018
反向 \(\Delta b = \Delta c \cdot 2\sqrt{b}\) -2.243 -1.462 -0.531 -0.078
反向 \(\Delta a = \Delta b \cdot a\) -8.973 -26.317 -28.662 -6.698
反向 \(\Delta x = \Delta a / 2x\) -2.243 -3.101 -1.951 -0.360

三、梯度下降

1.梯度下降数学公式

\[\theta_{n+1} = \theta_{n} - \eta \cdot \nabla J(\theta) \]

其中:

\(\theta_{n+1}\):下一个值;

\(\theta_n\):当前值;

\(-\):减号,梯度的反向;

\(\eta\):学习率或步长,控制每一步走的距离,不要太快以免错过了最佳景点,不要太慢以免时间太长;

\(\nabla\):梯度,函数当前位置的最快上升点;

\(J(\theta)\):函数。

梯度下降三要素

  1. 当前点;
  2. 方向;
  3. 步长。

梯度下降包含的含义

  1. 梯度:函数当前位置的最快上升点;
  2. 下降:与导数相反的方向,用数学语言描述就是那个减号。

2.单变量函数的梯度下降

假设一个单变量函数 $$J(x) = x ^2$$

计算其微分: $$J'(x) = 2x$$

假设初始位置为:$$x_0=1.2$$

假设学习率:$$\eta = 0.3$$

根据梯度下降公式

\[x_{n+1} = x_{n} - \eta \cdot \nabla J(x)= x_{n} - \eta \cdot 2x \]

x=0.480000, y=0.230400
x=0.192000, y=0.036864
x=0.076800, y=0.005898
x=0.030720, y=0.000944

3.双变量的梯度下降

假设一个双变量函数: $$J(x,y) = x^2 + \sin^2(y)$$

计算其微分:

\[{\partial{J(x,y)} \over \partial{x}} = 2x \]

\[{\partial{J(x,y)} \over \partial{y}} = 2 \sin y \cos y \]

假设初始位置为: $$(x_0,y_0)=(3,1)$$

假设学习率: $$\eta = 0.1$$

迭代过程是的计算公式:

\[(x_{n+1},y_{n+1}) = (x_n,y_n) - \eta \cdot \nabla J(x,y) \]

\[= (x_n,y_n) - \eta \cdot (2x,2 \cdot \sin y \cdot \cos y) \]

根据公式(1),假设终止条件为 \(J(x,y)<0.01\)

迭代次数 x y J(x,y)
1 3 1 9.708073
2 2.4 0.909070 6.382415
... ... ... ...
15 0.105553 0.063481 0.015166
16 0.084442 0.050819 0.009711

迭代16次后,\(J(x,y)\) 的值为 \(0.009711\),满足小于 \(0.01\) 的条件,停止迭代。

三、损失函数

一、损失函数概论

1.概念

使用“损失函数”和“Loss Function”这两个词汇,具体的损失函数符号用 \(J\) 来表示,误差值用 \(loss\) 表示。

“损失”就是所有样本的“误差”的总和,亦即(\(m\) 为样本数):

\[损失 = \sum^m_{i=1}误差_i \]

\[J = \sum_{i=1}^m loss_i \]

损失函数的作用

计算神经网络每次迭代的前向计算结果与真实值的差距,从而指导下一步的训练向正确的方向进行。

具体步骤:

  1. 用随机值初始化前向计算公式的参数;
  2. 代入样本,计算输出的预测值;
  3. 用损失函数计算预测值和标签值(真实值)的误差;
  4. 根据损失函数的导数,沿梯度最小方向将误差回传,修正前向计算公式中的各个权重值;
  5. 进入第2步重复, 直到损失函数值达到一个满意的值就停止迭代。

2.机器学习常用损失函数

符号规则:\(a\) 是预测值,\(y\) 是样本标签值,\(loss\) 是损失函数值。

  • Gold Standard Loss,又称0-1误差

\[loss=\begin{cases} 0 & a=y \\\\ 1 & a \ne y \end{cases} \]

  • 绝对值损失函数

\[loss = |y-a| \]

  • Hinge Loss,铰链/折页损失函数或最大边界损失函数,主要用于SVM(支持向量机)中

\[loss=\max(0,1-y \cdot a) \qquad y=\pm 1 \]

  • Log Loss,对数损失函数,又叫交叉熵损失函数(cross entropy error)

\[loss = -[y \cdot \ln (a) + (1-y) \cdot \ln (1-a)] \qquad y \in \\{ 0,1 \\} \]

  • Squared Loss,均方差损失函数

\[loss=(a-y)^2 \]

  • Exponential Loss,指数损失函数

\[loss = e^{-(y \cdot a)} \]

二、均方差损失函数

\[loss = {1 \over 2}(z-y)^2 \tag{单样本} \]

\[J=\frac{1}{2m} \sum_{i=1}^m (z_i-y_i)^2 \tag{多样本} \]

绝对值损失函数与均方差损失函数的比较

样本标签值 样本预测值 绝对值损失函数 均方差损失函数
\([1,1,1]\) \([1,2,3]\) \((1-1)+(2-1)+(3-1)=3\) \((1-1)^2+(2-1)^2+(3-1)^2=5\)
\([1,1,1]\) \([1,3,3]\) \((1-1)+(3-1)+(3-1)=4\) \((1-1)^2+(3-1)^2+(3-1)^2=8\)
\(4/3=1.33\) \(8/5=1.6\)

三、交叉熵损失函数

在信息论中,交叉熵是表示两个概率分布 \(p,q\) 的差异,其中 \(p\) 表示真实分布,\(q\) 表示预测分布,那么 \(H(p,q)\) 就称为交叉熵:

\[H(p,q)=\sum_i p_i \cdot \ln {1 \over q_i} = - \sum_i p_i \ln q_i \]

交叉熵可在神经网络中作为损失函数,\(p\) 表示真实标记的分布,\(q\) 则为训练后的模型的预测标记分布,交叉熵损失函数可以衡量 \(p\) 与 \(q\) 的相似性。

1.交叉熵的由来

信息量

\[I(x_j) = -\ln (p(x_j)) \]

\[H(p) = - \sum_j^n p(x_j) \ln (p(x_j)) \]

例如: $$ H(p)=-[p(x_1) \ln p(x_1) + p(x_2) \ln p(x_2) + p(x_3) \ln p(x_3)] $$

相对熵(KL散度)

KL散度的计算公式:

\[D_{KL}(p||q)=\sum_{j=1}^n p(x_j) \ln{p(x_j) \over q(x_j)} \]

交叉熵

把上述公式变形:

\[\begin{aligned} D_{KL}(p||q)&=\sum_{j=1}^n p(x_j) \ln{p(x_j)} - \sum_{j=1}^n p(x_j) \ln q(x_j) \\\\ &=- H(p(x)) + H(p,q) \end{aligned} \]

等式的前一部分恰巧就是 \(p\) 的熵,等式的后一部分,就是交叉熵:

\[H(p,q) =- \sum_{j=1}^n p(x_j) \ln q(x_j) \]

二分类对于批量样本的交叉熵计算公式是:

\[J= - \sum_{i=1}^m [y_i \ln a_i + (1-y_i) \ln (1-a_i)] \]

2.二分类问题交叉熵

对于学员甲,预测其学会的概率为0.6,而实际上该学员通过了考试,真实值为1。所以,学员甲的交叉熵损失函数值是:

\[loss_1 = -(1 \times \ln 0.6 + (1-1) \times \ln (1-0.6)) = 0.51 \]

对于学员乙,预测其学会的概率为0.7,而实际上该学员也通过了考试。所以,学员乙的交叉熵损失函数值是:

\[loss_2 = -(1 \times \ln 0.7 + (1-1) \times \ln (1-0.7)) = 0.36 \]

由于0.7比0.6更接近1,是相对准确的值,所以 \(loss2\) 要比 \(loss1\) 小,反向传播的力度也会小。

3.多分类问题交叉熵

当标签值不是非0即1的情况时,就是多分类了。假设期末考试有三种情况:

  1. 优秀,标签值OneHot编码为 \([1,0,0]\);
  2. 及格,标签值OneHot编码为 \([0,1,0]\);
  3. 不及格,标签值OneHot编码为 \([0,0,1]\)。

假设我们预测学员丙的成绩为优秀、及格、不及格的概率为:\([0.2,0.5,0.3]\),而真实情况是该学员不及格,则得到的交叉熵是:

\[loss_1 = -(0 \times \ln 0.2 + 0 \times \ln 0.5 + 1 \times \ln 0.3) = 1.2 \]

假设我们预测学员丁的成绩为优秀、及格、不及格的概率为:\([0.2,0.2,0.6]\),而真实情况是该学员不及格,则得到的交叉熵是:

\[loss_2 = -(0 \times \ln 0.2 + 0 \times \ln 0.2 + 1 \times \ln 0.6) = 0.51 \]

可以看到,0.51比1.2的损失值小很多,这说明预测值越接近真实标签值(0.6 vs 0.3),交叉熵损失函数值越小,反向传播的力度越小。

4.为什么不能使用均方差做为分类问题的损失函数?

  1. 回归问题通常用均方差损失函数,可以保证损失函数是个凸函数,即可以得到最优解。而分类问题如果用均方差的话,损失函数的表现不是凸函数,就很难得到最优解。而交叉熵函数可以保证区间内单调。

  2. 分类问题的最后一层网络,需要分类函数,Sigmoid或者Softmax,如果再接均方差函数的话,其求导结果复杂,运算量比较大。用交叉熵函数的话,可以得到比较简单的计算结果,一个简单的减法就可以得到反向误差。

四、心得

此前学习了人工智能的基本知识,列如反向传播、梯度下降、损失函数等等。代码有时候运行不出来,路径是对的就是运行不了,然后关机过一段时间再去运行,改都没改就运行出来了,真的很智能,能在内部修复代码的问题。总的来说,人工智能基本就是用数学公式多次迭代,然后就有了机器学习。目前的人工智能尚在数学领域,还有很多未知的东西等待发现。

Basic knowledge of neural network

Basic knowledge of neural network

Basic knowledge of neural network

上一篇:AI:2020年6月22日北京智源大会演讲分享之认知神经基础专题论坛——13:40-14:20毕彦超教授《Knowledge representation in the Human brain》


下一篇:【李宏毅2020 ML/DL】P99-105 Life Long Learning