从感知器到神经网络

来源:互联网 发布:阿克苏怎样优化网站 编辑:程序博客网 时间:2024/05/16 15:26

从感知器到神经网络


感知器(Perceptron)

最近写了一些简单感知器实现NLP任务的代码,对感知器算是掌握了。

感知器就是一个根据输入x,输出h(x)=sgn(w ˙x+b)的神经元。
因为感知器只有input layer和一个神经元的output layer,所以一个感知器只能处理一个本质feature或者做一个二分类。

训练感知器可以使用随机梯度算法,但是h(x)数学性质不够好,所以改成h(x)=σ(w ˙x+b),其中σ(x)是一个激活函数,其实这样一来单个感知器可以用于Logistic回归。在Logistic回归中讨论过激活函数的使用,一个最大似然估计是σ(x)=sigmoid(x),当然如果输出不在(0,1)内而在(1,1)内,可以使用σ(x)=tanh(x)(事实上这个函数仅仅通过sigmoid(x)平移伸缩变换就可以得到)。反正激活函数的使用是很有讲究的,但是我不太懂具体细节,知道这是一个最大似然估计的结果就好了。

还有一种朴素的训练方法就是如果输出正确则不更改权重,否则认为这一次输入对应的权重估计有问题,所以直接在权重中减去对应输入分量。虽然这是一个土办法,但是如果输入也是feature的有无0/1,我们经常会用,但方法没有一个名称,后来才知道这是梯度随机算法的一个特例,梯度直接使用输入这一个数据估计,叫在线算法或者增量算法。


感知器网络(Perceptron Net)

如果有多分类问题,可以配置多个感知器感知每一个类别,输出它们的最大值就是所属的类别。

因为最大值的数学性质不好,所以我训练就直接用类似训练感知器的在线算法处理:对于正确预测不做处理,预测错误则惩罚错误的最大值感知器对应权重,给正确的感知器对应权重增益。

事实上,如果要用随机梯度算法来处理感知器网络训练,可以认为感知器网络是一个hidden layer,那么output layer是一个与hidden layer一样大,但是做了一个softmax,(softmax之所以是softmax,因为看起来它的表达式和max没联系,但事实上在指数较大时候就趋向于一个max函数)


神经网络(Neural Networks)

神经元是神经网络的基础,而神经元和感知器原理非常类似。

sgn(x)sigmoid(x)max(x)softmax(x)

神经元所用的函数一般连续有梯度,感知器在某些任务中变量和函数可以离散不连续。神经网络可以配置多层,每一层以前一层所有神经元输出作为输入。代价函数除了L2范数,还有交叉熵等代价函数。神经网络训练简单地可以用随机梯度算法,BP算法之类的。但是如果层数太多会遇到梯度消失的问题。

神经网络还可以把后层的输出重新给前层输入,就是RNN,神经网络处理图像或者NLP中的文本时候考虑context和phrase信息时候需要卷积,就是CNN。当然还有LSTM,bi-LSTM等高级形态…


最后

不知道神经网络入门的正确方法是不是感知器,反正我是通过感知器入门神经网络的。感知器代码我手写了一下,感觉还是理解了。从感知器到神经网络感觉过渡比较自然,有一种原来是这样的感觉。

写了简单的神经网络的代码,感觉神经网络下标比较复杂,所以熟练使用numpy矩阵运算和各种技巧可以避免代码冗长易错。而且有必要学习tensorflow之类的。

但是我感觉我的学习进度有点慢了,寒假和最近在HMM,感知器上写了太多东西了,也没有加深多少理解,但是耗费了很多时间。所以下一阶段多看书,多理解理论,代码适当少写,加快学习进度。

0 0
原创粉丝点击