首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

统计学习 基础神经网络

这篇文章主要通过几个简单的例子来演示神经网络

0.目标

从一组输入的样本中找到规律,并生成一个程序(函数),接受新的输入,预测结果。

1.输入输出

众所周知,在计算机内部数据是以二进制按顺序存放在存储空间的,一组有序的数字在数学中叫做向量,所以对于神经网络而言,可以认为输入都是一个向量,同理,输出也可以当作向量处理。

在编程语言里,通常用一维数组表示向量

绝大多数时候,我们所用的数据不止一组,同时向量组可以用矩阵表示,所以我们把输入输出都当作矩阵。

这里涉及一个输入模式输出对的集合(训练数据)。每个输入向量都有一个对应的期望输出向量、或者称作是目标向量。

2.一个简单的例子

考虑输入为

,输出为

的一组数据。

我们先动用真正的人工智能(就是我们自己)找下规律:

显然,第三列对输出没有影响,然后一、二列和输出呈现出跟或门类似的关系。

下面我们来让计算机自动的从输入输出中学习这种规律(所谓的机器学习)。 现在我们要将一个

的矩阵映射到

的矩阵中去,最简单直观的做法的用一个

的矩阵

相乘。

那么,现在的目标就是求这个

(称作权值).

注:在这

的大小与输入的向量组的数量(

的列数)无关,所以不管有多少组数据,对于这个模型而言

还是

首先,我们用随机数初始化

:

然后计算

, 这里有一个问题,因为

元素取值在

上,所以

有可能超过

,这对于这个模型而言显然是错误的。

所以我们要找一个函数

,使得其输出的范围在

之间。 在这里我选用

函数,因为

,它的导数较为简单。

的图像如下:

选用

的原因不止这一个,后面会介绍具体原因和其他类似的函数

所以现在

然后我们计算一下当前权值

的误差:

,

可以看到误差还是相当大的,我们根据这些误差的大小正负更新一下

上面两条式子也称作Delta规则,具体推导过程在以后的文章里有介绍,这一篇文章只是引入,不深究细节

最后,我们重复上面的步骤,一直更新

,使它趋近于我们所要求。

上面的过程很容易用编程语言实现,下面是我用Wolfram 的一个例子,把所有的临时变量带入最后一条式子,可以求得

的递推关系式,重复计算到第10000项

迭代了10000次,效果还行。

关于新输入的预测,只要拿到计算好的

,对于任意一组新的输入

,可以求得新的输出

.

3.神经网络

上面都在讲矩阵的运算,那么跟神经网络有什么关系?

先来看一组例子

,我们用圆点代表元素项,把输入的每一项与输出连接起来,

后把

的每一项按顺序加到每一条边当做权值,注意到在上面的模型里还有一个

函数,将它当做一个虚拟的元素项(节点),最后画出来就是一个赋权图。

这个节点而言,它接收从

传进来的三个值,然后加权求和后,通过

函数生成Y的预测值。这时

节点就好像大脑的一个神经元一样,接收别的神经元的电信号,再产生新的电信号给别的神经元。 当多个神经元相互连接,就组成一个神经网络

或者叫做感知机

4.学习能力

对于输入为

,输出为

的一组数据。我们可以用上面的模型学习其中的规律,并预测,假如我们把输出改成

,也就是 一二两列的关系改成异或,这个模型就不能成功模拟了。

可以自行用代码验证,或者利用

这个式子,用反证法证明不存在一个W,使得对上述的输入输出成立(或者近似成立)。它的本质是因为简单的感知机不能解决异或问题

下面是验证的效果:

最终的结果会陷入一个最优解中,但不是我们所需要的。

可以这样理解,因为当前模型的学习能力太弱,无法学习出高级的函数。

如果一个这么简单模型能够学习出所有的函数,那我们还要研究什么。

假如我们把模型变得复杂(就是增加神经元),那就能学习出更高级的函数了。

5.增加神经元

对于这个神经网络:

我们把

神经元copy一下,增加复杂度

注意到第三行的

,它把第二行的输出当做输入,同样加权求和,输出Y的预测值。

下面写出它数学形式

有了一个模型的数学形式,你就可以用任意的编程语言编写出来了

输入为

,输出为

.

与上面的同理,对于任意的

而言,都是大小为31的列向量,那么

为34的矩阵,同样用随机数初始化。

是W和X的乘积,也就是4*4的矩阵。

我们得到第一条式子

对于上面模型中的

节点,我们也可以类似的写出

其中,

是指第二行到第三行的权值,与

中的

意义不同。(找不到别的符号表示了,就重复了= =)。这里的

应该是一个4*1的列向量。

然后计算下误差

,更新权值

.

注意到,

是以

的转置与增量相乘,而不与第一个模型一样的用

,因为应该用这个神经元的输入与增量相乘.

或者可以认为

的大小不对,没法相乘???

算出L的误差(可以直接复用上面算好的

):

更新权值

也应该用对应的输入输出算出的增量

下面是Wolfram代码实现:

图像的震荡好像是plot函数的原因

6.本质

可以直接跳过这一节,读下一篇文章

未完待续

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180423G1FVTG00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券