前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >多层感知机(MLP)与神经网络结构 | 深度学习笔记

多层感知机(MLP)与神经网络结构 | 深度学习笔记

作者头像
用户1332428
发布2018-03-08 12:11:45
4.2K0
发布2018-03-08 12:11:45
举报
文章被收录于专栏:人工智能LeadAI人工智能LeadAI

为了尽量能形成系统的体系,作为最基本的入门的知识,请参考一下之前的一篇:感知机 | 神经网络 。

上篇文章让你形成对于神经网络最感性的理解。有些看不懂的直接忽略就行,最基本的符号的记法应该要会。后面会用到这篇文章中的一些记号和用法的约定什么的之后就不再啰嗦了。

01

基本结构

看完上面给出的文章或者已经有基本概念的同学应该对于神经网络的基本结构有基本的认识了。但是上面那个还只是涉及到单层结构,并没有推广到多层结构,同时,也没有在实践中使用这种结构的经验。所以,这节的内容就是以手写体识别为例子来讲一下基本结构,和实践中的基本使用思想。

这是推广到更加复杂任务上的基础。

假设你现在已经有了神经网络的一些感性认识了,那就就看下面这幅图。

输入层(最左边),隐藏层(中间两层),和输出层(最右边),在之前列出的博客就讲过了,这里回顾一下。感受一下大概的架构。

神经网络的流程分为前向过程和反向过程。反向过程一般用于训练,后面讲,这里只讲前向过程。

还记得每个神经元上面都有对于一个输入的权值,以及一个偏置,还有一个激活函数。(不知道的话看之前列出来的博客,后面不再强调了),所以一个前向过程的流程就是input输入,然后经过第一层神经元运算(乘上权值,加上偏执,激活函数运算一次),得到输出,然后第一层的输出作为第二层的输入,运算,得到第二层的输出…..直到到输出层运算,然后得到结果。神经网络就是依靠这样一套机制来进行计算和预测的。

假如你的权值和偏置已经是被训练好了。对于一个新的输入,进行这样的过程,就能够得到一个预测。那么你就能够通过这个预测来解决一些问题了。所以有机器学习思想的话,这些概念是很容易理解的。而我们的任务就是找到权值和偏置这些参数的值,使得输出的东西让我们满意,达到我们的要求。

这里先补充一个思想:

假如我们改变了某个神经元或者某几个神经元的权值或者偏置一点点,那么该神经元的输出肯定会变得不同,这些不同最终将反应在输出上面。如上面的图所示。所以,我们可以通过合理地改变权值和偏置一点点的方式来让这个神经网络最后的结果向我们预期的结果进军(sorry,我想不到好词了)。

然后说激活函数,还是在前面的博客链接中,给了很多的激活函数类型。激活函数的选择对于神经网络的训练来说,也是很重要的,这个后面再讲到。

现代神经网络激活函数总结,可以看这篇文章:

常见激活函数总结 | 深度学习笔记2

这里先以sigmoid函数为例子,讲讲激活函数的作用。所以,你这里先暂时假设我们没得选,只有sigmoid函数。

这个时候,有没有发现对于感知机前向过程的形式很像logistic回归的形式?

那我们为什么要选择sigmoid函数呢? 我们知道一个神经元还是选择了sigmoid函数之后,他的输出为\sigma(w*x+b) ,这也就是我为什么说这个形式很像logistic回归的原因。

上面的文章里面给出过这个函数的形状,这里再贴一次。其实你肯定也很熟悉了。

这个函数变动不大,很温和。不像阈值函数那样粗暴的从0到1,这是很符合之前的那个思想的。当然这个函数还有另外一个优点,就是平滑。平滑能够使得权值和偏置非常微小的变动能够使得最终的结果也产生非常微小的变动。这才是很重要的。

写成公式,就应该是这样:

怎么理解这个公式呢?

首先在机器学习里面我们不是说过,我们的任务就是找一个函数f(w,b),然后他的输出output就是由这个函数产生。你再来看这里,这里虽然是神经网络,但是整个神经网络还是一个函数。

然后回顾一下全微分的定义:

同样可以推广到多元的形式,再看上面的那个公式就不难了吧。

这里还有一个要注意的就是,从上面公式的形式来看,\Delta output 就是\Delta w_{j}\Delta b 的一个线性函数,于是我们能够选择一个小的权值和偏置的改变,使得结果以我们期望的方式改变。

讲了这么多,现在根据一个例子来谈谈实践中是怎么设计网络的结构的,很简单,也很重要。

以MNIST手写体为例子,里面都是28x28的灰度图,假如以我们现在这么简单的网络形式,我们可以考虑把所有28x28的图片统一展开为一个一维数列(这样可能会丢掉某些位置信息,后面CNN会讲到这个),然后得到一个结构,含有784(28x28)个值。

回到网络这里来,对于输入层而言,我们可以“设定”784个单元,分别接受每一个像素的值。对于输出层而言,我们可以只设定一个神经元,用来输出这个数字是几,我们也可以设定10个神经元,分别代表0到9,然后输出这个那个数字更加有可能。

从上面看,设计输入层和输出层还是比较轻松的,但是设计隐藏层是比较难的。后面再讨论。

02

训练神经网络

这里暂时默认训练神经网络的损失函数为二次损失函数:

右边的为L-2范数,当做欧氏距离理解就行。我们的目标就是找到合适的w(权值)和偏置(b)使得这个损失函数最小。意味着网络输出的值会越来越接近真实值。

训练神经网络的方法为随机梯度下降法:

写成梯度下降的形式为:

也就是说,通过不停的迭代,找到最合适的权值和偏置,使得损失最小。这在机器学习里面是很基础的东西了。

最终,我们的任务就成了计算偏导: \frac{\partial C} {\partial w_{k}} \frac{\partial C} {\partial b_{i}} 了。

但是这里是神经网络啊,那么多层,那么多参数,传统方式怎么计算偏导?所以对于偏导的计算就是反向传播的任务了。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-09-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 人工智能LeadAI 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档