《python神经网络编程》这是一本适合入门神经网络的书,作者使用的是循序渐进的思维方式,从0开始,带领读者逐渐搭建一个自己的神经网络,这样可以很清楚的了解到,在一个网络里各部分的作用与功能是什么,跟着此书一边读一边敲代码一边记笔记,就会入门神经网络,受益匪浅。
本文章也会带领大家学习本书,最终动手实现自己的神经网络
1.1 一台简单的预测机
输入---------流程(计算)----------输出
我们来稍微增加一下难度
千米----------计算???-------------英里
我们只知道英里 = 千米 * C,不过C不知道是多少,现在有两组数据
实例 | 千米 | 英里 |
1 | 0 | 0 |
2 | 100 | 62.137 |
现在我们尝试用C为0.5计算一下,
100千米-----------50英里
显然这与62.137是有差距的 误差=真实值 - 计算值 = 12.137
既然我们知道有误差了,那么再来指导第二次的C值猜测,这次将0.5变为0.6,得到计算值100千米=60英里,误差值为2.137,这一次进步还是比较大的。
有些人会觉得为什么不使用代数法直接计算呢,其实很多有趣的问题并不是一个简单的公式可以得到答案的,
我们继续来改变C值,这次设置为0.7,得到结果70,啊,糟糕,过头了,62.137-70= -7.863,负号告诉我们,不是不足,而是这次调整的太多了,我们欣然接受了0.6这个值,不过,为什么不再精确一点呢,选择0.61,得到误差为1.137,这样一直计算下去,最终我们便可以一步步的优化我们的C值。
无论你相信与否,刚刚我们所做的,就是走马观花的浏览了一遍神经网络中学习的核心过程。
我们并没有一步到位,相反,我们尝试一个答案,然后多次改进,这被称为迭代。
1.2 分类器与预测器
这是花园里的毛虫和瓢虫,我们使用一个直线来将两者分开,不过现在这条直线貌似不太成功,
这次好像也不太行,现在我们来着手做一个训练简单的分类器
实例 | 宽度 | 长度 | 小虫 |
1 | 3.0 | 1.0 | 瓢虫 |
2 | 1.0 | 3.0 | 毛虫 |
现在来绘制出一个二维图像
首先随机使用一条分界线,,y=Ax,我们尝试用0.25来开始
这个不是一个很好的直线,观察得到,直线需要上移,不过我们不能使用上帝视角,直接通过观察就给出答案
现在通过计算得到 y = 3.0 * 0.25 = 0.75,这和数据中的1.0相差0.25,所以得出,0.25这个数字小了,我们希望
得到的结果大于1.0,我们希望分界线在它之上而不是穿过它,好的,那我们的期望值设定为1.1,那么误差便为
1.1 - 0.75 = 0.35
增加A后的值应为 t = (A+ΔA)*x,E便为误差 = t-y = (ΔA)*x,哇,我们发现了误差竟然与ΔA有着如此的联系。
可以根据等式计算出ΔA 为0.1167 再加上最初的 0.25 得到新的A值为0.3667.
不过,我们发现这条线离某些小虫太近了,离另一些又太远了,其实这就是机器学习中的一个重要思路--改进。
就像最初的千米英里的关系一样,先使用十分位,后使用百分位,这便是改变了公式中的调节系数,他有一个名字叫做学习率。
在解决了这个问题之后,我们发现这种方法并不是万能的,因为对于异或问题,它并不能解决
似乎并不能通过一条直线讲两种小圆圈分开,起码要两条直线才可以,看来我们要换一种方法了,接下来先为大家介绍神经元的基本概念吧,听到这个名词,忽然觉得眼前一亮,距离理想中的人工智能越来越近了。
在生物体内,有无数个神经元,它的计算方式是接受前一个神经元传输的信号,然后自己把它一阵处理,再传输给下一个,其中的一阵处理,就是看看接受的信号值不值得传给下一个,也就是说我们现在的神经元有没有被信号激活。
在数学上,有许多激活函数可以达到这样的效果,S函数就是其中一个,全名就是耳熟能详的sigmoid
以上是S函数的图形与表达式,我们现在会使用S函数来代替神经元中一阵处理的那个操作。
神经元就是这样工作的,经过S函数并达到阈值时,才会被激活并输出
这就是神经元们间的结构以及我们所模仿出的模型,神经元之间并不是干巴巴的连接,而是各有不同的连接权重
其中的各个连接权重,就是我们的宝贝了,最重要的工作就是不断的改变这些参数的值,使得输入可以准确的得到输出
神经元之间的连接权重需要怎么样去优化呢,最终的输出结果什么时候才能够满意呢,神经网络具体是如何工作的呢
欲知后事如何,且听下回分解