B站 | [MXNet/Gluon] 动手学深度学习第一课:从上手到多类分类
课程材料:http://zh.gluon.ai
互动论坛:http://discuss.gluon.ai
douyu直播:https://www.douyu.com/jiangmen
一、深度学习简介
包含关系:深度学习 ⊂ \subset ⊂机器学习 ⊂ \subset ⊂人工智能
正在应用深度学习的领域:增强学习(AlphaGo)、物体识别(自动驾驶、无人商店)、语音识别、机器翻译、推荐系统、点击预测(广告)。
系列讲座目的:通过动手实现来理解深度学习,与工业届应用相比,主要只是数据规模和模型复杂度的区别。
左图:深度学习轮子,课程采用MXNet/Gluon; 右图:课程内容
十年来深度学习长足发展的部分原因:优秀的容量控制算法,注意力机制,记忆网络和神经编码-解码器,生成对抗网络,分布式训练算法,并行计算,深度学习框架。
深度学习是具有多级表示的表征学习方法,每一级(从原始数据开始),深度学习通过简单的函数将该级的表示转换为更高级的表示。深度学习的一个外在特点是端到端的训练,而非单独调试的部分拼凑起来组成的一个系统。
与其他经典机器学习方法而言,深度学习的不同在于:对非最优解的包容、对非凸非线性优化的使用,以及用于尝试没有被证明过的方法。
二、预备知识(库的安装与使用)
安装MXNet库
ndarray,矩阵的创建和操作,广播的操作(broadcasting)
autograd,自动求导,链式求导
文件:linear-regression-scratch
这里的预备知识包括数据操作、数据预处理、线性代数、微积分、自动微分、概率等。
2.1-2.2 数据操作/预处理
这一张的具体代码可以 查看:预备知识 | 数据操作
- 操作类型:张量,创建张量,访问张量形状,查询张量元素总数,改变张量形状
- 创建的方式:指定形状的全0全1张量,通过某个特定的概率分布中随机采样来得到张量中每个元素的值,直接使用python列表创建。
- 运算符号:相同形状张量的按元素运算(+、-、 ∗ * ∗、/、 ∗ ∗ ** ∗∗),对张量的按元素操作(如求幂等),线性代数运算(向量点乘、矩阵乘法),向量连结,逻辑运算(构建二元张量),张量元素求和等
- 广播机制:通过复制元素扩展数组,以便在转换后两个张量具有相同的形状。如 3 × 1 3\times1 3×1 和 1 × 2 1\times2 1×2 矩阵相加时,会先分别被广播为 3 × 2 3\times2 3×2 的矩阵,然后相加。
- 索引和切片:与python数组一样。
- 节省内存:在一些操作过程中,可能为一些新结果分配内存,使用python的
id()
函数可以发现引用对象的地址在运算前后发生变化,这种变化可能是不可取的,而执行原地操作的指令也很简单,即使用切片表示法,如Y[:]=<expression>
。 - 转换为其他Python对象:要将大小为1的张量转换为Python标量,可以调用
item()
函数或者python的内置函数如int(),float()
。 - 数据预处理:使用pandas的
read_csv
读取存储在csv中的数据,其中的NaN
项代表缺失值,处理缺失值的方法包括插值法和删除法,处理完后,将原本的数值类型转换为张量格式(torch.tensor
)
2.3 线性代数
- 标量的加减乘除,向量的长度、维度和形状,矩阵的创建、变形、转置
- 向量是标量的推广,矩阵是向量的推广,因此可以构建具有更多轴的数据结构,张量就是描述具有任意数量轴的n维数组的通用方法。
- 对张量的按元素的一元、二元操作都不会改变结果形状。按元素的乘法称为Hamamard积,用
A * B
表示。 - 使用
sum()
、sum(axis=0)
、sum(axis=[0,1])
进行张量元素的求和,使用mean()
求平均值,并且也可以制定其求平均值的维度,另外还有非降维的求和和求平均keepdims=True
。 - 张量的点积
dot()
,矩阵向量积torch.mv(A,x)
,矩阵矩阵乘法torch.mm(A,B)
. - 范数
norm
, L 1 L_1 L1范数是绝对值和, L 2 L_2 L2范数是平方和的平方根, L p L_p Lp范数是 p p p次方和的 1 p \frac{1}{p} p1次方,等等。 - 深度学习中经常需要尝试解决优化问题,比如:最大化分配给观测数据的概率;最小化预测和真实观测之间的距离…这些目标常常是使用范数来定义的。
- 更多关于线性代数的资料:线性代数运算的在线附录或其他优秀资源 (Kolter, 2008, Petersen et al., 2008, Strang, 1993)
2.4-2.5 微积分与自动微分
- 逼近法是积分的起源,两千多年后微分被发明出来,其最重要的应用是优化问题,在深度学习训练模型的过程中,就意味着最小化一个损失函数(Loss Function),可以将拟合模型的任务分解为两个关键问题:
(1)优化:用模型拟合观测数据的过程。(2)泛化:指导我们生成出有效性超出用于训练数据集本身的模型。 - 符号 d d x \frac{d}{dx} dxd和 D D D是微分运算符,微分运算有其常数相乘、加法、乘法、除法等法则
- 注释特殊标记
#@save
,会将对应的函数、类或语句保存在d2l包中。 - 一些matplotlib的使用方法
- 多元函数的偏导数 ∂ y ∂ x i \frac{\partial y}{\partial x_i} ∂xi∂y,梯度 ▽ x f ( x ) \triangledown_xf(x) ▽xf(x)。
- 链式法则。
- 自动微分:对复杂模型手动更新微分是很麻烦且容易出错的,自动微分使系统能够反向传播梯度,案例如下:
import torch
x = torch.arange(4.0)
x.require_grad_(True) # 此时 x.grad = None
y = 2 * torch.dot(x, x) # y = tensor(28., grad_fn=<MulBackward0>)
y.backward() # x.grad = tensor([ 0., 4., 8., 12.])
- 当y不是一个标量的时候,向量y关于向量x的求导的结果是一个矩阵,在深度学习中,通常目的不是计算微分矩阵,而是计算批量中每个样本的偏导数之和
y.sum().backward()
- 分离计算:使用
u=y.detach()
将反向传播过程中的某一部分作为常数处理,这样可以实现计算的分离。 - 自动微分的另一好处是:即使函数中出现python控制流(如条件、循环或函数调用),仍然可以计算得到梯度。
2.5 概率
- 简单说,机器学习就是作出(概率的)预测,概率是一种用于说明确定程度的灵活的语言,有效应用于广泛的领域中。
- 基本概率论的python操作
import torch
from torch.distributions import multinomial
# 多项分布,模拟掷骰子
fair_probs = torch.ones([6]) / 6 # fair_probs = tensor([0.1667, 0.1667, 0.1667, 0.1667, 0.1667, 0.1667])
multinomial.Multinomial(1, fair_probs).sample() # tensor([0., 0., 1., 0., 0., 0.])
multinomial.Multinomial(10, fair_probs).sample() # tensor([2., 4., 1., 0., 1., 2.])
- 概率论公理:概率非负、整个样本空间概率为1,互斥事件序列概率等于各自概率之和。
- 随机变量、联合概率、条件概率、贝叶斯定理
- 边际化,即 B B B 的概率相当于计算 A A A 的所有可能选择,并将所有选择的联合概率求和。
- 独立性、期望、方差
2.6 查阅文档的方法
import torch
# 查看模块中可以调用哪些函数和类
print(dir(torch.distributions))
# 查找特定函数和类的用法
help(torch.ones)