「机器人圈」导览:关于深度学习(Deep Learning)现如今在AI领域有着举足轻重的地位,而怎样才能学好深度学习呢?拥有量子物理博士学位的Piotr Migdał是一个数据科学自由职业者,他积极参与有天赋的教育,发展量子游戏,并在deepsense.io上担任数据科学讲师,他对于深度学习有着不一般的教学经验,下面就和机器人圈一起来学习一下吧。
人们做一件事情,往往带有一定的目的性,对于深度学习,无论你开始着手的初衷是想开启一段职业生涯,还是仅仅是想进行一次探险(例如,检测可疑的对象),或者是想在机器接管世界之前先对它们有一个了解(just a joke),可以说你都可以在这篇文章中找到你想要的答案。本文的目标不在于神经网络教学本身,而是提供一个概述,并指出其中有用的资源。
不要害怕人工神经网络——它是很容易启动的!如果真要开始学习的话,所有你需要具备的就是真正的基本编程,非常简单的数学知识和几个机器学习概念的知识。接下来,我将一一解释该如何从这些要求中着手。
在我看来,最好的方法是从高级互动方式(另见:《高中生量子力学教材》和《Quantum Game with Photons》。因此,我建议从Keras的图像识别任务开始进行,这是一个普遍的Python神经网络库。当然,如果你想要用比Keras更少的代码来训练神经网络,唯一可行的选择就是使用鸽子(pigeons)。是的,我是认真的:鸽子识别癌症的水平可是要比肩人类科学家!
什么是深度学习?为什么它如此炫酷?
深度学习是使用多层人工神经网络的机器学习技术的名称。人们常常会使用人工智能这个术语,但除非你想要听起来很科幻,否则它就是为那些目前被认为是“对机器而言过于困难”的问题预留的,一个不断快速发展的前沿领域。这是一个在过去几年中得以大爆发的领域,特别是在视觉识别任务(包括许多其他任务)中可以企及人类的准确度,参见:
•电子前沿基金会的AI研究进展情况(Measuring the Progress of AI Research)(2017)
与量子计算或核聚变不同,它是一种正在应用的技术,而不是未来的一些可能性。有一个经验法则:
一个正常人可以在1秒钟内完成的任何操作,现在我们都可以使用AI的自动化完成。-—吴恩达在推文中说道。
有些人甚至更进一步,将这种说法外延到科学家领域。像Google和Facebook这样的公司处于如今的领先地位并不奇怪。事实上,每隔几个月我就会被超出我期望的东西惊讶到,例如:
•维基百科条目和LaTeX文章中所谈及的生成假莎士比亚式文章的循环神经网络(RNN)的不合理有效性。
•艺术风格迁移的神经算法 (视频!)
•脸部实时捕获和重现
•彩色图像着色
•用于逼真图像生成的即插即用生成网络
•皮肤病学家对皮肤癌的分类以及其他医疗诊断工具
•图像平移(pix2pix)——素描到照片
•用机器器绘制猫,狗等动物的草图
这看起来像是一些巫术。如果你好奇什么是神经网络,请观看以下这一系列视频,从而得到系统的介绍:
•Stephen Welch揭秘神经网络
•J Alamma的神经网络基础的视觉和交互指南
这些技术都是缺乏数据的(data-hungry)。查看Higgs数据集上的逻辑回归,随机森林和深度学习的AUC分数曲线(数据点以百万为单位):
一般来说,即使有大量数据,深度学习也比其他技术更好,比如随机森林或增强树等树型。
让我们试一下!
我需要一些Skynet才能运行吗?当然不用——像其他的软件一样,你甚至可以在浏览器中进行:
•TensorFlow Playground用于点分离,具有可视界面
•ConvNetJS用于数字和图像识别
•Keras.js演示—在浏览器中可视化和使用真实网络(例如ResNet-50)
或者,如果你想在Python中使用Keras,请参阅这个最小的示例—只是为了让你确信你可以在自己的电脑上使用它。
Python和机器学习
我提到基础Python和机器学习以此来作为一个要求。在对Python中的数据科学以及统计和机器学习的介绍部分,这些都涵盖在内。
对于Python而言,如果你已经拥有Anaconda distribution(涵盖大多数数据科学软件包),那么你唯一需要做的就是安装TensorFlow和Keras。
而在涉及机器学习的时候,在开始着手学习深度学习之前你并不需要学习许多技巧。尽管如此,如果可以用更简单的方法来解决给定的问题,那将是一个很好的实践,再好不过了。例如,随机森林通常可看作是一个锁匙(lockpick),在许多问题上都是开箱即用的。你需要了解的是我们为什么要进行训练,而后去测试分类器(以验证其预测能力)。想要得到它的要点,那就从这个基于树的美丽动画开始:
•Stephanie Yee和Tony Chu的机器学习视觉介绍(Visual introduction to machine learning)
此外,理解逻辑回归(logistic regression)也是一个不错的选择,要知道,逻辑回归几乎是任何神经网络分类的基础。
数学
深度学习(即具有多层次的神经网络)主要使用非常简单的数学运算。这里有几个示例,你可以在几乎任何网络中找到(只是看一看这个列表,请不要被吓到):
•向量,矩阵,多维数组
•加法,乘法
•卷取提取和处理局部模式
•激活函数:sigmoid,tanh或添加非线性的reLU(ReLU to add non-linearity)
•Softmax将向量转换为概率
•对数损失(交叉熵)以智能方式惩罚错误的猜测(另见Kullback-Leibler发散解释)
•梯度和链规则(反向传播),用于优化网络参数
•随机梯度下降及其变体(例如动量)。
如果你的专业背景是数学,统计学,物理学或信号处理的话——很有可能你已经知道了足够多的知识足以去开始学习!
而如果你与数学的最近一次接触还是在高中,那么也别担心。其实数学很简单,用于数字识别的卷积神经网络都可以在电子表格(没有macros)中实现,请参阅: Deep Spreadsheets with ExcelNet。这只是一个原则性的解决方案—不仅效率不高,而且还缺乏最关键的部分—训练新网络的能力。
矢向量运算的基础不仅对于深度学习至关重要,而且对许多其他机器学习技术也是至关重要的(例如在我写的word2vec中)。而想要了解它,我建议从以下之一开始:
•J.Ström,K.Åström和T. Akenine-Möller著作的Immersive Linear Algebra —一个具有完全交互式图形的线性代数书
•应用数学和机器学习基础:深度学习书本中的线性代数
•Brendan Fortuner著作的《深度学习线性代数作弊表》
由于书中有很多地方引用到NumPy,那么学习它的基础知识想必是很有用的:
•Nicolas P. Rougier著作的《从Python到Numpy》
•SciPy课程:NumPy数组对象
同时,回想一下其中所蕴含的道理,就像数学家们所认为的那样。从魔术般的工作代码开始,处理像乐高积木这样的神经网络层是完全可以的。
架构
有几个深度学习库是非常受欢迎的,包括TensorFlow,Theano,Torch和Caffe。他们每个都有Python接口(当然,现在Torch中也有:PyTorch)。
那么,我们该选择哪个呢?首先,像往常一样,把所有微妙的性能基准抛诸脑后,因为过早的优化是万恶之源。最重要的是从易于编写(和阅读)的那一个开始,从一个有许多在线资源,从一个可以安装在你的计算机上而不会出现过多BUG的那一个开始。
请记住,核心框架是具有GPU支持的多维数组表达式编译器。目前的神经网络可以这样表达。然而,如果你只是希望使用神经网络,通过最小功率规则,我建议从一个神经网络框架开始。例如……
Keras
如果你喜欢Python哲学(简洁,具有可读性,一种首选的做法),那么Keras就是为你量身定做的。它是使用TensorFlow或Theano作为其后端的神经网络的高级库。另外,如果你想有一个宣传画面,有可能会出现一个有偏差(或过度拟合)的排名:
•深度学习框架状态(来自GitHub指标), 2017年4月。——弗朗索瓦•乔克(Keras创造者)
如果你想咨询不同的来源,基于arXiv文件而不是GitHub的活动,请参阅Andrej Karpathy的机器学习趋势。流行是很重要的,这意味着如果你想搜索一个网络架构,搜索它(例如UNet Keras)可能会返回一个示例。那么应该从哪里开始学习呢?关于Keras的文档很好,而且它的博客是一个有价值的资源。对于Jupyter笔记本中使用Keras深入学习的完整互动介绍,我真的推荐应该去看看:
•由Valerio Maggio著作的基于Keras和TensorFlow的深度学习
如果你想要较为简短一些的,请尝试以下其中一项:
•Erik Reppel著作的使用Keras和Cats可视化卷积神经网络的部分
•PetarVeličković著作的完全初学者的深度学习:基于Keras的卷积神经网络
•Jason Brownlee著作的在Python中使用复杂的神经网络的手写数字识别(Theano张量维度)
Keras有几个附件,这对于学习它来说尤其有用。我为顺序模型创建ASCII汇总,以显示网络内的数据流(比 model.summary()
更好)。它显示层数,数据维数(x, y, channels) 和空闲参数数量(待优化)。例如,对于用于数字识别的网络,它可能如下所示:
OPERATION DATA DIMENSIONS WEIGHTS(N) WEIGHTS(%)
Input ##### 32 32 3
Conv2D \|/ ------------------- 896 0.1%
relu ##### 32 32 32
Conv2D \|/ ------------------- 9248 0.7%
relu ##### 30 30 32
MaxPooling2D Y max ------------------- 0 0.0%
##### 15 15 32
Dropout | || ------------------- 0 0.0%
##### 15 15 32
Conv2D \|/ ------------------- 18496 1.5%
relu ##### 15 15 64
Conv2D \|/ ------------------- 36928 3.0%
relu ##### 13 13 64
MaxPooling2D Y max ------------------- 0 0.0%
##### 6 6 64
Dropout | || ------------------- 0 0.0%
##### 6 6 64
Flatten ||||| ------------------- 0 0.0%
##### 2304
Dense XXXXX ------------------- 1180160 94.3%
relu ##### 512
Dropout | || ------------------- 0 0.0%
##### 512
Dense XXXXX ------------------- 5130 0.4%
softmax ##### 10
你可能也会对使用keras-tqdm的更好的进度条感兴趣,用quiver来探索每一层的激活函数,使用keras-vis来检测attention 映射或将Keras模型转换为JavaScript,并在Keras.js的浏览器中运行。说到语言,还有到Keras的R接口。
TensorFlow
如果不是Keras,那么我建议从单一的TensorFlow开始。这是一个级别更低和更为冗长的工具,但是可以直接优化各种多维数组(还有张量)操作。如下展示一些好的资源:
•官方的TensorFlow教程非常好
•MartinGörner著作的学习TensorFlow和深度学习。
•Aymeric Damien著作的为初学者提供TensorFlow教程和示例(使用Python 2.7)
•Nathan Lintz著作的使用Google的TensorFlow框架的简单教程
无论如何,TensorBoard可以轻松追踪训练过程。它也可以通过回调与Keras一起使用。
其他
Theano与TensorFlow类似,但有点老了,更难开始着手。例如,你需要手动写入变量的更新。典型的神经网络层不包括在内,所以经常使用诸如Lasagne这样的库。如果你正在寻找一个开始的地方,我喜欢下面这个介绍:
Marek Rei著作的Theano教程
同时,如果你在Torch或PyTorch中看到一些不错的代码,不要害怕安装并运行它!
数据集
每个机器学习问题都需要数据。你不能只是告诉它“检测这张照片中是否有猫”,并期望电脑告诉你答案。你需要显示许多猫的实例,以及不包含猫的图片,并且(希望)它将学习将其概括为其他情况。所以,你需要一些数据才能开始。这不是机器学习或只是深度学习的缺点 —它是任何学习的基本属性!
在潜入未知的水域之前,不妨先看一些流行的数据集。其中它们最关键部分就是它们是非常受欢迎的。这意味着你可以找到很多例子。并保证这些问题可以用神经网络解决。
MNIST
许多好的想法在MNIST(例如批处理规范)上将无法正常工作。反之,许多坏主意也许可以在MNIST上工作,而不会转移到真正的[计算机视觉]上。
—François Chollet’s tweet
不过,我建议从包含在keras.datasets中的MNIST数字识别数据集(60k灰度28x28图像)开始。不需要掌握它,只是为了得到它的工作原理(或者测试本地机器上的Keras的基础知识)。
notMNIST
事实上,我曾经提出,AI工作者面临的最棘手的挑战是回答这个问题:“A”和“I”是什么?
——Douglas R. Hofstadter(1995)
一个更有趣的数据集,对于经典机器学习算法来说更加困难,它是notMNIST(字母A - j来自奇怪的字体)。如果你想从它开始,这里是我的代码,它是在Keras中进行的notMNIST加载和逻辑回归。
CIFAR
如果你对图像识别感兴趣,则有CIFAR数据集,32x32照片的数据集(也可以在keras.datasets中)。它有两个版本:10个简单的课程(包括猫,狗,青蛙和飞机)和100个更难和更细微的课程(包括海狸,海豚,水獭,印章和鲸鱼)。我强烈建议从CIFAR-10开始,简单的版本。当心,更复杂的网络可能需要相当长的一段时间(在我7岁时在Macbook Pro的CPU上运行时间为12小时)。
更多
深度学习需要大量数据。如果要从头开始训练网络,即使是低分辨率(32x32),也可能需要多达10k左右的图像。特别是如果数据很少,就不能保证网络会学到任何东西。那么有什么办法可以解决这个问题呢?
•使用非常低的分辨率(如果你的眼睛可以看到它,不需要使用更高的分辨率)
•获得大量数据(对于像256x256这样的图像可能是:数百万个实例)
•重新训练已经看到很多的网络
•产生更多的数据(包括旋转、移位和变形)
通常,它是这是所提到的一切东西的组合。
站在巨人的肩膀上
创建新的神经网络与烹饪有很多共同之处—有典型的成分(层)和配方(流行的网络架构)。最重要的烹饪比赛是ImageNet大型视觉识别挑战赛,从50万个照片数据集中识别出数百个类。看看这些神经网络架构,通常使用224x224x3的输入(Eugenio Culurciello的图表):
圆的大小代表参数的数量(很多!)。不过,没有提到SqueezeNet,这种架构大大减少了参数的数量(例如减少了50倍)。
用于图像分类的几个关键网络可以从keras.applications模块轻松加载:Xception,VGG16,VGG19,ResNet50,InceptionV3。其他一些不是即插即用,但仍然很容易在网上找到—是的,在Keras有SqueezeNet。这些网络有两个目的:
•它们提供了有用的构建块和架构
•当使用具有预先训练权重的架构时,它们是重新训练(所谓的迁移学习)的最佳候选
图像的其他一些重要网络架构:
•U-Net:生物医学图像分割的卷积网络
视网膜血管分割与卷积神经网络 -——基于Keras实现
利用Keras,为Kaggle的超声神经细分竞争提供深入的学习指导
•一种艺术风格的神经算法
《在Keras中执行神经风格迁移和神经涂鸦》——Somshubra Majumdar
•《CNN在图像分割中的简史:从R-CNN到Mask R-CNN》——Dhruv Parthasarathy
另一套见解:
•《神经网络动物园》——Fjodor van Veen
•如何训练你的深度神经网络——有多少层,参数等
基础
对于非常小的问题(例如MNIST,notMNIST),你可以使用个人计算机—即使它是笔记本电脑,计算也是在CPU上进行的。
对于小问题(例如,CIFAR,不合理的RNN),你仍然可以使用PC,但需要更多的耐心和权衡。
对于中等和较大的问题,基本上唯一的办法是使用具有强大图形处理器(GPU)的机器。例如,我们花了2天时间来训练一个卫星图像处理的模型来进行Kaggle的竞赛,请参阅:
•ArkadiuszNowaczyński的基于图像分割的卫星图像深度学习
在一个强大的CPU上,将需要花费几周的时间,请看:
•Justin Johnson的流行卷积神经网络模型的基准
使用强大GPU的最简单和最便宜的方法是每小时租一台远程机器。你可以使用亚马逊(它不仅是一个书店!),这里有一些指导:
•亚马逊EC2上的Keras与GPU—一个循序渐进的指导,由Mateusz Sieniawski,我的学员完成
•在AWS上的GPU上运行Jupyter笔记本电脑:Francois Chollet的入门指南
进一步学习
我鼓励你与代码之间进行交互。例如,notMNIST或CIFAR-10可以是很好的起点。有时,最好的开始是从别人的代码开始运行,然后查看修改参数时会发生什么。
为了学习如何运作,这一个是杰作:
•由Andrej Karpathy编写的CS231n:卷积神经网络的视觉识别和演讲视频
对于书籍来说,有一个很好的例子,从介绍数学和机器学习的学习环境开始(甚至以我喜欢的方式涵盖对数丢失和熵)!)
•《深度学习》,麻省理工学院出版社的,这是由Ian Goodfellow,Yoshua Bengio和Aaron Courville联合编辑的。
或者,你可以使用(它可能有利于交互式材料的介绍,但我发现风格有点长):
•Michael Nielsen著作的《神经网络与深度学习》
其他材料
有很多深度学习的应用(不仅仅是图像识别!)。我收集了一些介绍材料来涵盖其各个方面(请注意:它们有各种困难)。不要尝试将它们全部阅读 ——我把它们列为灵感,而不是恐吓!
•通读性:
《循环神经网络的不合理有效性》——Andrej Karpathy
《卷积神经网络如何看待世界 》——Keras Blog
《What convolutional neural networks look at when they see nudity》——Clarifai博客(NSFW)
《用于艺术风格迁移的卷积神经网络》——Harish Nrayanan
《梦幻、药物和康复》——我的幻灯片(NSFW),我正在考虑把它变成一个更长的帖子——基于常识错误下的机器学习VS人类学习。
•技术性:
《Yes you should understand backprop》——Andrej Karpathy
《基于Keras的迁移学习》——Prakash Vanapalli
《50行代码中的生成对抗网络(GAN)》(PyTorch)
《Minimal and Clean Reinforcement Learning Examples》
《梯度下降优化算法概述》——Sebastian Ruder
《风格迁移的优化选择》——Slav Ivanov
《在Keras建造自动编码器》——Francois Chollet
《理解长短期记忆网络模型(LSTM)》——Chris Olah
《RNN&LSTMs》——Rohan Kapur
牛津深度自然语言处理2017课程
•资源清单
《如何开始学习深度学习》——Ofir Press
《深度学习指南》——YN ^ 2
•最流行的:
r / MachineLearning Reddit频道涵盖大部分最新内容
distill.pub—一种用于机器学习研究的交互式、视觉的、开放的期刊,并附有说明文章
我的链接在pinboard.in/u:pmigdal/t:deep-learning——虽然只能保存,而不是自动推荐
@fastml_extra Twitter频道
GitXiv——提供论文及代码
不要害怕阅读学术论文。有些文章写得很好,有着深刻的见解(如果你有Kindle或其他电子书阅读器,我推荐Dontprint)。
•数据(通常是具有挑战性的)
Kaggle
从单次导联心电图记录中的AF分类: 2017年心理学挑战中的PhysioNet /计算
2017 iNaturalist竞赛(675k图像和5k物种),vide Mushroom AI
希望这篇文章可以使你对深度学习有一个更为深入的了解。
来源:Piotr Migdał - blog
作者:Piotr Migdał
欢迎加入
中国人工智能产业创新联盟在京成立 近200家成员单位共推AI发展
关注“机器人圈”后不要忘记置顶哟
我们还在搜狐新闻、机器人产业网、腾讯新闻、网易新闻、一点资讯、天天快报、今日头条、QQ公众号…
↓↓↓点击阅读原文查看中国人工智能产业创新联盟手册