深度学习之pytorch实战计算机视觉

第3章 深度神经网络基础

3.1 监督学习和无监督学习

监督学习(supervised learning):提供一组输入数据和其对应
的标签数据,然后搭建一个模型,让模型在通过训练后准确地找到输入数据和标签数据之间的最优映射关系,在输入新的数据后,模型能够通过之前学到的最优映射关系,快速地预测出这组新数据的标签。这就是一个监督学习的过程

3.1.1监督学习

监督学习的主要应用场景:回归问题和分类问题

回归问题:使用监督学习的方法,让我们搭建的模型在通过训练后建立起一个连续的线性映射关系,其重点如下:

  1. 通过提供数据训练模型, 让模型得到映射关系并能对新的输入数据进行预测;
  2. 我们得到的映射模型是线性连续的对应关系。

线性回归的使用场景是我们已经获得一部分有对应关系的原始数
据, 并且问题的最终答案是得到一个连续的线性映射关系, 其过程就是使用原始数据对建立的初始模型不断地进行训练, 让模型不断拟合和修正, 最后得到我们想要的线性模型, 这个线性模型能够对我们之后输入的新数据准确地进行预测。

分类问题:分类问题就是让我们搭建的模型在通过监督学习之后建立起一个离散的映射关系。 分类模型和回归问题在本质上有很大的不同, 它依然需要使用提供的数据训练模型让模型得到映射关系, 并能够对新的输入数据进行预测, 不过最终得到的映射模型是一种离散的对应关系。

3.1.2无监督学习

定义:提供一组没有任何标签的输入数据,将其在我们搭建好的模型中进行训练,对整个训练过程不做任何干涉,最后得到一个能够发现数据之间隐藏特征的映射模型,使用这个映射模型能够实现对新数据的分类,这就是一个无监督学习的过程。

3.1.3 小结

监督学习:监督学习能够按照指定的训练数据搭建出想要的模型,但这个过程需要我们投入大量的精力处理原始数据,也因为我们的紧密参与,所以最后得到的模型更符合设计者的需求和初衷。
无监督学习:模型能够自己寻找数据之间隐藏的特征和关系,更具有创造性,有时还能够挖掘到数据之间让我们意想不到的映射关系,不过最后的结果也可能会向不好的方向发展

3.2 欠拟合和过拟合

拥有欠拟合特性的模型对已有数据的匹配性很差,不过对数据中的噪声不敏感;而拥有过拟合特性的模型对数据的匹配性太好,所以对数据中的噪声非常敏感。

3.2.1 欠拟合

解决欠拟合问题的三个方法:

  1. 增加特征项: 在大多数情况下出现欠拟合是因为我们没有准确地把握数据的主要特征, 所以我们可以尝试在模型中加入更多的和原数据有重要相关性的特征来训练搭建的模型, 这样得到的模型可能会有更好的泛化能力。
  2. 构造复杂的多项式: 这种方法很容易理解, 我们知道一次项函数就是一条直线, 二次项函数是一条抛物线, 一次项和二次项函数的特性决定了它们的泛化能力是有局限性的, 如果数据不在直线或者抛物线附近, 那么必然出现欠拟合的情形, 所以我们可以通过增加函数中的次项来增强模型的变化能力, 从而提升其泛化能力。
  3. 减少正则化参数: 正则化参数出现的目的其实是防止过拟合情形的出现, 但是如果我们的模型已经出现了欠拟合的情形, 就可以通过减少正则化参数来消除欠拟合。

3.2.2 过拟合

解决过拟合的三个方法

  1. 增大训练的数据量:在大多数情况下发生过拟合是因为我们用于模型训练的数据量太小,搭建的模型过度捕获了数据的有限特征,这时就会出现过拟合,在增加参与模型训练的数据量后,模型自然就能捕获数据的更多特征,模型就不会过于依赖数据的个别特征。
  2. 采用正则化方法:正则化一般指在目标函数之后加上范数,用来防止模型过拟合的发生,在实践中最常用到的正则化方法有L0正则、 L1正则和L2正则。
  3. Dropout方法: Dropout方法在神经网络模型中使用的频率较高,简单来说就是在神经网络模型进行前向传播的过程中,随机选取和丢弃指定层次之间的部分神经连接,因为整个过程是随机的,所以能有
    效防止过拟合的发生。

3.3 后向传播

后向传播主要用于对我们搭建的模型中的参数进行微调, 在通过多次后向传播后, 就可以得到模型的最优参数组合。
深度学习之pytorch实战计算机视觉
假设x0=1、 x1=1、 b=-1,同时存在相对应的权重值w0=0.5、 w1=0.5,使用Sigmoid作为该神经网络的**函数,就可以得
到前向传播的计算函数为
f=11+e(w0x0+w1x1+b)f=\frac{1}{1+e^-(w_0x_0+w_1x_1+b)}
h=w0x0+w1x1+b h = w_0x_0+w_1x_1+b
将相应的参数代入函数中,可得

  1. x0x_0的后向传播微调值为
    fx0=fhhx0=(1f(h))f(h)0.5=0.125 \frac {\partial f}{\partial x_0} = \frac{\partial f}{\partial h} \frac{\partial h}{\partial x_0}=(1-f(h))f(h)*0.5=0.125
  2. x1x_1的后向传播微调值为
    fx1=fhhx1=(1f(h))f(h)0.5=0.125 \frac {\partial f}{\partial x_1} = \frac{\partial f}{\partial h} \frac{\partial h}{\partial x_1}=(1-f(h))f(h)*0.5=0.125

3.4 损失和优化

