浅谈神经网络算法

最近迷上了一款游戏《刺激战场》,玩了两个多星期由热血青铜上到了不朽星钻,还是挺有意思的。大学四年基本不玩游戏的我还是勉强玩了一下。

人类进化几千年来,人脑也伴随着进化,人脑相当于一个高度复杂的、非线性的和并行的信息处理系统。通常我们怎么来识别图像呢?比如我们看到上图的那一串数字,对于我们人来说是非常简单的一串数字,我们都可以很清楚的认出来是504192几个数字,但是呢,我们在识别这串数字的过程中,人脑是经过一系列非常非常复杂的过程。我们人脑是一个相当复杂的系统,因为我们人脑非常善于在视觉上来识别一些图像和一些规律,把他可以抽象成一些高层的概念,所以我们不觉得这东西多么难。

我们大脑视觉皮层V1包含有140000000个神经元,而且除了这一层之外,还有V2、V3、V4、V5等组成数百亿个连接。我们人脑在进化的几千年里,非常善于在视觉上来识别一些图像和一些规律,把他可以抽象成一些高层的概念,但是,对于计算机来说没有那么简单了。对于Deep Learning来说,其实是由Neural Networks演变而来的,也就是神经网路算法演变而来的。那神经网络算法它的概念就是说:我们模拟人脑的结构,也就是有一个网络的结构,在于最底层来说,进来的信号其实是一个最小单元的信号,对于图片来说,其实就是一个像素点。对于任何一张图像来说,我们可以认为他其实就是一个矩阵,比如下图的图像我们可以认为是一个4*4的矩阵,每个像素点的值是在0~255之间,所以任何图像在数学上我们都可以认为他是一个矩阵。

类似于人脑来说,我们传入的输入层,对于图像来说,其实他就是一个像素的值,然后我们经过神经网络传递在下一层可能会学习出来一些比如边缘这些信号,再在这个边缘的下一层,可能还学会到部分信号,比如人的眼睛、嘴巴、鼻子这些,然后在最上面的一层就会学习到建立起整个物体模型,然后整个物体就会变得抽象的一个概念。就跟我们人脑有点像,就是在视网膜信号传递进来的时候,人脑视觉皮层V1就会学习到一些边缘,然后在V2层的话就会处理一些比较简单的形状这些信息,直到V4层,就会学习处理出很抽象的模型,可以看清楚这个物体是个什么东西。

对于人脑来说,非常善于在视觉上来识别一些图像和一些规律,把他可以抽象成一些高层的概念,对于一个物体来说并没有什么难度,但是对于计算机来说,它是有难度的,举个例子,比如上面的车,我们在车上截取一小块来讲,这个对于计算机来说,它看到的其实就是这样的一个矩阵,就是说每一个像素点,它的明暗(数值)对计算机来说的有很大的影响。假如说这个光线,稍微变亮一点或者变暗一点,这上面的每一个值都会跟着变化,那我们应该怎样抽象出一种方法,让计算机去理解我们抽取的这一部分是个什么样的东西?或者说这个车是怎么样的,总结出这一个规律其实是非常非常困难的,这也是这几十年来计算机视觉这方面的学者一直在研究探索的问题。经过近二十年的研究,也才达到了一个初步的智能化,比如对人脸识别是比较成熟,但是对一些物品的识别,还需要很多方面精确度的提高。

比如我们来看下这从MNIST dataset中截取的部分手写数字,每一个小图都是一个手写的阿拉伯数字,对于我们人来说很容易就能识别出每个数字是几,但是对于计算机来说,它可能就是些像素点,如果你的边缘稍微变一点点,或者稍微扭曲一点,它周围的像素都会跟着变化,所以,怎样写一个程序能让计算机自动识别出来,这件事其实不是那么容易的。

再比如我们把一个数字放大一点,我们很清楚的看到是一个9,其实它是一个28*28的矩阵,每一个小方格就是一个像素点,比如我们让边缘稍微变一下,整个数值就会跟着变化。那么我们如何能够让计算机识别出来这些数字呢?我们就需要借助机器学习、深度学习的这些算法来理解,来设计一套学习的策略。

在Neural Networks(神经网络算法)中,输入值(x1、x2、x3)经过某一个function后,出来有一个输出值。

比如我们输入输出值定义为0和1,什么时候等于0呢,我们可以看到这里有个求和,如果求和的结果小于我们事先定义好的预值,我们就让output输出就等于0。那么上面的公式怎么理解呢?比如再举个简单的例子:

今天去不去踢球?

天气冷吗?W1

跟我常配合的好友去吗?W2

是不是晚饭前?W3

这里我认为天气不是很重要,取W1=2,好友来不来对我很重要,取W2=6,我不想饭后还去打球,但比天气重要一些,取W3=3,我预值threshold=5,那么可以根据上面的模型进行组合,比如天气很冷x1=1,好友没空过来x2=0,还没吃晚饭x3=1,那么得出的预值等于1*2+0*6+1*3=5,那么我今天出去踢球的输出值为0,表示今天不愿意出去踢球。

但是,实际模型更加复杂。在实际过程中会有很多很多的因素,它的每个输入层的神经元中只能会影响下一个神经元的值。

我们也可以取threshold=-b,那么我们的方程也可以写成:

由上面的方程来看,其实对我们的研究会有一个很大的缺陷,比如让上面的x2稍微变一下,可以看到output输出也跟着完全变了。但是我们需要研究一个渐变的过程,不能让单一一个元素影响最后的结果,我们最理想的方法就是能让数值的变化很小很小,为了模拟更加细微的变化,不再只是0和1两个数,而是在0到1之间的任何数,所以在这里引进一个Sigmoid方程。

我们可以看下之前定义的函数:

从上面图像可以看出,输出的结果要么是1,要么是0,这并不是我们想要的结果。再看下我们转换为Sigmoid方程的图像:

从图像上看,函数是一个变化非常缓和曲线,这样自变量就可以在Z上面只要变化一点点,函数值Y的变化也是很小的,这样我们就达到一个目的:我们要模拟之前的神经元的时候呢,当Z的变化很小的时候,Y的值也变化很小。

———————————————

写到这里夜已深了,这里只是简单的介绍了一下神经网络算法的基本原理以及介绍了Sigmold Function,下一篇会继续介绍神经网络算法的基本结构以及梯度下降算法。

春去秋来,一边记录,一边成长。

——《凡人周郎》

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

扫码关注云+社区

领取腾讯云代金券