动手学深度学习v2笔记-Day7-基础知识总结

动手学深度学习v2

Day 7 复习与总结

内容均为本人现阶段学习中浅显的理解,如有任何错误,欢迎指出


0x00 自动微分

  • 深度学习其实就是一个复合函数
  • 微分可以解决深度学习中的优化问题
  • 系统自动构建计算图来跟踪变量参与的计算,并且根据这个计算图来进行自动求导
  • 反向传播可以加快梯度的运算,且节省空间
  • 每次求导不重新分配内存,pytorch默认每次累加梯度(函数对于变量计算出的包含n个偏导数的向量)
  • 深度学习中一般都是计算标量y对于向量x的导数,如果y是向量,那么一般sum()
  • 流程:声明变量需要记录梯度(分配空间)-> 记录计算过程 -> 执行反向传播backend() -> 访问梯度
  • 详细内容 0x02节

0x01 线性回归

  • 回归问题经常用来表示输入和输出的关系,自变量与因变量关系建模的方法
  • 线性回归的假设前提是:y可以表述为X中元素的加权和,噪声服从正态分布
  • y = W X + b y=WX+b y=WX+b
  • 其中 W , b W,b W,b是模型参数, X X X为输入变量(训练集)
  • 损失函数(loss function) 能够量化预测值和测量值之间的差距的函数 通常非负且值越小预测越准确,为了度量在整个数据集上的准确率,我们采用求损失均值的策略(全加起来/n)
  • 那么在线性回归问题中,我们的目标就是找到一组 W , b W,b W,b使得这个损失函数(平方损失)最小
  • 梯度下降(gradient descent)不断地在损失函数递减的方向上更新参数(初始参数一般随机挑选)
  • w t = w t − 1 − η ∂ l ∂ w t − 1 w_t = w_{t-1} - \eta \frac {\partial l} {\partial{w_{t-1}}} wt=wt1ηwt1l
    此时刻的参数值是上一个时刻的参数值沿着损失函数对参数导数的相反方向运动一次学习率(步长 η \eta η)*梯度的距离,等高线图十分形象且好理解。
  • 小批量随机梯度下降 对于整个训练集求梯度实在是太费时费力,因此将整个训练集抽样,并且迭代更新参数过程,这个小批量样本的样本数量成为批量大小(batch size)
  • 为什么要矢量化数据:加速且方便编写代码,减少不必要的运算错误
  • 每个输入都与每个输出相连,我们称之为全连接层or稠密层
  • epoch是迭代周期,简单来说就是对数据扫几遍
  • 流程:选择损失函数、定义模型并随机初始化参数 -> 进入循环 -> 每次取一个batchsize的数据 -> 计算loss函数的梯度 -> 更新参数
  • 详细内容

0x02 softmax回归

  • 分类问题目标是为了预测数据属于某一组类别中的哪一个
  • 独热编码(one-hot encoding)是一个向量,分量和类别一样多,对应的类别位置为1,其余位置为0
  • softmax回归也是一个单层神经网络,输出层也是全连接层
  • 简单的例子是有几个2x2像素的图片,然后将这些图片分为三类
  • 有以下分解
    o 1 = x 1 w 1 1 + x 2 w 1 2 + x 3 w 1 3 + x 4 w 1 4 + b 1 o_1 = x_1w_11 + x_2w_12 + x_3w_13 + x_4w_14 + b_1 o1=x1w11+x2w12+x3w13+x4w14+b1 o 2 = x 1 w 2 1 + x 2 w 2 2 + x 3 w 2 3 + x 4 w 2 4 + b 2 o_2 = x_1w_21 + x_2w_22 + x_3w_23 + x_4w_24 + b_2 o2=x1w21+x2w22+x3w23+x4w24+b2 o 3 = x 1 w 3 1 + x 2 w 3 2 + x 3 w 3 3 + x 4 w 3 4 + b 3 o_3 = x_1w_31 + x_2w_32 + x_3w_33 + x_4w_34 + b_3 o3=x1w31+x2w32+x3w33+x4w34+b3
  • 简单表示成下面
    o = W x + b o = Wx + b o=Wx+b
    其中 W W W是3行4列的向量 对于给定的 x x x 我们得到的输出 o o o 是用权重与输入特征进行矩阵-向量乘法加上 b b b得到的
  • 如果将线性输出的结果直接作为输出,那么可能为负数并且他们之间的和也不为1,这违反了概率基本公理
  • 因此采用softmax处理:对于原始输出每个求幂运算保证结果非负,然后为了保证和为1,再将幂运算结果除以他们的和
  • y ^ i = e o i ∑ 1 k e o k \hat y_i = \frac {e^{o_i}} {\sum^k_1e^{o_k}} y^i=1keokeoi
  • 在SGD过程中,会有一个批量的样本进入训练,那么并非上述 x x x形式的计算,而是输入一个矩阵 X X X进行softmax
    X_exp = torch.exp(X)  # 对输入的X矩阵的每个元素进行求幂操作
    partition = X_exp.sum(1, keepdim=True)  # 按列求和,每一列都累加到第一列,然后保留
    return X_exp / partition  # 矩阵中的每个元素就是上述yi^的结果,返回的就是一个softmax矩阵
  • 交叉熵一般用来衡量两个概率的区别,在这里作为损失函数很合理
    H ( p , q ) = ∑ i n − p i l o g q i H(p,q) = \sum_i^n -p_ilogq_i H(p,q)=inpilogqi
    p , q p, q p,q分别是两个概率集合,都有n个元素,用上述公式求出交叉熵
    l ( y , y ^ ) = − ∑ i n y i l o g y ^ i = − l o g y ^ y l(y, \hat y) = -\sum_i^n y_ilog\hat y_i = -log\hat y_y l(y,y^)=inyilogy^i=logy^y
    上述就是作为损失函数的交叉熵,对于每个预测概率求log然后乘上真实概率,再对全部的求和取相反数,那事实上one-hot的存在将导致y和y-hat中都是只有一个概率为1剩余概率为0,因此得出结果直接等于对真实类别y的预测的y—hat取log和相反数
  • 这个损失函数的梯度,就是每个真实概率和预测概率的差值(是计算得出的结果而非定义)
  • 交叉熵损失函数是分类问题最常用的损失函数之一
  • 在例子中,数据集由28*28的图像构成,暂时将这784个像素点看做784个特征输入,每个batch-size是256,因此 X X X矩阵为256*784,特征矩阵 W W W为784*10,偏置 b b b为1*10
  • 流程:读取数据 -> 定义模型 -> 损失函数 -> 初始化参数 -> sgd训练
  • 详细内容

