深度学习(一)神经网络简介
一、感知器
在生物上,神经元是神经系统结构和功能的单位,神经元之间通过突触传递信息,如果一个神经元接收到的刺激超过了阈值,就会产生一个动作电位,动作电位通过突触传向其他神经元,从而传递了信息。这个动作电位的产生过程,是一种“全或无”的响应:
如果刺激超过了阈值,不管这个刺激到底超过了阈值多少,都会产生动作电位。
如果刺激低于阈值,无事发生。
从数学角度来看,这就是一个二分类的问题,输出只能为1或-1。
1957年, Rosenblatt提出了感知器,感知器的决策规则:
分类的结果只取决于输入和权值乘积之和的符号。我们的目的是要找到一个权值,使它让误分类的样本点距离决策边界的距离最短。
单个的感知器的作用是有限的,它不能解锁XOR(异或)的问题,所以出现多层感知器(Multi-Layer Perceptron,MLP)。
多层感知器是单个感知器的集合,也就相当于结合了多个神经元,这使得决策边界有了非线性。直到今天多层感知器依旧会被用到(并不是过时的算法)。
当我们把多个感受器叠在一起的时候,总有那么几个神经元不会直接接触到第一手的信息,把从别的神经元那里得到的消息一通加工之后传给下一个神经元,它们被称为隐藏层(hidden layer),第一个收到消息的神经元是输入层,最后得出结论的神经元是输出层。
当一个感知器(或者其他前馈神经网络,感受器是最简单的)拥有了一个隐藏层时,它就已经是一个万能公式逼近器了(Universal function approximator)(听起来怪牛逼的)。
背后的数学原理是通用近似定理(Universal Approximation Theorem), 假设是一个非常数的,有界,单调递增的函数,对于任意
以及定义在
的紧子集上的任意连续函数,都存在一个整数
,实常数
,以及实向量
,有
所以我们可以根据这个定理,我们可以用合适的激活函数来近似任何公式。虽然但是,只有单层的网络就算能表示任何函数,我们也不知道它到底需要多少个神经元,也可能会无法学习和泛化。使用深层的模型能够减少所需要的单元数量,并且减小泛化误差。
二、Softmax
对于分类问题,当类别很多时,我们可以使用一种方式来标记类别
这种方式被称为独热编码(One-hot encoding),即只有一个元素不等于零。
对于预测到的结果,
即输出的结果为预测属于类别
的值占所有预测值之和的比,由此可见
有两个性质:
以上就是常见的出现在神经网络最后的softmax公式, 一般用于分类问题上。
在信息论里,交叉熵用来估计两个概率分布在给定变量上的区别
带入预测到的标签与真正的标签值
的值只能为0或者1,所以上式可以写为
三、优化
回忆一下上面提到的感知器,感知器的训练过程就是不断更新权重,找到最合适的权值,使误差达到最小。写成数学表达就是
要用的方法是梯度下降(Gradient Descent):
- 初始化权值
- 计算梯度,迭代直到收敛
-
一般被称为学习率
关于梯度下降法,可以把整个函数想象成一片高低起伏的山岭,目标是找到山岭中的最低点,我们从任意初始位置出发,每一步都朝着下山的方向走,每走一步就计算一次新的下山方向,这样重复直到走到了最低处。
梯度下降的关键自然是计算梯度,梯度是多元函数在某点上对变量的偏导数,那么如何在一个复杂的神经网络里求导数呢?
传统上有两种方法:有限差分法和解析微分法。第一种计算效率很低,不适合拿来给计算机使用。利用第二种方法(就是高数课做题用的那种),根据复合函数求导的链式法则,可以将复杂的函数分解成简单的函数。
假设一个只有一层隐藏层的简单网络,输入为,输出为
,损失方程为L。
前向传播:
反向传播:
反向传播是从后向前,先计算,然后向前做乘法,对于计算机来说是一种很有效率的计算方法。
偏微分的乘积也会带来一些问题,比如梯度爆炸和梯度消失,后面会讲到的。
四、全连接
一个神经元是一个节点,多个神经元连接就是一层(Layer)了。
假设有个神经元,对于
个输出有
写成矩阵乘法形式
这样的一层被称为全连接层(Fully connected layer)。
全连接层的前向和反向传播(公式好多改天再写)。
五、总结
- 感知器的算法来自于神经元的功能
- 梯度下降是深度学习里默认的训练算法
- 反向传播算法让计算梯度更加高效
- 全连接层是神经网络中非常常见的连接层
深度学习天坑系列会不定期更新,觉得我写的还行就点个赞吧,我会继续努力哒 !