鱼的深度学习

深度学习(一)神经网络简介

2020-04-16  本文已影响0人  升不上三段的大鱼

一、感知器

在生物上,神经元是神经系统结构和功能的单位,神经元之间通过突触传递信息,如果一个神经元接收到的刺激超过了阈值,就会产生一个动作电位,动作电位通过突触传向其他神经元,从而传递了信息。这个动作电位的产生过程,是一种“全或无”的响应:
如果刺激超过了阈值,不管这个刺激到底超过了阈值多少,都会产生动作电位。
如果刺激低于阈值,无事发生。

从数学角度来看,这就是一个二分类的问题,输出只能为1或-1。
1957年, Rosenblatt提出了感知器,感知器的决策规则:
\hat{y} = sign(w^{T}x)
分类的结果只取决于输入和权值乘积之和的符号。我们的目的是要找到一个权值,使它让误分类的样本点距离决策边界的距离最短。

单个的感知器的作用是有限的,它不能解锁XOR(异或)的问题,所以出现多层感知器(Multi-Layer Perceptron,MLP)。

多层感知器是单个感知器的集合,也就相当于结合了多个神经元,这使得决策边界有了非线性。直到今天多层感知器依旧会被用到(并不是过时的算法)。

当我们把多个感受器叠在一起的时候,总有那么几个神经元不会直接接触到第一手的信息,把从别的神经元那里得到的消息一通加工之后传给下一个神经元,它们被称为隐藏层(hidden layer),第一个收到消息的神经元是输入层,最后得出结论的神经元是输出层

当一个感知器(或者其他前馈神经网络,感受器是最简单的)拥有了一个隐藏层时,它就已经是一个万能公式逼近器了(Universal function approximator)(听起来怪牛逼的)。

背后的数学原理是通用近似定理(Universal Approximation Theorem), 假设\varphi是一个非常数的,有界,单调递增的函数,对于任意\epsilon>0以及定义在\mathbb{R}^m的紧子集上的任意连续函数,都存在一个整数N,实常数v_{i}, b_{i} \in \mathbb{R},以及实向量w_{i} \in \mathbb{R}^m,有
F(x)=\sum_{i=1}^{n}v_{i}\varphi(w_{i}^Tx+b_{i}), \qquad |F(x)-f(x)|<\epsilon
所以我们可以根据这个定理,我们可以用合适的激活函数来近似任何公式。虽然但是,只有单层的网络就算能表示任何函数,我们也不知道它到底需要多少个神经元,也可能会无法学习和泛化。使用深层的模型能够减少所需要的单元数量,并且减小泛化误差。

二、Softmax

对于分类问题,当类别很多时,我们可以使用一种方式来标记类别
y_{k} = \begin{cases} 1 & \quad \text{如果 k是应该分到的那个类} \\ 0 & \quad \text{其他} \end{cases}
这种方式被称为独热编码(One-hot encoding),即只有一个元素不等于零。

对于预测到的结果,\hat{y_{k}} = \frac{exp(x_{k})}{\sum_{j=1}^{K}exp(x_{j})}
即输出的结果为预测x属于类别k的值占所有预测值之和的比,由此可见\hat{y_{k}}有两个性质:

  1. \sum_{j=1}^{K} \hat{y_{k}} = 1
  2. \hat{y_{k}} \geq 0

以上就是常见的出现在神经网络最后的softmax公式, 一般用于分类问题上。

在信息论里,交叉熵用来估计两个概率分布在给定变量上的区别
H(p,q) = -\sum_{k=1}^{K}p_{k}log(q_{k})
带入预测到的标签与真正的标签值
L(y,\hat{y}) = -\sum_{k=1}^{K}y_{k}log(\hat{y}_{k})
y_{k}的值只能为0或者1,所以上式可以写为L(y,\hat{y}) = -log(\hat{y_{k}})|y_{k}=1

三、优化

回忆一下上面提到的感知器,感知器的训练过程就是不断更新权重,找到最合适的权值,使误差达到最小。写成数学表达就是
\mathop{\arg\min}_{w} L(w, x,y).
要用的方法是梯度下降(Gradient Descent):

  1. 初始化权值w
  2. 计算梯度,迭代直到收敛w^{k+1} = w^{k} - \eta \nabla_{w}L(w,x,y)
  3. \eta一般被称为学习率

关于梯度下降法,可以把整个loss函数想象成一片高低起伏的山岭,目标是找到山岭中的最低点,我们从任意初始位置出发,每一步都朝着下山的方向走,每走一步就计算一次新的下山方向,这样重复直到走到了最低处。

梯度下降的关键自然是计算梯度,梯度是多元函数在某点上对变量的偏导数,那么如何在一个复杂的神经网络里求导数呢?

传统上有两种方法:有限差分法和解析微分法。第一种计算效率很低,不适合拿来给计算机使用。利用第二种方法(就是高数课做题用的那种),根据复合函数求导的链式法则,可以将复杂的函数分解成简单的函数。

假设一个只有一层隐藏层的简单网络,输入为x_{1},x_{2},输出为\hat{y},损失方程为L。
前向传播:\hat{y} = f(x_{1},x_{2}), L = Loss(y,\hat{y})
反向传播: \frac{\partial L}{\partial x_{1}} = \frac{\partial L}{\partial \hat{y}} \frac{\partial \hat{y}}{\partial x_{1}}
\frac{\partial L}{\partial x_{2}} = \frac{\partial L}{\partial \hat{y}} \frac{\partial \hat{y}}{\partial x_{2}}
反向传播是从后向前,先计算\frac{\partial L}{\partial \hat{y}},然后向前做乘法,对于计算机来说是一种很有效率的计算方法。

偏微分的乘积也会带来一些问题,比如梯度爆炸和梯度消失,后面会讲到的。

四、全连接

一个神经元是一个节点,多个神经元连接就是一层(Layer)了。

假设有M个神经元,对于M个输出有\hat{y_{m}} = w^T_{m}x
写成矩阵乘法形式\hat{y} = Wx
这样的一层被称为全连接层(Fully connected layer)。

全连接层的前向和反向传播(公式好多改天再写)。

五、总结

深度学习天坑系列会不定期更新,觉得我写的还行就点个赞吧,我会继续努力哒 !

上一篇 下一篇

猜你喜欢

热点阅读