专栏首页人工智能LeadAI多层感知机(MLP)与神经网络结构 | 深度学习笔记

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

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

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

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}} 了。

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

本文分享自微信公众号 - 人工智能LeadAI(atleadai),作者:谢小小XH

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-09-12

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 讨厌算法的程序员 | 前言

    这个主题是写给自己的,假如你刚好也和我一样讨厌算法,那也是写给你的。我的主要参考书目是《算法导论》第3版中文版,自己先琢磨明白一个算法,然后再按我的理解写出来。...

    用户1332428
  • 学习笔记 | 吴恩达之神经网络和深度学习

    机器学习 机器学习研究的是计算机怎样模拟人类的学习行为,以获取新的知识或技能,并重新组织已有的知识结构使之不断改善自身。简单的说,就是计算机从数据中学习规律和模...

    用户1332428
  • 线性回归回顾与logistic回归 | 机器学习笔记

    01 再看线性回归 之前我们选择线性回归的时候,只是认为那些数据看上去很符合线性的样子,选择最小平方损失函数的时候,也是直接提出来的,没有考虑过为什么会是这个样...

    用户1332428
  • Lua 5.3 的调试库

    如果 message 有,且不是字符串或 nil, 函数不做任何处理直接返回 message。 否则,它返回调用栈的栈回溯信息。 字符串可选项 message ...

    bering
  • Java NIO套接字【源码笔记】

    本文以代码示例跟踪调用Native函数,看下原型函数的具体释义。例子中“客户端”从文件test02.tmp读取内容后,通过socket发送到“服务端”后写入te...

    瓜农老梁
  • 人工智能|神经网络中的激活函数

    激活函数是深度学习,也是人工神经网络中一个十分重要的学习内容,对于人工神经网络模型去学习、理解非常复杂和非线性的函数来说具有非常重要的作用。那么,激活函数的作用...

    算法与编程之美
  • [PHP] PHP闭包(closures)

    陶士涵
  • 神经网络和深度学习(吴恩达-Andrew-Ng):一二周学习笔记

    机器学习: 机器学习研究的是计算机怎样模拟人类的学习行为,以获取新的知识或技能,并重新组织已有的知识结构使之不断改善自身。简单的说,就是计算机从数据中学习规律和...

    用户1740424
  • 学习笔记 | 吴恩达之神经网络和深度学习

    机器学习 机器学习研究的是计算机怎样模拟人类的学习行为,以获取新的知识或技能,并重新组织已有的知识结构使之不断改善自身。简单的说,就是计算机从数据中学习规律和模...

    用户1332428
  • Linux内核本地提权漏洞预警分析(CVE-2019-8912)

    近日,Linux git中发布一个commit补丁,该补丁对应的漏洞是一个本地提权漏洞CVE-2019-8912,漏洞影响范围较广。根据git中的commit信...

    FB客服

扫码关注云+社区

领取腾讯云代金券