前馈神经网络FNN(原理及实现)

一、引例

在介绍前馈神经网络之前先介绍感知机的概念:

x1,x2是输入信号,y是输出信号,w1,w2是权重。输入信号被送往神经元时,会被乘以固定的权重,权重越大,对应的权重的信号的重要性越高,神经元会计算传送过来的信号的总和,只有当这个总和超过某个有限值时,才会输出1,这是称为“神经元被激活”,将这个界限值称为阈值。

 w1,w2是控制输入信号的重要性参数,b叫偏置,调整神经元被激活的容易程度的参数。 使用感知机可以实现与门、与非门、或门三种逻辑电路,现在考虑异或门(XOR gate)。

可以发现,无论重要性参数和偏置取值多少,都无法完成异或门的实现。(这就促使在当时,人们认为感知机连最基本的异或门逻辑电路都无法实现,认为 感知机并没有很大的作用),接下来看看为什么感知机无法实现最基本的异或门。

首先我们试着将或门的动作形象化,权重参数(b,w1,w2)=(-0.5 ,1,1)时,可以构造或门,此时感知机可以用下面的表达式写出:

 感知机会生成由直线-0.5+x1+x2=0分割开的两个空间,其中一个空间输出为1,另一个空间输出为0,如图:

与门、非门、与非门都可以用一条直线将样本空间分成两部分,一部分取1另一部分取0 。但是异或门是无法用一条直线进行分割的。如图:

 感知机的局限性就在于它只能表示由一条直线分割的空间,如上图的曲线,感知机无法表示。但异或门可以通过组合与门、与非门、或门来实现。如图:

 如上图,用感知机的表示方法来表示异或门,如图:

如图,异或门是一种多层结构的神经网络,这里将最左边的一列称为第0层,中间的一列称为第1层,最右边的1列称为第2层。实际上与门、或门是单层感知机,异或门是2层感知机,叠加了多层的感知机就被称为多层感知机(MLP)。

二、神经网络模型

首先考虑多个输出结果的感知机,如图:

(由于公式太难打了,就用以前做的ppt,直接截图过来啦)

画出最一般的情况:

 以上是基本的神经网络的结构,这种标准的结构称为前馈神经网络,因为输入从左向右不断前馈,也称为全连接网络,因为相邻层的所有神经元都相互连接。

三、激活函数

  值得注意的是,线性的激活函数无论叠加或嵌套多少次,所得到的结果一定还是线性函数,所以激活函数大多选择非线性的,可以得到非线性的决策边界。常见的激活函数如下:

1.S形函数(sigmoid function):

   可以视为一种挤压函数,即把输入的任何实数都挤压在(0,1)区间,当输入值z在0附近时,S函数近似为线性函数,输入越小,输出越接近于0,输入越大,输出越接近于1,取值位于(0,1),可将其解释为概率分布。

2.双曲正切函数(hyperbolic tangent function):是一种广义的S形函数:

 以上两个激活函数,可能会面临着梯度消失,“两端饱和”的问题。

3.修正线性单元(rectified linear unit,ReLU)。也称线性整流函数:

 ReLU函数的导数在z>0的时候恒等于1,这在一定程度上缓解神经网络中的梯度消失问题,加快梯度下降的收敛速度。

由于ReLU的特殊结构,当z<0的时候,可能会导致神经元在训练时死亡,故无法更新其权重。

4.泄露ReLU(leaky ReLU,简记为LReLU):为了解决死亡ReLU问题,当z<0时,依然保持一个很小的梯度,这样使得当神经元处于非激活状态时,也能有一个非0的梯度可以更新参数,定义为: 

 5.软加函数(softplus function),软加函数可以视为ReLU的光滑版本,定义为:

,softplus函数也具有单侧抑制的特性,但没有ReLU函数的稀疏激活性。

 四、损失函数

   训练网络意味着估计神经网络的诸多参数,神经网络的通常训练方法为,在参数空间使用梯度下降法,使损失函数最小化,神经网络的损失函数的一般形式可以写为:

五、算法(反向传播)

  由于神经网络包含很多参数,且涉及较多的非线性的激活函数,故一般不便于求二阶导数,无法使用牛顿法,因此,常使用梯度下降法训练神经网络,但仍需要计算神经网络的梯度向量,最常用的计算梯度向量的方法是反向传播算法(back propagation,简记BP)。反向传播算法就是使用微积分的“链式法则”,将靠左边的参数的导数递归地表示为靠右边的参数的导数的函数。

 

 初始值的选定其实也是有一些其他的方法,比如He初始值,感兴趣的可以自己搜索一下。

六、实战

1.利用神经网络完成一个简单的回归模型,采用的数据集是自带的波士顿数据集。但是这个数据集要注意,scikitlearn包的版本不能太高,太高就用不了啦!

其中参数“solver=lbfgs”表示使用L-BFGS算法,是一种准牛顿算法,使用近似的二阶黑塞矩阵,适用于较小的数据集。默认solver=adam,表示使用adam算法,是一种基于随机梯度下降的优化算法,适用于较大的数据集。另一种solver=sqd,表示使用标准的随机梯度下降法。 参数hidden_layer_sizes=(5,)表示只有单一隐藏层,其中包含五个神经元。 参数max_iter=10000,表示最大迭代次数设置为10000。 结果显示测试集R方达到0.85。

sklearn不提供针对神经网络结构的可视化画图方法。

对于神经网络,无法像基于决策树的模型那样计算各变量的重要性。一种替代方法是,计算每个特征变量的置换重要性,步骤如下。给定训练集和基准模型,计算 测试集的拟合优度,其次对于某个特征变量,将次变量在训练集的观测值排序随机打乱,变成一个噪声变量,即所谓的随机置换,重估模型并计算测试集的拟合优度,这两个拟合优度的差值就是该变量的置换重要性。

根据重要置换性,最重要的两个变量是LSTAT与RM。进一步想知道特征变量对于响应变量的具体作用,可画偏依赖图:

使用for循环,考察神经元数目与测试集拟合优度的影响:

 2.利用神经网络完成一个简单的多分类任务

使用垃圾邮件进行演示: 该数据框包含4601个观测值 和58个变量,最后一个变量 为响应变量。在这里只展示部分的数据:

 

 

默认使用Adam算法,模型准确率为94%,迭代次数为1013次。 为防止模型过拟合,我们采用早停的方式进行正则化:

early_stopping=True表示使用早停方法。validation_fraction=0.25表示使用25%的训练集作为验证集。 得到模型准确率为0.948,迭代次数为53。

(在此介绍一下早停的概念)

为防止过拟合,神经网络提出了多种正则化方法,包括:早停,丢包,惩罚等 介绍早停:意味着提前停止训练,而不必等到神经网络达到损失函数或者训练误差的最小值。建议把样本分成三部分,训练集,验证集和测试集,首先在训练集上进行训练,并同时将学到的神经网络模型在验证集上做预测,并计算验证误差(validation error),其次,当验证误差开始上升时,即停止训练。讲所得到的模型在测试集上进行预测即可。

sklearn这个包做前馈神经网络是非常方便的,但是我们无法看到其中的诸多信息,更深层的网络我们可以采用Keras等其他的包。厉害的小伙伴也可以自己手动构建网络。有任何问题欢迎评论哦!

  • 21
    点赞
  • 45
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值