这篇文章主要通过几个简单的例子来演示神经网络
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.本质
可以直接跳过这一节,读下一篇文章
未完待续
领取专属 10元无门槛券
私享最新 技术干货