系列文章目录
前言
早期人工智能有符号主义、联结主义和行为主义几种不同的流派。
符号主义的代表是专家系统,主张用符号计算和逻辑推演描述和解决问题。
行为主义关注系统的感知和动作,后来发展为控制论。
联结主义采取了仿生学的方法,认为智能存在于神经元的连接中。感知机模型是最早模拟神经元的智能计算模型,是现代神经网络模型的基础。
提示:以下是本篇文章正文内容,下面案例可供参考
一、生物神经元
生物神经元是一种高度分化的细胞,能够感受和传导刺激,如下图所示。
树突:从感受器或者其他神经元接收刺激,承担接收输入信号的功能。
轴突:传输神经元产生的信号,通过其末端突触传递给其他神经元或动作器官的细胞。轴突承担输出的功能。
神经冲动实际上是神经元细胞膜内外两侧电位差差的波动。细胞膜是一个 半透膜,膜构成了神经元的静息电位。当神经元受两侧液体中的带电离子维持着一定的浓度差, 构成了神经元的静息电位。当神经元受到刺激时,能引起细胞膜上的离子通道(钠离子和钾离子的通道)发生一系列开启和关闭的动作,造成带电离子大量跨膜运动,产生一个大而短暂的电位差波动,叫作动作电位。
动作电位会沿着轴突传输到轴突末端,触发末端突触释放一些叫做神经递质的化学物质,将信号传递给其他神经元。动作电位结束后,细胞膜上的离子通道会将膜内外电位差恢复到静息电位。
神经冲动是一种非线性的脉冲信号, 遵循全有全无律(ll-or-none law)。只要刺激超过了阈值,不论超过多少,都会触发神经冲动,并没有介于产生神经冲动和不产生神经冲动之间的状态。
神经元活跃度的强弱表现为神经冲动的频率,频繁的神经冲动表明较强的神经活动信号。 这种非线性的性质是感知机模型模拟神经元的关键,也是神经元通过连按组合能够产生复杂活动的必要条件。
假设神经元活动的输入/输出是线性关系,那么无论我们怎样叠加,多个神经元活动的总和仍然是线性的。单个神经元模型的非线性性质是构筑具有丰富的表达力的复杂神经网络模型的基础。
二、早期感知机模型
弗兰克.罗森布拉特(Frank Rosenblatt)在1957年发表了一篇描述最早的神经元模型——感知机模型的论文。由于现代电子计算机在当时尚处于雏形期,弗兰克描述的感知机是用电子电路设计的机器,而不是现代意义上的算法或者计算机软件程序。论文中还给出了一系列电路设计图,用来实现感知机的计算功能和学习功能。
弗兰克的感知机包含3个部分:感受器(Sensory System)、连接器(Association System)和响应器(Response System)。
感受器包含若干输入单元,可以将视觉或者声音等各种信息转换为电信号,与连接器单元建立兴奋或者抑制连接。
连接器可以累加输入信号,当信号超过一定阈值时就产生一个电信号输出到响应器单元。
响应器累加来自连接器的信号,当超过一定阈值时就触发显示或者打印动作,作为机器的输出。同时,响应器单元可以抑制其他响应器单元或者连接器单元,从而实现互斥的输出,只有具有极大值的响应器单元才会被激活并产生输出。
感知机的学习方式类似于神经系统的赫布法则(Hebbian Rule)。赫布法则是一个神经生物学理论,它解释了生物神经元在学习过程中发生的变化,描述了神经突触可塑性的基本原理。神经突触连接的两个神经元重复传递刺激信号,可以导致突触连接的性能增强。当某个神经元A的轴突与神经元 B 很接近,而且它们总是同时激活时,这两个神经元就会发生某些生长过程或者代谢变化,导致神经元 A能使B兴奋,也就是说从神经元A到B的突触连接被建立或者增强了。赫布法则可以解释生物神经网络通过反复接收同一组刺激来学习某种模式的过程。如果输入刺激总是导致一组神经元同时被激活,它们之间的连接就会大大增强。 于是,当刺激其中一个神经元时,另一个神经元也会被激活,而不相关的神经元活动将受到抑制。神经网络通过这种方式就学习到了刺激中重复出现的模式。弗兰克的感知机就是通过这种方式学习输入和输出之间的联系的。
在弗兰克的感知机中可以训练的参数是连接器单元的输出电压,当连接器单元两端的输入模式和输出模式同时被激活的时候,连接器的输出就增强一些,这样输入和输出模式就可以被关联起来。当相同的输入模式再次出现时,对应的输出单元就有更大的概率被激活。
但后续的理论研究发现,这种感知机的能力仅仅局限于解决线性可分问题。
三、激活函数
感知机模型是各种神经网络模型的基本单元,那么看如何用现代方法描述感知机模型呢?它解决的仍然是从输入到输出的映射问题,输入可以是图像像素的亮度值、声音信号在某个时刻的声波振幅、样本的某个特征值等,输出则是我们希望模型能够从输入模式中识别出的类型信息或者某种预测值。比如,在图像识别的场景中,输入图像是猫和狗的照片,我们希望能够通过输出0、1数值来区分图像中是猫还是狗。再如,在医学诊断的场景中,输入是病人的各项检查指标,例如血压、心率、血糖、血脂等,输出则是患有某种疾病的概率。
假设有N个输入维度,那么用 x i x_{i} xi表示第 i i i个维度的输入值 。感知机如同生物神经元一样,对输入刺激进行叠加,这个叠加过程是线性加权叠加,有的刺激起作用大,权重就高一些,有的刺激起作用小,权重就低一些,还有的刺激起抑制作用,权重就是负值。第 i维输入的权重用 ω i \omega_{i} ωi表示。若输入刺激叠加超过一定阈值就会将神经元激活,这个过程我们用一个激活函数 σ \sigma σ来表示。那么,神经元的输出就可以表示为以下公式:
y = σ ( ∑ i = 0 N ω i x i ) y = \sigma(\sum_{i=0}^{N}\omega_{i}x_{i}) y=σ(i=0∑Nωixi)
激活函数 ω \omega ω可以是一个分段函数,当自变量取值大于阈值时,函数值为1,否则函数值为0。通常,我们不希望函数的定义与阈值相关,因此,可以引入一个新的量作为叠加的一部分,用来调整阈值,这个量通常叫作偏置(bias)。
y = σ ( ∑ i = 0 N ω i x i + b ) y = \sigma(\sum_{i=0}^{N}\omega_{i}x_{i}+b) y=σ(i=0∑Nωixi+b)
其中
σ ( t ) = { 1 如果 t > 0 0 如果 t ≤ 0 \sigma (t)= \begin{cases} & \text{1 如果 } t>0 \\ & \text{0 如果 } t\le 0 \end{cases} σ(t)={
1 如果 t>00 如果 t≤0
另外,激活函数 σ \sigma σ还可以有很多种不同的形式,它主要用来模拟神经元刺激这种非线性过程,只要是单调递增的非线性函数就可以。
为了能够自动学习感知机的权重参数,模型训练过程需要计算激活函数 σ \sigma σ的导数,因此,我们希望它是连续可导的。(如果是分段函数的话,至少在每一段熵可导),而且导数不能总是等于0,因为导数等于0会使感知机找不到学习改进的方向。
下面是一个常用的激活函数,Sigmoid函数,
σ ( t ) = ( 1 + e − t ) − 1 \sigma(t)=(1+e^{-t})^{-1} σ(t)=(1+e−t)−1
# 绘制sigmoid函数图像
import numpy as np
import matplotlib.pyplot as plt
# 定义Sigmoid函数
def sigmoid(x):
return 1 / (1 + np.exp(-x))
# 生成x值的数组,从-10到10
x = np.linspace(-10, 10, 200)
# 计算对应的y值
y