图片来源于网络

翻译 | 林椿眄

编辑 | Donna

本周,我们为您准备了一份数据科学家Ben Gorman撰写的神经网络指导。这份指导包含了他具体的学习思路,包括所遇到的难点以及多种详细的解决方法。

文章不短,但是值得深读,请收藏!

人工神经网络当下非常流行。与任何流行的事物一样,人工神经网络也收到了不少质疑。它究竟是卖弄玄虚,还是真正可以使无数人获益的新技术呢?

为了让大家入门神经网络,我从一个并不太了解的专业数据科学家的角度,和大家分享我的学习过程,希望对你们有所帮助。

需要注意的是,本文中所涉及的示例都是用R语言写的代码。

让我们从一个动机问题开始思考。这里是一个灰度图片的集合,每个2×2的像素网格的像素取值都是在0(白)到255(黑)之间。我们的目标是构建一个模型,用“阶梯”的模式来识别图片。

在这里,我们来探讨如何找到一个能够合理拟合数据的模型感兴趣。

方法一:预处理

对每张图片,我们标记像素X1,X2,X3,X4 ,  并生成一个输入向量X=[X1 X2 X3 X4],作为我们模型的输入值。我们希望我们的模型能够预测“True”(图像具有阶梯模式)或为“False”(图像不具有阶梯模式)。

方法二:单层感知器(模型迭代0次)

单层感知器是我们可以构建的一个简单模型。当一个感知器使用线性权重组合的输入时,可以得到一个预测值。如果预测的数值超过所选用的阈值,感知器则会判定为“True”,否则判定为“False”。更具体的说,

我们可以将它重新表示为如下形式:

这里表示预测值。

图形上,我们可以将感知器表示为一个由输入到输出的节点。

例如,我们假定构建如下的感知器:

这里可以看到感知器是如何在我们的训练图像上执行的。

这是合理的结果,肯定优于随机猜测的效果。所有的阶梯模式在其底部都有带有深色阴影的像素,能支持X3和X4采用更大的正系数。尽管如此,这个模型还是存在一些明显的问题。

  • 该模型输出一个实数,它的值与自然的概念相关(值越大隐含着有更大的可能性说明图像表现为阶梯模式),但是将这些值解释为概率值是没有依据的,特别当它们的取值范围在[0,1]之外。

  • 该模型无法捕捉到变量之间非线性的关系。

为了解这个问题,可以考虑以下的假设情况:

情况A:从一张图像开始,x = [100, 0, 0, 125],从0增至60.

情况B:从最后一张图像开始,x = [100, 0, 60, 125],从60增至120.

直观上,相对于情况B来说,情况A的应该会有更大的增幅。然而,由于我们感知器模型只是一个线性等式,对于这两种情况,X3增加了60,而只增加了0.12。

同时,我们的线性感知器还会有更多的问题,但是我们先来解决这两个问题。

问题一:以Sigmoid为激活函数的单层感知器(模型迭代1次):

我们可以通过将我们的感知器包在Sigmoid函数里面(随后选择不同的权重值)来解决上述的问题1和2。回顾下Sigmoid函数是一条垂直方向上界定在0到1之间的S型曲线,因此经常被用来模拟二元事件发生的概率。

顺着这个思路,我们用下面的图片和方程式来更新我们的模型。

这就是Logistic回归。然而,将这个模型解释为以Sigmoid为激活函数的线性感知器也是很好的,因为这给了我们更多的空间去泛化。此外,由于我们将解释为概率值,所以我们必须相应地更新我们的决策规则。

问题二:假定我们提出以下的拟合模型:

对比先前的部分,可以看出这个模型在相同的图像上是如何起作用的。

解决方法:

情况A:从一张图像开始,x = [100, 0, 0, 125],从0增至60.

情况B:从最后一张图像开始,x = [100, 0, 60, 125],从60增至120.

请注意,随着的增加,Sigmoid函数是如何引起情况A的“触发”现象(快速增加),但随着z的持续增加,速度会减慢。这与我们的直觉是相一致的,即对于出现阶梯的可能性,情况A应该反映出比情况B更大的增长。

不幸的是,这个模型仍然存在问题:


  1. 与每个变量都有单调的关系。如果我们想识别轻微的阴影阶梯,那该怎么办?

  2. 该模型不考虑变量的交互问题。假设图像的底部是黑色的,如果左上角的像素是白色,则右上角的像素变暗会增加阶梯出现的可能性。如果左上角的像素是黑色的,则右上角的像素变暗会降低阶梯出现的可能性。换句话说,就是根据其他变量的值,增加X3应该可能增加或减少的值。目前我们的模型还无法实现这一点。

