动手学深度学习
这是一个深度学习的教学项目。我们将使用 Apache MXNet (incubating) 的最新 gluon 接口来演示如何从0开始实现深度学习的各个算法。我们的将利用 Jupyter notebook 能将文档,代码,公式和图形统一在一起的优势,提供一个交互式的学习体验。这个项目可以作为一本书,上课用的材料,现场演示的案例,和一个可以尽情拷贝的代码库。据我们所知,目前并没有哪个项目能既覆盖全面深度学习,又提供交互式的可执行代码。我们将尝试弥补这个空白。

第一季十九课视频汇总
可打印的PDF版本在这里
课程源代码在Github (亲,给个好评加颗星)
请使用 http://discuss.gluon.ai/ 来进行讨论

前言

主要符号一览

预备知识

机器学习简介

1、用代码编程和用数据编程

这个例子灵感来自 Joel Grus 的一次 应聘面试. 面试官让他写个程序来玩Fizz Buzz. 这是一个小孩子游戏。玩家从1数到100,如果数字被3整除,那么喊’fizz’,如果被5整除就喊’buzz’,如果两个都满足就喊’fizzbuzz’,不然就直接说数字。这个游戏玩起来就像是:

1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz 16 …

传统的实现是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
In [1]:
res = []
for i in range(1, 101):
if i % 15 == 0:
res.append('fizzbuzz')
elif i % 3 == 0:
res.append('fizz')
elif i % 5 == 0:
res.append('buzz')
else:
res.append(str(i))
print(' '.join(res))

1 2 fizz 4 buzz fizz 7 8 fizz buzz 11 fizz 13 14 fizzbuzz 16 17 fizz 19 buzz fizz 22 23 fizz b

对于经验丰富的程序员来说这个太不够一颗赛艇了。所以Joel尝试用机器学习来实现这个。为了让程序能学,他需要准备下面这个数据集:

  • 数据 X [1, 2, 3, 4, …] 和标注Y [‘fizz’, ‘buzz’, ‘fizzbuzz’, identity]
  • 训练数据,也就是系统输入输出的实例。例如 [(2, 2), (6, fizz), (15, fizzbuzz), (23, 23), (40, buzz)]
  • 从输入数据中抽取的特征,例如 x -> [(x % 3), (x % 5), (x % 15)].

有了这些,Jeol利用TensorFlow写了一个分类器。对于不按常理出牌的Jeol,面试官一脸黑线。而且这个分类器不是总是对的。

2、机器学习最简要素

成功的机器学习有四个要素:数据、转换数据的模型、衡量模型好坏的损失函数和一个调整模型权重来最小化损失函数的算法。

Data

Models

Loss Functions

  • 训练误差(training error):这是模型在用于训练的数据集上的误差。类似于考试前我们在模拟试卷上拿到的分数。有一定的指向性,但不一定保证真实考试分数。
  • 测试误差(test error):这是模型在没见过的新数据上的误差,可能会跟训练误差很不一样(统计上称之为过拟合)。类似于考前模考次次拿高分,但实际考起来却失误了。

Optimization Algorithms

3、Supervised Learning

简单概括,学习过程看起来是这样的:在一大组数据中随机地选择样本输入,并获得其真实(ground-truth)的标注(label);这些输入和标注(即期望的结果)构成了训练集(training set)。我们把训练集放入一个监督学习算法(supervised learning algorithm)。算法的输入是训练集,输出则是学得模型(learned model)。基于这个学得模型,我们输入之前未见过的测试数据,并预测相应的标注。

3-1、Regression

在该项任务里,输入是任意离散或连续的、单一或多个的变量,而输出是连续的数值。

一条经验就是,问题中如果包含“多少?”,这类问题一般是回归问题。“这次手术需要几个小时?”……回归分析。“这张照片里有几只狗?”……回归分析。不过,如果问题能够转化为“这是一个__吗?”,那这很有可能是一个分类,或者属于其余我们将会谈及的问题。

如果我们把模型预测的输出值和真实的输出值之间的差别定义为残差,常见的回归分析的损失函数包括训练数据的残差的平方和或者绝对值的和。机器学习的任务是找到一组模型参数使得损失函数最小化。

3-2、Classification

回归分析所关注的预测可以解答输出为连续数值 的问题。当预测的输出是离散的 类别时,这个监督学习任务就叫做分类。

使用NDArray来处理数据

使用autograd来自动求导
深度学习模型基础
线性回归——从零开始
线性回归——使用Gluon
多类逻辑回归——从零开始
多类逻辑回归——使用Gluon
多层感知机——从零开始
多层感知机——使用Gluon
欠拟合和过拟合
正则化——从零开始
正则化——使用Gluon
丢弃法(Dropout)——从零开始
丢弃法(Dropout)——使用Gluon
正向传播和反向传播
实战Kaggle比赛——使用Gluon预测房价和K折交叉验证
深度学习计算基础
模型构造
模型参数
自定义层
读取和存储
GPU计算
卷积神经网络
卷积神经网络 — 从0开始
卷积神经网络 — 使用Gluon
批量归一化 — 从0开始
批量归一化 — 使用Gluon
深度卷积神经网络和AlexNet
VGG:使用重复元素的非常深的网络
网络中的网络
更深的卷积神经网络:GoogLeNet
ResNet:深度残差网络
DenseNet:稠密连接的卷积神经网络
循环神经网络
循环神经网络 — 从0开始
通过时间反向传播
门控循环单元(GRU)— 从0开始
长短期记忆(LSTM)— 从0开始
循环神经网络 — 使用Gluon
优化算法
优化算法概述
梯度下降和随机梯度下降——从零开始
梯度下降和随机梯度下降——使用Gluon
动量法——从零开始
动量法——使用Gluon
Adagrad——从零开始
Adagrad——使用Gluon
RMSProp——从零开始
RMSProp——使用Gluon
Adadelta——从零开始
Adadelta——使用Gluon
Adam——从零开始
Adam——使用Gluon
计算性能
命令式和符号式混合编程
惰性计算
自动并行计算
多GPU训练模型——从零开始
多GPU训练模型——使用Gluon
计算机视觉
图片增广
Fine-tuning: 通过微调来迁移学习
使用卷积神经网络的物体检测
SSD — 使用Gluon
YOLO — 使用Gluon
语义分割:FCN
样式迁移
实战Kaggle比赛——使用Gluon对原始图像文件分类(CIFAR-10)
实战Kaggle比赛——使用Gluon识别120种狗 (ImageNet Dogs)
自然语言处理
词向量 — word2vec
词向量 — GloVe和fastText
使用预训练的词向量
编码器—解码器(seq2seq)和注意力机制
神经机器翻译
附录
安装和使用
GPU购买指南
在AWS上运行教程
数学基础
本教程的英文版本 (注意:中文版本根据社区的反馈做了比较大的更改,我们还在努力的将改动同步到英文版)