首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

神经网络到底提莫是怎么学习的!

嘛,最近看了个很棒的神经网络科普视频。看完视频之后我觉得我已经控制不住我体内的装逼之力了!所以今天我们就来说说这个视频里的具体内容——神经网络是如何学习的!

现在什么人工智能,机器学习一类的东西有多火我想不需要过多说明。各种各样的报道,什么阿尔法狗又赢了谁谁谁;新一代的人工智能准备进军XX领域等等等等可谓是不绝于耳。你新闻说得不烦我吃瓜的听着都烦了!

说了这么多机器如何如何牛逼,如何如何改变未来,你到是告诉告诉我机器到底是怎么自主学习的呀!喊了半天666还不知道其中的原理是什么,那岂不是很没劲!

像我这么热(闲)爱(得)学(无)习(聊)的好少年怎么能允许这种事情发生呢!

于是我就查阅了很(瞎)多(鸡)的(儿)相(乱)关(百)资(度)料,试图了解这个问题。可是我发现全是公式的我提莫看不懂!全是文字的它提莫又说的都是废话!

直到我看了这个视频!

我觉得这一把终于是稳了!

下面我们就以机器如何学习识别手写数字为例,来说说这神经网络到底是如何学习的!(如果具体过程不想看,只想知道核心思想的,可以直接跳到最后的总结部分!)

对于我们人来说,识别手写体的数字还是很容易的。

但是机器不是人,它们没有像我们一样复杂的大脑,那么它们要如何识别这些千奇古怪的数字呢?别急,现在我们就来好好说说这个机器运用神经网络学习识别数字的过程!

明确目的

首先我们明确下目的,我们的目的就是通过神经网络,如图

来实现输入一个28*28的像素,

输出一个个位数字的功能!

问题拆解

这具体怎么做呢。其实思想非常的简单。无论手写体怎么变,数字都是由一些简单的部分组成的,如图

而这些部分,又能由更小的部分组成,如图

知道了数字可以拆解这个思想,我们就可以用它来设计神经网络了。

事项说明

在神经网络中

每个圈都代表着一个神经元,这些神经元可以人为的赋予它各种各样的含义。在我们的例子中神经元代表的含义如图所示

第一层代表的是28*28=784个输入,最后一层代表的是0到9十个数字。而中间两层代表着数字分解后的组件(在我们的案例中,每个数字拆两次,所以神经网络中间的部份分两层,每层我们假设有16个神经元)。

而每个神经元其实都是作为一个存储数字的容器而存在的,它里面的数字我们叫做激活值!在我们的案例中激活值都在0到1之间。

而在第一层神经网络中,激活值对应的是像素的灰度值(我们把手写字变成了如下图的像素,而灰度值就是黑白的程度,越白表示像素越高。)

而其它三层的激活值你可以简单理解为是神经元代表的这个组件或者这个数字的可能性!

什么是神经网络的学习!

知道了这些以后,我们来看个具体的例子,看看神经网络的学习到底指的是啥!

首先我们来了解它靠着第一层的输入是怎么判断形状的!

如图所示

假设这个第二层的这个神经元代表的是上图的这个形状。

那么要判断是否是这个形状,我们首先要知道的是第一层网络的输入值。我们用a1来表示第一层的第一个神经元,a2表示第二个以此类推....

知道输入后,很明显的,我们的这个形状并不是和所有第一层的神经元都有关。其有关的程度也因位置的不同而存在差异。那么自然的我们就需要为每个神经元与这个形状的相关性进行赋值,也就是数学上说的加个权重。

现在把输入和权重加起来

你就能得到一个加权和!

(下面需要一定的数学知识,不懂也没有关系,不影响大局的理解。不理解可以直接跳过这个部分。)

而因为我们的激发值规定要在0到1之间,那么我们就可以把上面这个式子放到sigmoid函数里

而因为一个比较复杂解释起来我可能要吐血的原因,在加权和的背后我们还需要加个偏置值b

这个表达式有点复杂,我们简化写起来其实是这样的

这个东西看起来复杂,但是用编程运算起来还是比较好写的,所以并不需要方。

(数学部分结束)

