向AI型的程序员都关注了这个号????????????


        人工智能大数据与深度学习  公众号: weic2c


本文作者是一位教授深度学习的老师。传授深度学习知识既是他养家糊口的职业(Kaggle比赛获胜队伍的教练),也是他在波兰儿童基金会志愿者工作的一部分。因此,他打算和我们分享一些学习和教授深度学习知识时的心得。


首先,不要害怕接触神经网络模型,入门真的很容易!作者当初害怕难学,现在后悔学晚了。我们只要具备最基本的编程知识、简单的数学知识和机器学习概念就可以上手。作者接下来就会介绍如何上手学习。


在他看来,最好的学习方法是从高层次的互动方式切入,因此,他建议学习Keras的图像识别任务,这是Python环境下的一个通用神经网络库,只需几行代码就够。若是想再缩减代码量,唯一的方法就是用鸽子。没错,认真脸:鸽子诊断癌症的水平堪比人类专家.

深度学习是什么?

深度学习机器学习技术之一,采用多层神经网络模型。近些年来人们在此领域开展了大量的探索,在视觉识别等领域准确率已经达到人类的水平。不像量子计算、核聚变等,这项技术当前正应用于实际产品中,而不是凭空画大饼。大牛曾经说过:

[plain] view plain copy

  1. 大多数正常人能在一秒之内完成的任务,现在都能由人工智能来完成。—— 摘自[吴恩达的推特](https://twitter.com/andrewyng/status/788548053745569792)  

Google和Facebook等公司一直处于技术前沿并不令人感到惊讶。事实上,作者表示每个几个月他都会被某些超出自己期望的技术所征服,比如:

  • 循环神经网络的神器效果用于模仿生成莎士比亚作品、维基百科词条和LaTeX文章
  • 一种艺术形式迁移的神经算法
  • 实时人脸捕捉和重现
  • 彩色图像彩色化
  • 用于真实感图像生成的即插即用生成网络
  • 基于其它医疗诊断技术的专家级皮肤癌分类
  • 图片到图片的翻译
  • 教授机器学画猫、狗等动物的简笔画

看起来似乎像是一件件魔法。如果大家对神经网络模型感兴趣,可以观看系列入门教程的视频:

  • Stephen Welch的神经网络模型解密
  • J Alammar的神经网络基础指导

这些算法往往需要海量训练数据。下图是逻辑回归、随机森林和深度学习三种方法在Higgs数据集上的AUC分数(横坐标的单位是百万):

如何通过Keras来掌握深度学习_数据

一般来说,我们并不能保证深度学习的效果比其它方法好,比如随机森林或者决策树,即使在数据量足够大的情况下。


开始实践

是否需要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评分制作

如何通过Keras来掌握深度学习_tensorflow_02


除了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

  1. 很多好的想法在MNIST数据集上并不管用(比如batch norm)。相反,很多糟糕的想法对MNIST有效,但是却无法迁移到实际问题中。—— 摘自[François Chollet 的推特](https://twitter.com/fchollet/status/852594987527045120)  


MNIST是一份手写数字识别数据集(60000张28x28的灰度图)。它适合用来测试本机上安装的Keras是否成功。

notMNIST

[plain] view plain copy

  1. 其实,我曾经说过,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的图片:

如何通过Keras来掌握深度学习_深度学习_03

圆形的大小代表参数的数量。图中没有提到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   

人工智能大数据与深度学习

如何通过Keras来掌握深度学习_tensorflow_04

长按图片,识别二维码,点关注