动手学深度学习记录

学习目标:动手学深度学习

https://zh-v2.d2l.ai/chapter_preface/index.html
https://space.bilibili.com/1567748478/channel/seriesdetail?sid=358497


2022.4.1

1.数据集

通常将可用数据集分成两部分:训练数据集用于拟合模型参数,测试数据集用于评估拟合的模型。
当一个模型在训练集上表现良好,但不能推广到测试集时,我们说这个模型是“过拟合”(outfitting)的。

2.监督学习
非正式地说,监督学习的过程如下:首先,从大量数据样本中随机选取一个子集,为每个样本获取基本的真实标签(有时标签已有,有时人工标记),这些输入和相应的标签一起构成了训练数据集。随后,选择有监督的学习算法,它将训练数据集作为输入,并输出一个“完成学习模型”。最后,将之前没见过的样本特征放到这个“完成学习模型”中,使用模型的输出作为相应的标签的预测。打趣以下,“监督学习”模型像一个打工仔,有一份极其专业的工作和一位机器平庸的老板。老板站在身后,准确地告诉模型在每种情况下应该做什么,知道模型学会从情况到行动的映射。取悦这位老板很容易,只需尽快识别出模式并模仿他们的行为即可。
动手学深度学习记录_第1张图片

3.非监督学习
数据中不含有“目标”的机器学习问题为无监督学习(unsupervised learning)。
聚类问题
主成分分析问题
因果关系和概率图模型问题
生成对抗性网络

4.预备知识
n维数组,也称为张量
线性代数
自动求导
概率

5.广播机制
在某些情况下,即使形状不同,我们仍然可以通过调用广播机制(broadcasting mechanism)来执行按元素操作。这种机制的工作方式如下:首先,通过适当复制元素来扩展一个或两个数组,以便在转换之后,两个张量具有相同的形状。其次,对生成的数组执行按元素操作。

6.线性回归
在机器学习领域中的大多数任务通常都与预测有关。当我们想预测一个数值时,就会设计到回归问题。

7.损失函数
损失函数(loss function)能够量化目标的实际值与预测值之间的差距。通常我们会选择非负数作为损失,且数值越小表示损失越小,完美预测时的损失为0。回归问题中最常用的损失函数时平方误差函数。

8.随机梯度下降
即使在我们无法得到解析解(线性回归的解可以用一个公式简单的表达出来,这类解叫做解析解)的情况下,我们仍然可以有效地训练模型。在许多任务上,那些难以优化的模型效果要更好。因此,弄清楚如何训练这些难以优化的模型时非常重要的。
梯度下降几乎可以优化所有深度学习模型。它通过不断在损失函数递减的方向上更新参数来降低误差。
小批量随机梯度下降(在每次需要计算更新的时候随机抽取一小批样本)是深度学习默认的求解算法。
a.初始化模型参数的值,如随机初始化
b.从数据集中随机抽取小批量样本且在负梯度方向上更新参数,并不断迭代这一步骤

2022.4.2

1.线性回归的从零开始实现
包括数据流水线、模型、损失函数和小批量随机梯度下降优化器
a.生成数据集
b.读取数据集(训练机器学习算法的基础)
训练模型时对数据集进行遍历,每次抽取一小批量样本,并使用它们更新模型。有必要定义一个函数,该函数能打乱数据集中的样本并以小批量方式获取数据。
c.初始化模型参数
在开始用小批量随机梯度下降优化模型参数之前,需要先有一些参数。在下面的代码中,我们通过从均值为0标准差为0.01的正态分布中采样随机数来初始化权重,并将偏置初始化为0.

w = torch.normal(0, 0.01, size=(2,1), requires_grad=True)
b = torch.zeros(1, requires_grad=True)

