【机器学习】一个例子带你了解神经网络是什么

之前写过一篇文章:【机器学习】机器学习是什么意思

里面只是简单地说明了一下机器学习是什么

然而很多初学者误以为,机器学习=神经网络

其实机器学习是一个学科,里面包含了深度学习、深度神经网络、神经网络等......

神经网络可以说是人工智能的 “ HELLO WORLD!”

所以了解什么是神经网路还是十分必要的~

——————————————下面是正文————————————————

注意:在继续往下面看时,请把你电脑上有关于神经网络的网页通通关掉,专注看我这篇就好了~如果看得越多反而越乱喔!

———————————————真·下面是正文——————————————

       神经网络最擅长用于分类以及回归问题上,下面将通过讲解一个神经网络入门级例子(神经网络的 “HELLO WORLD!”):识别手写数字,来了解神经网络是什么。识别手写数字简单来说是指通过传入一张带有数字的照片给程序,程序可以自动识别出该数字是多少。比如现在我有这样一张照片:

                                                                    

       ps:因为该图片是经过了我进行了图像处理的结果,将照片压缩到了28x28,然后进行了灰度变换等一系列处理后再放进神经网络进行推理的结果,所以照片会变得用肉眼看起来十分模糊,但是关系不大,只要计算机可以识别就行。

       将这张照片丢到程序里面后,程序经过识别以及推理,将得出一个结果:

                                                                  

       计算机之所以能够得到这个结果,是因为我已经在之前对这个程序进行了 “ 学习 ”,在未经任何学习时,程序就像一个初生的婴儿,并不能识别任何东西,你能指望一个婴儿可以识别数字1—10么?但是随着年龄的增长,婴儿逐渐接触数字的机会越来越多,学习的机会也就越来越多,当学习到了一定的程度,就可以正常地经行识别数字1—10 了,而在学习的过程中,婴儿的大脑中对于数字的神经元就会被刺激,随着学习的次数越来越多,大脑负责数字识别的神经元就会变得越来越灵敏,准确率越来越高,最终在到达一定的年龄时可以非常简单的识别出数字来。

       程序亦是如此,刚开始时程序并不能识别任何东西,我们需要不断地对程序进行学习,使得程序对识别数字越来越敏感,准确率越来越高。所以机器学习分为 ” 学习 “ ” 推理 “ 两个阶段的原因就是如此。 

        那么程序究竟是什么进行学习的呢?       我们使用的是神经网络,所以学习其实就是让神经网络进行学习啦~

        那么学习要学到什么程度呢?    这个需要看程序员自己来定,学习的样本(一般至少几万张吧)越多,次数越多效果可能更好(注意:学习次数多并不会使得准确率越高,有可能适得其反,选择合适的算法可能比单纯多次学习好很多)

一.神经网络的学习过程

       “ 神经网络 ”,顾名思义,就是由众多的神经元组成的网络,而这个网络则是仿照我们人类的大脑中神经,通过不断学习来刺激网络中的每个记忆神经,使得我们对事物产生自己的见解:

                              

       学过生物的同学都知道,人脑神经网络最基本单位是:神经元(如图上的发光点),神经元通过相互连接来传递介质,及时应对外界传来的各种信息,所以,我们人工智能中神经网络的最小单位也是神经元。下面我们给出一个简单的神经网络,方便我们理解:

              

        如上图所示,每层都只有一个神经元,传入的信号经过多层神经元的处理后,将变为一种可以处理的结果输出,而每个神经元里面的数字即代表传入信号在传入神经元之后的处理结果。在神经网络中,我们对于每一层都有着这样的规定:

          

        每层的神经元数量以及中间层的层数都是不确定的,可以是任意多个,具体由多少个,是程序员自主手动设置的(看心情/按需分配),所以以下这样也是可以的:

                          

     而在本例中(识别手写数字),我们可以设置输入层的神经元一共有784个(因为照片的像素是28X28,一共784个像素),输出层的神经元一共10个(数字0到9一共10个),中间层分为一层,15个神经元(当然,你设置100层,每层100个神经元也可以)。这样设置主要是为了美观,设置完成之后如图下所示:

                                           

        而后,我们将照片压缩为28X28(784个像素点)大小的尺寸: 

                                                                                   

         其中每一个格子中都存有一个数值(至于这个数值是怎么的来的,可以参考我以前写过的文章:【计算机视觉】数字图像以及图像处理的基本步骤),该数值的范围在1(白色)至0(黑色)之间浮动,代表了这个格子的像素值: 

                                                                              