问题三:以Sigmoid为激活函数的单层感知器(模型迭代2次):

我们可以通过在我们感知器模型上额外增加一个层来解决上述的两个问题。我们将以上面的模型为基础构建一系列基本模型,然后将每个基本模型的输出作为输入提供给另一个感知器。这个模型实际上就是一个 “香草型”的神经网络。让我们通过一些例子看看它是如何工作。

例子1:识别阶梯模式

  1. 构建一个模型,当左阶梯模式被识别时触发,

  2. 构建一个模型,当右阶梯模式被识别时触发,

  3. 增大每个基础模型的得分,以便最后的S型函数只有在都很大时才会被触发。

或者

  1. 构建一个模型,当底部为暗色时才触发,

  2. 构建一个模型,当左上角像素为暗色且右上角像素为亮色时才触发,

  3. 构建一个模型,当左上角像素为亮色且右上角像素为暗色时才触发,

  4. 增大基础模型以便最后的sigmoid函数只有在都很大,或者都很大时才触发(请注意无法同时有很大的值)。

例子2:识别带轻微阴影的阶梯

  1. 构建一个模型,当底部为阴影,阴影x1和白色x2,阴影x2和白色x1时才被触发,

  2. 构建一个模型,当底部为暗色,暗色x1和白色x2,暗色x2和白色x1时才被触发, 

  3. 将模型组合起来以便在使用sigmoid函数压缩之前, “暗色”的标识符能够基本上从 “阴影”标识符中除去。

专业术语注释

单层感知器具有单个的输出层。因此,我们刚刚构建的模型将被称为双层感知器,因为模型的一个输出层,是另一个输出层的输入。然而,我们可以将这些模型称为神经网络,就这方面而言,网络有三层--输入层,隐藏层和输出层。

可替代的激活函数

在我们的例子中,我们使用了一个sigmoid作为激活函数。但是,我们可以使用其他的激活函数。双曲正切函数、 修正线性单元都是常用的选择。激活函数必须是非线性的,否则神经网络将等价于单层的感知器。

多目标分类

通过在最终输出层中使用多个节点,我们可以轻松地将我们的模型扩展成多分类模型。这里用到的想法是,每个输出对应于我们想要预测的类别之一C,我们可以使用Softmax函数将空间中的一个向量映射到中的另一个向量,如此使得向量的元素之和为1,而不是通过sigmoid函数映射空间的一个输出元素并将其压缩在[0,1]之间输出。换句话说,我们可以设计一个网络使得它的输出向量是如此的形式:

使用不止两层的神经网络,即深度学习

你可能想知道,我们是否可以扩展我们的香草式神经网络,使得其输出层被输入到第四层(进而第五层,第六层等等)?

是这样的,这就是通常所说的“深度学习”。实践中,它非常高效。但是值得注意的是,任何一个隐藏层都可以通过一个单隐藏层的网络来模拟。实际上,根据通用逼近定理,可以使用具有单个隐藏层的神经网络来逼近任何连续的函数。

深层神经网络架构经常选择偏向于单个隐层结构的原因就在于,他们更倾向于在拟合过程中更快速地收敛并得到最终的结果。

用模型去拟合带标签的训练样本 (反向传播法)

在拟合阶段,到目前为止,我们已经讨论了神经网络如何能够有效地工作,但是我们还没有讨论如何用神经网络去拟合带标签的训练样本。

一个等价的问题就是:给定一些带标签的训练样本,我们该如何选择网络的最佳权重值?

对此,梯度下降法是常见的答案(尽管用最大似然估量法也可以做到)。

下面继续我们的示例问题,梯度下降的过程会像这样:

  1. 以一些带标签的训练数据开始

  2. 选择一个可微的损失函数并最小化,

  3. 选择一个网络结构。具体地说就是确定网络的层数以及每层的节点数

  4. 随机地初始化网络权重

  5. 用网络运行训练数据来生成每个样本的预测值。根据损失函数来度量总体的误差值(这就是所谓的前向传播过程)。

  6. 当每个权重发生小的变化,确定当前的损失值将改变多少。换句话说,计算L对于网络中每个权重的梯度值(这就是所谓的后向传播过程)。

  7. 沿负梯度的方向走一小步。例如,,那么小幅度的减少会导致当前损失小幅度的降低。因此我们更新(这里0.001就是我们所预定义的步长)。

  8. 以固定的次数重复进行这个过程(从步骤5开始),直至损失函数收敛为止。

