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. 随机取点并不会提高其收敛率。

最新文章

  1. 基于Oracle安装Zabbix
  2. Selenium2(WebDriver)_如何判断WebElement元素对象是否存在
  3. 《利用Python进行数据分析》第4章学习笔记
  4. 写启动界面Splash的正确姿势,解决启动白屏(转)
  5. 二分--LIGHTOJ 1088查找区间(水题)
  6. 《Java并发编程实战》第十一章 性能与可伸缩性 读书笔记
  7. PAT 1011
  8. ThinkPHP3.1 常量参考
  9. SWD模式和JTAG模式
  10. WPF中实现多选ComboBox控件
  11. Linux查看机器的硬件信息
  12. python多线程学习一
  13. Python 安装 OpenCV 遇到的问题
  14. python常用命令和基础运算符
  15. Axure 第一个原型 简单的登录页面
  16. scala中Map和Set
  17. SQL on Hadoop中用到的主要技术——MPP vs Runtime Framework
  18. angularjs 阻止浏览器自带的回退
  19. php if判断
  20. docker run

热门文章

  1. IOS-指定返回Modal的控制器presentViewController
  2. 使用curl命令获取文件下载速度
  3. NFinal中增加生成页面自动带入js和css
  4. JSP的基本语法:
  5. 关于Android 打开新的Activity 虚拟键盘的弹出与不弹出
  6. 使用NUget发布自己的dll(转)
  7. bootstrap下使用模态框,在模态框内输入框中回车时,模态框自动关闭的问题及解决方法
  8. 常用PHP函数类目录
  9. LeedCde 题解目录
  10. NSTimer的使用[zhuang]