注意:像素值已经经过了归一化处理,使得像素值在1~0区间浮动,而没有经过归一化处理的像素值则是在0~255之间浮动。

          将照片的784个像素值通过第一层神经元传输进入输入层,每个神经元中既有指定的数值:

                                    

            然后数据经过神经元的层层计算,最后得出一个结果:

                                      

       我们将程序计算得出的结果(也称实际结果)与预测结果(也称训练标签)相比对,发现结果是正确的,那么我们就可以保留每个神经元的计算参数,不再继续学习。如果实际的结果并非如我们所想(比如照片里面的数字是“7”,但程序传出的结果却是“2”之类),那么我们就需要对这个程序说:我辛辛苦苦找了一个这么漂亮的数字给你,而你却传出一个错误的结果给我???你是在zuo si 吗??让程序自己感到惭愧,让它重新进行计算,更新各个神经元的计算参数,直到可以正确地识别结果为止

       而 “ 因程序传出来一个错误的结果从而需要重新计算 ” 的实现过程,有很多实现的方法,比较常见的方法是:使用反向传播法使得输出结果的梯度下降至最低的方法(也可以称为梯度下降法),至于这个方法具体实现可以在百度上获取,也可以参考我写的文章:【机器学习】一个例子带你了解监督学习中数据集、假设/代价/损失函数、梯度下降法等深奥概念是什么意思

       那么从宏观上知道了神经网络是怎么进行学习的了,接下来再来了解下各个神经元是如何进行计算的

二.神经元的计算过程

      我们抽取其中一小部分的神经元进行说明:

                                            

      把神经元想象成一个装数据的容器,神经元把数据往下一层传递时,数据会发生变化,是由于在神经元中经过了计算的结果,每个神经元可能会接收到不止一个输入信号(在本例子中,输入层每个神经元单独接收一个像素的值,但是中间层的神经元则是每一个神经元都接收了上一层的784个神经元的信号):

                                            

       上图可以看到是一个神经元接收三个输入信号的例子,其中x1、x2、x3是输入信号,w1、w2、w3是权重参数,B1是偏置参数,输入信号被传送到神经元时,会被分别乘以固定的权重(权重表示该输入信号对于整个计算过程的重要性,如本例中照片的角落处像素值由于对识别数字贡献不了什么价值,所以重要性最低,所以权重可以为0),然后计算总和,最后加上偏置参数(偏置表示该神经元被激活的容易程度),所以,当输入信号经由网络传入到神经元之后,神经元经过计算将得到一个数值,公式可以表示为:

                                                                

       ps:对于权重和偏置想要更为了解可以参考我写的一篇文章:【机器学习】机器学习是什么意思

       神经元经过以上计算之后,还不能将数值直接往下传递,还需要通过一种叫激活函数(也称传递函数)计算出最终的结果才能往下一个神经元进行数值传递,至于什么是激活函数,可以参考我写的文章:【机器学习】激活函数/传递函数

三.最后的反向传播

        经由各层神经元的计算后,数值会来到最后一层输出层,输出层的神经元计算与其他层无异,唯一有所区别的就是在学习阶段中,输出层最终所得到的结果需要经由损失函数的计算来得知计算结果与预测结果相差多大,从而告知程序进行重新计算,而计算机可以做的就是根据损失函数所得到的结果(损失函数顾名思义的出来的结果是损失值,所以损失函数的结果越低,程序识别数字的准确率就越高),通过从输出层到输入层方向计算,重新将各个神经元的权重和偏置进行更新,使得损失函数的值降到最低。有关损失函数可以参考我写的文章:【机器学习】损失函数

       至此,一个简单的神经网络学习过程就介绍完了,有关于 “识别手写数字” 这个例子的代码实现,有时间的话我会写一篇文章,届时我会在这里更新地址,如果没有的话就是还没有写(这个肯定会写滴)~~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

师兄师兄怎么办

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值