机器学习之神经网络
这段时间机器学习大热,很大程度都是归功于CNN(神经卷积网络)
不同于笔者之前机器学习相关文章,这一篇主要要讲的是机器学习中一类模型:神经网络
神经元模型:
神经元这样解释的不够清楚的话:
神经元
可以看出来,训练集(即 阶跃函数
但是由于这是一个分段函数(不可导):
无法很好的进行一些运算,因此,一般来说,我们希望有一个替代阶跃函数的可导函数
即sigmoid函数:
而最常见的sigmoid函数为: sigmoid函数
多层前馈神经网络
像如下图这样的,将神经元分成一层一层的,这种网络为多层前馈神经网络
多层前馈神经网络
误差逆传播算法
误差逆传播算法(error BackPropagation)亦称BP算法
因为对于多层的神经网络来说,想要很好的训练结果,需要强大的学习算法,而误差逆传播算法就是其中一种非常好的算法
想要了解误差逆传播算法首先要了解梯度下降:
梯度下降是一种常见的获得函数的局部最小值的方法,这种方法的主要思想是取一系列的自变量要保证,在的时候通过这种方法逐渐收敛得到局部最小值
即,根据泰勒展开式
因此由: 可知 这里只要 ()就可以保证不等式的成立
从而可知的更新方法是
其中的称为步长
如果 过大:
无法收敛
如果 过小:
收敛过慢
误差逆传播算法
对于输入层来说,假如有m个输入样本,其中每一个输入样本的特征为d维(即有d个特征),结果为l维。
输入层单一神经元输入的是所有样本的单一属性值,因此输入层会有d个神经元
输出层单一神经元输出的是所有样本的单一维度,因此输出层会有l个神经元
至于隐含层会有多少个神经元,这个是不确定的,但是一般来说是有一个经验值,具体如何计算,本文不再赘述
误差逆传首先计算最后一层,也就是输出层的误差:
对于第k个样例来说:
- 其中 和 分别表示模型获得的第k个样例的结果的第j维数据和真实的第k个样例的第j维数据
- 其中 1/2 是为了便于后来的求导
- 是一个关于的函数(代表隐含层向输出层输出的权重形成的矩阵)
我们希望尽量小,因此,需要通过我们在前面介绍的梯度下降来更新我们的
根据前面在梯度下降部分获得的公式:
根据矩阵相关的求梯度:
- 代表隐含层第h个和输出层第j个神经元之间的权重
可知
根据链式法则:
- 其中 为输出层第j个神经元的总输入,即, q 为隐藏层的神经元总数,为输出层的第h个输入
易知:
现在要计算另一部分,根据链式法则:
我们知道:,其中
因为sigmoid函数有一个非常好的性质:
因此:
而根据定义:
易知:
因此更新结果为:
设
因此
用类似的方法我们可以知道:
隐含层向输出层输入时候进行的sigmoid实际上传入的是因为传入的是线性方程而不是但不一定是过原点的,这个是偏移量
这个是输入层第i个神经元和隐含层层第h个神经元之间的权重
这个是输入层向隐含层输入时候的偏移量
以上介绍的BP算法称为标准BP算法
还有一种常用的BP算法称为累计BP算法
它计算的是希望达到最小
但是一般来说标准BP算法的误差会更小
BP算法存在的问题是:
其学习能力过好,容易出现过拟合问题
解决这种问题的方法:
- 如果发现训练集中误差在减小,而验证集的误差在增大,这个时候停止训练
- 第二种是 正则化
梯度下降算法固有的问题:
梯度下降只能获得局部最小值,而这个局部最小值可能并不是全局最小值,很有可能会陷入一个局部最小值
深度学习之CNN(神经卷积网络)
最开始时候深度学习并不被看好,因为深度学习的模型过于复杂,非常容易出现过拟合问题,而且经典算法(比如BP算法)不能很好的应用与深度学习网络。
但是计算能力的提升,和数据量的提升 使得 过拟合问题变得没那么严重。因此这些年深度学习又被重新提起。
但是还有一个比较严重的问题是,由于层数过多,这里面涉及参数过多,训练开销过大。为此,有多种解决方案。
其中一种比较常用的是“权共享”即让一组神经元使用相同的连接权。这也是CNN(神经卷积网络)所使用的策略
CNN 中的卷积核其实就是共享的权重 卷积的过程是特征提取的过程。
为什么要使用卷积:
前面我们介绍的神经网络是一种全连接网络,它最大的问题在于训练参数过多,因为一旦层数大量增加,它的参数训练带来的时间代价是无法忍受的。因此我们需要一种方法来减少要训练的参数。
要知道在处理图像时候,图像不同像素点之间比较近的像素之间的关系比较密切,而且我们也是在相邻像素中能获得更多的信息。因此,我们不希望在下一层输出时候我们仍然保持着没有表现出这种关系的状态继续向前传播。
因此,在向下传播之前,要进行内连接。也就是卷积,通过卷积核与局部图像卷积获得一个值完成对于相邻像素之间的关系的表现
这样简单的改变,形成的就是神经卷积网络