一、引例
在介绍前馈神经网络之前先介绍感知机的概念:
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等其他的包。厉害的小伙伴也可以自己手动构建网络。有任何问题欢迎评论哦!