0x03 感知机(MLP)

  • 之前都是单层的神经网络,最简单的深度网络叫做多层感知机
  • softmax模型结构,在输入层经过一次带有偏置项的线性变换(仿射变换)然后直接输出进行softmax操作,如果我们的标签经过仿射变换之后确实与输入数据相关,那么这种方法够用,但是这种相关的假设线性太强了。
  • 复杂世界中的问题如果假设的线性太强,一般结果都会很离谱。举例图像分类,由于任何像素的强度都以复杂的方式取决于图像上下文,我们的数据可能会有某种表示,可以考虑到这种上下文关系,在这种表示基础上建立一个线性模型应该会是合适的,但是我们无法手动计算出来这种表示形式,因此,深度神经网络观测数据并学习隐藏层表示来找到这种形式。
  • 加入“隐藏层”,目前就是输入和输出中间的层,最简单的就是将多个全连接层堆叠到一起,以此来客服单纯线性模型的限制。
  • 在加入多层结构之后,如果别的不变,我们只是多学了很多参数罢了,还是全部用的仿射变换,而这种堆叠就失去了意义
  • 激活函数:通过计算加权和并加上偏置来确定神经元是否应该被激活,这个函数一般是非线性的,并且作用于隐藏层,使得多个堆叠不会退化成线性模型
  • 即使网络只有一个隐藏层,只要给定足够的权重和神经元,我们也可以对任意函数进行拟合
  • ReLU sigmoid tanh 三种常用的激活函数
  • 流程:就是在之前的基础上加入隐藏层,并且给隐藏层加入激活函数
  • 详细内容

0x04 其它

  • 模型在训练数据上拟合的比在潜在分布中更接近的现象叫做过拟合(正则化处理),反之欠拟合。
  • 训练误差,在训练集上预测的误差;泛化误差,在测试集上的误差。
  • 几个影响模型泛化水平的因素:可调整参数的数量,参数的取值范围,训练样本的数量
  • 在机器学习中我们评估几个候选模型之后选择最终的模型,这个过程叫做模型选择,而且这些模型的超参数都不同,此时,我们会使用验证集来确定最终选择
  • k折交叉验证,将一个训练集分为k份,每次使用k-1份进行训练,用1份进行验证。重复上述过程k次,最后取一个平均值
  • 一般选取泛化损失最低的点作为结果,但是某些时候可能稍微的过拟合一点点不是坏事
  • **权重衰退(L2正则化)**就是通过限制参数的取值范围来避免过拟合的,在寻找最小的损失函数的过程中,限制 ∣ ∣ w ∣ ∣ 2 < θ ||w||^2 < \theta ∣∣w2<θ
  • 实现权重衰减的方法就是将L2正则项加入到原始目标函数中即可
  • 详细内容
  • 具有输入噪声的训练等价于Tikhonov正则化
  • 丢弃法(dropout) 在前向传播的过程中,计算每一内部层的同时注入噪声,从表面上看,只是在训练过程中随机丢弃了一些神经元
  • 标准dropout正则化 不改变数值的期望
    x i ′ = { 0 ( p ) x i 1 − p ( 非 p ) x'_i = \begin{cases} 0 &(p)\\ \frac {x_i} {1-p} &(非p)\\ \end{cases} xi={01pxi(p)(p)
  • 我们一般将dropout作用在隐藏层全连接的输出上,结果就导致某些神经元消失,某些神经元权重变大
  • 我们只在训练时做dropout,在测试时我们不会丢弃任何节点
  • dropout相当于一种正则项
  • 参数初始化的方案在整个深度学习过程中至关重要

你可能感兴趣的:(动手学深度学习v2笔记,深度学习,python,pytorch,人工智能,神经网络)