李宏毅苹果书读书学习笔记
学习目标:
- Task 1 《深度学习详解》- 1.1 通过案例了解机器学习
- Task 2 《深度学习详解》- 1.2 了解线性模型
- Task 3 《深度学习详解》- 2 机器学习框架&实践攻略
学习内容:
欢迎去大家各大电商平台选购纸质版苹果书《深度学习详解》
基于上述书籍拓展
引用内容为书本原话 图片基本上来源于书中
我以自问自答的方式输出内容
Task 1 通过案例了解机器学习
机器学习(Machine Learning,ML)和深度学习(Deep Learning,DL)的基本概念
什么是机器学习
人工智能的一个分支。机器学习范畴比人工智能概念略小,深度学习的底层是神经网络。机器学习是指用计算机模拟人类学习行为的的技术用来从已知的数据中获取新的知识。
机器学习,顾名思义,机器具备有学习的能力。具体来讲,机器学习就是让机器具备找一个函数的能力。机器具备找函数的能力以后,它可以做很多事。
比如语音识别,机器听一段声音,产生这段声音对应的文字。我们需要的是一个函数,该函数的输入是声音信号,输出是这段声音信号的内容。
就是让机器的输入映射到某个函数之后可以得到输出
什么是回归(regression)
随着要找的函数不同,机器学习有不同的类别。假设要找的函数的输出是一个数值,一个标量(scalar),这种机器学习的任务称为回归
机器要找一个函数 f,其输入是可能是种种跟预测 PM2.5 有关的指数,包括今天的 PM2.5 的数值、平均温度、平均的臭氧浓度等等,输出是明天中午的 PM2.5的数值,找这个函数的任务称为回归(regression)
机器要找一个函数f(x),其输入是可能是与预测目标有关的数值x,输出是对于下一次的预测值f(x),找这个函数的任务称为回归(regression)。
隐藏任务①: 找出本篇中形如回归(regression)加粗字体的术语,并用自己的话进行解释,列成表格,与学习群的其他小伙伴讨论你的理解和搜索到的相关案例
术语 | 解释 |
---|---|
分类 | 将数据划分为多个离散的类别的任务,预测输入的样本所属的类别 |
回归 | 通过对输入数据进行学习,建立一个连续的函数关系,预测数值型的输出结果 |
机器学习 | 一种从数据中自动学习模式和模型的方法,使计算机能够根据之前的经验来进行预测或决策 |
深度学习 | 一种机器学习的子领域,通过模拟人脑的神经网络结构,对大规模数据进行学习和表达复杂模式 |
损失 | 衡量预测的输出与实际值之间的差异的函数,用于评估模型的训练效果 |
梯度下降 | 一种优化算法,通过反复迭代的方式,沿着目标函数的负梯度方向调整模型参数的值,以最小化损失函数 |
什么是分类(classification)
分类任务要让机器做选择题。人类先准备好一些选项,这些选项称为类别(class),现在要找的函数的输出就是从设定好的选项里面选择一个当作输出,该任务称为分类。
举个例子,每个人都有邮箱账户,邮箱账户里面有一个函数,该函数可以检测一封邮件是否为垃圾邮件。分类不一定只有两个选项,也可以有多个选项。
根据某些特征把不同数据分成不同的类别。
什么是结构化学习
机器不只是要做选择题或输出一个数字,而是产生一个有结构的物体,比如让机器画一张图,写一篇文章。这种叫机器产生有结构的东西的问题称为结构化学习。
就是根据输入的东西的某种规律生产某种相似结构的东西
机器学习找函数的三个步骤
隐藏任务③:找出机器学习找函数的3个步骤!并查找资料,交叉佐证这些步骤。
机器学习找函数的过程,分成3个步骤。
第1个步骤是写出一个带有未知参数的函数f
,其能预测未来观看次数。
y = b + w ∗ x1,而 b 跟 w 是未知的。
带有未知的参数(parameter)的函数称为模型(model)。
模型在机器学习里面,就是一个带有未知的参数的函数,特征(feature) $x_1$ 是这个函数里面已知的,它是来自于后台的信息,2 月 25 日点击的总次数是已知的,而 w 跟 b 是未知的参数。
w 称为权重(weight),b 称为偏置(bias)。
第2个步骤是定义损失(loss),损失也是一个函数。
估测的值跟实际的值之间的差距,其实有不同的计算方法,计算 y 与 yˆ 之间绝对值的差距,如式 (1.6) 所示,称为平均绝对误差(Mean Absolute Error,MAE)
如果算 y 与 yˆ 之间平方的差距,如式 (1.7) 所示,则称为均方误差(Mean SquaredError,MSE)。
有一些任务中 y 和 yˆ 都是概率分布,这个时候可能会选择交叉熵(cross entropy),这个是机器学习的第 2 步。
交叉熵是信息论中用来度量两个概率分布之间差异的一种方法。在机器学习中,交叉熵经常被用来作为损失函数,用来度量预测结果与真实结果之间的差异。
对于分类问题,交叉熵可以用来度量预测结果的概率分布与真实结果的概率分布之间的差异。交叉熵的计算公式如下:
$$H(p,q) = -∑ p(x) * log(q(x))$$
其中,p(x)
表示真实结果的概率分布,q(x)
表示预测结果的概率分布。
交叉熵的值越小,表示预测结果与真实结果越接近,模型的性能也越好。因此,通过最小化交叉熵,可以优化模型的预测能力。
在深度学习中,交叉熵通常作为损失函数与激活函数一起使用,用来训练神经网络模型。通过反向传播算法,可以根据交叉熵的值来调整模型的参数,使得模型的预测结果与真实结果更加接近。
机器学习的第 3 步:解一个最优化的问题。
找一个
w
跟b
,把未知的参数找一个数值出来,看代哪一个数值进去可以让损失 L 的值最小,就是要找的w
跟b
,这个可以让损失最小的w
跟b
称为w∗
跟b∗
代表它们是最好的一组w
跟b
,可以让损失的值最小。
梯度下降(gradient descent)是经常会使用优化的方法。
试了不同的参数,计算它的损失,画出来的等高线图称为误差表面(error surface)。
在这个等高线图上面,越偏红色系,代表计算出来的损失越大,就代表这一组 w 跟 b 越差。如果越偏蓝色系,就代表损失越小,就代表这一组 w 跟 b 越好,拿这一组 w 跟 b,放到函数里面,预测会越精准。
学习率(learning rate)η 也会影响步伐大小。
学习率是自己设定的,如果 η 设大一点,每次参数更新就会量大,学习可能就比较快。如果 η 设小一点,参数更新就很慢,每次只会改变一点点参数的数值。
这种在做机器学习,需要自己设定,不是机器自己找出来的,称为超参数(hyperparameter)。
为什么损失可以是负的?
梯度下降有一个很大的问题
梯度下降有一个很大的问题,没有找到真正最好的解,没有找到可以让损失最小的 w。
在图 1.4 所示的例子里面,把 w 设定在最右侧红点附近这个地方可以让损失最小。但如果在梯度下降中,$w^0$ 是随机初始的位置,也很有可能走到 wT 这里,训练就停住了,无法再移动 w 的位置。右侧红点这个位置是真的可以让损失最小的地方,称为全局最小值(global minima),而 wT 这个地方称为局部最小值(local minima),其左右两边都比这个地方的损失还要高一点,但是它不是整个误差表面上面的最低点。
推广到多参数(w,b)的话
假设有两个参数,随机初始值为 $w^0$, $b^0$。要计算 w, b 跟损失的微分,计算在 w = $w^0$ 的位置,b = $b^0$ 的位置,要计算 w 对 L 的微分,计算 b 对 L 的微分计算完后更新 w 跟 b,把 $w^0$ 减掉学习率乘上微分的结果得到 ,把 $b^0$ 减掉学习率乘上微分的结果得到 $b^1$。
就是反复同样的步骤,就不断的更新
w
跟b
,期待最后,可以找到一个最好的w
,w∗ 跟最好的b∗
. 如图 1.5 所示,随便选一个初始的值,先计算一下w
对 L 的微分,跟计算一下b
对 L 的微分,接下来更新w
跟b
,更新的方向就是∂L/∂w
,乘以 η 再乘以一个负号,∂L/∂b,算出这个微分的值,就可以决定更新的方向,可以决定w
要怎么更新。把w
跟b
更新的方向结合起来,就是一个向量,就是红色的箭头,再计算一次微分,再决定要走什么样的方向,把这个微分的值乘上学习率,再乘上负号,我们就知道红色的箭头要指向那里,就知道如何移动w
跟b
的位置,一直移动,期待最后可以找出一组不错的w
,b
。
Task 2 了解线性模型
线性模型
书中举例了一个预测观看人数的例子
每隔 7 天它一个循环,如果一个模型参考前 7 天的数据,把 7天前的数据,直接复制到拿来当作预测的结果,也许预测的会更准也说不定,所以我们就要修改一下模型。通常一个模型的修改,往往来自于对这个问题的理解,即领域知识。
机器学习领域的领域知识是指机器学习算法、技术和应用方面的专业知识。
包括机器学习算法、数据预处理、特征工程、模型评估和选择的知识。
这些模型都是把输入的特征 x 乘上一个权重,再加上一个偏置就得到预测的结果,这样的模型称为线性模型(linear model)。
分段线性曲线
红色的曲线可以看作是一个常数再加上一群 Hard
Sigmoid
函数。HardSigmoid
函数的特性是当输入的值,当 x 轴的值小于某一个阈值(某个定值)的时候,大于另外一个定值阈值的时候,中间有一个斜坡。所以它是先水平的,再斜坡,再水平的。所以红色的线可以看作是一个常数项加一大堆的蓝色函数(Hard Sigmoid)。常数项设成红色的线跟 x 轴的交点一样大。
常数项怎么加上蓝色函数后,变成红色的这一条线?
- 蓝线 1 函数斜坡的起点,设在红色函数的起始的地方,第 2 个斜坡的终点(最高点)|(第 1 个蓝色函数斜坡的终点) 设在第一个转角处,让第 1 个蓝色函数的斜坡和红色函数的斜坡的斜率是一样的,这个时候把 线0+线1 就可以得到红色曲线左侧的线段。
- 再加第 2 个蓝色的函数,所以第2 个蓝色函数的斜坡就在红色函数的第一个转折点到第 2 个转折点之间,让第 2 个蓝色函数的斜率跟红色函数的斜率一样,这个时候把 线0+线1+线2,就可以得到红色函数左侧和中间的线段。
- 接下来第 3 个部分,第 2 个转折点之后的部分,就加第 3 个蓝色的函数,第 3 个蓝色的函数坡度的起始点设的跟红色函数转折点一样,蓝色函数的斜率设的跟红色函数斜率一样
- 接下来把 线0+线1+线2+线3全部加起来,就得到完整红色的线。
(线0、线1、线2、线3 为图1.8中线段)
所以红色线,即分段线性曲线(piecewise linear curve)可以看作是一个常数,再加上一堆蓝色的函数。
大量不同的蓝色函数,加上一个常数以后就可以组出任意的分段线性曲线。
如果分段线性曲线越复杂,转折的点越多,所需的蓝色函数就越多。
反之,越多蓝色函数的话可以组成越复杂的分段线性曲线。
可以在这样的曲线(图1.9)上面,先取一些点并连起来变成一个分段线性曲线。这个分段线性曲线跟非常接近原来的曲线,如果点取的够多或点取的位置适当,分段线性曲线就可以逼近这一个连续的曲线。
所以可以用分段线性曲线去逼近任何的连续的曲线,而每个分段线性曲线都可以用一大堆蓝色的函数组合起来。也就是说,只要有足够的蓝色函数把它加起来,就可以变成任何连续的曲线。
我们可以用任意多的蓝色函数来模拟出曲线。
极限的思路来看:就是只有取得足够多的点并且相连接,就可以无限多的直线代替曲线。
如何表示方程
如果 x1 的值,趋近于无穷大的时候,e−(b+wx1) 这一项就会消失,当 x1 非常大的时候,这一条就会收敛在高度为 c 的地方。如果 x1 负的非常大的时候,分母的地方就会非常大,y的值就会趋近于 0。
所以可以用这样子的一个函数逼近这一个蓝色的函数,即Sigmoid
函数,Sigmoid
函数就是 S 型的函数。
因为它长得是有点像是 S 型,所以叫它Sigmoid
函数。为了简洁,去掉了指数的部分,蓝色函数的表达式为
$$y = cσ(b + wx1) (1.15)$$
所以可以用
Sigmoid
函数逼近 HardSigmoid
函数。
$$
y = \frac{c}{ 1+ e^{-(b+wx1)}}
$$
调整这里的
b
、w
和c
可以制造各种不同形状的Sigmoid
函数, 用各种不同形状的 Sigmoid函数去逼近 HardSigmoid
函数。
如图 1.11 所示,如果改 w,就会改变斜率,就会改变斜坡的坡度。如果改了
b
,就可以把这一个Sigmoid
函数左右移动;如果改c
,就可以改变它的高度。所以只要有不同的w
不同的b
不同的c
,就可以制造出不同的Sigmoid
函数,把不同的Sigmoid
函数叠起来以后就可以去逼近各种不同的分段线性函数;分段线性函数可以拿来近似各种不同的连续的函数。
我们可以不只用一个特征
x1
,可以用多个特征代入不同的c, b, w
,组合出各种不同的函数,从而得到更有 灵活性(flexibility) 的函数,如图 1.13 所示。
用j
来代表特征的编号。如果要考虑前 28 天,j
就是 1 到 28。
无论是拿行或拿列都可以,把 W 的每一列或每一行“拼”成一个长的向量,把 b, cT, b” 拼” 上来,这个长的向量直接用 θ 来表示。
所有的未知的参数,一律统称 θ。
优化是找一个可以让损失最小的参数,是否可以穷举所有可能的未知参数的值?
刚才的例子里面有 3 个 Sigmoid,为什么是 3 个,能不能 4 个或更多?
定义损失
之前是
L(w, b)
,因为 w 跟 b 是未知的。
现在未知的参数很多了,再把它一个一个列出来太累了,所以直接用 θ 来统设所有的参数,所以损失函数就变成L(θ)
。
损失函数能够判断
θ
的好坏,其计算方法跟刚才只有两个参数的时候是一样的。
先给定θ
的值,即某一组W, b, cT, b
的值,再把一种特征x
代进去,得到估测出来的y
,再计算一下跟真实的标签之间的误差e
。把所有的误差通通加起来,就得到损失。
要找到 $θ$让损失越小越好,可以让
损失最小的一组 $θ$称为 $θ_∗$。一开始要随机选一个初始的数值 $θ_0$。
接下来计算每一个未知的参数对 L 的微分,得到向量 $g$,即可以让损失变低的函数
假设有 1000 个参数,这个向量的长度就是 1000,这个向量也称为梯度,$∇L$代表梯度。
L($θ_0$) 是指计算梯度的位置,是在 θ 等于 $θ_0$ 的地方。
计算出 g 后,接下来跟新参数,$θ_0$ 代表它是一个起始的值,它是一个随机选的起始的值,代表 $θ_1$ 更新过一次的结果,$θ^0_2$ 减掉微分乘以,减掉 η 乘上微分的值,得到 $θ^1_2$,以此类推,就可以把 1000 个参数都更新了。
假设参数有 1000 个,$θ_0$ 就是 1000 个数值,1000 维的向量,g 是 1000 维的向量,$θ_1$ 也是 1000 维的向量。 整个操作就是这样,由 $θ_0$ 算梯度,根据梯度去把 $θ_0$ 更新成 $θ_1$,再算一次梯度,再根据梯度把 $θ_1$ 再更新成 $θ_2$,再算一次梯度把 $θ_2$ 更新成 $θ_3$,以此类推,直到不想做。
或者计算出梯度为 0 向量,导致无法再更新参数为止,不过在实现上几乎不太可能梯度为 0,通常会停下来就是我们不想做了。
实现上的细节
批量(batch)
实现上有个细节的问题,实际使用梯度下降的时候,如图 1.17 所示,会把 N 笔数据随机分成一个一个的批量(batch),一组一组的。
在深度学习中,批量(Batch) 指的是计算一次成本(cost) 需要的输入数据个数。当数据集比较大时,一次性处理所有样本在计算和存储上会有困难,因此会采用一次输入一定量的样本来进行训练。
如果数据集比较小,可以将全体数据看做一个批量,即把数据集中每个样本都计算损失(loss)然后取其平均值当做成本(cost)。
批量学习的优点:能更好地代表样本总体从而更准确地确定下降方向,对梯度向量有更精确的估计等。
回合(epoch)
把所有的批量都看过一次,称为一个回合(epoch),每一次更新参数叫做一次更新。更新跟回合是不同的东西。每次更新一次参数叫做一次更新,把所有的批量都看过一遍,叫做一个回合。
回合(Epoch) 指的是遍历全部数据集一次。
在一个回合中,模型会对数据集中的所有样本都进行处理和学习。
模型变形
其实还可以对模型做更多的变形,不一定要把 Hard Sigmoid 换成 Soft Sigmoid。
HardSigmoid 可以看作是两个修正线性单元(Rectifed Linear Unit, ReLU) 的加总, ReLU 的图像有一个水平的线,走到某个地方有一个转折的点,变成一个斜坡, 其对应的公式为
$$
c ∗ max(0, b + wx1)
$$
输出0或b+ w1为正的。
把两个 ReLU 叠起来就可以变成 Hard 的 Sigmoid,想要用 ReLU,就把 Sigmoid 的地方,换成
$$max(0, b_i + w_{ij}x_{j})$$
要合成 i 个 Hard Sigmoid, 需要 i 个 Sigmoid,如果 ReLU 要做到一样的事情,则需要 2i 个 ReLU,因为 2 个 ReLU 合 起来才是一个 Hard Sigmoid。因此表示一个 Hard 的 Sigmoid 不是只有一种做法。
激活函数(activation function)
在机器学习里面, Sigmoid 或 ReLU 称为激活函数(activation function)。
Sigmoid 跟 ReLU 是最常见的激活函数,接下来的实
验都选择用了 ReLU,显然 ReLU 比较好,实验结果如图 1.20 所示。
连续使用 10 个 ReLU作为模型,跟用线性模型的结果是差不多的
但连续使用 100 个 ReLU 作为模型,结果就有显著差别了, 100 个 ReLU 在训练数据上的损失就可以从 320 降到 280,有 100 个 ReLU 就可以制造比较复杂的曲线,本来线性就是一直线,但 100 个 ReLU 就可以产生 100 个折线的函数,在测试数据上也好了一些。
接下来使用 1000 个 ReLU 作为模型,在训练数据上损失更低了一些,但是在没看过的数据上,损失没有变化。
Sigmoid 跟 ReLU 是最常见的激活函数
继续改模型
如图 1.21 所示,从 x 变成 a,就是把 x 乘上 w 加 b,再通过 Sigmoid 函数。
不一定要通过Sigmoid 函数,通过 ReLU 也可以得到 a,同样的事情再反复地多做几次。 所以可以把 x 做这一连串的运算产生 a,接下来把 a做这一连串的运算产生 a′。 反复地多做的次数又是另外一个超参数。
注意, w, b 和 w′, b′ 不是同一个参数,是增加了更多 的未知的参数。
深度学习
如图 1.24 所示, Sigmoid 或 ReLU 称为神经元(neuron),很多的神经元称为神经网络(neural network)。
每一排称为一层,称为隐藏层(hiddenlayer),很多的隐藏层就“深”,这套技术称为深度学习。
人们把神经网络越叠越多越叠越深
残差网络(Residual Network, ResNet) 有 152 层,错误率降到 3.57%。
如图 1.25 所示。在训练数据和测试数据上的结果是不一致的,这种情况称为过拟合(overftting)。
Task 3 机器学习框架&实践攻略
机器学习框架
定义函数fθ(x)
定义一个函数$f_θ(x)$,其中θ表示模型中的所有未知参数。该函数接收输入特征x,并根据参数θ计算输出。
定义损失函数
定义一个损失函数,用于评估给定参数组合θ的好坏程度。损失函数的选择依赖于具体的问题和模型类型。常见的损失函数包括均方误差、交叉熵等。
优化问题求解
的目标是寻找一个最优的参数组合θ∗,使得损失函数的值最小化。这可以通过求解一个优化问题来实现。常用的优化算法包括梯度下降、牛顿法等。
应用于测试数据
找到最优参数θ∗后,可以将其应用于测试数据。将测试集中的输入特征x带入函数$f_θ(x)$,得到预测结果。
提交到Kaggle进行评估
将预测结果提交到Kaggle等竞赛平台进行评估。该平台会根据预测结果与真实值之间的差异进行评分,以衡量模型的性能。
总结一下就是定义一个函数$f_θ(x)$,其中θ代表模型中的未知参数。然后,定义一个损失函数来评估参数组合的好坏程度。然后,通过优化问题求解找到最优参数θ∗
,使损失函数最小化。然后,将最优参数应用于测试数据,得到预测结果。最后,将预测结果提交到评估平台进行性能评估。
实践方法论
为什么会出现模型偏差
模型偏差可能会影响模型训练。
假设模型过于简单,一个有未知参数的函数代$θ_1$ 得到一个函数$f_θ1(x)$,同理可得到另一个函数 $f_θ2(x)$,把所有的函数集合起来得到一个函数的集合。但是该函数的集合太小了,没有包含任何一个函数,可以让损失变低的函数不在模型可以描述的范围内。
如何解决
- 用深度学习,增加更多的灵活性。
- 所以如果模型的灵活性不够大,可以增加更多特征,可以设一个更大的模型,可以用深度学习来增加模型的灵活性,这是第一个可以的解法。
- 但是并不是训练的时候,损失大就代表一定是模型偏差,可能会遇到另外一个问题:优化做得不好。
优化问题
一般只会用到梯度下降进行优化,这种优化的方法很多的问题。
比如可能会卡在局部最小值的地方,无法找到一个真的可以让损失很低的参数,如图 2.3(a) 所示。如图 2.3(b) 所示蓝色部分是模型可以表示的函数所形成的集合,可以把 θ 代入不同的数值,形成不同的函数,把所有的函数通通集合在一起,得到这个蓝色的集合。这个蓝色的集合里面,确实包含了一些函数,这些函数它的损失是低的。
但问题是梯度下降这一个算法无法找出损失低的函数,梯度下降是解一个优化的问题,找到 θ∗ 就结束了。但 θ∗ 的损失不够低。
还是可能会出现卡在局部最小值的地方,仍未能找到真正的最优解
如何判断模型是否足够大?
一个建议判断的方法,通过比较不同的模型来判断模型现在到底够不够大。
很多人看到这张图认为这个代表过拟合,深度学习不奏效, 56 层太深了不奏效,根本就不需要这么深。但个不是过拟合,并不是所有的结果不好,都叫做过拟合。在训练集上, 20 层的网络损失其实是比较低的, 56 层的网络损失是比较高的,如图 2.4(b) 所示,这代表 56 层的网络的优化没有做好,它的优化不给力。
层数多但是反而效果不好,不一定是过拟合,可能是因为它的优化没有做好。
看到一个从来没有做过的问题,可以先跑一些比较小的、比较浅的网络,或甚至用一些非深度学习的方法,比如线性模型、支持向量机(Support Vector Machine,SVM), SVM 可能是比较容易做优化的,它们比较不会有优化失败的问题。
对于一个新的问题可以多种不同的模型综合考量一下。
先跑一个小的模型试一下,在逐步加深模型。
过拟合
为什么会有过拟合这样的情况呢?
举一个极端的例子,这是训练集。
假设根据这些训练集,某一个很废的机器学习的方法找出了一个一无是处的函数。这个一无是处的函数,只要输入 x 有出现在训练集里面,就把它对应的 y 当做输出。如果 x 没有出现在训练集里面,就输出一个随机的值。这个函数啥事也没有干,其是一个一无是处的函数,但它在训练数据上的损失是 0。把训练数据通通丢进这个函数里面,它的输出跟训练集的标签是一模一样的,所以在训练数据上面,这个函数的损失可是 0 呢,可是在测试数据上面,它的损失会变得很大,因为它其实什么都没有预测,这是一个比较极端的例子,在一般的情况下,也有可能发生类似的事情。
灵活性太大带来的问题
如图 2.6 所示,举例来说,假设输入的特征为 x,输出为 y, x 和 y 都是一维的。
x 和 y之间的关系是 2 次的曲线,曲线用虚线来表示,因为通常没有办法,直接观察到这条曲线。我们真正可以观察到的是训练集,训练集可以想像成从这条曲线上面,随机采样出来的几个点。
模型的能力非常的强,其灵活性很大,只给它这 3 个点。在这 3 个点上面,要让损失低,所以模型的这个曲线会通过这 3 个点,但是其它没有训练集做为限制的地方,因为它的灵活性很大,它灵活性很大,所以模型可以变成各式各样的函数,没有给它数据做为训练,可以产生各式各样奇怪的结果。
如果再丢进测试数据,测试数据和训练数据,当然不会一模一样,它们可能是从同一个分布采样出来的,测试数据是橙色的点,训练数据是蓝色的点。
如何解决过拟合问题
增加数据集,数据增强
给模型一些限制,让模型不要有过大的灵活性。
如图 2.8 所示,要用多限制的模型才会好取决于对这个问题的理解。因为这种模型是自己设计的,设计出不同的模型,结果不同。解决过拟合的问题,要给模型一些限制,最好模型正好跟背后产生数据的过程,过程是一样的就有机会得到好的结果。
如果是深度学习的话,就给它比较少的神经元的数量,本来每层一千个神经元,改成一百个神经元之类的,或者让模型共用参数,可以让一些参数有一样的数值。
全连接网络(fully-connected network) 其实是一个比较有灵活性的架构,而卷积神经网络(Convolutional Neural Network, CNN) 是一个比较有限制的架构。 CNN 是一种比较没有灵活性的模型,其是针对图像的特性来限制模型的灵活性。所以全连接神经网络,可以找出来的函数所形成的集合其实是比较大的, CNN 所找出来的函数,它形成的集合其实是比较小的,其实包含在全连接网络里面的,但是就是因为CNN 给了,比较大的限制,所以 CNN 在图像上,反而会做得比较好。
但也不要给太多的限制。有可能会因为模型太大的限制,大到有了模型偏差的问题。
- 比如早停(early stopping)、正则化(regularization)和丢弃法(dropout
method)。
交叉验证
一种比较合理的选择模型的方法是将训练数据分成训练集和验证集,通常是将90%的数据用作训练集,剩余的10%作为验证集。训练集用于训练模型,验证集用于评估模型的性能。
在训练集上训练出的模型会使用验证集来衡量模型的分数。根据验证集上的分数选择最佳的模型,并将该模型的结果上传到Kaggle等平台上得到公开分数。
这个过程中,使用验证集来选择模型,因此公开测试集的分数可以反映私人测试集的分数。然而,如果这个过程重复太多次,根据公开测试集的结果调整模型太多次,就有可能在公开测试集上过拟合,导致在私人测试集上得到差的结果。
因此,需要在选择模型时找到平衡,避免过度拟合,并注意不要过多地根据公开测试集的结果调整模型。
在选择模型时,常用的方法是将训练数据分成训练集和验证集。训练集用于训练模型,验证集用于评估模型在未知数据上的性能。通常情况下,将大约90%的数据用作训练集,剩余的10%作为验证集。模型在验证集上的表现可以作为选择模型的依据。
然而,在选择模型的过程中需要注意,过多地根据公开测试集上的结果调整模型可能会导致在私人测试集上得到较差的结果,即过拟合的问题。因此,在选择模型时需要找到一个平衡,避免过度拟合模型。
最好的做法,就是用验证损失,最小的直接挑就好了,不要管公开测试集的结果。
在实现上,不太可能这么做,因为公开数据集的结果对模型的选择,可能还是会有些影响的。理想上就用验证集挑就好,有过比较好的基线(baseline) 算法以后,就不要再去动它了,就可以避免在测试集上面过拟合。
k 折交叉验证
用 k 折交叉验证(k-fold cross validation),如图 2.11 所示。 k 折交叉验证就是先把训练集切成 k 等份。在这个例子,训练集被切成 3 等份,切完以后,拿其中一份当作验证集,另外两份当训练集,这件事情要重复 3 次。即第一份第 2 份当训练,第 3 份当验证;第一份第 3 份当训练,第 2 份当验证;第一份当验证,第 2 份第 3 份当训练
不匹配
反常的情况。这种情况应该算是另外一种错误的形式,这种错误的形式称为不匹配(mismatch)
不匹配跟过拟合其实不同,一般的过拟合可以用搜集更多的数据来克服,但是不匹配是指训练集跟测试集的分布不同,训练集再增加其实也没有帮助了。
增加数据也不能让模型做得更好,所以这种问题要怎么解决,匹不匹配要看对数据本身的理解了,我们可能要对训练集跟测试集的产生方式有一些理解,才能判断它是不是遇到了不匹配的情况
🚩学习目标
- Task 1.1 《深度学习详解》3.1 局部极小值与鞍点
- Task 1.2 《深度学习详解》3.2 批量和动量
- Task 2.1 《深度学习详解》3.3&4&5 自适应学习率
- Task 2.2 《深度学习详解》3.6 分类
- Task 2.3 (实践任务):HW3(CNN)
- Task 3.1 《深度学习详解》3.7 批量归一化
- Task 3.2 《深度学习详解》4.1&2&3&4 卷积神经网络-上
- Task 3.3 《深度学习详解》3.5&6&7&8 卷积神经网络-下
- (选修)《深度学习详解》6.1&2 自注意力机制的原理
🚩学习内容
欢迎去大家各大电商平台选购纸质版苹果书《深度学习详解》
基于上述书籍拓展
引用内容为书本原话 图片基本上来源于书中
我以自问自答的方式输出内容
🚩 Task1.1
🎯为什么优化会失败
收敛在局部极限值与鞍点会导致优化失败。
隐藏任务①:搜索资料,找到一个优化失败的案例,尝试用自己的话描述一遍情况~
深度学习并非万能,遇到这些问题会失败 | 机器之心
📌因非信息梯度导致的失败
原因:如果梯度中的信息很少,使用它来进行学习就无法成功。
例如,研究者从学习随机奇偶校验的简单问题开始,在大约d=30这个程度之后,经过合理时间后也没有观察到优于随机的表现。
研究者使用两个定理对此进行了详细的分析,得出了结论:基于梯度的方法确实不能学会随机奇偶校验和线性周期函数。 此外,不管我们使用哪一类预测算法,只要使用了基于梯度的方法来进行训练,这个结果都成立。
🎯局部极小值与鞍点
我们在做优化的时候经常会发现,随着参数不断更新,训练的损失不会再下降, 但是我们对这个损失仍然不满意。’
达到了临界点
🎯临界点及其种类
过去常见的一个猜想是我们优化到某个地方,这个地方参数对损失的微分为零,如图 3.1所示。图 3.1 中的两条曲线对应两个神经网络训练的过程。当参数对损失微分为零的时候,梯度下降就不能再更新参数了,训练就停下来了,损失不再下降了。
提到梯度为零的时候,大家最先想到的可能就是局部极小值(local minimum)
所以经常有人说,做深度学习时使用梯度下降会收敛在局部极小值,梯度下降不起作用。 但其实损失不是只在局部极小值的梯度是零,还有其他可能会让梯度是零的点,比如鞍点(saddle point) 。鞍点其实就是梯度是零且区别于局部极小值和局部极大值(localmaximum)的点。图 3.2b 红色的点在 y 轴方向是比较高的,在 x 轴方向是比较低的,这就是一个鞍点。鞍点的叫法是因为其形状像马鞍。 鞍点的梯度为零,但它不是局部极小值。 我们把梯度为零的点统称为临界点(critical point)。 损失没有办法再下降,也许是因为收敛在了临界点,但不一定收敛在局部极小值,因为鞍点也是梯度为零的点。
局部较小值点和鞍点都会使得梯度为零,所以梯度为零的点,临界点不一定是局部极小值。
🎯如何判断临界值种类
判断一个临界点到底是局部极小值还是鞍点需要知道损失函数的形状。
虽然无法完整知道整个损失函数的样子,但是如果给定某一组参数,比如$θ^{‘}$,$θ^{‘}$ 附近的 $L(θ)$ 可近似为
$$
L(θ) ≈ L(θ^{‘})+(θ − θ^{′})^T*g +\frac{1}{2}(θ − θ^{′})^T * H(θ − θ^{′}) . (3.1)
$$
式 (3.1) 是泰勒级数近似(Tayler series appoximation)。 其中,第一项 $L(θ)$′ 告诉我们,当 θ 跟 $θ^{′}$很近的时候,$L(θ)$ 应该跟还蛮靠近的;第二项$(θ − θ^{′})^T*g$中,g 代表梯度,它是一个向量,可以弥补$L(θ^{′})$跟 $L(θ)$ 之间的差距。有时候梯度 g 会写成 $∇L(θ^{′})$。$g_i$是向量 g 的第 i 个元素,就是 L 关于 θ 的第 i 个元素的微分,即
$$
g_i =\frac{∂L(θ^{′})}{∂θ_i}.(3.2)
$$
光看 g 还是没有办法完整地描述 ,还要看式 (3.1) 的第三项$\frac{1}{2}(θ − θ^{′})^T * H(θ − θ^{′})$。第三项跟海森矩阵(Hessian matrix)H 有关 。
H 里面放的是 L 的二次微分,它第 i 行,第 j 列的值 $H_{ij}$ 就是把 θ 的第 i 个元素对$L(θ^{′})$作微分,再把 θ 的第 j 个元素对$\frac{∂L(θ^{′})}{∂θ_i}$作微分后的结果,即
$$
H_{ij} =\frac{∂^2L(θ^{′})}{∂θ_i∂θ_j}. (3.3)
$$
在临界点,梯度 g 为零,因此 θ − θ′Tg 为零。所以在临界点的附近,损失函数可被近似为
$$
L(θ) ≈ L(θ^{‘}) +\frac{1}{2}(θ − θ^{′})^T * H(θ − θ^{′}) . (3.1)
$$
我们可以根据$\frac{1}{2}(θ − θ^{′})^T * H(θ − θ^{′})$来判断在 $θ^{′}$附近的误差表面(error surface) 到底长什么样子。
知道误差表面的“地貌”,我们就可以判断 L(θ′) 是局部极小值、局部极大值,还是鞍点。
上述我们通过一系列的转化把损失函数近似的写了出来,可以根据误差表面来判断临界点。
我们用向量 v 来表示$θ − θ^{′} ,(θ − θ^{′})^T * H(θ − θ^{′})$可改写为 $v^TH_v$,有如下三种情况。
- 如果对所有 v,$v^TH_v> 0$ . 这意味着对任意 θ,L(θ) > L(θ′). 只要 θ 在 θ′ 附近,L(θ) 都大于 L(θ′). 这代表 L(θ′) 是附近的一个最低点,所以它是局部极小值。
- 如果对所有 v,$v^TH_v< 0$ . 这意味着对任意 θ,L(θ) < L(θ′),θ′ 是附近最高的一个点,L(θ′) 是局部极大值。
- 如果对于 v, $v^TH_v$ 有时候大于零,有时候小于零。 这意味着在 θ′ 附近,有时候L(θ) > L(θ′),有时候 L(θ) < L(θ′). 因此在 θ′ 附近,L(θ′) 既不是局部极大值,也不是局部极小值,而 是鞍点。
📌更简便的方法来判断 $v^TH_v$ 的正负。
只要看 H的特征值。
- 若 H 的所有特征值都是正的,H 为正定矩阵,则 $v^TH_v$ > 0,临界点是局部极小值。
- 若 H 的所有特征值都是负的,H 为负定矩阵,则 $v^TH_v$ < 0,临界点是局部极大值。
- 若 H 的特征值有正有负,临界点是鞍点。
🎯H 怎么告诉我们怎么更新参数呢?
设 λ 为 H 的一个特征值 λ,u 为其对应的特征向量。对于我们的优化问题,可令 $u =θ − θ^{′}$,则
$$
u^{T}Hu = uT(λu) = λ∥u∥^{2}.
$$
若 λ < 0,则 $λ∥u∥^{2}$ < 0。所以$\frac{1}{2}(θ − θ^{′})^T * H(θ − θ^{′})$ < 0。此时,L(θ) < L(θ′),且沿着 u 的方向更新 θ,损失就会变小。
只要 θ = θ′ + u,沿着特征向量 u 的方向去更新参数,损失就会变小,所以虽然临界点的梯度为零,如果我们是在一个鞍点,只要找出负的特征值,再找出这个特征值对应的特征向量。将其与 θ′ 相加,就可以找到一个损失更低的点。
我们其实只要顺着 u 的方向去更新参数,就可以找到一个比鞍点的损失还要更低的点。
🎯如何逃离鞍点
我们常常会遇到两种情况:损失仍然很高,却遇到了临界点而不再下降;或者损失降得很低,才遇到临界点。
在图 3.6 所示的例子中,最小值比例(=正特征值数量/总特征值数量)最大也不过处于 0.5 ~ 0.6 的范围,代表只有约一半的特征值为正,另一半的特征值为负,代表在所有的维度里面有约一半的路可以让损失上升,还有约一半的路可以让损失下降。
所以从经验上看起来,局部极小值并没有那么常见。 多数的时候,我们训练到一个梯度很小的地方,参数不再更新,往往只是遇到了鞍点。
🚩 Task1.2
🎯什么是批量和动量
实际计算梯度的过程中,我们将数据分成多个批次(batch),每个批次大小为B,即包含B个数据样本。
每次更新参数时,从批次中选取数据计算损失和梯度,并更新参数。完成一次遍历所有批次的过程称为一个回合(epoch)。
为了增加样本的随机性,我们会在划分批次时进行随机打乱(shuffle)。常见的一种做法是在每个回合开始之前重新划分批次,使得每个回合的批次数据都不同。
📌批量大小对梯度下降法的影响
🔧批量梯度下降法(Batch Gradient Descent,BGD)
使用全批量(fullbatch)的数据来更新参数的方法即批量梯度下降法(Batch Gradient Descent,BGD)。
此时模型必须把 20 笔训练数据都看完,才能够计算损失和梯度,参数才能够更新一次。
🔧随机梯度下降法(Stochastic Gradient Descent,SGD),也称为增量梯度下降法
批量大小等于 1,此时使用的方法即随机梯度下降法(Stochastic Gradient Descent,SGD),也称为增量梯度下降法。
批量大小等于 1 意味着只要取出一笔数据即可计算损失、更新一次参数。
如果总共有 20 笔数据,那么在每一个回合里面,参数会更新 20 次。
用一笔数据算出来的损失相对带有更多噪声,因此其更新的方向如图 3.8 所示,是曲曲折折的 。
🔧批量大小与计算时间的关系
当批量大小增加到10000,甚至增加到 60000 的时候,GPU 计算梯度并更新参数所耗费的时间确实随着批量大小的增加而逐渐增长。
大的批量更新比较稳定,小的批量的梯度的方向是比较有噪声的(noisy)。
同一个模型,大的批量大小往往在训练的时候,结果比较差。 这个是优化的问题,大的批量大小优化可能会有问题,小的批量大小优化的结果反而是比较好的。
一个可能的解释如图 3.12 所示,批量梯度下降在更新参数的时候,沿着一个损失函数来更新参数,走到一个局部最小值或鞍点显然就停下来了。
梯度是零,如果不看海森矩阵,梯度下降就无法再更新参数了 。
但小批量梯度下降法(mini-batch gradient descent)每次是挑一个批量计算损失,所以每一次更新参数的时候所使用的损失函数是有差异的。
这种有噪声的更新方式反而对训练其实是有帮助的。其实小的批量也对测试有帮助。
在模型训练的适合小批量梯度下降法的噪声反而使得梯度不容易落在临界点,而且更方便测试。
大的批量跟小的批量的训练准确率(accuracy) 差不多,但就算是在训练的时候结果差不多,测试的时候,大的批量比小的批量差,代表过拟合。
大的批量大小会让我们倾向于走到“峡谷”里面,而小的批量大小倾向于让我们走到“盆地”里面。 小的批量有很多的损失,其更新方向比较随机,其每次更新的方向都不太一样。即使“峡谷”非常窄,它也可以跳出去,之后如果有一个非常宽的“盆地”,它才会停下来。
而小的批量更新的方向比较有噪声的,大的批量更新的方向比较稳定。但是有噪声的更新方向反而在优化的时候有优势,而且在测试的时候也会有优势。
所以大的批量跟小的批量各有优缺点,批量大小是需要去调整的超参数。
🎯什么是动量法
动量法(momentum method)是另外一个可以对抗鞍点或局部最小值的方法。
但是在物理的世界里,一个球如果从高处滚下来,就算滚到鞍点或鞍点,因为惯性的关系它还是会继续往前走。因此在物理的世界里面,一个球从高处滚下来的时候,它并不一定会被鞍点或局部最小值卡住,如果将其应用到梯度下降中,这就是动量。
📌对比一般的梯度下降法和动量法
引入动量后,每次在移动参数的时候,不是只往梯度的反方向来移动参数,而是根据梯度的反方向加上前一步移动的方向决定移动方向。
图 3.16 中红色虚线方向是梯度的反方向,蓝色虚线方向是前一次更新的方向,蓝色实线的方向是下一步要移动的方向。 把前一步指示的方向跟梯度指示的方向相加就是下一步的移动方向。
动量法引入了动量的概念,通过累积之前的梯度信息来加速学习过程。动量法在更新参数时不仅考虑当前的梯度,还考虑了之前累积的梯度。
🔧动量法的主要优点
可以加速收敛速度,特别是在目标函数存在高度非均向性的情况下。
可以帮助跳出局部最小值,并具有一定的平滑效果。
🔧动量法也存在一些缺点。
动量法引入了额外的超参数,需要人工调整。
如果动量系数设置过大,可能会导致震荡;如果设置过小,则可能会导致收敛速度变慢。
动量的简单例子如图 3.17 所示。红色表示负梯度方向,蓝色虚线表示前一步的方向,蓝色实线表示真实的移动量。 一开始没有前一次更新的方向,完全按照梯度给指示往右移动参数。负梯度方向跟前一步移动的方向加起来,得到往右走的方向。一般梯度下降走到一个局部最小值或鞍点时,就被困住了。但有动量还是有办法继续走下去,因为动量不是只看梯度,还看前一步的方向。即使梯度方向往左走,但如果前一步的影响力比梯度要大,球还是有可能继续往右走,甚至翻过一个小丘,也许可以走到更好的局部最小值,这就是动量有可能带来的好处 。
🚩Task 2.1
🎯什么是自适应学习率
临界点其实不一定是在训练一个网络的时候会遇到的最大的障碍。
图 3.18中的横坐标代表参数更新的次数,竖坐标表示损失。
一般在训练一个网络的时候,损失原来很大,随着参数不断的更新,损失会越来越小,最后就卡住了,损失不再下降。
到临界点损失不在下降。
我们走到临界点的时候,意味着梯度非常小,但损失不再下降的时候,梯度并没有真的变得很小,图 3.19 给出了示例。
图 3.19 中横轴是迭代次数,竖轴是梯度的范数(norm),即梯度这个向量的长度。
随着迭代次数增多,虽然损失不再下降,但是梯度的范数并没有真的变得很小。
范数(norm)是 梯度这个向量的长度。
图 3.20是误差表面,梯度在山谷的两个谷壁间,不断地来回“震荡”,这个时候损失不会再下降,它不是真的卡到了临界点,卡到了鞍点或局部最小值。
在局部最小值或鞍点,只是单纯的损失无法再下降。
但它的梯度仍然很大,只是损失不一定再减小了。
我们可以试着把学习率设小一点
调学习率从 10−2 调到 10−7 的结果如图 3.22(b)所示,参数不再“震荡”了。参数会滑到山谷底后左转,但是这个训练永远走不到终点,因为学习率已经太小了。
AB段的坡度很陡,梯度的值很大,还能够前进一点。左拐以后,BC 段的坡度已经非常平坦了,这种小的学习率无法再让训练前进。
事实上在 BC 段有 10 万个点(10 万次更新),但都无法靠近局部最小值,所以显然就算是一个凸的误差表面,梯度下降也很难训练。
在梯度下降里面,所有的参数都是设同样的学习率,这显然是不够的,应该要为每一个参数定制化学习率,即引入自适应学习率(adaptive learning rate) 的方法,给每一个参数不同的学习率。
🎯AdaGrad
AdaGrad(Adaptive Gradient) 是典型的自适应学习率方法,其能够根据梯度大小自动调整学习率。 AdaGrad可以做到梯度比较大的时候,学习率就减小,梯度比较小的时候,学习率就放大。
📌参数更新和学习率调整
🔧基本参数更新公式
在第$t$个迭代中,参数$\theta^i$的更新公式为:
$$
\theta_{t+1}^i \leftarrow \theta_t^i \eta g_t^i \quad (3.14)
$$
其中$g_t^i$是在$\theta = \theta_t$时,参数$\theta^i$对损失$L$的微分。
🔧梯度计算
梯度$g_t^i$的计算公式为:
$$
g_t^i = \left.\frac{\partial L}{\partial \theta^i}\right|_{\theta=\theta_t} \quad (3.15)
$$
🔧定制化学习率
将学习率$\eta$调整为参数相关的学习率$\frac{\eta}{\sigma_t^i}$:
$$
\theta_{t+1}^i \leftarrow \theta_t^i \frac{\eta}{\sigma_t^i} g_t^i \quad (3.16)
$$
其中$\sigma_t^i$与参数$i$和迭代$t$相关。
🔧梯度的均方根
参数的更新过程,其中$\sigma_0^i$的计算为:
$$
\sigma_0^i = \sqrt{\left(g_0^i\right)^2} = \left|g_0^i\right| \quad (3.18)
$$
🔧参数更新的迭代过程
第二次参数更新:
$$
\theta_2^i \leftarrow \theta_1^i \frac{\eta}{\sigma_1^i} g_1^i \quad (3.19)
$$
其中$\sigma_1^i$是过去所有计算出来的梯度的平方的平均再开根号。
🔧迭代更新公式
第$t+1$次更新参数的公式为:
$$
\theta_{t+1}^i \leftarrow \theta_t^i \frac{\eta}{\sigma_t^i} g_t^i \quad \sigma_t^i = \sqrt{\frac{1}{t+1}\sum_{i=0}^t\left(g_t^i\right)^2} \quad (3.22)
$$
🔧参数更新的动态调整
根据梯度的不同,每一个参数的梯度的不同,自动调整学习率的大小,使得参数更新更加有效。
🔧参数更新的可视化
图 3.24 展示了两个参数$\theta^1$和$\theta^2$的更新情况,其中$\theta^1$坡度小,$\theta^2$坡度大。根据公式 (3.22),不同的梯度大小导致不同的学习率调整,从而影响参数更新的步伐。
📌AdaGrad算法的问题
当模型接近最优点时,由于在某些方向上梯度非常小,AdaGrad算法会导致学习率变得非常大,从而可能出现“爆炸”现象,使得模型突然偏离最优路径。累积的 $\sigma_t^i$值在梯度较小的方向上会变得非常大,导致学习步伐过大。
🎯RMSProp
RMSprop 是一种自适应学习率的优化算法,由 Geoffrey Hinton 在 Coursera 深度学习课程中提出。
📌算法的步骤
🔧初始梯度的均方根
RMSprop 的第一步与 Adagrad 相同,计算初始梯度的绝对值作为均方根:
$$
\sigma_0^i = \sqrt{\left(g_0^i\right)^2} = \left|g_0^i\right| \quad (3.23)
$$
📌参数更新公式
第二次更新参数的公式,引入超参数 $\alpha$来调整梯度的重要性:
$$
\theta_2^i \leftarrow \theta_1^i \frac{\eta}{\sigma_1^i} g_1^i \quad \sigma_1^i = \sqrt{\alpha \left(\sigma_0^i\right)^2 + (1-\alpha) \left(g_1^i\right)^2} \quad (3.24)
$$
其中 $0 < \alpha < 1$。
🔧迭代更新过程
后续的参数更新过程,通过递归方式计算 $\sigma_t^i$来动态调整学习率:
$$
\begin{aligned}
\theta_3^i &\leftarrow \theta_2^i \frac{\eta}{\sigma_2^i} g_2^i \quad \sigma_2^i = \sqrt{\alpha \left(\sigma_1^i\right)^2 + (1-\alpha) \left(g_2^i\right)^2} \
\vdots \
\theta_{t+1}^i &\leftarrow \theta_t^i \frac{\eta}{\sigma_t^i} g_t^i \quad \sigma_t^i = \sqrt{\alpha \left(\sigma_{t-1}^i\right)^2 + (1-\alpha) \left(g_t^i\right)^2}
\end{aligned}
$$
📌算法特性
RMSprop 通过超参数 $\alpha$来决定当前梯度 $g_t^i$相较于之前梯度的重要性。这使得算法能够快速响应梯度的变化,实现更灵活的参数更新。
在误差表面的不同区域,例如从 A 到 B 的平坦区域,RMSprop 允许较大的学习步伐;而在 B 到 C 的陡峭区域,通过增加 $\alpha$值,可以快速减小学习步伐,实现“踩刹车”的效果。
🎯Adam
最常用的优化的策略或者优化器(optimizer) 是Adam(Adaptive moment estimation) 。
Adam 可以看作 RMSprop 加上动量,其使用动量作为参数更新方向,并且能够自适应调整学习率。PyTorch 里面已经写好了 Adam 优化器。
🎯学习率调度
学习率调度是一种策略,它使得学习率 $\eta$随着时间或训练的迭代次数逐渐减小。学习率衰减(learning rate decay)或学习率退火(learning rate annealing)是学习率调度中的一种常见策略。
📌学习率衰减
通过引入学习率衰减,可以避免在训练后期由于学习率过大导致的不稳定现象。学习率调度允许模型在训练初期快速收敛,在训练后期则通过减小学习率,使模型能够稳定地接近最优点。
📌学习率调度的公式
引入学习率调度后的参数更新公式为:
$$
\theta_{t+1}^i \leftarrow \theta_t^i \frac{\eta_t}{\sigma_t^i} g_t^i \quad (3.26)
$$
其中 $\eta_t$是随时间变化的学习率。
📌预热
除了学习率下降以外,还有另外一个经典的学习率调度的方式———预热。
预热的方法是让学习率先变大后变小,至于变到多大、变大的速度、变小的速度是超参数。
除了残差网络, BERT 和 Transformer 的训练也都使用了预
热。
📌RAdam
RAdam的应用场景非常广泛,尤其适用于那些对学习率预热敏感的模型和任务。
RAdam 是 Ranger 优化器的重要组成部分。Ranger 优化器结合了 RAdam 和 LookAhead,在深度学习中表现出色,能够提升模型的能力和收敛速度。
🔧无需预热
RAdam 无需预热,就能避免模型收敛至“局部最优解”。
🔧优于手动预热
RAdam 自动提供方差缩减,在各种预热长度和各种学习率下都优于传统的手动预热调整。
🔧RAdam与Adam性能对比
性能指标 | RAdam | Adam |
---|---|---|
收敛速度 | 有望为几乎所有 AI 应用提供更好的收敛速度。 | 在前期的表现一般不好,前期数据少,很难总结出一个靠谱的初始动量,也更容易陷入局部最优,所以一般需要几个 batch 的预热阶段让自适应动量更靠谱。 |
训练稳定性 | 对不同的学习速度具有鲁棒性,同时仍具有更好的训练稳定性(对选择的学习率不那么敏感)。 | 在没有预热的情况下使用时,在初始迭代期间,梯度具有较大的方差。这种较大的差异会导致最小值的过冲,从而导致较差的最优值。 |
准确性和泛化性 | 可立即提高 AI 准确度和泛化性。 | 存在很多问题,效果甚至没有简单的 SGD+Momentum 好。 |
以下是对您提供的文件内容的总结,使用Markdown格式: |
🎯学习率调度与优化器变形
📌动量与均方根的计算差异
动量 $m_{t}^{i}$:考虑了过去所有梯度的方向和大小,通过将所有梯度直接相加来计算,因此保留了梯度的方向信息。
均方根 $\sigma_{t}^{i}$:仅考虑了梯度的大小,通过计算梯度的平方和的平方根来得出,忽略了梯度的方向。
尽管 $m_{t}^{i}$ 和 $\sigma_{t}^{i}$ 都使用了过去所有的梯度,但由于计算方式的不同,它们并不会相互抵消。
📌优化总结
从最基本的梯度下降法演化至包含动量的优化版本,如式(3.27)所示:
$$
\theta_{t+1}^i \leftarrow \theta_t^i \frac{\eta_t}{\sigma_t^i} m_t^i \qquad (3.27)
$$
其中,$m_t^i$ 表示动量。
动量 $m_t^i$ 不仅考虑了某一时刻的梯度方向,而是对所有梯度方向进行了加权总和,作为参数更新的方向。
更新步伐的大小由 $\frac{m_t^i}{\sigma_t^i}$ 决定。
🚩Task 2.2
🎯什么是分类
分类与回归是深度学习最常见的两种问题
🎯回归与分类的区别和联系
回归是输入一个向量 x,输出 yˆ,我们希望 yˆ 跟某一个标签 y 越接近越好, y 是要学习的目标。而分类可当作回归来看,输入 x 后,输出仍然是一个标量 yˆ,要让它跟正确答案的那个类越接近越好。
📌回归
回归任务涉及输入一个向量 $x$ 并预测一个连续值 $y$。
目标是使得预测值 $y$ 尽可能接近真实标签值。
📌分类
分类可以视为一种特殊的回归问题,其中输入 $x$ 后,输出是一个标量 $y$。
目的是让输出 $y$ 与正确类别的编号尽可能接近。
🎯使用数字表示类别会出现的问题
引出独热编码
直接使用数字来表示类别可能会导致问题,尤其是当类别之间存在某种关系时。
例如,根据身高和体重预测年级时,一年级和二年级在逻辑上比一年级和三年级更接近。
🎯什么是独热编码(One-Hot Encoding)
当类别之间没有固有的顺序或数值关系时,使用独热编码来表示类别是一种常见做法。
独热编码通过为每个类别分配一个唯一的二进制向量,避免了类别之间不恰当的数值关系。
在分类问题中尤其有用,因为它允许模型更准确地学习类别之间的关系。
图3.30展示了如何使用数字和独热编码来表示类别。类别编号(如1、2、3)可能暗示它们之间的某种关系,而独热编码则不包含这样的预设关系。
如果用独热向量计算距离的话,类两两之间的距离都是一样的
以下是对您提供的文件内容的总结:
📌多输出神经网络结构
计算 $\hat{y}_1$:
将输入特征 $x_1$ 与权重相乘,加上偏置,得到 $a_1$。
将 $a_1$ 与另一组权重相乘,加上偏置,得到 $\hat{y}_1$。
计算 $\hat{y}_2$:
将输入特征 $x_2$ 与权重相乘,加上偏置,得到 $a_2$。
将 $a_2$ 与另一组权重相乘,加上偏置,得到 $\hat{y}_2$。
计算 $\hat{y}_3$:
将输入特征 $x_3$ 与权重相乘,加上偏置,得到 $a_3$。
将 $a_3$ 与另一组权重相乘,加上偏置,得到 $\hat{y}_3$。
每个输出 $\hat{y}$ 是通过对输入特征的不同线性组合并加上偏置来计算的。使得这些输出 $\hat{y}_1, \hat{y}_2, \hat{y}_3$ 尽可能接近它们各自的目标值。
偏置使得这些输出尽可能接近它们的目标值,以实现最佳的预测性能。
🎯带有 softmax 的分类
按照上述的设定,分类实际过程是:输入 x,乘上 W,加上 b,通过激活函数 σ,乘上W ′,再加上 b′ 得到向量 yˆ。
但实际做分类的时候,往往会把 yˆ 通过 softmax 函数得到 y′,才去计算 y′ 跟 yˆ 之间的距离。
📌为什么分类过程中要加上softmax函数
softmax 的计算如式 (3.28) 所示,先把所有的 y 取一个指数(负数取指数后也会变成正的),再对其做归一化(除掉所有 y 的指数值的和)得到 y′。
📌Softmax 函数及其特性
在考虑三个类别的情况下,Softmax 函数的应用(图3.33)
Softmax 函数 用于将一个向量或一组实数转换成另一个向量,其中转换后的向量元素值在 0 到 1 之间,并且所有元素的和为 1。
公式为:
$$
y_i^{\prime} = \frac{\exp\left(y_i\right)}{\sum_j \exp\left(y_i\right)} \qquad (3.28)
$$
其中$y_i$ 是输入向量中的第$i$ 个元素,$y_i^{\prime}$ 是输出向量中的第$i$ 个元素。
🔧特性
- Softmax 函数除了进行归一化,使得输出值在 0 到 1 之间并总和为 1 之外,还有将大数值与小数值的差距进一步拉大的效果。
- 输出值$y_i^{\prime}$ 满足$1 > y_i^{\prime} > 0$,并且所有输出值之和为 1。
📌Sigmoid 函数与 Softmax 函数的比较
🔧两分类问题
在处理两个类别的问题时,通常直接使用 Sigmoid 函数 而不是 Softmax。
当只有两个类别时,Sigmoid 函数和 Softmax 函数是等价的。
🔧多分类问题
在涉及三个或更多类别的情况下,Softmax 函数是首选,因为它可以处理多类别的输出,并保证输出值的总和为 1。
🎯什么是分类损失
📌损失函数
在分类问题中,损失函数用于衡量模型预测值$y’$ 与实际标签$y$ 之间的差异。
📌均方误差 (MSE)
公式:
$$
e = \sum_i \left(y_i y_i’\right)^2 \quad (3.29)
$$
计算预测值与实际值之间差的平方和。
📌交叉熵 (Cross-Entropy)
公式:
$$
e = -\sum_i y_i \ln y_i’ \quad (3.30)
$$
衡量实际标签与通过 softmax 转换后的预测值之间的差异。
优点:当预测值与实际值相同时,交叉熵最小化,此时均方误差也最小。
📌使用 softmax 的好处
如图 3.35 所示,有一个三类的分类,网络先输出 y1、 y2 和 y3,在通过 softmax 以后,产生 y1′ 、 y2′ 和 y3′ 。
假设正确答案是 [1, 0, 0]T,要计算 [1, 0, 0]T 跟 y1′ 、 y2′ 和 y3′ 之间的距离 e, e 可以是均方误差或交叉熵。
假设 y1 的变化是从-10 到 10, y2 的变化也是从-10 到 10, y3 就固定设成-1000。因为 y3 的值很小,通过 softmax 以后, y3′ 非常趋近于 0,它跟正确答案非常接近,且它对结果影响很少。
Softmax 将网络输出转换为概率分布,使得每个类别的预测值在 0 到 1 之间,并且总和为 1。
🎯损失函数的选择对优化的影响
📌交叉熵
- 优点:在分类问题中,交叉熵比均方误差更常用,因为它在优化过程中表现更好,尤其是在参数初始化远离最优值时。
- 优化难度:使用交叉熵时,即使在损失较大的区域,梯度仍然存在,使得模型可以通过梯度下降法有效地优化。
📌均方误差
- 缺点:在损失较大的区域,均方误差可能导致梯度非常小,使得梯度下降法难以优化。
- 优化难度:如果没有好的优化器,使用均方误差可能导致模型训练困难。
图3.35比较了均方误差和交叉熵在损失表面上的差异,以及它们对优化过程的影响。
📌总结
- 在分类问题中,交叉熵是首选的损失函数,因为它在优化过程中提供了更好的梯度信息。
- 均方误差可能在某些情况下导致优化困难,尤其是在模型初始化远离最优值时。
- 选择合适的损失函数对模型的训练效果和优化效率至关重要。
🚩Task 2.3
(实践任务):HW3(CNN)
🎯一键运行Notebook
通过在卷积神经网络(CNN)模型的验证集上实现t-SNE(t分布随机邻域嵌入),可视化学习到的视觉表示,包括顶层和中间层的输出。
绘制特定类别的t-SNE可视化图
🎯实验结果
🚩 Task 3.1
🎯批量归一化(Batch Normalization, BN)
直接改误差表面的地貌,“把山铲平”,让它变得比较好训练
一个“把山铲平”的想法。
不要小看优化这个问题,有时候就算误差表面是凸(convex)的,它就是一个碗的形状,都不一定很好训练。如图 3.37 所示,假设两个参数对损失的斜率差别非常大,在 w1 这个方向上面,斜率变化很小,在 w2 这个方向上面斜率变化很大。
🎯学习率和误差表面优化
在机器学习模型训练中,固定的学习率可能导致难以获得理想的结果。为了解决这一问题,引入了自适应学习率和高级优化算法,如Adam,这些方法能够更好地调整学习率,从而优化训练过程。
📌误差表面分析
误差表面可能因为参数$w_1$和$w_2$的斜率差异而变得难以优化。
通过修改误差表面,尝试使其更易于优化。
📌线性模型示例
考虑一个简单的线性模型,输入为$x_1$和$x_2$,参数为$w_1$和$w_2$。
模型输出$\hat{y}$计算为$\hat{y} = w_1 \cdot x_1 + w_2 \cdot x_2 + b$。
损失函数$L$定义为所有训练数据误差$e$的总和,即$L = \sum e$,其中$e = \hat{y} y$。
🎯特征归一化的重要性
在训练模型时,如果输入特征的数值范围差异很大,可能会导致难以训练的误差表面。为了解决这个问题,引入了特征归一化技术,如Z值归一化(也称为标准化),它有助于使误差表面更加平滑,从而优化训练过程。
📌Z值归一化(标准化)
归一化处理通过计算每个特征维度的平均值$m_i$和标准差$\sigma_i$,然后应用以下公式进行归一化:
$$\tilde{x}_i^r \leftarrow \frac{x_i^r m_i}{\sigma_i}$$
归一化后,特征的平均值为0,方差为1,有助于梯度下降算法更有效地收敛。
🎯深度学习中的特征归一化
在深度学习中,即使输入特征已经归一化,中间层的特征$z$也可能需要进一步的归一化处理,以确保模型训练的稳定性和效率。
📌归一化中间层特征
对于中间层的特征$z$,计算其平均值$\mu$和标准差$\sigma$,然后应用以下公式进行归一化:
$$\mu = \frac{1}{N} \sum_{i=1}^N z_i$$
$$\sigma = \sqrt{\frac{1}{N} \sum_{i=1}^N (z_i - \mu)^2}$$
$$\tilde{z}_i = \frac{z_i - \mu}{\sigma}$$
归一化可以放在激活函数之前或之后,具体取决于所使用的激活函数类型。
通过这些方法,可以有效地优化深度学习模型的训练过程,提高模型的性能和泛化能力。
其中,除号代表逐元素的除,即分子分母两个向量对应元素相除。
如果做归一化以后, z˜ 的平均值一定是 0,如果平均值是 0 的话,这会给网络一些限制,这个限制可能会带来负面的影响,所以需要把 β, γ 加回去,让网络隐藏层的输出平均值不是 0。让网络学习 β, γ 来调整一下输出的分布,从而来调整 zˆ 的分布
以上说的都是训练的部分,测试有时候又称为推断(inference)。
🎯批量归一化(Batch Normalization)在测试阶段的应用
📌使用移动平均和方差
在训练阶段,批量归一化通过计算每个批次的均值和方差来归一化数据。在测试阶段,利用训练期间累积的移动平均均值和方差来处理测试数据,确保模型的稳定性。
使用训练过程中计算的移动平均均值 $\mu_{\text{moving}}$ 和方差 $\sigma^2_{\text{moving}}$ 替代批次统计量:
$$
\hat{x}{\text{test}} = \frac{x \mu{\text{moving}}}{\sqrt{\sigma^2_{\text{moving}} + \epsilon}}
$$
$$
y_{\text{test}} = \gamma \hat{x}_{\text{test}} + \beta
$$
这样,即使在测试时单个样本的分布可能与训练时的批次分布不同,模型仍然能够以一种稳定的方式进行推理。
🔧不依赖批次统计
测试阶段不计算新的统计量,而是直接使用训练阶段得到的全局均值和方差,独立处理每个测试样本。
🔧减少内部协变量偏移
批量归一化通过使用固定的全局统计量,继续在测试阶段减少网络各层激活分布的变化,从而提高模型的稳定性。
🔧提高泛化能力
测试阶段应用批量归一化有助于提升模型对新数据的泛化能力,减少对训练数据特定特征的过度拟合。
🔧无需调整学习率
由于测试阶段不涉及梯度更新,因此不需要调整学习率,简化了模型的应用过程。
🔧计算效率
在测试阶段,批量归一化避免了复杂的统计计算,从而提高了推理过程的计算效率。
🔧模型部署
批量归一化在模型部署时作为一个固定步骤,确保了模型在不同环境中的一致性和可靠性。
🎯内部协变量偏移
批量归一化最初被提出来是为了解决神经网络中的内部协变量偏移问题。这个问题说的是,网络中每一层的输入数据分布会随着前面层的参数更新而变化,这可能会让训练过程变得不太稳定。
批量归一化通过规范化层间的输出,减少这种分布变化,帮助训练过程更稳定。
📌对优化的帮助
论文《How Does Batch Normalization Help Optimization?》提出了不同的看法,质疑内部协变量偏移是否真的是训练网络的主要障碍。研究发现,即使存在内部协变量偏移,也不一定会对训练产生负面影响。实验显示,无论是否使用批量归一化,网络层输出的分布变化对训练的影响都不大,梯度方向的变化也不显著。这表明批量归一化的有效性可能并非仅仅因为它解决了内部协变量偏移。
📌误差表面平滑化
论文还提出了另一个观点,即批量归一化可能通过改变网络的误差表面,使其变得更加平滑,从而有助于优化过程。这个观点得到了理论和实验的支持。论文还指出还有其他方法也可以使误差表面平滑化,效果可能与批量归一化相似或更好。
📌归一化方法的多样性
批量归一化不是唯一的归一化技术。实际上,存在多种归一化方法,包括批量重归一化、层归一化、实例归一化、组归一化、权重归一化和谱归一化等。可以根据具体的需求和场景选择合适的方法。
🚩 Task 3.2 && Task 3.3
卷积神经网络(CNN)
🎯如何把图像输入到计算机里面
一张图像是一个三维的张量,其中一维代表图像的宽,另外一维代表图像的高,还有一维代表图像的通道(channel) 的数目。
🎯什么是卷积神经网络架构
卷积神经网络(CNN)是一种经典的网络架构,常用于图像处理等计算机视觉任务。
通过卷积层提取图像特征,实现图像识别。
🎯图像表示
图像可以被机器识别,机器通过图像识别图中的对象(如狗、飞机、汽车等)。
彩色图像由红色、绿色、蓝色三种颜色的组合构成,每种颜色的强度不同。
🎯向量化处理
网络处理时,需要将图像的三维数据(宽度、高度、颜色通道)拉直成一维向量。
每个像素点的颜色值被展开成一个向量,作为网络的输入。
🎯标准化处理
不同图像大小不一,通常将所有图像调整为相同大小再输入网络。
标准化处理有助于统一网络输入,简化图像识别过程。
🎯卷积层的作用
卷积层通过卷积操作提取图像特征。
卷积层的输出是特征图,特征图上的每个点代表图像中某种特征的存在概率。
🎯特征图的解释
特征图上的每个点(激活值)代表网络对输入图像中特定特征的响应。
激活值高表示相应特征在图像中出现的可能性大。
🎯目标检测
卷积神经网络也可用于目标检测,即识别图像中是否存在特定对象。
通过卷积层提取的特征,可以用于判断图像中是否包含某些特定模式或对象。
🎯感受野
感受野是指网络中每个神经元“关心”的输入图像区域大小。
卷积层的神经元只关注输入图像的一小部分区域,通过这种方式提取局部特征。
感受野是输入图像中影响特定神经元输出的局部区域。
每个神经元只关注输入图像的一个特定区域,这个区域称为它的感受野。
📌神经元和权重
每个神经元接收一个多维输入向量,并对每个维度赋予权重。
例如,一个神经元可能有 $3 \times 3 \times 3 = 27$个权重,对应于3x3x3的输入数据。
📌偏置(Bias)
神经元除了权重外,还有一个偏置项,用于调整输出。
📌感受野的重叠
不同神经元的感受野可以重叠,允许多个神经元同时响应图像中的同一个局部区域。
重叠的感受野有助于网络捕捉图像中的复杂特征。
📌感受野的大小和形状
感受野的大小可以根据需要调整,不仅限于正方形,也可以是长方形或其他形状。
有的模式可能在小范围内就能被检测到,而有的则需要更大的范围。
📌通道的选择性
感受野不仅可以覆盖所有颜色通道(如RGB),也可以只关注特定的颜色通道。
这允许网络对某些颜色通道中的特征更加敏感。
📌设计感受野
设计感受野时,可以根据任务的需求和图像的特性来决定其大小、形状和覆盖的通道。
经典的感受野安排方式会考虑如何有效地覆盖和响应图像的不同区域。
🎯卷积操作
卷积操作通过滑动窗口(卷积核或滤波器)在图像上移动,计算窗口内像素与卷积核值的点积。
📌步幅
我们把左上角的感受野往右移一个步幅,就制造出一个新的守备范围,即新的感受野。移动的量称为步幅(stride) ,图 4.9 中的这个例子里面,步幅就等于 2。
感受野移动的距离
每次移动的步长称为步幅,步幅影响感受野的重叠程度。
📌填充
为了处理图像边缘,避免卷积后图像尺寸过小,可以在图像边缘添加填充(padding)。
填充通常使用零值,也可以使用其他策略。
如图 4.10 所示,超出范围就做填充(padding) ,填充就是补值,一般使用零填充(zero padding),超出范围就补 0,如果感受野有一部分超出图像的范围之外,就当做那个里面的值都是 0。其实也有别的补值的方法,比如补整张图像里面所有值的平均值或者把边界的这些数字拿出来补没有值的地方。
而感受野加上参数共享就是卷积层(convolutional layer),用到卷积层的网络就叫卷积神经网络。
📌卷积层的参数共享
如果不同的守备范围都要有一个检测鸟嘴的神经元,参数量会太多了,因此需要做出相应的简化
让不同感受野的神经元共享参数,也就是做参数共享(parameter sharing),如图 4.13 所示。所谓参数共享就是两个神经元的权重完全是一样的。
卷积层的参数(卷积核)在整个图像上共享,减少模型参数数量,提高训练效率。
参数共享使得网络能够学习到图像中普遍存在的模式。
📌全连接层(Fully Connected Layer)
拓展
全连接层是神经网络中的一种层,其中每个神经元都与前一层的所有神经元相连。
全连接层主要用于整合前一层的特征,进行最终的分类或回归分析。
它们通常位于卷积神经网络的末尾,用于处理卷积层和池化层提取的特征。
全连接层广泛应用于图像识别、语音处理和自然语言处理等多种任务中。
它们是构建深度学习模型的关键组件之一。
🔧特点
在全连接层中,每个神经元对所有输入数据进行加权求和,然后通过激活函数。
这些层通常包含大量的参数,因为每个输入都与每个神经元相连。
🔧计算过程
每个神经元的输出计算公式为:$$\text{output} = \text{activation}(\text{weights} \times \text{input} + \text{bias})$$
其中,weights 是权重矩阵,input 是前一层的输出,bias 是偏置项,activation 是激活函数。
🔧激活函数
激活函数用于引入非线性,使网络能够学习复杂的模式。
常用的激活函数包括 ReLU、sigmoid 和 tanh。
🔧训练
全连接层的权重和偏置通过反向传播算法和梯度下降进行优化。
训练过程中,网络通过调整这些参数来最小化损失函数。
🔧输出
在分类任务中,全连接层的输出通常是一个概率分布,表示不同类别的预测概率。
在回归任务中,全连接层可能只有一个输出节点,直接预测连续值。
📌特征映射
如果有 64 个滤波器,就可以得到 64 组的数字。这组数字称为特征映射(feature map) 。当一张图像通过一个卷积层里面一堆滤波器的时候,就会产生一个特征映射。
📌多卷积核
卷积层通常包含多个卷积核,每个卷积核负责提取图像中的不同特征。
多个卷积核的输出可以组合成新的特征图,提供更丰富的图像表示。
如图 4.22 所示,第 2 层的卷积里面也有一堆的滤波器,每个滤波器的大小设成 3 × 3。其高度必须设为 64,因为滤波器的高度就是它要处理的图像的通道。如果输入的图像是黑白的,通道是 1,滤波器的高度就是 1。
而共享权重其实就是用滤波器扫过一张图像,这个过程就是卷积。这就是卷积层名字的由来。把滤波器扫过图像就相当于不同的感受野神经元可以共用参数,这组共用的参数就叫做一个滤波器。
📌采样
把一张比较大的图像做下采样(downsampling),把图像偶数的列都拿掉,奇数的行都拿掉,图像变成为原来的 1/4,但是不会影响里面是什么东西。
📌汇聚
做完卷积以后,往往后面还会搭配汇聚。汇聚就是把图像变小。做完卷积以后会得到一张图像,这张图像里面有很多的通道。做完汇聚以后,这张图像的通道不变。
图 4.27 中的例子是 2 × 2 个一组。汇聚有很多不同的版本,以最大汇聚(max pooling) 为例。最大汇聚在每一组里面选一个代表,选的代表就是最大的一个,如图 4.28 所示。除了最大汇聚,还有平均汇聚(mean pooling),平均汇聚是取每一组的平均值。
汇聚可能会对模型的性能造成一定的损害。
特别是在检测非常细微的特征时,进行下采样可能会使性能稍微降低。
🔧全卷积网络的趋势
近年来,图像网络设计趋向于舍弃汇聚层,转而使用全卷积网络。全卷积网络中整个网络结构都是卷积层,不使用汇聚层,这种设计可以保持更多的空间信息,有助于特征的提取。
🔧汇聚的主要作用
汇聚的主要作用是减少运算量。 通过下采样缩小图像尺寸,从而减少计算量,这在资源有限的情况下非常有用。
🔧运算能力的提升
随着运算能力的提升,如果有足够的运算资源,很多网络架构设计选择不使用汇聚。采用全卷积设计,从开始到结束都使用卷积层,探索是否可以取得更好的效果。
🔧一般网络架构
传统的网络架构通常包括卷积层和汇聚层。汇聚层是可有可无的,许多设计选择不使用汇聚层,以避免可能的性能损失。
🔧架构示例
在完成卷积和汇聚后,通常将汇聚的输出扁平化,形成一维向量。然后将这个向量输入到全连接层中,最终通过 softmax 层得到图像识别的结果。
这是一个经典的图像识别网络,包括卷积层、汇聚层、扁平化处理,以及全连接层或 softmax 层。
🎯卷积神经网络的应用
卷积神经网络广泛应用于图像识别、目标检测等领域。
通过学习图像特征,卷积神经网络能够识别和分类图像中的不同对象。
🎯围棋落子预测
卷积神经网络也可用于围棋等策略游戏,预测下一步最佳落子位置。
通过分析棋盘状态,网络可以评估每个位置的重要性,指导决策。
🚩自注意力机制
🎯自注意力模型(Self-Attention Model)
自注意力模型是深度学习中处理序列数据的一种重要架构,尤其适用于处理输入序列长度可变的问题。
📌输入与输出
输入通常是向量序列,输出可以是标量、类别或另一个向量序列。
自注意力模型能够处理输入序列长度不一的情况,适用于文本、语音、图数据等多种序列任务。
📌序列处理的挑战
传统的卷积或全连接网络在处理序列数据时,可能因固定窗口大小或不考虑序列间长距离依赖而受限。
📌自注意力机制
自注意力模型通过计算序列中每个元素对其他所有元素的关联程度(注意力分数),来捕捉序列内的长距离依赖关系。
模型不需要预设固定大小的窗口,能够动态地关注序列中任意距离的依赖。
📌独热编码与词嵌入
独热编码是一种将词汇表示为向量的方法,但这种方法无法表达词汇之间的语义关系。
词嵌入(Word Embedding)通过将词汇映射到包含语义信息的向量空间,能够更好地捕捉词汇之间的关系。
📌序列到序列的任务
一些任务如机器翻译,输入和输出序列的长度可能不同,自注意力模型能够灵活处理这类序列到序列的任务。
📌注意力分数的计算
注意力分数通过查询(Query)、键(Key)和值(Value)的机制计算得出。
常见的计算方法包括点积(Dot Product)和相加(Additive)等。
📌多头注意力
多头注意力(Multi-Head Attention)是自注意力的一种扩展,它将输入向量分割成多个头,每个头计算不同的注意力,最终再将结果合并,以捕获不同子空间的信息。
📌Transformer 架构
Transformer 是一种完全基于自注意力机制的网络架构,广泛应用于自然语言处理任务。
Transformer 通过堆叠多个自注意力层和前馈神经网络层,并通过残差连接和层归一化来提高训练效率和性能。
📌应用实例
文本处理:如情感分析、词性标注、机器翻译。
语音处理:如语音识别、语音合成。
图数据:如社交网络分析、药物分子发现。
自注意力模型通过其灵活的注意力机制,为深度学习在序列数据处理方面提供了强大的工具,推动了多个领域的发展。