欢迎光临散文网 会员登陆 & 注册

神经网络

2022-11-02 21:41 作者:Vector永远的神  | 我要投稿

    神经网络是机器学习当中的一个最常见的模型,模拟大脑的神经元进行输入输出的,需要大量的参数进行计算。遇到非线性问题时,特征的数量增大,单纯的幂函数之和是无法分类问题的曲线。

    算法相当于是有一个阈值在决定是否激活,类似于区间的思想,只有当总输入值大于阈值时,神经元模型才会输出相应的结果。通常是使用Sigmoid激活函数来将大范围的输入压缩到[0,1]区间上进行输出。

    全连接神经网络结构一般是一层是特征输入层,若干个隐藏层,一个结果输出层。每层之间都需要大量的参数来进行控制,包括权重值和偏置值等等,激活函数的设置都是需要考虑的。同层神经元之间是不存在连接关系的。

    以三层神经元网络为例来说明反向传播算法

反向传播的伪代码

   在反向传播的思路当中,首先是随机给定初始的若干权重值和偏置,然后带入训练样本计算得到预测值,然后与真实值比较计算损失函数,再根据损失函数求梯度,得到每组权重w向量的变化值,对于输出层和隐藏层的权值变换时分成两步进行,对当前值变化后再带入下一个训练样本计算。


正向计算

        在神经网络模型的运算中,正向传播是基础。a(i)表示某一层的输出值,第一层输出的a1就是输入的特征值x,Θi表示某一层全连接神经元之间的参数值向量,通过与上一层的a(i)进行相乘得到下一层的输入z(i),再相加常数值a0后进行sigmoid函数压缩,得到本层的输出a(i)。函数g(x)就是sigmoid函数。

    损失函数的定义依然是最为关键的,直接决定了代价函数和梯度下降的调整过程。在神经网络中,我们依然使用均方差来表示误差值(预测-真实),为了后续求偏导数梯度的方便就加了个1/2。

误差函数

     整体的目标是为了代价函数最小,为了收敛最快也就是采用了梯度下降的方式来进行,沿着负梯度的方向进行调整。η表示学习率控制收敛速度,防止其发散,一般设置为0.1.

权重w的调整  

    代价函数求出偏导数后本质上仍然是一个关于参数θ,也就是权重w的函数,每一步带入当前位置的一系列w的值,就是θ向量的值,再取反也就是当前逆梯度的值,就是最快收敛的方向。

反向传播中的误差函数

    δ4j是输出层某一个神经元的输出误差,与真实值相减即可得到,组合起来的δ4则是整个输出层的误差向量。第三层间的神经元参数Θ3与δ4相乘,再与sigmoid(z3)导数点乘得到第三层的误差值δ3,sigmoid(z3)的导数也就是a3点乘(1-a3)。同理可得第二层的损失函数δ2以及第一层的δ1,这个从输出层反推得到输入层的损失函数的过程就是反向传播。


    梯度下降的求导过程中,在不考虑正则化(即λ=0)的影响下,对于全连接神经网络中的第l层第j个神经元到l+1层第i个神经元之间的系数求偏导时,刚好是对应的输出值a(l)j乘以下一层的损失函数值delta(l+1)i。

反向传播的基本过程

    整体过程如此流程图所示,最终的终止条件应该是代价函数最小。

    标准BP算法是挨个挨个训练样本进行计算,但是真实的模型中,一般是将训练集划分为若干个minibatch来求。求出在这个batch上的累加的cost函数再取平均,对于这个函数求梯度,当作近似值,称为随机梯度下山的方式,并不一定每次都是最快的方向,但是可以加速收敛过程,并且还可以在一定程度上避免陷入局部最优解的问题。

    对于隐藏层的神经元个数的设计问题,一般使用经验和试错法来进行,权重值等参数还可以反向传播自动计算,但是神经元个数的问题要具体分析。

    过拟合问题一般是使用早停和正则化两种思路来解决,早停就是说一旦训练集误差减小而验证集的误差升高就立刻停止训练过程,选择最小的验证集误差对应的参数输出。

    正则化的方借用了SVM的思想,引入网络复杂度的描述到代价函数当中,也就是权值的平方和,这样会偏爱于权值较小的那种类型。

正则化

   

回归模型中损失函数

     与logistic回归模型类型类似,正则化的思想在神经网络预测回归模型也适用。与logistic回归的二分类模型不同的是,对于输出层的K个神经元节点输出的都表示每一种结果的可能的概率,输出层节点的概率之和为1,然后与真实的结果相减求对数即得到损失函数。真实的结果就只有某一项的概率为1,其他的项都是0组成的向量。最后就是添加全连接神经网络中的各个节点之间的权重值平方和,在最小化的目标下,自然会选择较小的参数值来构成网络。

    避免陷入局部最优解的思路一般就是随机梯度下降,当然也可以多组初始值开始搜索下山法,耗费资源较多,也有模拟退火的算法,选择次优解,避免收敛速度太快,但是选择的概率得逐渐降低。

梯度检测

关于在基础的编码过程中,验证J(Θ)求导是否正确,可以使用导数的定义来验证,选择一个较小的ε,量级10-4次方,来进行双向检测确保两边导数均存在,避免程序错误。


在反向传播算法初始值设定时,不能全部参数完全设置成一样的,否则会使得后续反向传播算法中的更新后依然相同,应先模型的特征学习的效果。为了避免这种对称权重的现象,应该随机设置初始参数值。

    卷积神经网络因为时图像处理相关的,等到那个时候再学。

神经网络的评论 (共 条)

分享到微博请遵守国家法律