这些是最基本的想法。实际中,这面临了一系列的困难:

挑战一: 计算复杂度

在拟合的过程中,我们需要计算的一个东西是L对于每个权重的梯度值。这是个棘手的问题,因为L依赖于输出层中的每个节点,并且每个节点依赖于之前的层中的每个节点,以此类推。这就意味着计算是一个链式规则的噩梦(请记住,实际上许多神经网络都有数十层数千个节点)。

我归纳了解决这个噩梦的四个技巧。

处理这个问题的关键是要认识到,在应用链式规则的时候,将重用相同中间层的导数值。

如果你仔细追踪这个的话,你就可以避免重新计算相同的东西几千次。

另一个技巧就是使用特殊的激活函数,其衍生物可以写成他们值的函数。例如,=的导数。这是很方便的,因为在正向传播过程中,当我们计算每个训练样本时,我们必须为某个向量x逐元素地计算

在反向传播过程中,我们可以在计算L相对于权重的梯度时重用这些值,从而节省时间和内存的占用。

第三个技巧就是将训练数据分成“小批量”,并逐一更新每个批次的权重。例如,如果将训练数据划分为{batch1,batch2,batch3},则训练数据首先将

  • 使用batch1更新权重值

  • 使用batch2更新权重值

  • 使用batch3更新权重值

这里,L的梯度将在每次更新后重复地计算。

最后的一个值得注意的技巧就是使用GPU而不是CPU,因为GPU更适合并行地执行大量的计算。

挑战二:梯度下降法可能会无法找到绝对最小值点

这不仅仅是一个神经网络的问题,因为它也是一个梯度下降问题。在梯度下降的过程中,权重可能会陷入局部最小值。权重也可能超过最小值。

处理这个问题的一个技巧就是调整不同的步长。

另一个技巧就是增加网络中的节点数或网络层数(注意过拟合现象)。

此外,一些像使用动量的启发式技巧也可能有效。

挑战三: 如何泛化?

我们如何编写一个通用的程序来拟合任何数量的节点和网络层的神经网络呢?

答案是, 你不用这样做,你是用Tensorflow。但是,如果你真的想这么做的话,最困难的部分就是计算损失函数的梯度。

这么做的技巧就是意识到你可以把梯度表示为一个递归函数。5层的神经网络只是一个4层带一些感知器的神经网络,而4层的神经网络只是一个3层带一些感知器的神经网络。诸如此类。更正式的说,这称为自动分化。

作者:Ben Gorman

原文链接:

http://blog.kaggle.com/2017/11/27/introduction-to-neural-networks/

热文精选

重磅 | 2017年深度学习优化算法研究亮点最新综述火热出炉

Reddit热点 | 想看被打码的羞羞图片怎么办?CNN帮你解决

多图 | 从神经元到CNN、RNN、GAN…神经网络看本文绝对够了

重磅 | 128篇论文,21大领域,深度学习最值得看的资源全在这了(附一键下载)

资源 | 多伦多大学“神经网络与机器学习导论”2017年课程表

爆款 | Medium上6900个赞的AI学习路线图,让你快速上手机器学习

Quora十大机器学习作者与Facebook十大机器学习、数据科学群组

TensorFlow下构建高性能神经网络模型的最佳实践