那么一个第二层神经元就带了784个权重和1个偏置。那么这16个神经元就带了784*16个权重和16个偏置。第三,第四层同理,那么这套网络算下来就有

13000个权重加偏置。而我们所说的机器学习,就是电脑怎么设置这些参数!

而电脑怎么设置这些参数其实是个函数问题(不懂的看数学部分),整个神经网络基本可以说就是一个函数!那么到了这里,识别手写体的问题,就变成了一个函数问题!

神经网络到底怎么学!

知道了机器学习是什么且知道它是一个函数问题后,接下来我们就该来看看它到底是这么学习的了!

它的思想其实也非常简单,从一开始,可以随机设计参数。这时输出的自然会是一坨屎。假如它输出的是如下图所示

它的输出乱七八糟。而我们想要它输出的其实只是3,也就是要求除了3是白色的以外(灰度值是1,也就是纯白的)其它数字全部要是黑的(灰度值为0)。

那么要想达到我们的要求有什么方法呢?

我们可以这样做,把它输出的值(也就是乱七八糟的灰度值)减去我们希望它输出的值(也就是除了3的值是1外其它值都是0)的平方和相加。

这样我们就会得到一个数,我们称之为训练一个样本需要的代价!很明显,这个“代价”越小,你就越接近正确的输出值!

那么现在你要考虑的事情就变成了在成千上万个样本训练中怎么使得你这个网络的“代价”平均值最小!

这样一来,这个问题就又变成了一个函数问题!

上面说机器学习是什么里的函数是这样的

输入是784个值,输出是10个数,而参数是13002个权重与偏置的和。

而这个函数是这样的

输入的是13002个偏置与权重,输出的是“代价”,而参数则是网络对于训练数据的综合表现!

把它变成一个函数问题后,网络的如何学习就变成了找到特定的偏置与权重使“代价”函数最小!

而这个方法术语叫做“梯度下降法”。这个过于复杂,用来装逼别人都听不懂,所以这里就不具体解释了。大致思想就是小步慢行,先找局部最小。有兴趣的少年可以自行学习....

具体的学习例子

下面我们直接来看个例子!

比如你现在的网络输出是这样的

很明显,如图所示我们需要第三个输出值变大,其它输出值变小。

那么我要怎么办呢。办法有三,1是改权重,2是改偏置,3是改上层的激活值。

而改变每个参数条件的效果都是不同的,就像下图所示

所以我们不仅要知道哪些参数要改,还要知道改哪个参数的性价比最高。当然这是梯度下降法的内容,大众不要求掌握,只需知道数学上可以有这种求函数最小值的方法即可!

当然通过改动这只是增加了输出层2这一个神经元的激活值,我们还需要降低其它数字的激活值!其改动方法同理。那么把这些改动量相加!

我们就得到了倒数第二层的改动量!

其它层数的同理。

当然这只是对一个样本的调节,你还需要如图所示的过程

经过这些步骤后,你就可以得到一个优化过的神经网络了....

总结

以上就是整个机器用神经网络学习的简化过程!这其中的难点不在与算法而是在于需要要有一大堆的训练数据....

总结起来,其核心思路个人概括为

1,拆解问题。

2,根据拆解的步骤确定网络的中间层数。(因为输入输出是设定的。)。

3,通过构造神经网络,设置权重与偏置把具体的问题变成函数问题。

4,通过大量的训练,得出“代价”值。

5,最后通过数学方法配置出“代价”最小值的参数,完成训练!

呼,终于说完了,真是累死老子了,上面的内容看起来多,但是其核心思想其实还是很简单的。无外乎就是拆解问题接着把具体的问题变成数学问题然后再变成函数问题最后求个最小值而已!

这思想总是简单的,数学总是困难的!所以说“学好数理化,走遍天下都不怕”!古人诚不欺我!

最后在这里我要对这个视频的制作者和那些把知识传播给大众的人们表达一下深深的敬意!谢谢你们把知识带给大众,让这个世界因为你们的存在又美好了一点点....

(以上截图均来自视频:

https://www.bilibili.com/video/av15532370/from=search&seid=8258663928530139195

这是个非常棒的视频十分推荐观看!)

嘛,今天就是这样了拜拜!

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

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券