人工神经元和Delta规则
人工神经元和Delta规则
原作者知乎:蒹葭苍苍
感知机
神经系统给生命带来了智能。不管是低级的条件反射,还是高级的逻辑推理,都是神经系统中一个个神经元共同完成的。每个神经元都是一个单独的细胞,他们通过“突触”互相连接。每个神经元有若干个树突,树突可以接受信号。这些信号进行叠加,当叠加的刺激突破一个阈值,神经元就会被**放电,也就是产生了“神经冲动”,电信号沿着神经元的轴突传导出去。轴突可以很长,因此,神经元可能是生物体内直径最大的细胞。
人工智能研究者很早就开始试图模拟神经元的行为,希望由此构造出人工的智能。感知机(Perceptron)模型是广泛采用的一种简化的神经元模型。这个模型具有神经元最为基本的一些特征,它有多个输入(树突),它对输入进行线性叠加,然后当叠加和突破某个阈值的时候产生一个输出(轴突)。
图示是一个简单的感知机模型,有三个输入。假设一个一般的感知机有个输入,每个输入记作
。在对输入进行叠加的时候,给每个输入赋一个权值
。叠加和
,我们把突破阈值**这一行为表达为一个阶梯函数:
通常,这个阈值称作偏置(bias),相当于把阶跃在0的阶梯函数挪了个位置。有时候,模型会忽略这个偏置,这时候我们可以假设有一维输入是个恒定的非零值,偏置就隐含在了那一维对应的权值里。总之,这些有点不同的模型其实是等效的。
**函数
前面那个阶梯函数就是神经元的**函数。**函数有很多不同的形式,阶梯函数是最简单的一种。为什么要一个**函数呢?一方面是因为生物神经元确实有类似的行为,另一方面是为了给模型一点非线性的因素。
生物神经元有一个特性,它要么产生冲动,要么不产生冲动,没有中间状态。因此,人工神经元要模拟类似的行为。而且,如果仅仅做线性叠加,当我们把很多神经元组合在一起时会发现,将线性模型叠加在一起,无论叠加多少,总是相当于一个线性模型,对于计算能力的提升没有任何贡献。因此,我们需要**函数引入一点非线性的因素,这样当多个神经元叠加的时候,就产生了比单个神经元更为强大的表达能力。于是,我们可以构造神经网络。
上面的**函数有个问题,它不可导。为了计算和推导的便利,我们引入了一些可导的函数作为**函数,这一类函数都叫做Sigmoid函数,其中最著名的是Logistic函数:
这个函数的导数也很特别,或者说非常容易计算:
Delta规则
人工神经元的作用是对于输入向量产生一个输出
。为了让神经元能够给出我们期望的输出,需要训练它,或者说让它学习到一个模型。训练的样本是一系列已知的
和
,我们用
表示期待得到的正确输出。我们用下面的函数描述实际输出和期待的正确输出之间的误差:
这个函数定义成这样是为了后面计算方便,比如定义成也毫无问题,只不过算起来麻烦一些。
学习的过程就是减小这个误差,而且最好我们能使这个误差达到最小值。神经元通过迭代的方式求得最小值,每次根据当前的状况做出一点修正,逐渐找到目标函数的最小值。这跟生物神经元逐渐生长的策略是相似的。我们采用梯度下降法:想象要找到山谷的最低点,应该朝着下坡路走,当然前提是这是一个向盆地一样的山谷,没有太多复杂的起伏,不然我们可能陷在一个不太深的小山谷里,误以为真的到达了最低处。幸好对于单个神经元,这种复杂的情况是没有的,也就是说误差最小化这个优化问题的目标函数是个凸函数。
学习的过程就是减小这个误差,而且最好我们能使这个误差达到最小值。神经元通过迭代的方式求得最小值,每次根据当前的状况做出一点修正,逐渐找到目标函数的最小值。这跟生物神经元逐渐生长的策略是相似的。我们采用梯度下降法:想象要找到山谷的最低点,应该朝着下坡路走,当然前提是这是一个向盆地一样的山谷,没有太多复杂的起伏,不然我们可能陷在一个不太深的小山谷里,误以为真的到达了最低处。幸好对于单个神经元,这种复杂的情况是没有的,也就是说误差最小化这个优化问题的目标函数是个凸函数。
为了使最小化,每一次对参数
的修正应该是
。这里,
是个因子,表示学习速度的快慢,通常叫做学习率。下面算一下偏导数:
由于**函数的倒数总是非负值,不影响权值修正的方向,因此有时候可以忽略掉它:
这就是神经元的基本学习规则之一,Delta规则。简单说,就是权值的修正量等于误差乘以输入。
至此,我们就得到了一个可以将输入向量对应的输出的简单模型。我们可以把它作为一个二分分类器。