干货!这里有一份神经网络入门指导,请收下!相关推荐

  1. 高等数学思维导图_直击高数重点!这份思维导图请收下

    点击蓝色字关注我们! Hello,同学们 今天是又来发福利的小渥 有需要的同学们在后台回复[高数]便可获取高清版噢 我们的数学老师整理了一份   高等数学  的思维导图 思维导图是一种简单而有效的学习 ...

  2. 最受商户关注的五大进销存软件,这份贴心排行榜秘籍请收好

    说到EXCEL表格,相信现在有很多的商家还在使用excel表格做帐,之前有一位客户,用excel来做库存管理和客户的应收账目,而且做的非常细致:但是,随时生意的扩大,客户逐渐的增多,表格做起来就会很麻 ...

  3. 凌恩生物资讯|细菌完成图,坑多专家少——请收下这份避坑指南

    尝试做细菌完成图的你是不是有很多疑问 这份避坑指南请收好! 小坑1."1 +X Contig,0 Gap"代表什么? 答:"1 Contig,0 Gap"的承诺 ...

  4. KeyError: [] not found in axis_最IN黄浦 | 万圣狂欢倒计时!露台派对、变装游、沉浸式密室...请收下这份黄浦活动指南~_电竞...

    原标题:最IN黄浦 | 万圣狂欢倒计时!露台派对.变装游.沉浸式密室...请收下这份黄浦活动指南~ Ttick or Treat 一年一度的万圣节就要来了, 黄浦不少商圈都策划了多场精彩活动: BFC ...

  5. 干货|最全面的卷积神经网络入门教程

    关注上方"深度学习技术前沿",选择"星标公众号", 精选干货,第一时间送达! 卷积神经网络 简介 卷积网络 (convolutional network)(Le ...

  6. 干货 | 请收下这份2018学习清单:150个最好的机器学习,NLP和Python教程

    本文英文出处:Robbie Allen 翻译/雷锋网字幕组 吴楚 校对/ 雷锋网 田晋阳 机器学习的发展可以追溯到1959年,有着丰富的历史.这个领域也正在以前所未有的速度进化.在之前的一篇文章中,我 ...

  7. pc端编码表必须为gbk才能正常启动软件_【干货】请收下这份非常完整的PCIE4.0 发送端测试SOP...

    编者注:本文作者为 是德科技(中国)有限公司的马卓凡.黄腾.刘宗祺.PCIE4.0的电气特性分为了发送端测试和接收端测试,本文主要介绍的是发送端测试. 一.前言 进入2019年,随着5G商用的坚实推进 ...

  8. 【学习编程】献给迷茫中的你,教你如何快速入门编程,如何从编程小百到 IT 巨佬?零基础自学请收下这份学习指南(经验分享)

    导语 编程初学者可能都思考过这个问题: "我该怎么学编程?我要选择哪门编程语言比较适合我呢?......" 今天小编教大家认识编程语言,了解编程语言. 我们已经迈进了崭新的2023 ...

  9. 程序员的职业规划_从菜鸡到大佬——程序员们,请收下这份职业规划全攻略!...

    作者:阿诺,有删改 引言 John Z. Sonmez是一位来自硅谷的杰出程序员,2016年他出版了<软技能:代码之外的生存指南>一书.这本书在中国翻译出版之后,引起了国内广大程序员的热烈 ...

最新文章

  1. Bzoj2780: [Spoj]8093 Sevenk Love Oimaster
  2. 机会!搞科研的同伴注意了,再忙也要看一下!
  3. 征文 | “‘互联网+’背景下大数据与税收征管的深度融合研究” 专题征文启事...
  4. 【Maven实战】之生成项目站点
  5. predis如何实现phpredis的pconnect方法
  6. 计算机科学导论学习资料
  7. 2014年广州科目三道路驾驶技能考试/广汕路科目三路考系统操作和评判指南
  8. 单身汪的电梯之旅(洛谷P1897题题解,Java语言描述)
  9. 死亡搁浅运送系统服务器,死亡搁浅订单23寻物系统服务器流程介绍-死亡搁浅订单23寻物系统服务器怎么做_牛游戏网...
  10. python编程(编写opengl程序)
  11. SCCM 2007 R7使用手记
  12. Python 实现PID控制一阶惯性系统
  13. Chrome断点JS寻找淘宝签名sign
  14. 手机锁机病毒解锁清除教程
  15. 生产力工具:功能强大又好用的浏览器网页截屏工具FireShot
  16. 数字证书申请流程(双证)
  17. 计算机组成原理小游戏,计算机组成原理cla是什么
  18. Python学习资料收集
  19. android手机无USB法连接应用宝解决办法
  20. 常用的连续概率分布汇总

热门文章

  1. 2018-3-25论文(Grey Wolf Optimizer)自然界狼群的生活等级
  2. HDU.4903.The only survival(组合 计数)
  3. 反射拷贝对象的思路:
  4. 假如有Thread1、Thread2、ThreaD3、Thread4四条线程分别统计C、D、E、F四个盘的大小,所有线程都统计完毕交给Thread5线程去做汇总,应当如何实现?...
  5. [您有新的未分配科技点]可,可,可持久化!?------0-1Trie和可持久化Trie普及版讲解...
  6. 2017-02-20 注册.Net Framework4.0
  7. 如何将github上的 lib fork之后通过podfile 改变更新源到自己fork的地址
  8. Oracle Sales Cloud 实施(二)
  9. 【ACM】杭电OJ 1241(深度优先搜索小结)
  10. 目前常用的服务器端网络操作系统有,目前常用的服务器端网络操作系统是()。...