Python神经网络学习--神经网络知识先导--什么是神经网络?
Posted ChuckieZhu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python神经网络学习--神经网络知识先导--什么是神经网络?相关的知识,希望对你有一定的参考价值。
前言
沉寂了这么久,原本说发布一个go语言无框架建站教程,结果发现由于这一年没怎么看go语言,go的工程模式貌似有了新的变化,再加上联系了导师,导师让我学习神经网络的知识,所以索性先把go语言建站的日程推后,先行学习神经网络再说。
一如既往,我的目标仍然是让你看了之后就能和别人讲。
今天,就先看看神经网络的基本概念,对它有一个初步的了解吧。(前几篇可能是理论知识多一点,后面再实操)
什么是神经网络?
这里不会对这一概念进行解释,让我们一步一步去理解这个神秘的东西。
神经元?函数?
生物中的神经元
高中我们都学过(既然看到这篇文章,我默认您是工科的学生或者理科的学生,那么高中应该是学习了生物这门课程),生物大脑中有神经元,草图如下(单个神经细胞):
左边是接受其他神经元传来的信号的,经过处理之后,如果需要反应,那么会在末端释放神经递质即将这个信号传递到下一个神经细胞(虽然上面的解释可能不精确,但是大概能理解到这个神经细胞的作用了)。
简单来说,一个神经元有三个基本的功能:‘
1. 接收刺激或者信号
2. 处理这些信息
3. 根据信号做出相应反应
程序语言中的函数
在程序中,我们经常使用到函数(function)或者方法(method)或者其他的,在这里就姑且统称为函数吧,举个例子,一个很简单的最大值函数:
# 返回num1和num2的最大值
def Max(num1, num2):
if num1 > num2:
num2 = num1
return num2
可以看到
1. 这个函数接收了两个参数:num1和num2
2. 比较了num1和num2的大小
3. 返回了最大值
神经元!函数!
现在,很容易理解,其实,一个神经元就可以大致认为是一个简单的函数,这个神经元(函数)接收信号(参数),处理信息,作出反应(返回值)!多么简单,以后,我们编程时就不要说写一个功能函数了,就说,来吧,写一个比较最大最小值的神经元吧哈哈哈哈哈哈。
神经元+神经元 = 神经网络
高中生物课本说,很多个神经元组成了一个神经网络,人体中的神经元数量大概有几百亿个,就是简单的蚂蚁也有几十万个神经元,而这么多数量的神经元一个一个连接到一起工作,竟然产生了令人惊讶的能力:智能。而这个网络,也被称为神经网络。
所以,神经元(函数)+神经元(函数) = 神经网络(人工神经网络)。
虽然这句话不严格精确,但是很能帮助理解如何去使用编程语言编写神经网络,即我们需要使用函数套函数,这个函数的输出作为下一个甚至后面多个函数的输入,一个函数的输入来自一个甚至多个函数的输出,如示意图:
理解了上面的四张图,相信我,你已经步入了神经网络编程的大门。恭喜你!
编程中,神经网络的分类
据我目前的知识,神经网络大致分为两类:预测机和分类机。
但事实上,这两类神经网络应该没太大区别,比如自动驾驶,某一张道路状况的照片,我们既可以说:预测下一步的动作,左拐还是右拐或者其他,也可以说:分类这个场景,左拐,右拐还是其他,所以无需在这个分类上面纠结太多。
但有的情况貌似有区别,比如输入华氏度,给出摄氏度,在不知道明确转换公式的情况下,这里的神经网络应该只能叫预测机,因为输入是华氏度,经过处理后,给出可能的摄氏度结果。
如果叫分类机,那问题就太大了。比如73华氏度到74华氏度之间有无限个温度数值,不可能全部“分类”。
函数:摄氏度转为华氏度函数
# 将摄氏度转为华氏度
def CToF(C):
return 1.8 * C + 32
上面的函数功能很简单,就是把摄氏度转为华氏度,无论我们输入什么摄氏度的值,都能得到精确的华氏度的值。
但是,这是我们想要的吗?不是!我们需要的是神经网络!
神经元:摄氏度->华氏度
当我们看到一个运算时,比如 41*41,我们一眼就能看出结果大于1600,而一眼看出结果却很难,计算机却能直接计算出结果是1681。
同样,我们知道体温大概是36.5摄氏度或者97.7摄氏度左右,但是我们并不能精准知道现在体温是多少,但是神经元能通过自己的“经验”来“推断”出我们当前的体温应该是多少。
所以,这里有一个很有意思的事情:神经网络不需要计算精确,需要近似计算即可。编程神经网络时,不需要很精确,实际上,也不可能精确。实际生活中,无论什么方面,总能找到一些特殊的例子,有些人戏谑的称之为地球OL的BUG。
神经网络:温度转换
假设我们现在对 F = 1.8 * C + 32 这个公式有点模糊了,我们只知道需要加32,而忘记了C前面需要乘多少,幸运的是,我们大脑中有一个闲置的神经元可以用来处理这个转换,手里面也有一个华氏温度计和一个摄氏温度计。
设置初始条件
我们知道摄氏度和华氏度之间的转换关系是:F = 常数 * C + 32,要去估计这个常数的大小,所以,现在设这个常数是1,即初始转换关系是:F = 1 * C + 32。
我们使用温度计测量了下面一组数据:
华氏度 | 摄氏度 |
---|---|
97.7 | 36.5 |
77 | 25 |
212 | 100 |
经过设置,我们的闲置的神经网络设置为如下图所示:
尝试计算
现在准备好了一切,我们把测量的36.5输入到网络中,网络计算后,输出了68.5。
然后计算误差:97.7 - 68.5 = 29.2。(切记,误差可正可负可为0,但误差=真实值 - 计算值,当然你也可以计算值 - 真实值,只要你自己知道,并且计算时不要弄颠倒就行。)
29.2华氏度,这个误差还是挺大了,接下来,我们需要增大C的系数,变为1.5(系数乘以1.5,我承认这个变化太大,但是这是为了便于理解,其实变化应该小一点)。神经元变成了下面的样子:
输入第二个摄氏度的数据(25),再次计算,网络输出为69.5。
现在的误差为:77 - 69.5 = 7.5。误差瞬间变小了,但是误差仍然存在,所以我们要继续调整,1.5*1.5 = 2.25,于是,神经元变成了下面的样子:
现在计算第三个摄氏度的数据(100),得到257。
现在误差为:212 - 257 = -45(无论使用真实值-计算值还是计算值-真实值,要保证前后一致。)。误差再次变大,且现在是负的,证明我们调整的过于猛烈了,而测量数据到这里已经没了,所以我们只得选择误差相对较小的系数1.5作为神经元最终的训练结果。
最终结果
最终我们得到了一个摄氏度到华氏度转换的公式:F = 1.5 * C + 32,虽然和真正的公式(F = 1.8 * C + 32)相差较大,但是这种思想是神经网络的“核心”思想之一:随机初始数据(例如本例的F = 1 * C + 32),利用数据计算误差(使用测量的三组数据),调整数据重新计算(计算误差,重新计算),一次又一次的调整数据,最终得到一个较好的结果(F = 1.5 * C + 32)作为最终的网络。
以上是我的总结,可能与官方的表述不一样,但是大致思想只要大家理解了,相信学习起来会很快的。
上面的神经元的改进
最开始我们参数是1 时,得到了一个大误差,调整参数后计算误差急剧减小,然而我们调整参数策略却没发生变化,仍然是乘以了1.5,导致参数变化过于剧烈,从而引起了误差剧变。
上面计算时,第一次误差是29.2,第二次误差是7.5,如果我们每次只改变误差的一部分呢?比如,误差的百分之1?来吧,尝试一下。仍然是从最初开始!
最初的神经元
尝试训练
把第一组数据的摄氏度36.5输入网络,得到输出为:68.5。
计算误差 :97.7 - 68.5 = 29.2。此时调整参数1为:1 + 29.2 / 100 = 1.292。现在新的神经元如下:
把第二组数据的摄氏度25输入网络,得到输出为:64.3。
计算误差:77 - 64.3 = 12.7。可见,虽然这是的误差没有变化过于猛烈,但是至少误差是在慢慢减少了,它走上了正确的道路。
此时调整参数为:1.292 + 12.7 / 100 = 1.419。现在新的神经元如下:
此时将最后一组数据摄氏度100输入网络,得到输出为173.9。
计算误差:212 - 173.9 = 38.1。调整参数为:1.419 + 38.1 / 100 = 1.8。(很抱歉,误打误撞竟然算出了一个精确的1.8,这是偶然情况,并不是所有神经网络都能算到这么精确,但是希望大家能理解这里面的思想。)
而此时新的神经元如下:
到此,训练数据结束。
选择最终结果
一般来讲,我认为可以选择最后两次的任意之一作为最终的结果。本次纯属偶然得到了精确的1.8的值,实际应用中应该会比1.419更接近1.8,或者高于1.8,体现在数轴上,最后一次计算的参数应该处于黄色区域:
所以,在未知的情况下,这两次的结果都可能是更好的,例如为改进版本直接乘以1.5,倒数第二次的1.5为更好,而改进版本中,显然最后一次更好(相对来讲)。
写到最后
虽然今天内容看起来极其简单,但是,这就是神经网络的核心知识之一,理解了这些,学好神经网络绝非难事,但是要记住几个有帮助的建议:
1. 适当的改变参数,大误差大调整,小误差小调整。
2. 神经元的参数不需要精确,只需要有一个大概值即可,哪怕看起来有点荒诞,也是一个可以使用的值。
3. 每次训练要建立在前一次训练调整后的基础上。
如果大家有兴趣,可以试一试将改进版本中的调整率变为2%计算最终结果,试一试吧哈哈
最近等开学,在家里找了兼职,白天上班,抽空才能学习并记录,不定时更新,尽量周更或者两周更,希望大家多多谅解!拜谢!下期见!
以上是关于Python神经网络学习--神经网络知识先导--什么是神经网络?的主要内容,如果未能解决你的问题,请参考以下文章
Python神经网络学习--神经网络知识先导--分类器是什么东西?