Neural Network学习(一) 最早的感知机:Perceptron of Rosenblatt
1. Frank Rosenblatt
首先介绍的是神经网络的开山祖师,先放张图拜拜
Frank Rosenblatt出生在纽约,父亲是医生,其1956年在Cornell大学拿到博士学位后,留校任教,研究方向为心理学和认知心理学。1957年,Frank提出了Perceptron的理论。1960年,在计算机运算能力还不强的时候,其使用基于硬件结构搭建了一个神经网络,大概长下面这样(跪)。
但是和所有先驱一样,Frank开创性的工作并没有在当时得到认可。当时两位科学家 Marvin Minksy 和 Seymour Papert(这两位之后都成了AI界泰斗级的人物)对Frank的工作表示质疑,认为他只不过想博取世人眼球,并且还特地写了一本书来批判Perceptron,书名就叫《Perceptron》。也就是这本书,导致Perceptron沉寂了将近20年,直到80年代另一位dalao — Hinton发明BP算法,让其成为当今AI最热门的领域。
2. 感知机介绍
感知机出现时为了解决二分类问题(这也成了其的局限:只能解决二分类问题)。其基本形式可以用一下公式来表示
$y(\mathbf{x}) = f(\mathbf{w}^T\mathbf{\phi}(\mathbf{x}))$ (1)
其中$\mathbf{w}$是感知机的参数,$\mathbf{x}$是一个训练样本。$\mathbf{\phi}$是任意一组基本函数。其中$\mathbf{\phi}_0(x) = 1$,即感知机也包含bias这一项。f(a)是step function,即在a大于等于零时,f(a) = 1; a小于零时,f(a) = -1。对应的,我们二分类问题的标签值为{1,-1}而不是{1,0}。
假设$\mathbf{w}$已知,对于一个新的未打标签的样本$\mathbf{x}$,计算$f(\mathbf{w}^T\mathbf{\phi}(\mathbf{x}))$的值。如果其大于零,则其标签标为1;如果小于零,则其标签标为-1。
3. 感知机训练
要训练感知机的权值$\mathbf{w}$,首要任务就是定义误差函数(error function or loss function)。一个很简单直接的想法就是counting:把所有预测错的训练样本个数作为其误差函数。这样我们的误差函数就是一个分段常数函数,即在不同的区域内为不同的常数,就比如上面提到的step function。原因我们可以这么理解。参数$\mathbf{w}$可以看做是一个超平面,训练过程就是不断调整其位置和角度。在这个超平面移动时,如果没有越过任何一个训练点,那么其误差函数不变;越过某一个训练点,那么误差函数就要加一(或减一)。这样一个分段函数是不可微分的,如果我们想使用梯度下降法来优化的话,明显是不合适的。
既然counting的方法不合适是来源于其不可导,那么我们就选择另一种可导的误差函数,叫做perceptron criterion。首先我们注意到,对于每一个训练点,$\mathbf{w}^T\mathbf{\phi}(\mathbf{x})t_n>0$恒成立(原因是在最优情况下,$\mathbf{w}^T\mathbf{\phi}(\mathbf{x})$和$t_n$的正负号相同)。Perceptron criterion是这样一个误差函数:如果一个训练点被正确预测,则误差为零;如果一个训练点未能正确预测,那么其误差函数为$-\mathbf{w}^T\mathbf{\phi}(\mathbf{x})t_n$。那么对于总的误差函数为:
$E_p(\mathbf{w}) = - \sum_{n\epsilon\mathcal{M}}\mathbf{w}^T\mathbf{\phi}(\mathbf{x})t_n$ (2)
其中$\mathcal{M}$表示被错误预测的训练点的集合。
很容易计算,对于一个数据点n,${\nabla}E_p(\mathbf{w}) = -\mathbf{\phi}(\mathbf{x})t_n$
然后使用SGD可以得到更新公式
$\mathbf{w}^{({\tau}+1)}$ = $\mathbf{w}^{({\tau})}$ + ${\eta}\mathbf{\phi}(\mathbf{x})t_n$ (3)
至此,我们可以总结一下感知机训练的算法。
step1 : 随机初始化$\mathbf{w}^{0}$。
step2 : 选取训练集中一点(顺序或随机),计算其$\mathbf{\phi}(\mathbf{x})t_n$的值。如果其大于0,则跳至step3;如果其小于0,则使 用公式(3)更新$\mathbf{w}$。
step3 : 判断是否收敛,如果不收敛,则跳至step2。
4. 实验结果
为了测试感知机的性能,我取一条直线 y + 0.3x + 0.2 ,随机取100个点并标注上1 或 -1 。代码使用python写。结果如下:
其中左图中,两种颜色的点分别代表两种label的点,蓝色的直线就是 y + 0.3x + 0.2 , 红色的直线是我们随机初始化w的直线。
右图是训练之后得到的结果,可以看到,红线已经能完全分开两种点。
5. 总结
1. 虽然理论证明了,如果线性分类问题有解的话,感知机一定能找到这个解,但是在实验中确实存在无法找到解的情况。我现在暂时想到的原因可能是我们随机取的点与直线太接近,导致无法收敛。
2. 感知机能保证最后收敛,但是其并不能保证每一次更新都会使分类误差减小。(例子可见github https://github.com/chencjGene/SoftEngineering/tree/master/NN/Perceptron)
3. 随机取点并不会提高其收敛率。
Neural Network学习(一) 最早的感知机:Perceptron of Rosenblatt的更多相关文章
- Neural Network学习(二)Universal approximator :前向神经网络
1. 概述 前面我们已经介绍了最早的神经网络:感知机.感知机一个非常致命的缺点是由于它的线性结构,其只能做线性预测(甚至无法解决回归问题),这也是其在当时广为诟病的一个点. 虽然感知机无法解决非线性问 ...
- 机器学习公开课笔记(5):神经网络(Neural Network)——学习
这一章可能是Andrew Ng讲得最不清楚的一章,为什么这么说呢?这一章主要讲后向传播(Backpropagration, BP)算法,Ng花了一大半的时间在讲如何计算误差项$\delta$,如何计算 ...
- 深度学习笔记之关于基本思想、浅层学习、Neural Network和训练过程(三)
不多说,直接上干货! 五.Deep Learning的基本思想 假设我们有一个系统S,它有n层(S1,…Sn),它的输入是I,输出是O,形象地表示为: I =>S1=>S2=>….. ...
- Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1
3.Spark MLlib Deep Learning Convolution Neural Network (深度学习-卷积神经网络)3.1 http://blog.csdn.net/sunbow0 ...
- 计算机视觉学习记录 - Implementing a Neural Network from Scratch - An Introduction
0 - 学习目标 我们将实现一个简单的3层神经网络,我们不会仔细推到所需要的数学公式,但我们会给出我们这样做的直观解释.注意,此次代码并不能达到非常好的效果,可以自己进一步调整或者完成课后练习来进行改 ...
- 深度学习论文翻译解析(二):An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application to Scene Text Recognition
论文标题:An End-to-End Trainable Neural Network for Image-based Sequence Recognition and Its Application ...
- 深度学习课程笔记(十六)Recursive Neural Network
深度学习课程笔记(十六)Recursive Neural Network 2018-08-07 22:47:14 This video tutorial is adopted from: Youtu ...
- 深度学习课程笔记(十五)Recurrent Neural Network
深度学习课程笔记(十五)Recurrent Neural Network 2018-08-07 18:55:12 This video tutorial can be found from: Yout ...
- Sony深度学习框架 - Neural Network Console - 教程(1)- 原来深度学习可以如此简单
“什么情况!?居然不是黑色背景+白色文字的命令行.对,今天要介绍的是一个拥有白嫩的用户界面的深度学习框架.” 人工智能.神经网络.深度学习,这些概念近年已经涌入每个人的生活中,我想很多人早就按捺不住想 ...
随机推荐
- aspx aspx.cs
http://www.cnblogs.com/axzxs2001/archive/2009/01/19/1378383.html
- OpenStack部署工具总结
目前感觉比较简单直观的部署工具有RDO.devstack.Fuel等: 1. RDO https://openstack.redhat.com/Quickstart REDHAT出品,支持Redhat ...
- ubuntu中常用软件的安装
1.有道词典 1.百度有道词典,进入有道首页,点"下载词典客户端",下载对应版本. 2.打开终端,进入下载目录,输入sudo dpkg -i youdao-dict_1.0.2~u ...
- MySQL binlog的格式解析
我搜集到了一些资料,对理解代码比较有帮助. 在头文件中binlog_event.h中,有描述 class Log_event_header class Log_event_footer 参见[Myst ...
- npoi本地文件
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.I ...
- AMap行政区查询服务
AMap.DistrictSearch行政区查询服务插件,提供全国各省.市.县.区的中心点经纬度.行政区边界坐标组.下级行政区等信息.根据行政区边界坐标组可在地图上绘制行政区边界.(本文为原创,并在项 ...
- WPF DataGrid常用属性记录
WPF DataGrid常用属性记录 组件常用方法: BeginEdit:使DataGrid进入编辑状态. CancelEdit:取消DataGrid的编辑状态. CollapseRowGroup:闭 ...
- Spring AOP不拦截从对象内部调用的方法原因
拦截器的实现原理很简单,就是动态代理,实现AOP机制.当外部调用被拦截bean的拦截方法时,可以选择在拦截之前或者之后等条件执行拦截方法之外的逻辑,比如特殊权限验证,参数修正等操作. 但是最近在项目中 ...
- jave占用CPU较高
转自http://www.tuicool.com/articles/YFVbia Linux下java进程CPU占用率高-分析方法 时间 2014-01-04 12:18:44 IT社区推荐资讯 原文 ...
- CreateIoCompletionPort() 函数
/* ********************* * CreateIoCompletionPort() 函数有两个功能: * 1.创建一个完成端口: * 2.将一个设备与一个存在的完成端口进行绑定,在 ...