损失用来度量我们的模型得到的预测值和数据真实值之间的差距模型预测值和真实值的差距越大,损失值就会越高,这时我们就需要通过不断地对模型中的参数进行优化来减少损失;同理,预测值和真实值的差距越小,则说明我们训练的模型预测越准确,具有更好的泛化能力。

对模型进行优化的最终目的是尽可能地在不过拟合的情况下降低损失值。

3.4.1 损失函数

  1. 均方误差函数
    均方误差(Mean Square Error, 简称MSE) 函数计算的是预测值与真实值之差的平方的期望值, 可用于评价数据的变化程度, 其得到的值越小, 则说明模型的预测值具有越好的精确度。 均方误差函数的计算如下:深度学习之pytorch实战计算机视觉
  2. 均方根误差函数
    均方根误差(Root Mean Square Error, 简称RMSE) 在均方误差函数的基础上进行了改良, 计算的是均方误差的算术平方根值, 其得到的值越小, 则说明模型的预测值具有越好的精确度。 均方根误差函数的计算如下:
    深度学习之pytorch实战计算机视觉
  3. 平均根误差函数
    平均绝对误差(Mean Absolute Error, MAE) 计算的是绝对误差的平均值, 绝对误差即模型预测值和真实值之间的差的绝对值, 能更好地反映预测值误差的实际情况, 其得到的值越小, 则说明模型的预测值具有越好的精确度。 平均绝对误差函数如下:
    深度学习之pytorch实战计算机视觉

3.4.2 优化函数

在实践操作中最常用到的是一阶优化函数,典型的一阶优化函数包括 GD、 SGD、 Momentum、 Adagrad、 Adam,等等。一阶优化函数在优化过程中求解的是参数的一阶导数,这些一阶导数的值就是模型中参数的微调值。

这里引入了一个新的概念:梯度。梯度其实就是将多元函数的各个参数求得的偏导数以向量的形式展现出来,也叫作多元函数的梯度。

梯度中的内容其实就是在后向传播中对每个参数求得的偏导数,所以我们在模型优化的过程中使用的参数微调值其实就是函数计算得到的梯度,这个过程又叫作参数的梯度更新。

  1. 梯度下降(Gradient Descent)

全局梯度下降公式
θj=θjηJ(θj)θj\theta_j=\theta_j-\eta*\frac{\partial J(\theta_j)}{\partial \theta_j}
其中, 训练样本总数为n, j=0…n。 可以将这里的等号看作编程中的赋值运算, θ是我们优化的参数对象, η是学习速率, J(θ)是损失函数, 是根据损失函数来计算θ的梯度。

学习速率用于控制梯度更新的快慢, 如果学习速率过快, 参数的更新跨步就会变大, 极易出现局部最优和抖动; 如果学习速率过慢, 梯度更新的迭代次数就会增加, 参数更新、 优化的时间也会变长, 所以选择一个合理的学习速率是非常关键的。

全局的梯度下降在每次计算损失值时都是针对整个参与训练的数据集而言的, 所以会出现一个令人困扰的问题: 因为模型的训练依赖于整个数据集, 所以增加了计算损失值的时间成本和模型训练过程中的复杂度, 而参与训练的数据量越大, 这两个问题越明显。

  1. 批量梯度下降(Batch Gradient Descent)

批量梯度下降就是将整个参与训练的数据集划分为若干个大小差不多的训练数据集, 我们将其中的一个训练数据集叫作一个批量,每次用一个批量的数据来对模型进行训练, 并以这个批量计算得到的损失值为基准来对模型中的全部参数进行梯度更新, 默认这个批量只使用一次, 然后使用下一个批量的数据来完成相同的工作, 直到所有批量的数据全部使用完毕。
批量梯度下降参数更新公式:
θj=θjηJbatch(θj)θj\theta_j=\theta_j-\eta*\frac{\partial J_{batch}(\theta_j)}{\partial \theta_j}
训练样本总数为batch, j=0…batch。
批量梯度下降算法大体上和全局的梯度下降算法没有多大的区别, 唯一的不同就是损失值的计算方式使用的是Jbatch(θj),即这个损失值是基于我们的一个批量的数据来进行计算的。如果我们将批量划分得足够好,则计算损失函数的时间成本和模型训练的复杂度将会大大降低,不过仍然存在一些小问题,就是选择批量梯度下降很容易导致优化函数的最终结果是局部最优解。

  1. 随机梯度下降(Stochastic Gradient Descent)

随机梯度下降是通过随机的方式从整个参与训练的数据集中选取一部分来参与模型的训
练,所以只要我们随机选取的数据集大小合适,就不用担心计算损失函数的时间成本和模型训练的复杂度,而且与整个参与训练的数据集的大小没有关系。
随机梯度下降公式:
θj=θjηJstochastic(θj)θj\theta_j=\theta_j-\eta*\frac{\partial J_{stochastic}(\theta_j)}{\partial \theta_j}
训练样本的总数为stochastic, j=0…stochastic。
随机梯度下降虽然很好地提升了训练速度,但是会在模型的参数优化过程中出现抖动的情况,原因就是我们选取的参与训练的数据集是随机的,所以模型会受到随机训练数据集中噪声数据的影响,又因为有随机的因素,所以也容易导致模型最终得到局部最优解。

  1. Adam(自适应时刻估计方法)

Adam在模型训练优化的过程中通过让每个参数获得自适应的学习率,来达到优化质量和速度的双重提升。举个简单的实例,假设我们在一开始进行模型参数的训练时损失值比较大,则这时需要使用较大的学习速率让模型参数进行较大的梯度更新, 但是到了后期我们的损失值已经趋近于最小了, 这时就需要使用较小的学习速率让模型参数进行较小的梯度更新, 以防止在优化过程中出现局部最优解。即,Adam收敛速度快、 学习效果好