这六段代码隐藏着深度学习的前世今生!

本文作者:晞萌 编辑:郭奕欣 2017-10-10 14:36
导语:六段代码解释了深度学习的前世今生,覆盖了深度学习几十年来的重大创新和突破。

雷锋网AI科技评论按:本文作者Emil Wallner用六段代码解释了深度学习的前世今生,这六段代码覆盖了深度学习几十年来的重大创新和突破,作者将所有代码示例都上传了FloydHub 和 GitHub,想要在FloydHub上运行代码示例的读者,请确保已经安装了floyd command line tool,并将作者提供的代码示例拷贝到本地。 如果你是FloydHub新手,可以先阅读作者之前发布的getting started with FloydHub section, 在本地计算机上的示例项目文件夹中安装好CLI之后,可以使用以下命令在FloydHub上启动项目:

接下来我们一起跟着原作者细读这六段极富历史意义历史的代码,雷锋网(公众号:雷锋网)做了详细编译:

最小二乘法

最小二乘法最初是由法国数学家勒让德(Adrien-Marie Legendre)提出的,他曾因参与标准米的制定而闻名。勒让德痴迷于预测彗星的位置,基于彗星曾出现过的几处位置,百折不挠的计算彗星的轨道,在经历无数的测试后,他终于想出了一种方法平衡计算误差,随后在其1805年的著作《计算慧星轨道的新方法》中发表了这一思想,也就是著名的最小二乘法。

勒让德将最小二乘法运用于计算彗星轨道,首先是猜测彗星将来出现的位置,然后计算这一猜测值的平方误差,最后通过修正猜测值来减少平方误差的总和,这就是线性回归思想的源头。
在Jupyter notebook上执行上图的代码。 m是系数,b是预测常数,XY坐标表示彗星的位置,因此函数的目标是找到某一特定m和b的组合,使得误差尽可能地小。

这也是深度学习的核心思想:给定输入和期望输出,寻找两者之间的关联性。

梯度下降

勒让德的方法是在误差函数中寻找特定组合的m和b,确定误差的最小值,但这一方法需要人工调节参数,这种手动调参来降低错误率的方法是非常耗时的。在一个世纪后,荷兰诺贝尔奖得主彼得·德比(Peter Debye)对勒让德的方法进行了改良。
假设勒让德需要修正一个参数X,Y轴表示不同X值的误差。勒让德希望找到这样一个X,使得误差Y最小。如下图,我们可以看出,当X=1.1时,误差Y的值最小。

如上图,德比注意到,最小值左边的斜率都是负数,最小值右边的斜率都是正数。因此,如果你知道任意点X值所处的斜率,就能判断最小的Y值在这一点的左边还是右边,所以接下来你会尽可能往接近最小值的方向去选择X值。

这就引入了梯度下降的概念,几乎所有深度学习的模型都会运用到梯度下降。

假设误差函数 Error = X5  - 2X3 - 2

求导来计算斜率:

如果读者需要补充导数的知识,可以学习Khan Academy的视频。

下图的python代码解释了德比的数学方法:

上图代码最值得注意的是学习率 learning_rate,通过向斜率的反方向前进,慢慢接近最小值。当越接近最小值时,斜率会变得越来越小,慢慢逼近于0,这就是最小值处。

Num_iterations 表示在找到最小值前估算的迭代次数。

运行上述代码,读者可以自行调参来熟悉梯度下降。

线性回归

线性回归算法结合了最小二乘法和梯度下降。在二十世纪五六十年代,一组经济学家在早期计算机上实现了线性回归的早期思想。他们使用穿孔纸带来编程,这是非常早期的计算机编程方法,通过在纸带上打上一系列有规律的孔点,光电扫描输入电脑。经济学家们花了好几天来打孔,在早期计算机上运行一次线性回归需要24小时以上。

下图是Python实现的线性回归。

梯度下降和线性回归都不是什么新算法,但是两者的结合效果还是令人惊叹,可以试试这个线性回归模拟器来熟悉下线性回归。