在初始化参数之后,我们的任务是更新这些参数,知道这些参数足够拟合我们的数据。每次更新都需要计算随时函数关于模型参数的梯度。有了这个梯度,我们就可以向减小损失的方向更新每个参数。因为手动计算梯度很枯燥而且容易出错,所以没人会手动计算梯度。引入自动微分来计算梯度。
d.定义模型
将模型的输入和参数同模型的输出关联起来。
e.定义损失函数
f.定义优化算法
g.训练
在每次迭代中,读取一小批量训练样本,并荣国模型来获得一组预测。计算完损失后,开始反向传播,存储每个参数的梯度。最后,调用优化算法sgd来更新模型参数。
(学习率lr不能过大或过小。若过小,则损失一开始会很大。若过大,求导可能出现0,loss nan)

2.softmax回归
softmax回归是一个多类分类模型,使用softmax操作子得到每个类的预测置信度,使用交叉熵(所有分布的预期损失值)来衡量预测和标号的区别。

3.感知机
感知机是一个二分类模型,是最早的AI模型之一。它的求解算法等价与使用批量大小为1的梯度下降。它不能拟合XOR函数,导致第一次AI寒冬。

4.多层感知机
可以通过在网络中加入一个或多个隐藏层来客服线性模型的限制,使其能处理更普遍的函数关系类型。要做到这一点,最简单的方法是将许多全连接层堆叠在一起。每一层都输出到上面的层,直到生成最后输出。可以把前L-1层看作表示,把最后一层看作线性预测器。这种架构通常称为多层感知机(multilayer perceptron),缩写为MLP。
动手学深度学习记录_第2张图片
这个多层感知机有4个输入,3个输出,其隐藏层包含5个隐藏单元。输入层不涉及任何计算,因此使用此网络产生输出只需要实现隐藏层和输出层的计算。因此,这个多层感知机中的层数为2.这两个层都是全连接的。每个输入都会影响隐藏层中的每个神经元,而隐藏层中的每个神经元又会影响输出层中的每个神经元。
多层感知机可以通过隐藏神经元,捕捉到输入之间复杂的相互作用,这些神经元依赖于每个输入的值。我们可以很容易地设计隐藏节点来执行任意计算。例如,在一对输入上进行基本逻辑操作,多层感知机是通用近似器。即使是网络只有一个隐藏层,给定足够的神经元和正确的权重,我们可以对任意函数建模,尽管实际中学习该函数是很困难的。虽然一个单隐层网络能学习任何函数,但并不意味着我们应该尝试使用单隐藏层网络来解决所有问题。事实上,通过使用更深(而不是更广)的网络,我们可以更容易地逼近许多函数。
多层感知机使用隐藏层和激活函数来得到非线性模型,常用激活函数是Sigmoid,Tanh,reLU,使用softmax来处理多类分类。超参数为隐藏层数,和各个隐藏层大小。

5.激活函数
激活函数通过计算加权和并加上偏置来确定神经元是否应该被激活,它们将输入信号转换为输出的可微计算。大多数激活函数都是非线性的。

6.模型选择
将模型在训练数据上拟合的比在潜在分布中更接近的现象称为过拟合(overfitting),用于对抗过拟合的技术称为正则化(regularization)。如果又足够多的神经元、层数和训练迭代周期,模型最终可以在训练集上达到完美的精度,此时测试集的准确性却下降了。
过拟合并不总是坏事。
动手学深度学习记录_第3张图片
正则化是处理过拟合的常用方法:在训练集的损失函数中加入惩罚项,以降低学习到的模型的复杂度。

7.测试数据集和验证数据集
验证数据集是一个用来评估模型好坏的数据集(例如拿出50%的训练数据,不要和训练数据混在一起)。
测试数据集是只用一次的数据集。
训练数据集:训练模型参数
验证数据集:选择模型超参数
非大数据集上通常使用K-折(fold)交叉验证

8.训练误差和泛化误差
训练误差是指,模型在训练数据集上计算得到的误差。
泛化误差是指,模型应用在同样从原始样本的分布中抽取的无限多数据样本时,模型误差的期望。

