向AI转型的程序员都关注了这个号????????????
人工智能大数据与深度学习 公众号: weic2c
本文作者是一位教授深度学习的老师。传授深度学习知识既是他养家糊口的职业(Kaggle比赛获胜队伍的教练),也是他在波兰儿童基金会志愿者工作的一部分。因此,他打算和我们分享一些学习和教授深度学习知识时的心得。
首先,不要害怕接触神经网络模型,入门真的很容易!作者当初害怕难学,现在后悔学晚了。我们只要具备最基本的编程知识、简单的数学知识和机器学习概念就可以上手。作者接下来就会介绍如何上手学习。
在他看来,最好的学习方法是从高层次的互动方式切入,因此,他建议学习Keras的图像识别任务,这是Python环境下的一个通用神经网络库,只需几行代码就够。若是想再缩减代码量,唯一的方法就是用鸽子。没错,认真脸:鸽子诊断癌症的水平堪比人类专家.
深度学习是什么?
深度学习是机器学习技术之一,采用多层神经网络模型。近些年来人们在此领域开展了大量的探索,在视觉识别等领域准确率已经达到人类的水平。不像量子计算、核聚变等,这项技术当前正应用于实际产品中,而不是凭空画大饼。大牛曾经说过:
[plain] view plain copy
- 大多数正常人能在一秒之内完成的任务,现在都能由人工智能来完成。—— 摘自[吴恩达的推特](https://twitter.com/andrewyng/status/788548053745569792)
Google和Facebook等公司一直处于技术前沿并不令人感到惊讶。事实上,作者表示每个几个月他都会被某些超出自己期望的技术所征服,比如:
- 循环神经网络的神器效果用于模仿生成莎士比亚作品、维基百科词条和LaTeX文章
- 一种艺术形式迁移的神经算法
- 实时人脸捕捉和重现
- 彩色图像彩色化
- 用于真实感图像生成的即插即用生成网络
- 基于其它医疗诊断技术的专家级皮肤癌分类
- 图片到图片的翻译
- 教授机器学画猫、狗等动物的简笔画
看起来似乎像是一件件魔法。如果大家对神经网络模型感兴趣,可以观看系列入门教程的视频:
- Stephen Welch的神经网络模型解密
- J Alammar的神经网络基础指导
这些算法往往需要海量训练数据。下图是逻辑回归、随机森林和深度学习三种方法在Higgs数据集上的AUC分数(横坐标的单位是百万):
一般来说,我们并不能保证深度学习的效果比其它方法好,比如随机森林或者决策树,即使在数据量足够大的情况下。
开始实践
是否需要Skynet之类的神器帮助运行呢?显然不必,甚至可以在浏览器内运行代码:
- TensorFlow Playground提供可视化界面的样本分类
- ConvNetJS用于数字和图像识别
- Keras.js Demo在浏览器中可视化展现和使用网络模型
如果想要在Python环境中使用Keras,参考这个小示例。
Python和机器学习
作者之前提到过Python和机器学习是必备的基础知识。相关的教程可以分别参考作者曾经的文章《基于Python的数据科学介绍》以及《统计与机器学习》。
对于Python,如果大家的电脑里已经安装了Anaconda环境,只需再安装TensorFlow和Keras。
至于机器学习,在入坑深度学习之前并不需要掌握太多的相关知识。当然,之后在实践中可以分析某个问题是否能够采取更简单的方法。比如,随机森林算法就是万能钥匙,适用于大部分问题。大家需要理解我们为什么要训练模型,然后测试它的效果。可以参考下面的教程:
- Stephanie Yee和Tony Chu的《机器学习的可视化介绍》
数学知识
深度学习模型中用到的数学知识还算是比较基础。下面罗列了一些,这些知识在其它网络模型里也很常见:
- 向量、矩阵和多维数组;
- 加法和乘法;
- 卷积运算提取局部特征;
- 激活函数:sigmoid, tanh或者ReLU等;
- softmax将向量转化为概率值;
- log-loss(cross-entropy)作为惩罚项
- 网络参数优化的梯度反向传播算法
- 随机梯度下降及其变种(比如冲量)
如果大家的学科背景是数学、统计学、物理或者信号处理,那应该绰绰有余了。如果只有高中数学的基础,也别慌。用于识别数字的卷计算机网络也可以仅用Excel表格实现:Deep Spreadsheets with ExcelNet。
向量计算是深度学习和其它机器学习算法的基本内容(比如,作者曾经介绍过word2vec的文章)。作者建议大家参考下面几份学习资料:
- J. Ström, K. Åström, 和 T. Akenine-Möller 编写的《Immersive Linear Algebra》
- 应用数学和机器学习基础:《深度学习》的线性代数章节
- Brendan Fortuner 的《Linear algebra cheat sheet for deep learning 》
以及Numpy相关的一些基础知识:
- Nicolas P. Rougier 的《From Python to Numpy》
- 《SciPy lectures: The NumPy array object》
框架
目前,市面上有很多流行的深度学习库,包括Tensorflow、Theano、Torch和Caffe。它们都提供了Python接口(Torch也开放了Python接口:PyTorch)
我们该如何选择呢?作者建议,首先在标准测试集上跑一遍各个方法的效果,因为过早的优化是万恶之源。最明智的做法是选一个容易开发、在线文档齐全而且安装方便的工具。
Keras
Keras它属于神经网络的上层封装库,对Tensorflow和Theano做了封装。下图是大家较为认可的各个工具排名:
- 深度学习框架概览,2017年4月,Keras创作者Francois Chollet根据Github评分制作
除了Github的活跃度,也可以参考根据arXiv论文得到的排名,参见by Andrej Karpathy的报告《机器学习趋势一瞥》。工具的流行程度越高,意味着如果你遇到了问题,在Google搜索得到答案的机会也越大。Keras的学习文档非常友善,它的官方博客也提供了宝贵的资源。为了全面了解在 jupyter notebook 环境下使用 Keras,作者强烈建议阅读:
- Valerio Maggio的《基于Keras和Tensorflow的深度学习》
这里也有几篇篇幅较短的文章:
- Erik Reppel写的基于Keras 和 Cats 的卷计算机网络可视化
- Petar Veličković 写的深度学习完全入门:基于Keras的卷计算机网络
- Jason Brownlee写的用Keras和卷计算机网络识别手写数字
另外,作者还开发了许多非常实用的Keras插件。比如查看序列模型网络内部数据流的ASCII summary,比model.summary()用起来更方便。它可以显示层级、数据维度以及待优化的参数数量。例如,一个数字识别网络是这样的:
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
Tensorflow
如果不用Keras,作者则建议只用Tensorflow。它比Keras更底层、更灵活,能直接对各个多维数组参数做优化。下面也是作者推荐的一些相关资源:
- 官方教程Tensorflow Tutorial非常不错
- Martin Görner 的《不读博士也能学习Tensorflow和深度学习》
- Aymeric Damien 写的《Tensorflow入门教程和示例》
- Nathan Lintz 写的《Tensorflow框架简单教程》
另外,TensorBoard是一款在训练过程中调试和查看数据非常方便的工具。
其它
Theano与Tensorflow很相似,但是更早出现,略微难以上手。比如,大家需要自己动手写变量更新的代码。不提供典型的神经网络层级,往往还需要再调用lasagne包。作者也推荐了入门教程:
- Marek Rei编写的Theano教程
数据集
解决每个机器学习问题都离不开数据。我们没办法告诉计算机“检测图片中是否有猫”这个命令,希望计算机直接给我们答案。而是要提供大量含有猫和不含有猫的图片,然后让计算机从这些数据中学习。因此,我们手头必须要先有一份数据集。这并不是机器学习或是深度学习的短板,任何的学习方法都离不开数据!
作者推荐了几个常用的数据集。它们的共同点就是……常用!这就意味着大家很容易在网上找到可以运行的示例,并且前人已经留下了大量的经验。
MNIST
[plain] view plain copy
- 很多好的想法在MNIST数据集上并不管用(比如batch norm)。相反,很多糟糕的想法对MNIST有效,但是却无法迁移到实际问题中。—— 摘自[François Chollet 的推特](https://twitter.com/fchollet/status/852594987527045120)
MNIST是一份手写数字识别数据集(60000张28x28的灰度图)。它适合用来测试本机上安装的Keras是否成功。
notMNIST
[plain] view plain copy
- 其实,我曾经说过,AI研究者面临的最难回答的问题就是“字母A和I是什么?” —— [Douglas R. Hofstadter](https://web.stanford.edu/group/SHR/4-2/text/hofstadter.html)(1995年)
另一个更有趣、相对经典机器学习算法也更难解决的数据集是notMNIST(异形字体的字母A-J)。这里提供了Keras加载和用逻辑回归预测notMNIST的代码。
CIFAR
CIFAR是经典的图像识别数据集,都是32x32尺寸的照片。它分为两种版本:10类简单的照片(包括猫、狗、青蛙、飞机等)和100类更难的照片(包括海狸、海豚、水獭、海豹、鲸鱼等)。作者建议先从简单的10类照片开始学习,因为训练复杂的模型往往要耗费大量的时间(作者用了7年的MacBook Pro需要跑12个小时)。
其它数据集
深度学习算法都需要大量的数据。如果大家想从头开始训练网络模型,至少需要大约10000张低分辨率的图片。当数训练据匮乏时,网络模型很可能学不到任何模式。那么该怎么办呢?
- 只要肉眼看得清,使用低分辨率的图像也无妨
- 尽可能多的收集训练数据,最好达到百万级别
- 在已有的模型基础上开始训练
- 用现有数据集构造更多的训练数据(比如旋转、平移和扭曲)
站在巨人的肩膀上
训练神经网络模型就如同烹饪,原料(网络层)和菜谱(通用网络结构)都有固定的搭配。最具有影响力的烹饪大赛就是ImageNet Large Scale Visual Recognition Challenge,用50万张照片训练模型来识别几百类问题。这里介绍了一些神经网络结构,输入数据基本都是224x224x3的图片:
圆形的大小代表参数的数量。图中没有提到SqueezeNet,这个网络结构极大地压缩了模型参数(减少约50倍)。
一些主要的图像分类模型可以直接从keras.applications模块加载使用,比如Xception, VGG16, VGG19, ResNet50, InceptionV3。另外一些模型尽管不能直接加载,但是也可以很方便的在网上找到。这些网络模型有两大作用:
- 给我们搭建新的网络模型提供了参考
- 便于大家在其基础上继续训练模型(也被称为迁移学习)
作者列举了图像领域的几种其它的网络结构:
U-Net:用卷计神经网络对生物医学图像进行分割
卷积神经网络提取视网膜血管,Keras实现
Kaggle超声神经提取比赛的深度学习教程 ,Keras实现
一种艺术风格的神经算法
神经网络实现风格转换和涂鸦,作者是Somshubra Majumdar
图像分割领域的CNN进化史:从 R-CNN 到蒙板 R-CNN,作者是Dhruv Parthasarathy
硬件设施
对于超小规模问题(比如MNIST和notMNIST),个人电脑就能训练数据,甚至笔记本电脑也能完成。
对于普通小规模的问题(比如CIFAR),PC机应该还是能扛得住,但是需要耐心地等待训练过程。
对于中等规模或是大规模的问题,基本上要依赖装有GPU的大型机器。例如,作者他们花了整整两天的时间来训练Kaggle比赛的卫星照片数据:
- Deep learning for satellite imagery via image segmentation,作者Arkadiusz Nowaczyński
若用高端CPU机器训练,需要若干星期的时间:
- Benchmarks for popular convolutional neural network models,作者Justin Johnson
然而,最简单划算的利用GPU途径就是按使用时长向平台租用机器。比如使用亚马逊云,作者也提供了一部分使用指南:
- Keras with GPU on Amazon EC2 – a step-by-step instruction,作者Mateusz Sieniawski
- Running Jupyter notebooks on GPU on AWS: a starter guide,作者Francois Chollet
拓展学习
作者鼓励大家多动手写代码。举个例子,notMNIST 和 CIFAR-10 就非常适合初学者练习。有时候,参考别人的代码并做修改,然后观察输出结果的变化,也不失为是一条学习的捷径。
神经网络学习课程:
- CS231n: Convolutional Neural Networks for Visual Recognition,Andrej Karpathy教授开课
经典教材推荐:
- Goodfellow, Yoshua Bengio 和 Aaron Courville等几位大牛联合编写的Deep Learning, An MIT Press book
- 以及 Michael Nielsen 编写的Neural Networks and Deep Learning
其它资料
深度学习的应用产品多种多样,作者从各个不同的角度收集整理了入门级的材料。作者强调,别想着把它们都读完,他只是想给大家多一点启发,不是为了显摆!
入门级
The Unreasonable Effectiveness of Recurrent Neural Networks
How convolutional neural networks see the world - Keras Blog
What convolutional neural networks look at when they see nudity – Clarifai Blog
Convolutional neural networks for artistic style transfer
Dreams, Drugs and ConvNets,作者制作的幻灯片,他真考虑将其改写为一篇文章
进阶级
Yes you should understand backprop
Transfer Learning using Keras
Generative Adversarial Networks (GANs) in 50 lines of code (PyTorch)
Minimal and Clean Reinforcement Learning Examples
An overview of gradient descent optimization algorithms
Picking an optimizer for Style Transfer
https://medium.com/slavv/picking-an-optimizer-for-style-transfer-86e7b8cba84b
Understanding LSTM Networks
Recurrent Neural Networks & LSTMs
Oxford Deep NLP 2017 course
资源列表
How to Start Learning Deep Learning
A Guide to Deep Learning by YN^2
更新资讯
r/MachineLearning,Reddit频道,经常介绍新事物
distill.pub,机器学习研究的交流期刊,收录大量论文
pinboard.in/u:pmigdal/t:deep-learning
@fastml_extra作者推荐的推特账号
GitXiv,找论文和代码的好地方
数据集
Kaggle
AF Classification from a short single lead ECG recording: the PhysioNet/Computing in Cardiology Challenge 2017
[iNaturalist 2017 Competition](iNaturalist 2017 Competition),包括5000个种类的67.5万张图片
搜索公众号添加: weic2c
人工智能大数据与深度学习
长按图片,识别二维码,点关注