《动手学习深度学习》笔记(一)简介与预备知识

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 数据操作/预处理

这一张的具体代码可以 查看:预备知识 | 数据操作

  1. 操作类型:张量,创建张量,访问张量形状,查询张量元素总数,改变张量形状
  2. 创建的方式:指定形状的全0全1张量,通过某个特定的概率分布中随机采样来得到张量中每个元素的值,直接使用python列表创建。
  3. 运算符号:相同形状张量的按元素运算(+、-、 ∗ * 、/、 ∗ ∗ ** ),对张量的按元素操作(如求幂等),线性代数运算(向量点乘、矩阵乘法),向量连结逻辑运算(构建二元张量),张量元素求和
  4. 广播机制:通过复制元素扩展数组,以便在转换后两个张量具有相同的形状。如 3 × 1 3\times1 3×1 1 × 2 1\times2 1×2 矩阵相加时,会先分别被广播为 3 × 2 3\times2 3×2 的矩阵,然后相加。
  5. 索引和切片:与python数组一样。
  6. 节省内存:在一些操作过程中,可能为一些新结果分配内存,使用python的id()函数可以发现引用对象的地址在运算前后发生变化,这种变化可能是不可取的,而执行原地操作的指令也很简单,即使用切片表示法,如Y[:]=<expression>
  7. 转换为其他Python对象:要将大小为1的张量转换为Python标量,可以调用item()函数或者python的内置函数如int(),float()
  8. 数据预处理:使用pandas的read_csv读取存储在csv中的数据,其中的NaN项代表缺失值,处理缺失值的方法包括插值法和删除法,处理完后,将原本的数值类型转换为张量格式(torch.tensor

2.3 线性代数

  1. 标量的加减乘除,向量的长度、维度和形状,矩阵的创建、变形、转置
  2. 向量是标量的推广,矩阵是向量的推广,因此可以构建具有更多轴的数据结构,张量就是描述具有任意数量轴的n维数组的通用方法。
  3. 对张量的按元素的一元、二元操作都不会改变结果形状。按元素的乘法称为Hamamard积,用A * B表示。
  4. 使用sum()sum(axis=0)sum(axis=[0,1])进行张量元素的求和,使用mean()求平均值,并且也可以制定其求平均值的维度,另外还有非降维的求和和求平均keepdims=True
  5. 张量的点积dot()矩阵向量积torch.mv(A,x)矩阵矩阵乘法torch.mm(A,B).
  6. 范数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次方,等等。
  7. 深度学习中经常需要尝试解决优化问题,比如:最大化分配给观测数据的概率;最小化预测和真实观测之间的距离…这些目标常常是使用范数来定义的。
  8. 更多关于线性代数的资料:线性代数运算的在线附录或其他优秀资源 (Kolter, 2008, Petersen et al., 2008, Strang, 1993)

2.4-2.5 微积分与自动微分

  1. 逼近法是积分的起源,两千多年后微分被发明出来,其最重要的应用是优化问题,在深度学习训练模型的过程中,就意味着最小化一个损失函数(Loss Function),可以将拟合模型的任务分解为两个关键问题:
    (1)优化:用模型拟合观测数据的过程。(2)泛化:指导我们生成出有效性超出用于训练数据集本身的模型。
  2. 符号 d d x \frac{d}{dx} dxd D D D是微分运算符,微分运算有其常数相乘、加法、乘法、除法等法则
  3. 注释特殊标记#@save,会将对应的函数、类或语句保存在d2l包中。
  4. 一些matplotlib的使用方法
  5. 多元函数的偏导数 ∂ y ∂ x i \frac{\partial y}{\partial x_i} xiy,梯度 ▽ x f ( x ) \triangledown_xf(x) xf(x)
  6. 链式法则
  7. 自动微分:对复杂模型手动更新微分是很麻烦且容易出错的,自动微分使系统能够反向传播梯度,案例如下:
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.])
  1. 当y不是一个标量的时候,向量y关于向量x的求导的结果是一个矩阵,在深度学习中,通常目的不是计算微分矩阵,而是计算批量中每个样本的偏导数之和y.sum().backward()
  2. 分离计算:使用u=y.detach()将反向传播过程中的某一部分作为常数处理,这样可以实现计算的分离。
  3. 自动微分的另一好处是:即使函数中出现python控制流(如条件、循环或函数调用),仍然可以计算得到梯度。

2.5 概率

  1. 简单说,机器学习就是作出(概率的)预测,概率是一种用于说明确定程度的灵活的语言,有效应用于广泛的领域中。
  2. 基本概率论的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. 概率论公理:概率非负、整个样本空间概率为1,互斥事件序列概率等于各自概率之和。
  2. 随机变量、联合概率、条件概率、贝叶斯定理
  3. 边际化,即 B B B 的概率相当于计算 A A A 的所有可能选择,并将所有选择的联合概率求和。
  4. 独立性、期望、方差

2.6 查阅文档的方法

import torch
# 查看模块中可以调用哪些函数和类
print(dir(torch.distributions))
# 查找特定函数和类的用法
help(torch.ones)

猜你喜欢

转载自blog.csdn.net/lj164567487/article/details/129142744