感知机

感知机最早由康奈尔航空实验室的心理学家弗兰克·罗森布拉特(Frank Rosenblatt)提出,罗森布拉特除了研究大脑学习能力,还爱好天文学,他能白天解剖蝙蝠研究学习迁移能力,夜晚还跑到自家屋后山顶建起天文台研究外太空生命。1958年,罗森布拉特模拟神经元发明感知机,以一篇《New Navy Device Learns By Doing》登上纽约时报头条。

罗森布拉特这台机器很快吸引了大众视线,给这台机器看50组图片(每组由一张标识向左和一张标识向右的图片组成),在没有预先设定编程命令的情况下,机器可以识别出图片的标识方向。

每一次的训练过程都是以左边的输入神经元开始,给每个输入神经元都赋上随机权重,然后计算所有加权输入的总和,如果总和是负数,则标记预测结果为0,否则标记预测结果为1。

如果预测是正确的,不需要修改权重;如果预测是错误的,用学习率(learning_rate)乘以误差来对应地调整权重。

下面我们来看看感知机如何解决传统的或逻辑(OR)。

Python实现感知机:

等人们对感知机的兴奋劲头过后,马文·明斯基(Marvin Minsky)和西摩·帕普特(Seymour Papert) 打破了人们对这一思想的崇拜。当时明斯基和帕普特都在MIT的AI实验室工作,他们写了一本书证明感知机只能解决线性问题,指出了感知机无法解决异或问题(XOR)的缺陷。很遗憾,罗森布拉特在两年后的一场船难中遇难离世。

在明斯基和帕普特提出这一点的一年后,一位芬兰的硕士学生找到了解决非线性问题的多层感知机算法。当时因为对感知机的批判思想占主流,AI领域的投资已经干枯几十年了,这就是著名的第一次AI寒冬。

明斯基和帕普特批判感知机无法解决异或问题(XOR,要求1&1返回0):

对于左图的OR逻辑,我们可以通过一条线分开0和1的情形,但是对于右边的XOR逻辑,无法用一条线来划分。

人工神经网络

到了1986年,鲁梅尔哈特(David Everett Rumelhart)、杰弗里·辛顿(Geoffrey Hinton)等人提出反向传播算法,证明了神经网络是可以解决复杂的非线性问题的。当这种理论提出来时,计算机相比之前已经快了1000倍。让我们看看鲁梅尔哈特等人如何介绍这篇具有重大里程碑意义的论文:

我们为神经元网络提出了一种新的学习过程——反向传播。 反向传播不断地调整网络中的连接权重,最小化实际输出与期望输出之间的误差。 由于权重调整,我们加入了隐藏神经元,这些神经元既不属于输入层,也不属于输出层,他们提取了任务的重要特征,并对输出进行了正则化。反向传播这种创造有效特征的能力,将其与之前的算法(如感知器收敛过程)区别开来。

Nature 323,533-536(1986年10月9日)

为了理解这篇论文的核心,我们实现了DeepMind大神Andrew Trask的代码,这并不是随机选择的代码,这段代码被Andrew Karpathy斯坦福的深度学习课程、Siraj Raval在Udacity的课程中采用。更为重要的是,这段代码体现的思想解决了XOR问题,融化了AI的第一个冬季。

在我们继续深入之前,读者可以试试这个模拟器,花上一两个小时来熟悉核心概念,然后再读Trask的博客,接下来多熟悉代码。注意在X_XOR数据中增加的参数是偏置神经元(bias neurons),类似于线性函数中的常量。

这里结合的反向传播,矩阵乘法和梯度下降可能会绕晕你,读者可以通过可视化过程来理解。先注重去看背后的逻辑,不要想着一下子就能完全参透全部。

另外,读者可以看看Andrew Karpathy的反向传播那一课,玩转一下可视化过程,读读迈克尔·尼尔森(Michael Nielsen)的《神经网络与深度学习》书上这一章。

深度神经网络