9.权重衰退
权重衰退通过L2正则项使得模型参数不会过大,从而控制模型复杂度。
正则项权重是控制模型复杂度的超参数。

2022.4.3

1.丢弃法(dropout)
丢弃法将一些输出项随机置0来控制模型复杂度,常作用在多层感知机的隐藏层输出上,丢弃概率是控制模型复杂度的超参数。
(在训练过程中,在计算后续层之前向网络的每一层注入噪声。因为当训练一个有多层的深层网络时,注入噪声只会在输入-输出映射上增强平滑性。)
dropout在前向传播过程中,计算每一内部层的同时注入噪声,这已经称为训练神经网络的常用技术。这种方法之所以被称为暂退法,因为我们从表面上看是在训练过程中丢弃一些神经元。在整个训练过程中的每一次迭代中,标准暂退法包括在计算下一层之前将当前层中的一些节点置0。

net = nn.Sequential(nn.Flatten(),
        nn.Linear(784, 256),
        nn.ReLU(),
        # 在第一个全连接层之后添加一个dropout层
        nn.Dropout(dropout1),
        nn.Linear(256, 256),
        nn.ReLU(),
        # 在第二个全连接层之后添加一个dropout层
        nn.Dropout(dropout2),
        nn.Linear(256, 10))

def init_weights(m):
    if type(m) == nn.Linear:
        nn.init.normal_(m.weight, std=0.01)

net.apply(init_weights);

对于深度学习框架的高级API(上面用的pytorch),我们只需在每个全连接层之后添加一个dropout层,将暂退概率作为唯一的参数传递给它的构造函数,在训练时,dropout层将根据指定的暂退概率随即丢弃上一层的输出(相当于下一层的输入)。在测试时,dropout层仅传递数据。

2.前向传播
前向传播(forward propagation或forward pass)指的是:按顺序(从输入层到输出层)计算和存储神经网络中每层的结果。
动手学深度学习记录_第4张图片
3.反向传播
(backward propagation或backpropagation)指的是计算神经网络参数梯度的方法。简言之,该方法根据微积分中的链式规则,按相反的顺序从输出层到输入成遍历网络。该算法存储了计算某些参数梯度时所需的任何中间变量(偏导数)。
在训练神经网络时,前向传播和反向传播相互依赖。对于前向传播,我们沿着依赖的方向遍历计算图并计算其路径上的所有变量。然后将这些用于反向传播,其中计算顺序与计算图的相反。
在初始化模型参数后,我们交替使用前向传播和反向传播,利用反向传播给出的梯度来更新模型参数。反向传播重复利用前向传播中存储的中间值,以避免重复计算。

4.梯度消失
参数更新过小,在每次更新时几乎不会移动,导致模型无法学习。
不管如何选择学习率,训练没有进展;对于底部层尤为严重,仅仅顶部层训练得较好,无法让神经网络更深。

5.层和块
一个块可以由许多层组成;一个块可以由许多块组成。块可以包含代码。块负责大量的内部处理,包括参数初始化和反向传播。层和块的顺序连接由sequential块处理。

6.GPU
在pytorch中,CPU和GPU可以用torch.device(‘cpu’)和torch.device(‘cuda’)表示。
深度学习框架要求计算的所有输入数据都在同一设备上,无论是CPU还是GPU。

7.卷积层
卷积层将输入和核矩阵进行交叉相关,加上偏移后得到输出。核矩阵和偏移是可学习的参数,核矩阵的大小是超参数。

8.填充和步幅
填充和步幅是卷积层的超参数,填充在输入周围添加额外的行/列,来控制输出形状的减少量。步幅是每次滑动核窗口时的行/列的步长,可以成倍地减少输出形状。

2022.4.5

