Neural Network学习(一) 最早的感知机:Perceptron of Rosenblatt

1. Frank Rosenblatt

  首先介绍的是神经网络的开山祖师,先放张图拜拜

      Neural Network学习(一) 最早的感知机:Perceptron of Rosenblatt

  Frank Rosenblatt出生在纽约,父亲是医生,其1956年在Cornell大学拿到博士学位后,留校任教,研究方向为心理学和认知心理学。1957年,Frank提出了Perceptron的理论。1960年,在计算机运算能力还不强的时候,其使用基于硬件结构搭建了一个神经网络,大概长下面这样(跪)。Neural Network学习(一) 最早的感知机:Perceptron of Rosenblatt

           Neural Network学习(一) 最早的感知机:Perceptron of Rosenblatt

  但是和所有先驱一样,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写。结果如下:

  Neural Network学习(一) 最早的感知机:Perceptron of RosenblattNeural Network学习(一) 最早的感知机:Perceptron of Rosenblatt

  其中左图中,两种颜色的点分别代表两种label的点,蓝色的直线就是 y + 0.3x + 0.2 , 红色的直线是我们随机初始化w的直线。

  右图是训练之后得到的结果,可以看到,红线已经能完全分开两种点。

5. 总结

  1. 虽然理论证明了,如果线性分类问题有解的话,感知机一定能找到这个解,但是在实验中确实存在无法找到解的情况。我现在暂时想到的原因可能是我们随机取的点与直线太接近,导致无法收敛。

  2. 感知机能保证最后收敛,但是其并不能保证每一次更新都会使分类误差减小。(例子可见github  https://github.com/chencjGene/SoftEngineering/tree/master/NN/Perceptron

  3. 随机取点并不会提高其收敛率。

上一篇:ajax的data传参的两种方式


下一篇:获取【请求体】数据的3种方式(精)(文末代码) request.getInputStream() request.getInputStream() request.getReader()