神经网络架构

神经网络模型

神经网络分为输入层、隐藏层、输出层;以一个四层的神经网络为例(包含两个隐藏层),输入层x1,x2,x3经过第一组权重参数W1后,得到了第一个隐藏层的数据。然后再经过W2、W3后,得到最后的输出层数据。

那么,既然如此,可以直接用一个WX来进行表示就可以,为什么要加那么多的隐藏层?

因为还得考虑到非线性的情况,WX是不能表现出非线性的情况的。

激活函数

如上图所示,特征值x经过W1后,还要和0做一个对比,取较大者。这里其实相当于在隐藏层1之后,经过了一个ReLu类型的激活函数。ReLu激活函数如下:

隐藏层1的参数如果小于0,输出值直接等于0。隐藏层1的参数如果大于0,那么输出值等于它本身。

经过了激活函数,线性方程就会变成非线性方程,可以更好地取拟合真实值。

常见的激活函数如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JZjg502g-1577169211786)(https://raw.githubusercontent.com/yumening7/image_lib/master/1576747069(1)].jpg)

有了激活函数,可以在某些隐藏层添加激活函数,把原本的线性方程变成非线性的方程。

sigmoid激活函数与梯度消失问题

之前已经说过误差反向传播,如上图所示,假设一个神经网络经过W0-W4之后得到一个loss值,现在我们想知道W0-W4对loss的贡献值。

W4对loss的贡献值c4 = 对W4求偏导

W3对loss的贡献值c3 = (对W3求偏导)* c4

W2对loss的贡献值c2 = (对W2求偏导)* c3 * c4

W1对loss的贡献值c1 = (对W1求偏导)* c2 * c3 * c4

W0对loss的贡献值c0 = (对W0求偏导)* c1 * c2 * c3 * c4

其实这里就相当于一个梯度累乘的操作。

最开始,神经网络都是拿sigmoid当激活函数的。但是它有个致命的缺陷:

假设这里的W3是一个sigmoid激活函数,W3这一个隐藏层的作用是把经过W2的数据作为x传入sigmoid函数,得出一个0到1区间的参数,再传递给W4对应的隐藏层。

如果经过W2的数据比较大或者比较小(例如大于10或小于-10,这里取10方便举例),10作为x传入sigmoid函数,求x=10时,W3的偏导。由下图sigmoid函数图像可以看出,当x=10时,此时W3的偏导(斜率)已经很接近0。

W3对loss的贡献值c3 = (对W3求偏导)* c4

可以看得出,除非c4的值非常大,否则W3对loss的贡献值c3也会是一个接近0的数。

由于W3对loss的贡献值小,通过误差反向传播,对W3的调整也会很小。而且由于W2、W1、W0对loss的贡献值计算,都要乘上c3,而c3又十分接近0,导致W2、W1、W0对loss的贡献值都非常小,误差反向传播时,对它们的调整也会非常小,几乎无法进行更新。

这还是只考虑到W3是sigmoid函数且对应的x值偏大或偏小的情况。若是W2或W1也是一个sigmoid函数,且对应的x值也存在偏大或偏小的情况,那整个梯度计算中,会出现多个接近0的值相乘,梯度会在累乘中逐渐消失(约等于0)。

这样就产生了所谓的梯度消失的问题,在神经网络层次比较多的时候,梯度消失问题非常容易发生,所以sigmoid函数被逐渐淘汰。

ReLu激活函数:

Relu激活函数一方面可以解决梯度消失的问题,另一方面求导也比较简单。ReLu激活函数已经几乎取代了sigmoid函数,成为神经网络的首选激活函数。

神经元

神经元的个数是会影响最终分类的效果,神经元的个数越多,通常情况下,神经网络模型的效果越好。

https://cs.stanford.edu/people/karpathy/convnetjs/demo/classify2d.html

上面的链接是一个神经网络分类的模型,点开链接

如上图所示,在红色方框中,把中间两个隐藏层的神经元个数都改为1,再去执行脚本,可以看到此时只有一条决策边界去做分类,分类效果并不好。

如上图,我们把两个隐藏层的神经元个数都改为2,再次执行脚本,可以看到此时有两条决策边界去做分类,效果比只有1个神经元的时候会好一些。

如上图,我们把隐藏层的神经元个数都改为3,再次执行脚本,可以看到此时的分类效果已经很好了,绿色的点和红色的点被完全分开。

当遇到更复杂的分类问题的时候,想要有比较好的分类效果,需要再增加神经元的个数。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rzTF6X8c-1577169211790)(68CFAE4AF8F9431FACB8B22473FB43B7)]

如上图,螺旋形的数据,当隐藏层的神经元个数都为5的时候,才能勉强把红色的点和绿色的点分开。

虽然神经元的个数越多,通常情况下,神经网络模型的效果越好。但是神经元的个数越多,也越容易发生过拟合的现象。

正则化在神经网络中的重要作用:

L2正则化的表达式为:Σ λ*w^2

如上图,可以看到正则项系数λ取值越小时,在损失函数中施加的正则化惩罚项力度就越小,虽然训练时的分类效果很好,但是泛化能力差,容易出现过拟合现象。

当正则项系数λ的值增大时,在损失函数中施加的正则化惩罚项力度也随值增大,决策边界逐渐变得平滑,训练时的分类效果可能没有特别好,但是泛化能力强,不容易出现过拟合现象。

从上图也可以看出,越多的神经元,就越能够表达复杂的模型。但是神经元越多也越容易发生过拟合现象。

权重初始化:

如果W的初始化值都为0,那隐藏层都为0,输出层也为0,反向传播也是0。这样就没有意义。而如果W是1或者任意常数,都会导致反向传播回来都是从一个方向去迭代,这样会导致神经网络迭代太慢。

一般的权重初始化都是进行高斯初始化或者随机初始化。

而wx + b中的b,一般都是用零值来进行初始化的,当然,用其他常值来进行初始化也没有问题。

DROP-OUT:

如上图,在神经网络中,每一层的和其他层之间是一个全连接的操作。既每一个特征或神经元都与下一层的每个w进行连接。这样的连接方式过于复杂,很容易就出现过拟合的现象。

这样的情况就可以使用DROP-OUT来消除过拟合。

DROP-OUT的原理是在训练的过程,每次只取部分的神经元进行更新,例如指定一个保留率为60%,每次只留下60%的神经元进行前向传播和反向传播,其他神经元不进行更新。如上图中的B,第一次训练迭代的时候,不更新w1、w3、w4。可能在第二次训练迭代的时候,又会不更新W2和W5。反正每次只会随机选出60%的神经元。

使用DROP-OUT就能降低一些过拟合的风险,而且还能减小计算量。对于DROP-OUT减小的部分精度,可以用更多的迭代次数来进行弥补。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值