Rosonblatt线性感知器
前叙
读前简介
机器学习的流派很多,现在比较流行的便是联结学派,其计算的重点在于权重更新,而其它学派比如贝叶斯学派,基于统计学,进化学派则注重结构学习.
本篇博客以线性感知器为基础,将会对神经网络与一些机器学习算法进行介绍,如果你只想简单的了解,那么可以浏览一遍即可,当然你也可以花费些时间读这篇文章,那么你也可以受益许多.
神经网络与联结学派
神经网络就是联结学派的”作品”,从最基本的线性感知器到现在的深度学习都隶属于联结学派,其实现人工智能的思想在于利用计算机模拟生物神经网络,而计算过程最后则转化为求最优解问题,计算过程的核心则在于迭代与权值更新,主要陷阱为局部最优解陷阱等等.
而联结学派的核心观点即为:智能的本质是连接机制,神经网络是一个由大量简单的处理单元组成的高度复杂的大规模非线性自适应系统.联结主义模拟人脑智能行为四个层面为:
a.物理结构;
b.计算模拟
c.存储与操作
d.训练
神经网络图解:
Rosonblatt感知器图解
基本计算过程与权值修正
基本计算过程:
- 数据输入
- 计算诱导局部域,计算公式如下
最后求出的超平面: - 诱导局部域输入输出函数(硬限幅函数sgn()),并输出最后结果
# 硬限幅函数 python语言 def sgn(v): if v> 0: return 1 else: return -1
权值更新(图片来自他处):
代码
# 单样本感知器算法 import numpy as np b = 1 # 偏置 # 该数据量下 初始权值为 0 时 Rosebblatt感知器 训练失败 a = 0.3 # 学习率 x = np.array([[1,1,3],[1,2,5],[1,1,8],[1,2,15],[1,3,7],[1,4,29]]) d = np.array([1,1,-1,-1,1,-1]) w = np.array([b,0,0]) def sgn(v): if v> 0: return 1 else: return -1 def comy(myw,myx): return sgn(np.dot(myw.T,myx)) def neww(oldw,myd,myx,a): print("comy:",comy(oldw,myx)) return oldw+a*(myd - comy(oldw,myx))*myx i = 0 for xn in x: print("wn:",xn) w =neww(w,d[i],xn,a) i+=1 print("w:",w) for xn in x: print("%d or %d => %d"%(xn[1],xn[2],comy(w,xn))) test = np.array([b,9,19]) print("%d or %d => %d"%(test[1],test[2],comy(w,test))) test = np.array([b,9,64]) print("%d or %d => %d"%(test[1],test[2],comy(w,test)))
梯度下降与批量修正算法
公式如下(图片来自书籍):
具体算法过程如下:
1) 初始化权值.学习率,以及期望误差率
2) 读取所有样本数据
3) 依次对样本进行训练.更新权值,其更新策略如(8-1)所示
4) 检查误差率是否小于指定误差率,或者训练次数已达到,否则转到第二步执行
code
import numpy as np b = 1 # 偏置 # 该数据量下 初始权值为 0 时 Rosebblatt感知器 训练失败 a = 0.5 # 学习率 x = np.array([[1,1,3],[1,2,5],[1,1,8],[1,2,15]]) d = np.array([1,1,-1,-1]) w = np.array([b,0,0]) wucha = 0 ddcount = 50 def sgn(v): if v> 0: return 1 else: return -1 def comy(myw,myx): return sgn(np.dot(myw.T,myx)) # 权值更新策略 def tiduxz(myw,myx,mya): i = 0 sum_x =np.array([0,0,0]) for xn in myx: if comy(myw,xn)!=d[i]: sum_x+=d[i]*xn i+=1 return mya*sum_x i = 0 while True: tdxz = tiduxz(w,x,a) print('tdxz:',tdxz) w = w+tdxz print("w:",w) i = i+1 if abs(tdxz.sum())<=wucha or i >= ddcount:break test = np.array([1,9,19]) print("%d or %d => %d"%(test[1],test[2],comy(w,test))) test = np.array([1,3,22]) print("%d or %d => %d"%(test[1],test[2],comy(w,test))) print()
Rosonblatt感知器 优化
LMS(最小均方算法:Least-Mean-Square)
均方误差MSE:参数估计中均方误差是指参数估计值与参数真值之差平方的期望值,即样本预测输出值与实际输出值之差平方的期望值.
而MSE的策略则是使MSE最小,
代价函数:
在之前的例子中继续使用批量修正算法,并在其误差信号基础上计算梯度向量:
权值生成方案:
# 代码来自<机器学习实践指南2> import numpy as np # LMS算法实现逻辑或运算 b = 1 # 偏置 # 该数据量下 初始权值为 0 时 Rosebblatt感知器 训练失败 a = 0.1 # 学习率 x = np.array([[1,1,1],[1,1,0],[1,0,1],[1,0,0]]) d = np.array([1,1,1,0]) w = np.array([b,0,0]) expect_e=0.005 maxtrycount=20 def sgn(v): if v> 0: return 1 else: return 0 def get_v(myw,myx): return sgn(np.dot(myw.T,myx)) def neww(oldw,myd,myx,a): mye = get_e(oldw,myx,myd) return (oldw+a*mye*myx,mye) def get_e(myw,myx,myd): return myd-get_v(myw,myx) # 实际输出值 - 样本预测输出值 mycount = 0 while True: mye = 0 i = 0 for xn in x: w,e = neww(w, d[i], xn, a) i+=1 mye+=pow(e,2) # 在 ANN 领域 MSE(均方误差)是指样本预测输出至于实际输出值之差平方的期望 mye/=float(i) mycount+=1 print(u"第 %d 次调整后的权值:"%mycount) print("w:",w) print(u"误差: %f "%mye) if abs(mye) < expect_e or mycount > maxtrycount:break for xn in x: print("%d or %d => %d"%(xn[1],xn[2],get_v(w,xn)))
LMS退火算法
LMS算法的一个限制在于学习率的设定:
当学习率较大时,收敛速度较快
当学习率较小时才能保证权值的修正是再让代价函数一步比一步小
因而比较科学的方法应该是学习率随着权值的不断修改而不断减小,于是便有了LMS退火算法,其公式如下:
退火算法原理源于固体退火原理,其为基于蒙特卡罗迭代求解法的一种启发式随机搜索过程
修改之前的例子:
a0 = 0.1 a = 0.0 def neww(oldw,myd,myx,a): mye = get_e(oldw,myx,myd) a=a0/(1+float(mycount)/r) return (oldw+a*mye*myx,mye)
Rosonblatt感知机的局限
Rosonblatt感知机的局限在于其本质为一个线性感知机,因此当样本线性不可分时则使用delta法则进行感知机的训练,而delta的关键思想在于使用梯度下降来搜索可能的权向量的假设空间,已找到最佳拟合训练样本的权向量.
通过这种方式可以一定程度上对非线性数据进行分类,但想要解决Rosonblatt感知器无法处理非线性关系(无法学习”异或”逻辑运算)的问题,需要的是双层感知机,或者多层感知机(也就是神经网络),实际上在历史上正是因为Rosonblatt无法学习线性关系才导致了神经网络十几年的低潮,也正是双层感知机找到了异或的学习方法以及传统冯诺依曼计算机模拟智能遇到了不可逾越的瓶颈才再一次掀起了神经网络的热潮.
参考资料
- [1] 麦好 <机器学习实践指南 案例应用解析 第二版> 机械工业出版社 2017.7