1.多输入多输出通道
当输入包含多个通道时,需要构造一个与输入数据具有相同输入通道数地卷积核,以便与输入数据进行互相关运算。
随着神经网络层数地加深,我们常会增加输出通道的维数,通过减少空间分辨率以获得更大的通道深度。
多输入多输出通道可以用来扩展卷积层的模型。当以每像素为基础应用时。1×1卷积层相当于全连接层。1×1卷积层通常用于调整网络层的通道数量和控制模型复杂性。

2.汇聚层
对于给定输入元素,最大汇聚层会输出该窗口内的最大值,平均汇聚层会输出该窗口内的平均值。汇聚层的主要优点之一是减轻卷积层对位置的过度敏感。可以指定汇聚层的填充和步幅。使用最大汇聚层以及大于1的步幅,可减少空间维度。汇聚层的输入通道数与输出通道书相同。

2022.4.6

1.VGG网络
与AlexNet、LeNet一样。VGG网络可以分为两部分:第一部分主要由卷积层和汇聚层组成,第二部分由全连接层组成。

2.NiN
AlexNet、LeNet和VGG都有一个共同的设计模式:通过一系列的卷积层与汇聚层来提取空间结构特征;然后通过全连接层对特征的表征进行处理。AlexNet和VGG对LeNet的改进主要在于如何扩大和加深这两个模块。或者,可以想象在这个过程的早期使用全连接层。然而,如果使用了全连接层,可能会完全放弃表征的空间结构。网络中的网络(NiN)提供了一个非常简单的解决方案:在每个像素的通道上分别使用多层感知机。
NiN和AlexNet之间的一个显著区别是NiN完全取消了全连接层。相反,NiN使用一个NiN块,其输出通道数等于标签类别的数量。最后放一个全局平均汇聚层,生成一个对数几率。NiN设计的一个优点是,它显著减少了模型所需参数的数量。然而,在实践中,这种设计有时会增加训练模型的时间。

3.GoogLeNet
在其中,基本的卷积块被称为Inception块。
动手学深度学习记录_第5张图片
GoogLeNet一共使用9个Inception块和全局平均汇聚层的堆叠来生成其估计值。Inception块之间的最大汇聚层可降低维度。
动手学深度学习记录_第6张图片
4.批量归一化
批量归一化固定小批量中的均值和方差,然后学习出适合的偏移和缩放。可以加快收敛速度,但一般不改变模型精度。

5.ReNet
残差映射可以更容易地学习同一函数,例如将权重层中的参数近似为0。利用残差块可以训练出一个有效的深层神经网络:输入可以通过层间的残余连接更快地向前传播。

2022.4.7

1.数据增广
数据增广通过变形数据来获取多样性从而使得模型泛化性能更好。行间图片增广包括翻转、切割、变色。

2.微调
神经网络通常学习有层次地特征表示:低层次地特征更加通用,高层次的特征则更跟数据集相关。可以固定底部一些层的参数,不参与更新。
微调通过使用在大数据上得到的预训练好的模型来初始化模型权重来完成提升精度。预训练模型质量很重要。微调通常速度更快、精度更高。
a.在源数据集上预训练神经网络模型,即源模型
b.创建一个新的神经网络模型,即目标模型。这将复制源模型上的所有模型设计及其参数(输出层除外)。我们假定这些模型参数包含从源数据集中学到的知识,这些知识也将适用于目标数据集。我们还假设源模型的输出层与源数据集的标签密切相关;因此不在目标模型中使用该层。
c.向目标模型添加输出层,其输出数是目标数据集中的类别数。然后随机初始化该层的模型参数。
d.在目标数据集上训练目标模型。输出层将从头开始进行训练,而所有其他层的参数将根据源模型的参数进行微调。
动手学深度学习记录_第7张图片


总结:

大概把视频过了一遍,代码也没跟着敲,公式也没跟着推导,仅仅是过了一遍最基本的东西,也觉得好吃力。
学习没有捷径。
虽然很挫败,但希望能愈挫愈勇吧。


你可能感兴趣的:(深度学习记录,深度学习,学习)