一、人工智能发展
一、人工智能的定义
\[机器学习\left\{ \begin{matrix} 监督学习 \\ 无监督学习 \\ 强化学习 \end{matrix} \right. \]二、范式的演化
三、神经网络基本工作原理
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.神经网络的训练过程
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.易出现的问题
- 在检查 \(\Delta z\) 时的值时,注意要用绝对值,因为有可能是个负数
- 在计算 \(\Delta b\) 和 \(\Delta w\) 时,第一次时,它们对 \(z\) 的贡献值分别是 \(1/63\) 和 \(1/18\),但是第二次时,由于 \(b,w\) 值的变化,对 \(z\) 的贡献值也会有微小变化,所以要重新计算。具体解释如下:
所以,在每次迭代中,要重新计算下面两个值:
\[\Delta b=\frac{\Delta z}{3y+2x} \] \[\Delta w=\frac{\Delta z}{2y} \]二、非线性反向传播
正向过程
- 第1个人,输入层,随机输入第一个 \(x\) 值,\(x\) 的取值范围 \((1,10]\),假设第一个数是 \(2\);
- 第2个人,第一层网络计算,接收第1个人传入 \(x\) 的值,计算:\(a=x^2\);
- 第3个人,第二层网络计算,接收第2个人传入 \(a\) 的值,计算:\(b=\ln (a)\);
- 第4个人,第三层网络计算,接收第3个人传入 \(b\) 的值,计算:\(c=\sqrt{b}\);
- 第5个人,输出层,接收第4个人传入 \(c\) 的值
反向过程
- 第5个人,计算 \(y\) 与 \(c\) 的差值:\(\Delta c = c - y\),传回给第4个人
- 第4个人,接收第5个人传回\(\Delta c\),计算 \(\Delta b = \Delta c \cdot 2\sqrt{b}\)
- 第3个人,接收第4个人传回\(\Delta b\),计算 \(\Delta a = \Delta b \cdot a\)
- 第2个人,接收第3个人传回\(\Delta a\),计算 \(\Delta x = \frac{\Delta}{2x}\)
- 第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)\):函数。
梯度下降三要素
- 当前点;
- 方向;
- 步长。
梯度下降包含的含义
- 梯度:函数当前位置的最快上升点;
- 下降:与导数相反的方向,用数学语言描述就是那个减号。
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 \]损失函数的作用
计算神经网络每次迭代的前向计算结果与真实值的差距,从而指导下一步的训练向正确的方向进行。
具体步骤:
- 用随机值初始化前向计算公式的参数;
- 代入样本,计算输出的预测值;
- 用损失函数计算预测值和标签值(真实值)的误差;
- 根据损失函数的导数,沿梯度最小方向将误差回传,修正前向计算公式中的各个权重值;
- 进入第2步重复, 直到损失函数值达到一个满意的值就停止迭代。
2.机器学习常用损失函数
符号规则:\(a\) 是预测值,\(y\) 是样本标签值,\(loss\) 是损失函数值。
- Gold Standard Loss,又称0-1误差
- 绝对值损失函数
- Hinge Loss,铰链/折页损失函数或最大边界损失函数,主要用于SVM(支持向量机)中
- Log Loss,对数损失函数,又叫交叉熵损失函数(cross entropy error)
- Squared Loss,均方差损失函数
- Exponential Loss,指数损失函数
二、均方差损失函数
\[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的情况时,就是多分类了。假设期末考试有三种情况:
- 优秀,标签值OneHot编码为 \([1,0,0]\);
- 及格,标签值OneHot编码为 \([0,1,0]\);
- 不及格,标签值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.为什么不能使用均方差做为分类问题的损失函数?
-
回归问题通常用均方差损失函数,可以保证损失函数是个凸函数,即可以得到最优解。而分类问题如果用均方差的话,损失函数的表现不是凸函数,就很难得到最优解。而交叉熵函数可以保证区间内单调。
-
分类问题的最后一层网络,需要分类函数,Sigmoid或者Softmax,如果再接均方差函数的话,其求导结果复杂,运算量比较大。用交叉熵函数的话,可以得到比较简单的计算结果,一个简单的减法就可以得到反向误差。
四、心得
此前学习了人工智能的基本知识,列如反向传播、梯度下降、损失函数等等。代码有时候运行不出来,路径是对的就是运行不了,然后关机过一段时间再去运行,改都没改就运行出来了,真的很智能,能在内部修复代码的问题。总的来说,人工智能基本就是用数学公式多次迭代,然后就有了机器学习。目前的人工智能尚在数学领域,还有很多未知的东西等待发现。 | |