深度神经网络指的是除了输入层和输出层,中间还存在多层网络的神经网络模型,这一概念首先由加利福尼亚大学计算机系认知系统实验室的Rina Dechter提出,可参考其论文《Learning While Searching in Constraint-Satisfaction-Problems》,但深度神经网络的概念在2012年才得到主流的关注,不久后IBM IBM Watson在美国智力游戏危险边缘(eopardy)取得胜利,谷歌推出了猫脸识别。

深层神经网络的核心结构仍保持不变,但现在开始被应用在不同的问题上, 正规化也有很大的提升。一组最初应用于简化噪音数据的数学函数,现在被用于神经网络,提高神经网络的泛化能力。
深度学习的创新很大一部分要归功于计算能力的飞速提升,这一点改进了研究者的创新周期,那些原本需要一个八十年代中期的超级计算机计算一年的任务,今天用GPU只需要半秒钟就可以完成。
计算方面的成本降低以及深度学习越来越丰富的库资源,使得大众也可以走进这一行。我们来看一个普通的深层学习堆栈的例子,从底层开始:

  • GPU > Nvidia Tesla K80。通常用于图像处理,对比CPU,他们在深度学习任务的速度快了50-200倍。

  • CUDA > GPU的底层编程语言。

  • CuDNN > Nvidia优化CUDA的库

  • Tensorflow > Google的深度学习框架

  • TFlearn > Tensorflow的前端框架

我们来看一个数字分类的例子(MNIST数据集),这是一个入门级的例子,深度学习界的“hello world”。

在TFlearn中实现:

有很多经典的文章解释了MNIST问题,参考Tensorflow文档、Justin Francis的文章以及Sentdex发布的视频。

如果读者还想对TFlearn有进一步了解,可参考作者Emil Wallner之前的博客文章。

总结

如同上图的TFlearn示例,深度学习的主要思想仍然很像多年前罗森布拉特提出的感知机,但已经不再使用二进制赫维赛德阶跃函数(Heaviside step function),今天的神经网络大多使用Relu激活函数。在卷积神经网络的最后一层,损失设置为多分类的对数损失函数categorical_crossentropy,这是对勒让德最小二乘法的一大改良,使用逻辑回归来解决多类别问题。另外优化算法Adam则起源于德比的梯度下降思想。此外, Tikhonov的正则化思想被广泛地应用于Dropout层和L1 / L2层的正则化函数。

如果读者更深入了解神经网络及其实现,请阅读作者在FloydHub博客上发表的文章《My First Weekend of Deep Learning》。

雷锋网附:本文摘自Emil Wallner的博客,Emil Wallner花了十年时间探索人类学习,曾在牛津大学商学院工作,投资教育创业公司,并建立了教育技术业务。去年,他加入了Ecole 42,将自己所学的人类学习知识应用于机器学习。

原文链接:https://blog.floydhub.com/coding-the-history-of-deep-learning/

