神经网络学习中

6 篇文章 0 订阅
3 篇文章 0 订阅

神经网络
关于感知机,既有好消息,也有坏消息。好消息是,即便对于复杂的函数,感知机也隐含着能够表示它的可能性。坏消息是,设定权重的工作,即确定合适的、能符合预期的输入与输出的权重,现在还是由人工进行的。上一章中,我们结合与门、或门的真值表人工决定了合适的权重。
神经网络的出现就是为了解决刚才的坏消息。具体地讲,神经网络的一个重要性质是它可以自动地从数据中学习到合适的权重参数。本章中,我们会先介绍神经网络的概要,然后重点关注神经网络进行识别时的处理。在下一章中,我们将了解如何从数据中学习权重参数。
3.1 从感知机到神经网络
神经网络和上一章介绍的感知机有很多共同点。这里,我们主要以两者的差异为中心,来介绍神经网络的结构。
神经网络的例子
用图来表示神经网络的话,如下图所示。我们把最左边的一列称为输入层,最右边的一列称为输出层,中间的一列称为中间层。中间层有时也称为隐藏层。“隐藏”一词的意思是,隐藏层的神经元(和输入层、输出层不同)肉眼看不见。另外,本书中把输入层到输出层依次称为第0层、第1层、第2层(层号之所以从0开始,是为了方便后面基于Python进行实现)。下图中,第0层对应输入层,第1层对应中间层,第2层对应输出层。

上图中的网络一共由 3 层神经元构成,但实质上只有 2 层神经元有权重,因此将其称为“2层网络”。请注意,有的书也会根据构成网络的层数,把上图的网络称为“3层网络”。本书将根据实质上拥有权重的层数(输入层、隐藏层、输出层的总数减去 1后的数量)来表示网络的名称。
只看上图的话,神经网络的形状类似上一章的感知机。实际上,就神经元的连接方式而言,与上一章的感知机并没有任何差异。那么,神经网络中信号是如何传递的呢?
复习感知机
在观察神经网络中信号的传递方法之前,我们先复习一下感知机。网络结构:

图3-2中的感知机接收x1和x2两个输入信号,输出y。如果用数学式来表示图3-2中的感知机,则如式(3.1)所示。

b是被称为偏置的参数,用于控制神经元被激活的容易程度;而w1和w2是表示各个信号的权重的参数,用于控制各个信号的重要性。
在图3-2的网络中,偏置b并没有被画出来。图3-3中添加了权重为b的输入信号1。这个感知机将x1、 x2、 1三个信号作为神经元的输入,将其和各自的权重相乘后,传送至下一个神经元。在下一个神经元中,计算这些加权信号的总和。如果这个总和超过0,则输出1,否则输出0。另外,由于偏置的输入信号一直是1,所以为了区别于其他神经元,我们在图中把这个神经元整个涂成灰色。

现在将式(3.1)改写成更加简洁的形式。为了简化式(3.1),我们用一个函数来表示这种分情况的动作(超过0则输出1,否则输出0)。引入新函数h(x),将式(3.1)改写成下面的式(3.2)和式(3.3).

式(3.2)中,输入信号的总和会被函数h(x)转换,转换后的值就是输出y。然后,式(3.3)所表示的函数h(x),在输入超过0时返回1,否则返回0。因此,式(3.1)和式(3.2)、式(3.3)做的是相同的事情。
激活函数登场
刚才登场的h(x)函数会将输入信号的总和转换为输出信号,这种函数一般称为激活函数(activation function)。如“激活”一词所示,激活函数的作用在于决定如何来激活输入信号的总和。
现在来进一步改写式(3.2)。式(3.2)分两个阶段进行处理,先计算输入信号的加权总和,然后用激活函数转换这一总和。因此,如果将式(3.2)写得详细一点,则可以分成下面两个式子。

首先,式(3.4)计算加权输入信号和偏置的总和,记为a。然后,式(3.5)用h()函数将a转换为输出y。
之前的神经元都是用一个○表示的,如果要在图中明确表示出式(3.4)和式(3.5),则可以像图3-4这样做。

如图3-4所示,表示神经元的○中明确显示了激活函数的计算过程,即信号的加权总和为节点a,然后节点a被激活函数h()转换成节点y。本书中,“神经元”和“节点”两个术语的含义相同。这里,我们称a和y为“节点”,其实它和之前所说的“神经元”含义相同。
通常如图3-5的左图所示,神经元用一个○表示。本书中,在可以明确神经网络的动作的情况下,将在图中明确显示激活函数的计算过程,如图3-5的右图所示。

激活函数是连接感知机和神经网络的桥梁。
本书在使用“感知机”一词时,没有严格统一它所指的算法。一般而言,“朴素感知机”是指单层网络,指的是激活函数使用了阶跃函数 A 的模型。“多层感知机”是指神经网络,即使用sigmoid 函数(后述)等平滑的激活函数的多层网络。
激活函数
式(3.3)表示的激活函数以阈值为界,一旦输入超过阈值,就切换输出。这样的函数称为“阶跃函数”。因此,可以说感知机中使用了阶跃函数作为激活函数。实际上,如果将激活函数从阶跃函数换成其他函数,就可以进入神经网络的世界了。下面我们就来介绍一下神经网络使用的激活函数。
sigmoid函数
神经网络中经常使用的一个激活函数就是式(3.6)表示的sigmoid函数(sigmoid function)。

式(3.6)中的exp(−x)表示e−x的意思。 e是纳皮尔常数2.7182 . . .。式(3.6)表示的sigmoid函数看上去有些复杂,但它也仅仅是个函数而已。而函数就是给定某个输入后,会返回某个输出的转换器。比如,向sigmoid函数输入1.0或2.0后,就会有某个值被输出,类似h(1.0) = 0.731 . . .、 h(2.0) = 0.880 . . .这样。
神经网络中用sigmoid函数作为激活函数,进行信号的转换,转换后的信号被传送给下一个神经元。实际上,上一章介绍的感知机和接下来要介绍的神经网络的主要区别就在于这个激活函数。其他方面,比如神经元的多层连接的构造、信号的传递方法等,基本上和感知机是一样的。下面,让我们通过和阶跃函数的比较来详细学习作为激活函数的sigmoid函数。
阶跃函数的实现
这里我们试着用Python画出阶跃函数的图(从视觉上确认函数的形状对理解函数而言很重要)。阶跃函数如式(3.3)所示,当输入超过0时,输出1,否则输出0。可以像下面这样简单地实现阶跃函数。

def step_function(x):
if x > 0:
return 1
else:
return 0

这个实现简单、易于理解,但是参数 x只能接受实数(浮点数)。也就是说,允许形如 step_function(3.0)的调用,但不允许参数取NumPy数组,例如 step_function(np.array([1.0, 2.0]))。为了便于后面的操作,我们把它修改为支持NumPy数组的实现。为此,可以考虑下述实现。

def step_function(x):
y = x > 0
return y.astype(np.int)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值