神经网络

机器学习之神经网络

2019-02-08  本文已影响9人  Athenaearl

这段时间机器学习大热,很大程度都是归功于CNN(神经卷积网络)
不同于笔者之前机器学习相关文章,这一篇主要要讲的是机器学习中一类模型:神经网络

神经元模型:

神经元
这样解释的不够清楚的话:
神经元
可以看出来,训练集(即 阶跃函数
但是由于这是一个分段函数(不可导):
无法很好的进行一些运算,因此,一般来说,我们希望有一个替代阶跃函数的可导函数
即sigmoid函数:
而最常见的sigmoid函数为: sigmoid函数

多层前馈神经网络

像如下图这样的,将神经元分成一层一层的,这种网络为多层前馈神经网络


多层前馈神经网络

误差逆传播算法

误差逆传播算法(error BackPropagation)亦称BP算法
因为对于多层的神经网络来说,想要很好的训练结果,需要强大的学习算法,而误差逆传播算法就是其中一种非常好的算法
想要了解误差逆传播算法首先要了解梯度下降
梯度下降是一种常见的获得函数的局部最小值的方法,这种方法的主要思想是取一系列的自变量x_1, x_2, x_3,.....x_n要保证,在x_i < x_j的时候f(x_i)>f(x_j)通过这种方法逐渐收敛得到局部最小值
f(x+\Delta x) < f(x),根据泰勒展开式 f(x+\Delta x) = f(x) + \Delta x^T\nabla f(x)
因此由:f(x+\Delta x) < f(x) 可知 \Delta x^T\nabla f(x) < 0 这里只要 \Delta x = -\gamma \nabla f(x) (\gamma > 0)就可以保证不等式的成立
从而可知x的更新方法是x => x - \gamma \nabla f(x)
其中的\gamma称为步长
如果\gamma 过大:

步长过大
无法收敛

如果\gamma 过小:

步长过小
收敛过慢

误差逆传播算法
对于输入层来说,假如有m个输入样本,其中每一个输入样本的特征为d维(即有d个特征),结果为l维。
输入层单一神经元输入的是所有样本的单一属性值,因此输入层会有d个神经元
输出层单一神经元输出的是所有样本的单一维度,因此输出层会有l个神经元
至于隐含层会有多少个神经元,这个是不确定的,但是一般来说是有一个经验值,具体如何计算,本文不再赘述
误差逆传首先计算最后一层,也就是输出层的误差:
对于第k个样例来说:E_k = \frac{1}{2} \sum_{j=1}^{l}(o^k_j - y^k_j)^2

我们希望E_k尽量小,因此,需要通过我们在前面介绍的梯度下降来更新我们的W
根据前面在梯度下降部分获得的公式:
\Delta W= - \gamma \frac{\partial E_k}{\partial W}

根据矩阵相关的求梯度:
\frac{\partial f(X)}{\partial X} = [\frac{\partial f(x)}{\partial x_1}, \frac{\partial f(x)}{\partial x_2},......,\frac{\partial f(x)}{\partial x_n}]^T

可知
\Delta w_{hj} = - \gamma \frac{\partial E_k}{\partial w_{hj}}
根据链式法则:
- \frac{\partial E_k}{\partial w_{hj}} = - \frac{\partial E_k}{\partial \beta_j} \frac{\partial \beta_j}{\partial w_{hj}}

易知:\frac{\partial \beta_j}{\partial w_{hj}} = b_h

现在要计算另一部分,根据链式法则:
- \frac{\partial E_k}{\partial \beta_j} = -\frac{\partial E_k}{\partial o^k_j} \frac{\partial o^k_j}{\partial \beta_j}

我们知道:o^k_j = sigmoid(\beta_j),其中sigmoid(x) = \frac{1}{1+e^{-x}}
因为sigmoid函数有一个非常好的性质:sigmoid'(x) = sigmoid(x)(1-sigmoid(x))
因此:\frac{\partial o^k_j}{\partial \beta_j} = o^k_j(1 - o^k_j)
而根据定义:E_k = \frac{1}{2} \sum_{j=1}^{l}(o^k_j - y^k_j)^2
易知:-\frac{\partial E_k}{\partial o^k_j} = y^k_j - o^k_j

因此更新结果为: \Delta w_{hj} = \gamma (y^k_j - o^k_j)y^k_j(1 - y^k_j)b_h
g_j = (y^k_j - o^k_j)y^k_j(1 - y^k_j)
因此\Delta w_{hj} = \gamma g_j b_h

用类似的方法我们可以知道:
\Delta \theta_j = - \gamma g_j 隐含层向输出层输入时候进行的sigmoid实际上传入的是\beta_j - \theta_j因为传入的是线性方程而不是但不一定是过原点的,这个是偏移量
\Delta v_{ih} = \gamma e_h x_i 这个是输入层第i个神经元和隐含层层第h个神经元之间的权重
\Delta \eta_j = - \gamma e_h 这个是输入层向隐含层输入时候的偏移量
e_h = b_h(1-b_h)\sum_{j = 1}^{l}w_{hj}g{j}

以上介绍的BP算法称为标准BP算法
还有一种常用的BP算法称为累计BP算法
它计算的是希望E = \frac{1}{m}\sum_{k=1}^{m}E_k达到最小
但是一般来说标准BP算法的误差会更小

BP算法存在的问题是:
其学习能力过好,容易出现过拟合问题
解决这种问题的方法:

  1. 如果发现训练集中误差在减小,而验证集的误差在增大,这个时候停止训练
  2. 第二种是 正则化

梯度下降算法固有的问题:
梯度下降只能获得局部最小值,而这个局部最小值可能并不是全局最小值,很有可能会陷入一个局部最小值

深度学习之CNN(神经卷积网络)

最开始时候深度学习并不被看好,因为深度学习的模型过于复杂,非常容易出现过拟合问题,而且经典算法(比如BP算法)不能很好的应用与深度学习网络。
但是计算能力的提升,和数据量的提升 使得 过拟合问题变得没那么严重。因此这些年深度学习又被重新提起。
但是还有一个比较严重的问题是,由于层数过多,这里面涉及参数过多,训练开销过大。为此,有多种解决方案。
其中一种比较常用的是“权共享”即让一组神经元使用相同的连接权。这也是CNN(神经卷积网络)所使用的策略
CNN 中的卷积核其实就是共享的权重 卷积的过程是特征提取的过程。
为什么要使用卷积:
前面我们介绍的神经网络是一种全连接网络,它最大的问题在于训练参数过多,因为一旦层数大量增加,它的参数训练带来的时间代价是无法忍受的。因此我们需要一种方法来减少要训练的参数。
要知道在处理图像时候,图像不同像素点之间比较近的像素之间的关系比较密切,而且我们也是在相邻像素中能获得更多的信息。因此,我们不希望在下一层输出时候我们仍然保持着没有表现出这种关系的状态继续向前传播。
因此,在向下传播之前,要进行内连接。也就是卷积,通过卷积核与局部图像卷积获得一个值完成对于相邻像素之间的关系的表现

这样简单的改变,形成的就是神经卷积网络

上一篇下一篇

猜你喜欢

热点阅读