这六段代码隐藏着深度学习的前世今生!相关推荐

  1. 百度飞桨:十行代码高效完成深度学习POC

    本文用户记录黄埔学院学习的心得,并补充一些内容. 课程2:十行代码高效完成深度学习POC,主讲人为百度深度学习技术平台部:陈泽裕老师. 因为我是CV方向的,所以内容会往CV方向调整一下,有所筛检. 课 ...

  2. 开源项目kcws代码分析--基于深度学习的分词技术

    http://blog.csdn.net/pirage/article/details/53424544 分词原理 本小节内容参考待字闺中的两篇博文: 97.5%准确率的深度学习中文分词(字嵌入+Bi ...

  3. 代码+实例:深度学习中的“轴”全解

    ©PaperWeekly 原创 · 作者|海晨威 学校|同济大学硕士生 研究方向|自然语言处理 在深度学习中,轴,指的就是张量的层级,一般通过参数 axis/dim 来设定.很多张量的运算.神经网络的 ...

  4. 用少于10行代码训练前沿深度学习新药研发模型

    ©PaperWeekly · 作者|黄柯鑫 学校|哈佛大学硕士生 研究方向|图学习和生物医疗 深度学习正在革新药研发行业.在本文中,我们将展示如何使用 DeepPurpose,一个基于 PyTorch ...

  5. 在英特尔硬件上部署深度学习模型的无代码方法 OpenVINO 深度学习工作台的三部分系列文章 - CPU AI 第一部

    作者 Taylor, Mary, 翻译 李翊玮 关于该系列 了解如何转换.微调和打包推理就绪的 TensorFlow 模型,该模型针对英特尔®硬件进行了优化,仅使用 Web 浏览器.每一步都在云中使用 ...

  6. 资源下载| 深度学习Pytoch1.0如何玩?这一门含900页ppt和代码实例的深度学习课程带你飞

    本文来自专知 近日,在NeurIPS 2018 大会上,Facebook 官方宣布 PyTorch 1.0 正式版发布了.如何用Pytorch1.0搞深度学习?对很多小白学生是个问题.瑞士非盈利研究机 ...

  7. 在英特尔硬件上部署深度学习模型的无代码方法 OpenVINO 深度学习工作台的三部分系列 - CPU AI 第二部

    作者 Taylor, Mary, 翻译 李翊玮 关于该系列 了解如何转换.微调和打包 推理就绪的 TensorFlow 模型,该模型针对英特尔®硬件进行了优化,仅使用 Web 浏览器.每一步都在云中使 ...

  8. 互联网世界的“人工智能”——探秘“深度学习”的前世今生

    转载自:http://blog.sina.com.cn/s/blog_990865340101gl2g.html 编者按:本文来自"流浪汉"投稿(@ZhangLumin),一个在硅 ...

  9. 神经网络与深度学习的“前世今生”

    原文出自  http://tech.sina.com.cn/i/2016-02-23/doc-ifxprucu3124795.shtml 原文作者王川,投资人,中科大少年班校友,现居加州硅谷,个人微信 ...

最新文章

  1. 定时自动按键软件_[按键精灵手机版教程]QUI界面也可以如此炫酷
  2. 东北面人李---精品作品展
  3. opencv python 图片腐蚀和膨胀
  4. WebLogic的下载地址http://www.oracle.com/technetwork/middleware/weblogic/downloads/wls-main-097127.html
  5. XHTML行内描述性元素(持续更新中)
  6. android:制作 Nine-Patch 图片
  7. Mozilla正修复Firefox遗留8年的漏洞
  8. android 获取微信二维码 DiffDevOAuth.auth
  9. Navicat安装教程
  10. 一款用C++语言实现的3D游戏引擎(附源码),适用于想学3D游戏开发
  11. 8月书讯(上)| 这些新书不可错过
  12. 添加w3c验证图片到网站
  13. mysql中没有utf8字符集_mysql之坑–UTF8字符集
  14. 不要女程序员,公司都爱招男性程序员,这是为什么?
  15. 测试岗位面试题库---支付功能测试思路有哪些?
  16. C语言丨整蛊必备小程序,好玩炸翻天(附源码)
  17. 计算 11+12+13+...+m python
  18. 用volatile的视角,来打开JMM内存模型
  19. colorkey口红怎么样_colorkey口红推荐什么颜色
  20. CycleGAN在医学图像中的应用

热门文章

  1. 关中断解决任务间资源共享问题
  2. fwr171改无线服务器,迅捷(Fast)FWR171无线AP模式设置
  3. 卸载 nvidia 显卡驱动
  4. .jar中没有主清单属性_为什么 Spring Boot 的 jar 可以直接运行?
  5. Leetcode 349. 两个数组的交集 (每日一题 20211014)
  6. Leetcode 300 最长递增子序列 (每日一题 20210803)
  7. DQN笔记:MC TD
  8. 文巾解题 929. 独特的电子邮件地址
  9. 文巾解题 160. 相交链表
  10. 【数学建模】MATLAB应用实战系列(九十二)-教你怎么挑对象,层次分析法应用案例(附MATLAB代码)