神经网络浅析(单层)


机器学习的模型可以多种形式来实现,而神经网络就是其中之一。参看我所编写的初识机器学习那一个文章,对于第二幅图而言,用神经网络代替模型,用学习规则代替机器学习。因为在神经网络的语境中,确定模型的过程称为学习规则,接下来我只简单介绍单层神经网络中的一些基础知识,为多层神经网络的学习奠定基础。(以下涉及的具体详细代码不给出,可尝试自己编程一下,如果实在有困难,可以直接看我发布的资源MATLAB编程神经网络

1. 节点

众所周知,神经网络是模拟大脑机制发展起来的。大脑依靠神经元以及神经元之间的关联记忆和存储信息,而神经网络利用节点和节点之间的关联传递信息,权重值用来模拟神经元之间的关联。这样说可能还不太清楚,在这儿我举个简单的例子,看下图:
在这里插入图片描述
图中的圆圈就是节点,箭头代表信号流。x1、x2、x3是输入信号,w1、w2、w3是相应信号的权重,b是偏置,神经网络的信息就是以权重和偏置形式存储。来自外部的输入信号在到达节点前要乘以一个权重值,最后得到和偏置值形成加权和,即 v = w 1 ∗ x 1 + w 2 ∗ x 2 + w 3 ∗ x 3 + b v=w1*x1+w2*x2+w3*x3+b v=w1x1+w2x2+w3x3+b,最后,节点将加权和输入到激活函数并产生输出,即 y = ϕ ( v ) y=\phi(v) y=ϕ(v),激活函数的形式也有很多。

2. 层

不同的节点连接方式可以建立多种神经网络,最常用的一类神经网络采用的是分层节点结构。通过不同的层可以对神经网络进行分类,一般分类如下

单层神经网络 多层神经网络
输入层—输出层 浅度神经网络:输入层—单个隐含层—输出层
深度神经网络:输入层—多个隐含层—输出层

在分层的神经网络中,信号进入输入层,穿过隐含层,并通过输出层离开网络,在此过程中,信号逐层前进。通过下图可以明显看出一些含义:
在这里插入图片描述
除了输入层、输出层之外,隐含层的每个节点均需要接收上一层所有节点传递过来的信息,并且将输出传递给下一层的所有节点。在这儿需要明确一点,除了输入层不需要激活函数外,其余层均需要激活函数进行输出,这儿有一个特点,如果隐含层采用线性激活函数,隐含层将无效化,输出层可以采用线性激活函数,毫无影响。

3. 神经网络的监督学习

对于这一节,我就仅仅介绍一下监督学习的步骤:

  1. 用合适的值初始化权重
  2. 从训练数据中获得输入,输入神经网络,最后从神经网络获取输出,将它与标准输出进行比对
  3. 调整权重值以减少误差
  4. 对所有训练数据重复步骤2、3

4. delta规则

正如前面所述,为了用新的信息训练神经网络,需要相应的改变权重,根据给定信息修改权重的系统方法就是学习规则,delta规则是单层神经网络的代表性规则。
在这里插入图片描述
如果一个输入节点导致一个输出节点产生误差,则这两个节点之间的权重将依据输入值和输出偏差成比例的进行调整,公示表述为 w i j = w i j + α ∗ e i ∗ x j w_{ij}=w_{ij}+\alpha*e_i*x_j wij=wij+αeixj,其中 α \alpha α称为学习率,取值为 ( 0 , 1 ] (0,1] (0,1]。学习率决定了权重每次的变化量,如果太高就会导致输出在解决方案周围徘徊,从而无法收敛,如果太低计算收敛到解决方案的过程则太慢。

5. 广义delta规则

上一节介绍的delta规则已经相当过时了,因为delta规则存在更广义的形式。对于任意激活函数,delta规则可写为 w i j = w i j + α ∗ δ i ∗ x j w_{ij}=w_{ij}+\alpha*\delta_i*x_j wij=wij+αδixj,其中 δ i = ϕ 1 ( v i ) ∗ e i \delta_i=\phi^1(v_i)*e_i δi=ϕ1(vi)ei。如果采用线性激活函数,则 δ i = e i \delta_i=e_i δi=ei,因此上一节的学习规则仅仅对线性激活函数适用。虽然广义delta规则的权重更新公式比较复杂,但基本思想没有变,依然是依据输出节点误差和输入节点值成比例的确定。

6. SGD、Batch、Mini Batch

6.1 SGD

SGD(随机梯度下降)依据每个训练数据计算误差,并立即调整权重。由于SGD针对每个数据点调整权重,神经网络的性能在进行训练的过程中是上下波动的。SGD计算权重更新的方法为 Δ w i j = α ∗ δ i ∗ x j \Delta w_{ij}=\alpha*\delta_i*x_j Δwij=αδixj,这意味着delta规则是基于SGD方法的。

6.2 Batch

该方法使用训练数据的所有误差计算各个权重更新值,然后使用权重更新的平均值调整权重,它使用了所有训练数据,但只做一次更新。Batch计算权重更新的方法为 Δ w i j = 1 N ∗ ∑ k = 1 N Δ w i j ( k ) \Delta w_{ij}=\frac{1}{N}*\displaystyle\sum_{k=1}^{N}\Delta w_{ij}(k) Δwij=N1k=1NΔwij(k),由于采用了对权重更新求平均值的计算方法,Batch方法的训练花费大量时间。

6.3 Mini Batch

该方法是介于上面两个方法之间。在这儿举个简单的例子,如果在200个训练数据点中取50个任意数据点,将Batch方法应用于这50个数据点,这种情况下需要进行4次权重调整就可以完成所有数据点的训练过程。若数据点的数量选择合理,则该方法可以兼顾两个方法的优势,即SGD方法的速度和Batch方法的稳定性。

扫描二维码关注公众号,回复: 12619326 查看本文章

7. 实现SGD方法

考虑三个输入节点和和一个输出节点组成的神经网络,无偏置。采用Sigmoid函数作为激活函数,有四个训练数据点,分别是 [ 0010 ] [0 0 1 0] [0010] [ 0110 ] [0 1 1 0] [0110] [ 1011 ] [1 0 1 1] [1011] [ 1111 ] [1111] [1111],每个数据点的最后一个是标准输出,然后编写实现SGD方法的代码,训练10000次,将最后得到的结果与标准输出进行比较

y=[0.0102 0.0083 0.9932 0.9917]'

这个与标准输出相差无几

y=[0 0 1 1]'

8. 实现Batch方法

所考虑的模型和上节一样,编程中唯一不同的是计算权重更新的方法,同样训练10000次,最后得到的结果为

y=[0.0209 0.0169 0.9863 0.9830]'

这明显比SGD方法误差大,当我们训练40000次时

y=[0.0102 0.0083 0.9932 0.9917]'

此时的精度和SGD一样,但是Batch花费的时间更多,也就是Batch学习速度更慢。

9. 两者比较

在这里插入图片描述
从上图明显可以看出在同样的训练次数下,SGD方法明显比Batch方法学习速度更快。

10. 局限性

同样考虑上文显示的模型,如果改一下标准输出为 [ 0110 ] [0 1 1 0] [0110],最后得到的结果为

y=[0.5297 0.5000 0.4703 0.4409]'

是不是就完全不对了,但是,这到底是为什么呢?将输入的前三个坐标定义为x,y,z坐标,z坐标全部是1,因此只需考虑x,y坐标,画在一张图上,红色是标准输出
在这里插入图片描述

从该图可以看出,要想划分0和1的区域,需要一根复杂的曲线,同样画出上节所示的标准输出图
在这里插入图片描述
划分这个0和1的区域只需要一根直线就可以了。换句话说,这是个线性可分的问题,而单层神经网络只能解决线性可分的问题,这就是为什么现在越来越多的发展多层神经网络的原因,因为多层神经网络没有这个限制。

猜你喜欢

转载自blog.csdn.net/woaiyyt/article/details/113091892
今日推荐