Datawhale X 李宏毅苹果书 AI夏令营机器学习(入门班)——笔记(第五期)

引入

前四期的夏令营,我们大多是通过赛事来实践机器学习/深度学习/大模型 ,解决特定场景的问题,在本期,我们将参考李宏毅教授的相关课程以及Datawhale开源项目孵化的新书《深度学习详解》,一起抓住暑假的尾巴共学深度学习的理论 ,进一步地研究和探讨深度学习的奥秘。

开源链接:https://github.com/datawhalechina/leedl-tutorial

Task 1 通过案列了解机器学习 

李宏毅老师对应视频课程:预测本频道观看人数(上) - 机器学习基本概念简介_哔哩哔哩_bilibili

根据《深度学习详解》1.1的内容,以视频点击次数预测为例,介绍了机器学习的实际应用和运作过程。

1.机器学习的基本概念

  • 机器学习是让机器具备学习能力,即自动寻找函数的能力。
  • 机器学习可以应用于多种任务,如语音识别、图像识别等。

2.机器学习任务的分类

  • 回归(Regression):预测一个数值,例如预测PM2.5数值。
  • 分类(Classification):从预设的类别中选择一个作为输出,例如邮件分类。
  • 结构化学习(Structured Learning):生成有结构的输出,如绘图或写作。

补充:机器学习和深度学习的区别和联系

区别:

  1. 概念层次

    • 机器学习是人工智能的一个分支,它使计算机能够从数据中学习并做出决策或预测,而无需进行明确的编程。
    • 深度学习是机器学习的一个子集,它使用一种称为神经网络的算法,特别是那些具有多个隐藏层的网络,称为深度神经网络。
  2. 算法复杂性

    • 机器学习包含多种算法,如决策树、支持向量机、随机森林等,这些算法的复杂性各不相同。
    • 深度学习通常涉及到更为复杂的神经网络结构,需要大量的数据和计算资源。
  3. 数据需求

    • 机器学习算法通常可以在较小的数据集上训练,尽管大数据集可以提高性能。
    • 深度学习通常需要大量的数据来训练模型,以便网络能够学习到足够的特征。
  4. 计算资源

    • 机器学习算法通常可以在普通计算机上运行,尽管高性能的硬件可以加速训练过程。
    • 深度学习模型通常需要GPU或TPU等高性能计算资源来加速训练过程。
  5. 应用领域

    • 机器学习可以应用于各种领域,包括图像识别、自然语言处理、推荐系统等。
    • 深度学习在图像和语音识别、自然语言处理等领域表现出色,尤其是在处理非结构化数据时

联系:

  1. 技术演进深度学习是机器学习技术的一个演进,它利用了神经网络的深度结构来处理更复杂的模式识别问题。

  2. 相互依赖深度学习算法是机器学习算法的一种,它们共享许多基础概念,如监督学习、无监督学习、特征提取等。

  3. 共同目标:无论是机器学习还是深度学习,它们的最终目标都是使计算机能够从数据中学习并做出智能决策

  4. 技术融合:在实际应用中,深度学习经常与机器学习的其他技术相结合,以解决特定的问题。

  5. 研究和应用:机器学习和深度学习都是当前人工智能研究和应用的热点领域,它们在推动技术进步和解决实际问题中发挥着重要作用。

总的来说,深度学习是机器学习的一部分,但它们在技术实现、应用场景和研究重点上有所不同。随着技术的发展,两者之间的界限可能会变得更加模糊,但它们都是推动人工智能发展的关键技术。

3.机器学习找函数的步骤

step 1 模型建立(Model Building)

写出一个带有未知参数的函数,这个函数用于预测或分类任务。例如,线性回归模型可以表示为 y=b+w\cdot x_{1}​,其中 y是预测值,x_{1}是特征(已知信息),b 是偏置(bias),w 是权重(weight),它们都是模型的参数。

step 2 损失函数定义(Loss Function Definition)

定义一个损失函数来衡量模型预测值与实际值之间的差距。损失函数的输出值越小,表示模型的预测越准确。常见的损失函数包括均方误差(MSE)、平均绝对误差(MAE)和交叉熵(cross entropy)等。

step 3 最优化问题(Optimization Problem)

解决一个最优化问题,以找到一组参数值,使得损失函数的值最小化。这个过程通常使用梯度下降(gradient descent)或其他优化算法来实现。通过计算损失函数对每个参数的导数(梯度),并根据这些导数更新参数值,逐步逼近最优解。

4.损失函数的不同形式

   损失函数(lossfunction)的全面介绍(简单易懂版)-CSDN博客

(1)均方误差(Mean Squared Error, MSE)

  • 公式:MSE = \frac{1}{N} \sum_{i=1}^{N} (y_i - \hat{y}_i)^2
  • 特点:对大的误差值惩罚更大,因为误差是平方的。
  • 适用于:回归任务,因为它能够量化预测值与实际值之间的平均错误程度,并且能够通过平方惩罚较大的误差,这有助于减少大误差的影响。(特别是当预测误差的平方对模型性能影响较大时)

(2)平均绝对误差(Mean Absolute Error, MAE)

  • 公式:MAE = \frac{1}{N} \sum_{i=1}^{N} |y_i - \hat{y}_i|
  • 特点:对所有误差值的惩罚相同,不受误差大小的影响。
  • 适用于:回归任务,特别是当数据中包含异常值时,因为它对异常值的影响较小。

(3)交叉熵损失(Cross Entropy Loss)

  • 公式:CE = -\sum_{c=1}^{M} y_{o,c} \log(p_{o,c})
  • 特点:能够衡量模型输出的概率分布与真实分布之间的差异。其中 M 是类别数,y_{o,c}是实际标签(如果是类别 c则为 1,否则为 0),p_{o,c} 是模型预测为类别 c 的概率。
  • 适用于:分类问题,特别是多分类问题。

补充其他形式

对数损失(Logarithmic Loss)

  • 公式:LogLoss = -\frac{1}{N} \sum_{i=1}^{N} \log(p(y_i))
  • 特点:是交叉熵损失的简化形式,其中 p(y_{i}) 是模型预测正类的概率。
  • 适用于:二分类问题,它衡量的是模型预测的概率与实际标签之间的差异。

Hinge损失(Hinge Loss)

  • 公式:Hinge = \frac{1}{N} \sum_{i=1}^{N} \max(0, 1 - y_i \cdot \hat{y}_i)
  • 特点:常用于支持向量机(SVM),它的目标是找到能够最大化样本间隔的决策边界。
  • 适用于:适用于二分类问题,惩罚不满足y_i \cdot \hat{y}_i \geq 1 的样本。

       相关链接:【机器学习算法笔记系列】支持向量机(SVM)算法详解和实战_支持向量机算法-CSDN博客

平方Hinge损失(Squared Hinge Loss)

  • 公式:SquaredHinge = \frac{1}{N} \sum_{i=1}^{N} \max(0, 1 - y_i \cdot \hat{y}_i)^2
  • 特点:是Hinge损失的平方形式,有助于提高模型对错误分类的敏感度。
  • 适用于:二分类问题。类似于Hinge损失,但对较大的误差有更大的惩罚。

5.误差表面

误差表面(Error Surface)是机器学习中用于描述模型损失函数随参数变化的三维或多维图表。在优化问题中,我们的目标是找到一组参数值,使得损失函数达到最小,这相当于在误差表面上寻找一个最小点

以下是误差表面的一些关键特性:

  1. 多维性: 误差表面是多维的,其维度等于模型参数的数量。例如,如果模型有两个参数,误差表面就是一个三维空间中的曲面;如果有更多的参数,它将是一个更高维的空间。

  2. 形状: 误差表面的形状取决于损失函数的形式。它可以是碗状(存在一个全局最小值),鞍状,或者有多个局部最小值和全局最小值。

  3. 全局最小值(global minima)和局部最小值(local minima)

    • 全局最小值:误差表面上所有点中的最低点,表示最佳的参数值,使得损失函数达到最小。
    • 局部最小值:在某些方向上比周围点更低,但在其他方向上可能更高。在优化过程中可能会陷入局部最小值而不是全局最小值。
  4. 梯度: 在误差表面上,梯度(或斜率)指向损失增加最快的方向。优化算法(如梯度下降)通过计算梯度来更新参数,朝着损失减少的方向移动。

  5. 等高线图: 为了可视化误差表面,通常使用等高线图来表示不同高度(损失值L)的轮廓。在二维等高线图中,可以观察到损失函数的凹凸性和可能的最小值位置。

  6. 优化算法的影响: 不同的优化算法可能会沿着不同的路径在误差表面上移动,有些算法可能更容易陷入局部最小值,而有些算法可能更倾向于找到全局最小值。

  7. 超参数:在做机器学习,需要自己设定,不是机器自己找出来的参数,如学习率,会影响优化过程中在误差表面上的步进大小和方向,从而影响最终找到的解。

6.梯度下降优化算法

梯度下降算法(Gradient Descent)是一种用于求解最小化问题的一阶迭代优化算法。在机器学习中,它通常用于最小化损失函数,从而找到模型的最佳参数。以下是梯度下降算法的关键步骤和特点:

  1. 初始化参数: 开始时,参数(例如权重和偏置)通常被随机初始化或设置为特定值。

  2. 计算梯度: 对于每一个参数,计算损失函数相对于该参数的梯度(导数)。梯度指向损失增加最快的方向(在PyTorch中,其自动求导系统(autograd)会追踪所有操作以便后续进行梯度计算。当调用loss.backward()时,PyTorch会自动计算损失相对于模型参数的梯度。然后,调用optimizer.step()会根据这些梯度更新模型的参数)

  3. 更新参数: 使用以下公式更新参数:w^{1}\leftarrow w^{_{0}}-\eta \frac{\partial L}{\partial w}|_{w=w^{0}}其中,w是模型的参数,\eta是学习率(一个超参数),\frac{\partial L}{\partial w}​ 是损失函数 L相对于参数 w 的偏导数。这样做的好处,当曲线趋近平缓的时候,微分也小,往后逼近的速度也会变慢)

  4. 重复迭代: 重复步骤2和3,直到满足停止条件,例如梯度足够小、达到预定的迭代次数或损失值不再显著减小。

  5. 学习率: 学习率是一个关键的超参数,它决定了在每次迭代中参数更新的步长。如果学习率太大,可能会越过最小值;如果太小,则收敛速度会很慢。

  6. 收敛性: 梯度下降算法的目标是找到损失函数的局部最小值或全局最小值。在理想情况下,算法会收敛到全局最小值,但在实际应用中可能会遇到局部最小值鞍点

  7. 变体: 梯度下降有几种变体,包括:

    • 批量梯度下降(Batch Gradient Descent):使用整个数据集计算梯度和更新参数。
    • 随机梯度下降(Stochastic Gradient Descent, SGD):每次迭代只使用一个样本来更新参数。
    • 小批量梯度下降(Mini-batch Gradient Descent):每次迭代使用一小部分数据来更新参数。
  8. 挑战

    • 局部最小值:可能会陷入局部最小值而不是全局最小值。
    • 鞍点:梯度为零但不是最小值的点。
    • 学习率选择:需要仔细选择学习率以避免不稳定的收敛或错过最小值。

思考:

在讨论梯度下降算法时,局部最小值问题有时被认为是一个“假问题”,原因如下:

  1. 高维空间的特性在高维空间中,损失函数的局部最小值通常非常少,而大部分的极值点都是鞍点。鞍点是指在某些方向上是最小值,在其他方向上是最大值的点。因此,优化算法更可能停在鞍点而不是局部最小值。

  2. 损失函数的性质: 对于深度学习中常用的损失函数,如均方误差或交叉熵损失,它们通常是凸的或在参数空间中有大量平坦区域,这意味着局部最小值很少,而全局最小值更容易找到。

  3. 实际应用中的次优解: 在实际应用中,通常不需要找到全局最小值,只要找到一个足够好的解即可。即使在局部最小值处停止,模型的性能也可能已经足够好。

解决局部最小值问题的一些策略包括当梯度下降陷入局部最优解 - Jeremy Feng

  • 使用具有动量的优化算法,如SGD with momentum或Adam。
  • 学习率衰减,逐渐减小学习率以更细致地探索参数空间。
  • 使用随机性,例如随机重启或在训练过程中引入噪声。
  • 使用更高级的优化算法,如Nesterov加速梯度或RMSprop。

然而,真正的难题可能包括:

  1. 鞍点问题: 梯度下降可能会在鞍点处停止,因为此时至少有一个维度的梯度为零。在鞍点处,模型可能无法进一步学习。[AI算法][深度学习]:鞍点以及如何跳出鞍点-CSDN博客

  2. 梯度消失或爆炸: 在深度神经网络中,梯度可能会随着网络深度的增加而变得非常小(消失)或非常大(爆炸),这会导致训练过程不稳定。【机器学习】梯度消失和梯度爆炸的原因分析、表现及解决方案_梯度消失的表现-CSDN博客

  3. 模型复杂度: 选择一个合适复杂度的模型是一个挑战。过于简单的模型可能无法捕捉数据的复杂性,而过于复杂的模型可能导致过拟合。

  4. 数据问题: 数据的质量、量和多样性对模型的性能有很大影响。噪声过多或数据不平衡都可能导致模型学习效果不佳。

  5. 超参数调整: 找到最优的超参数组合(如学习率、批大小、正则化系数等)是一个困难的任务,通常需要大量的实验和调整。

总的来说,局部最小值问题在高维优化中并不是主要障碍,而梯度下降算法的稳定性、收敛速度和模型的泛化能力是更值得关注的问题。

一个参数 

 两个参数

实际应用中梯度下降的步骤:

  1. 初始化参数

    为模型的参数(如权重和偏置)选择一个初始值,通常这些值是随机的。
  2. 选择损失函数

    确定一个损失函数来衡量模型预测值与实际值之间的差异。
  3. 选择优化器

    选择一个优化算法,如梯度下降或其变体(例如SGD、Adam等)。
  4. 设置学习率

    确定学习率(η),这是一个超参数,用于控制每次迭代参数更新的步长。
  5. 前向传播

    使用当前参数值进行预测,计算模型的输出。
  6. 计算损失

    根据模型的输出和真实值计算损失函数的值。
  7. 反向传播

    计算损失函数关于每个参数的梯度。这一步骤涉及到求损失函数对每个参数的偏导数。
  8. 更新参数

    使用梯度和学习率更新每个参数。
  9. 检查停止条件

    根据预定的停止条件判断是否结束迭代,这些条件可能包括:
    • 梯度足够小,表明已经接近局部或全局最小值。
    • 损失函数值不再显著减小。
    • 达到预定的迭代次数。
  10. 迭代优化

    从步骤5开始重复执行,直到满足停止条件。
  11. 模型评估

    在训练完成后,使用测试数据评估模型的性能。

总结

Task 2 了解线性模型

李宏毅老师对应视频课程:

预测本频道观看人数(上) - 机器学习基本概念简介_哔哩哔哩_bilibili (41分左右开始)

预测本频道观看人数(下) - 机器学习基本概念简介_哔哩哔哩_bilibili

根据《深度学习详解》1.2的内容,在1.1的基础上,仍然以视频点击次数预测为例,围绕深度学习 中的线性模型、模型的变形以及神经网络的构建进行详细阐述。

1.线性模型基础

  • 定义:线性模型是最简单的预测模型,形式为 y=b+w\cdot x_{1}​,其中 w 是权重,b 是偏置,x_{1}是输入特征,y 是预测输出。
  • 梯度下降:用于最小化损失函数 L,通过计算 w 和 b 对损失的偏导数,并更新它们以减少误差。

2. 损失函数和优化

  • 损失函数:衡量模型预测值与实际值之间差异的函数,常见的有均方误差等。
  • 优化过程:通过梯度下降法不断更新模型参数,直到找到最小化损失函数的参数 w^{*} 和 b^{*}∗。

3. 模型预测与误差

  • 预测:使用训练好的模型对新数据进行预测。
  • 误差分析:通过比较预测值和实际值来评估模型性能,分析误差来源。

以上内容参考Task 1 

4.模型改进

  • 历史数据

考虑更多历史数据(如过去7天)来提高模型预测的准确性。例如,在本次对频道的观看人数预测中,通过对以往数据的绘制图中发现周期性——7天,每到周五周六观看人数就会下降,所以可以建立一个新的模型参考前7天的数据。(在平常的模型建立中要常常借助相关的领域知识

由上图的数据可以得到:考虑更多天没有办法再进一步降低损失了。看来考虑天数这件事,也许已经到了一个极限。这些模型都是把输入的特征x乘上一 个权重,再加上一个偏置就得到预测的结果,这样的模型称为线性模型(linear model)。接下来会看如何把线性模型做得更好。

  • 分段线性模型:通过组合多个线性函数来逼近复杂的非线性关系。

情况一:

线性模型也许过于简单,x_{1}y可能中间有比较复杂的关系,如图1.7所示,永远无法用线性模型1制造红色线。显然线性模型有很大的限制,这一种来自于模型的限制称为Model Bias,无法模拟真实的情况。

解决办法:需要写一个更复杂的、更有灵活性的、有未知参数的函数。红色的曲线可以看作是一个常数再加上一群Hard Sigmoid函数【类似于数学中的分段函数】。 

所以红色线,即分段线性曲线(piecewise linear curve)可以用常数项加一大堆的蓝色函数组合出来,只是用的蓝色函数不一定一样。 如果分段线性曲线越复杂,转折的点越多,所需的蓝色函数就越多。 

关于Hard Sigmoid的介绍:

  Hardsigmoid — PyTorch 2.4 documentation

【Python】Sigmoid和Hard Sigmoid激活函数对比总结及示例_hardsigmoid-CSDN博客

Hard Sigmoid 函数是 Sigmoid 函数的一个简化版本,它旨在减少计算复杂性,同时保持 Sigmoid 函数的基本特性。Hard Sigmoid 函数通常在深度学习框架中实现,以提高计算效率。Hard Sigmoid 函数的表达式如下:

\text{Hard Sigmoid}(x) = \max(0, \min(1, x + \alpha))

其中,\alpha是一个可调节的参数,用于控制函数的斜率和输出范围。在某些实现中,\alpha 的值通常设为 0.2,但这可以根据具体应用进行调整。

特点

  • 线性近似:Hard Sigmoid 函数通过线性方式近似传统的 Sigmoid 函数,减少了计算成本。
  • 参数化:通过调整参数 \alpha,可以控制函数的线性部分和饱和部分。
  • 非线性:尽管是线性近似,Hard Sigmoid 仍然保持了一定的非线性特性,使其可以用于神经网络中的非线性变换。

计算过程

Hard Sigmoid 函数的计算过程可以分为以下几个步骤:

  1. 线性变换:首先对输入 x 进行线性变换,即 x+\alpha
  2. 饱和处理:然后使用 max 和 min 函数将结果限制在 [0, 1] 范围内。

应用

Hard Sigmoid 函数常用于:

  • 神经网络的激活函数:在某些需要快速计算的场景中,Hard Sigmoid 可以作为 Sigmoid 函数的替代品。
  • 特征映射:在需要将输入值映射到 [0, 1] 区间的场景中使用。

缺点

  • 精度损失:由于是线性近似,Hard Sigmoid 可能会损失一些传统 Sigmoid 函数的精度。
  • 参数依赖:Hard Sigmoid 的效果依赖于参数 \alpha 的选择,不当的参数设置可能导致性能下降。
情况二:

考虑的xy的关系不是分段线性曲线,而是如图1.9所示的曲线。

解决方式:可以在这样的曲线上面,先取一些点,再把这些点点起来,变成一个分段线性曲线。而这个分段线性曲线跟原来的曲线,它会非常接近,如果点取的够多或点取的位置适当,分段线性曲线就可以逼近这一个连续的曲线,就可以逼近有角度的、有弧度的这一条曲线。

所以可以用分段线性曲线去逼近任何的连续的曲线,而每个分段线性曲线都可以用一大堆蓝色的函数组合起来。也就是说,只要有足够的蓝色函数把它加起来,就可以变成任何连续的曲线。

情况三:

当然,假设xy的关系非常复杂也没关系,就想办法写一个带有未知数的函数。直接写Hard Sigmoid 不是很容易,但是可以用一条曲线来理解它,用Sigmoid函数来逼近HardSigmoid, 如图1.10 所示。Sigmoid函数的表达式为\sigma(x) = c\frac{1}{1 + e^{-(b+wx_{1})}}

调整这里的bwc可以制造各种不同形状的Sigmoid函数,用各种不同形状的Sigmoid 函数去逼近Hard Sigmoid 函数。只要有不同的w不同的b不同的c,就可以制造出不同的Sigmoid函数,把不同的 Sigmoid 函数叠起来以后就可以去逼近各种不同的分段线性函数;分段线性函数可以拿来近 似各种不同的连续的函数。 

关于Sigmoid函数的介绍:

机器学习中的数学——激活函数(一):Sigmoid函数-CSDN博客

Sigmoid 函数是一种广泛应用于统计学和机器学习的激活函数,特别是在二分类问题的神经网络中。它的数学表达式如下:

\sigma(x) = c\frac{1}{1 + e^{-(b+wx_{1})}}

其中x_{1}是输入值,e 是自然对数的底数(约等于 2.71828),\sigma \left ( x \right )是函数的输出值,其范围在 0 到 1 之间。

特点

  • 饱和性:当输入值 x非常大或非常小的时候,sigmoid 函数的输出会趋近于 1 或 0,表现出饱和的特性
  • 平滑连续:在整个实数域上,sigmoid 函数都是光滑且连续的,这使得它在许多神经网络模型中作为激活函数使用。
  • 非线性:尽管输出值在 0 到 1 之间,但由于其形状呈S型,它能够引入非线性,使得神经网络可以模拟复杂的函数。

作用

在神经网络中,Sigmoid 函数常用于:

  • 分类:特别是在二分类问题中,输出值可以被解释为概率,通常需要在最后一层网络中使用。
  • 压缩值域:将任意实数值映射到 (0, 1) 区间。

缺点

尽管广泛使用,Sigmoid 函数也有一些缺点,如:

  • 梯度消失问题:当输入值非常大或非常小的时候,Sigmoid 函数的梯度接近于 0,这可能导致在训练过程中权重更新非常缓慢,特别是在深层网络中。
  • 计算成本:相比于某些其他激活函数(如ReLU),Sigmoid 函数涉及到指数运算,计算上更昂贵。

那么红色线就有了更灵活的合成方式:

对模型进行改进考虑加入更多的特征:

用矩阵和向量相乘的形式简化表示\left ( b_{i}+\sum_{j}^{}w_{ij}x_{j} \right )部分为r: 

 再由\alpha =\sigma \left ( r \right )可得到用线性代数表示的函数为y=b+c^{T}\alpha,即:

 接下来要定义损失以及优化:

定义损失:

直接用\Theta 来统设所有的参数,所以损失函数就变成L\left ( \Theta \right )。 先给定\Theta的值,即某一组W,\mathbf{b},c^{T},b的值,再把一种特征x代进去,得到估测出来的y, 再计算一下跟真实的标签之间的误差e。把所有的误差累加起来求平均,就得到损失。

优化:

要找到\Theta让损失越小越好,可以让损失最小的一组\Theta称为\Theta ^{*}。一开始要随机选一个初始的数值\Theta _{0}。接下来计算每一个未知的参数对L的微分,得到向量g,即可以让损失变低的函数。

假设有1000个参数,这个向量的长度就是1000,这个向量也称为梯度,\bigtriangledown L代表梯度。 L\left ( \Theta _{0} \right )是指计算梯度的位置,是在\Theta等于\Theta _{0}的地方。计算出g后,接下来更新参数,\Theta _{0}代 表它是一个起始的值,它是一个随机选的起始的值,\Theta _{1}代表更新过一次的结果,\Theta _{0}^{2}减掉\eta乘上微分的值,得到\Theta _{1}^{2},以此类推,就可以把1000个参数都更新了。

整个操作就是这样,由\Theta _{0}算梯度,根据梯度去把\Theta _{0}更新成\Theta _{1},再算一 次梯度,再根据梯度把\Theta _{1}再更新成\Theta _{2},再算一次梯度把\Theta _{2}更新成\Theta _{3},以此类推,直到不想做。或者计算出梯度为0向量,导致无法再更新参数为止,不过在实现上几乎不太可能梯度为0,通常会停下来就是我们不想做了。

使用小批量梯度下降算法 :

N笔数据随机分成一个一个的批量(batch),即分为一组一组的。每个批量里面有B笔数据,所以本来有N笔数据,现在B笔数据一组,一组叫做批量。本来是把所有的数据拿出来算一个损失,现在只拿一个批量里面的数据出来算一个损失,记为L_{1}L以示区别。假设B够大,也许LL_{1}会很接近。所以实现上每次会先选一个批量,用该批量来算L_{1},根据L_{1}来算梯度,再用 梯度来更新参数,接下来再选下一个批量算出L_{2},根据L_{2} 算出梯度,再更新参数,再取下 一个批量算出L_{3},根据L_{3}算出梯度,再用L_{3}算出来的梯度来更新参数。

所以并不是拿L来算梯度,实际上是拿一个批量算出来的L_{1},L_{2},L_{3}来计算梯度。把所有的批量都看过一次,称为一个回合(epoch),每一次更新参数叫做一次更新。更新跟回合是不同的东西。每次更新一次参数叫做一次更新,把所有的批量都看过一遍,叫做一个回合。举个例子,假设有10000笔数据,即N等于10000,批量的大小设10,也就B等于10。10000 个样本(example)形成了 1000 个批量,所以在一个回合里 面更新了参数1000次,所以一个回合并不是更新参数一次,在这个例子里面一个回合,已经更新了参数1000 次了。 

  • 模型变形:引入ReLU等激活函数来构建更复杂的模型。

Hard Sigmoid 可以看作是两个修正线性单元(Rectified Linear Unit,ReLU)的加总。如图1.18 所示,2 个ReLU 才能够合成一个Hard Sigmoid。要合成 i 个 Hard Sigmoid, 需要 i 个Sigmoid,如果 ReLU 要做到一样的事情,则需要 2i 个ReLU。因此表示一个 Hard Sigmoid 不是只有一种做法。在机器学习里面,Sigmoid 或 ReLU 称为激活函数(activation function)

关于ReLU的介绍:

深入理解ReLU函数(ReLU函数的可解释性)-CSDN博客

ReLU(Rectified Linear Unit,修正线性单元)是深度学习中非常流行的激活函数之一。它具有简洁的数学形式和良好的性能,尤其是在隐藏层中。ReLU 的表达式定义如下:

\text{ReLU}(x) =c* \max(0, b+wx_{1})

这意味着:

  • 当输入 b+wx_{1} 大于 0 时,输出就是 b+wx_{1}  本身。
  • 当输入 b+wx_{1} 小于或等于 0 时,输出就是 0。

特点

  • 稀疏激活:由于 ReLU 函数在输入小于0时输出为0,在输入大于0时输出为输入值本身,这导致在任何时候都有很多神经元的输出是0,这种现象称为稀疏激活
  • 计算效率:ReLU 函数的计算非常直接和简单,没有指数运算,因此在实践中比 Sigmoid 或 Tanh 函数更快
  • 缓解梯度消失问题:相比于 Sigmoid 或 Tanh 函数,ReLU 在正区间的梯度恒定为1,这有助于缓解梯度消失问题,特别是在深层网络中。

变种

由于 ReLU 在训练深度神经网络时非常有效,但也存在一些缺点(比如“死亡ReLU”问题,即一旦输入小于0,梯度就为0,某些神经元可能永远不会再激活),因此出现了一些变种来解决这些问题:

  • Leaky ReLU:允许负输入有一个非零的梯度。\text{Leaky ReLU}(x) = \max(0.01x, x)
  • Parametric ReLU (PReLU):梯度的斜率是一个可学习的参数。 \text{PReLU}(x) = \max(ax, x)其中 a是一个可学习的参数。
  • Exponential Linear Unit (ELU):提供一个小的负值斜率,以解决“死亡ReLU”问题。\text{ELU}(x) = \max(x, \alpha(e^x - 1))

应用

ReLU 及其变种广泛应用于各种深度学习模型中,包括卷积神经网络(CNN)、循环神经网络(RNN)等,因为它们简单且有效。

使用线性模型和ReLU的损失比较: 

继续改进: 如图1.21 所示,从x变成a,就是把x乘上wb,再通过 Sigmoid 函数或者ReLU函数得到a,同样的事情再反复地多做几次。 所以可以把x做这一连串的运算产生a,接下来把a做这一连串的运算产生a^{'}。 反复地多做的次数又是另外一个超参数。注意,w,bw^{'},b^{'}不是同一个参数,是增加了更多的未知的参数。

使用不同层数的ReLU得到的损失:

其中第三层的预测结果与实际结果比对如下图所示:

5.深度学习

 神经网络构建

  • 神经元(neuron):基本的计算单元,可以应用激活函数处理输入数据。如Sigmoid 或 ReLU。
  • 神经网络(neural network):神经网络由大量的节点(或称为“神经元”)组成,这些节点通常被组织成层。
  • 隐藏层(hidden layer):神经网络中位于输入层和输出层之间的层,其主要作用是提取输入数据的特征并进行处理,以便网络能够学习和执行复杂的任务。【隐藏层的存在使得神经网络能够学习和模拟非线性关系,从而解决线性不可分问题。
  • 深度网络:通过堆叠多个隐藏层来构建深度学习模型,提高模型的表达能力。

过拟合(overfitting)

在使用多层数的ReLU预测时损失有所降低,但 4 层在训练数据上,损失是100,在没有看过2021年的数据上,损失是440。在训练数据上,3 层比4层差,但是在没看过的数据上,4层比较差,3层比较好,这种情况称为过拟合(overfitting)

过拟合的原因

  1. 模型复杂度过高:模型参数过多,或者模型结构过于复杂,导致模型能够捕捉到训练数据中的每一个小细节和噪声。
  2. 训练数据不充分:训练样本数量太少,或者数据的多样性不足,使得模型无法泛化到新数据。
  3. 训练过度:模型在训练数据上训练时间过长,直到学会数据中的每个细节和异常值。

过拟合的表现

  1. 训练误差极低:模型在训练数据上的误差非常低,几乎可以完美预测训练数据。
  2. 测试误差较高:模型在验证集或测试集上的表现远不如训练集,误差较高。
  3. 泛化能力差:模型对新数据的预测能力弱,无法很好地推广到实际应用中。

过拟合的解决方案

  1. 增加数据量:收集更多的训练数据,提高数据的多样性,使模型能够学习到更一般化的特征。
  2. 数据增强:通过对训练数据进行变换(如旋转、缩放、裁剪等),增加数据的多样性。
  3. 正则化:引入正则化项(如L1、L2正则化),惩罚模型的复杂度,限制模型的过拟合倾向。
  4. 简化模型:减少模型的复杂度,如减少层数、神经元数量或参数。
  5. 早停法(Early Stopping):在训练过程中,当验证集上的性能不再提升时停止训练,避免过度拟合训练数据。
  6. 交叉验证:使用交叉验证来评估模型的泛化能力,选择最佳模型。
  7. Dropout:在训练过程中随机丢弃一部分神经元,减少模型对特定数据的依赖。
  8. 集成学习:通过集成多个模型来减少过拟合,如Bagging、Boosting和随机森林。

过拟合的检测

  • 训练集与验证集的误差差异:如果训练误差远低于验证误差,可能是过拟合的迹象。
  • 学习曲线观察:绘制训练和验证误差随训练过程的变化曲线,如果训练误差持续降低而验证误差增加,可能是过拟合。

反向传播 (BackPropagation,BP)

反向传播是深度学习中用于训练神经网络的核心算法。它通过计算损失函数关于网络参数的梯度,然后利用这些梯度来更新网络的权重和偏置,以此最小化损失函数。反向传播算法结合了梯度下降优化方法,是训练深度神经网络的基础

反向传播的步骤

1.前向传播(Forward Pass)

  • 输入数据在网络中从输入层经过隐藏层传递到输出层。
  • 每一层的神经元计算其输入的加权和,然后应用激活函数,生成输出。
  • 最终输出层的激活结果与真实标签的误差通过损失函数计算得到。

2.计算损失(Loss Calculation)

  • 根据网络的预测输出和实际的目标值计算损失。
  • 损失函数可以是均方误差(MSE)用于回归问题,或交叉熵损失用于分类问题。

3.反向传播(Backward Pass)

  • 损失函数关于网络参数(权重和偏置)的梯度需要计算出来。
  • 这个过程从输出层开始,逆向通过网络的每一层,利用链式法则计算梯度。
  • 梯度计算涉及对激活函数的导数和权重的反向传播。

4.参数更新(Parameter Update)

  • 利用计算得到的梯度和预定的学习率来更新网络中的权重和偏置。
  • 更新公式通常是:\theta = \theta - \eta \cdot \nabla_\theta J(\theta),其中 \theta 表示参数,\eta 是学习率,\nabla_\theta J(\theta) 是损失函数 J 关于 \theta 的梯度。

5.迭代过程

  • 重复上述过程,通过多个训练周期(Epochs),每个周期包括多个批次(Batches)的数据,直到模型性能不再提升或达到预定的迭代次数。
反向传播的关键点
  • 链式法则:反向传播中使用链式法则来计算复合函数的导数,这是求解多层网络梯度的基础。
  • 梯度爆炸和消失:在深层网络中,梯度可能会随着层数增加而指数级增长(爆炸)或减少(消失),这会影响网络的训练效果。使用ReLU等激活函数和适当的权重初始化可以缓解这些问题。
  • 优化算法:虽然最基本的梯度下降方法被用于反向传播,但更高级的优化算法如Adam、RMSprop等可以加速训练过程并提高模型性能。
反向传播的实际应用

反向传播算法是现代深度学习框架(如TensorFlow、PyTorch)中实现神经网络训练的基础。这些框架提供了自动微分功能,可以自动计算梯度,极大地简化了神经网络的训练过程。

Task 3 机器学习框架&实践攻略

李宏毅老师对应视频课程:

机器学习任务攻略_哔哩哔哩_bilibili

机器学习框架

  • 数据准备:包括训练数据和测试数据的准备。
  • 模型构建:定义模型结构,包括参数和激活函数。
  • 损失函数定义:选择合适的损失函数来衡量预测误差。
  • 优化问题解决:使用梯度下降等方法找到最小化损失的模型参数。

在应用机器学习算法时,实践方法论能够帮助我们更好地训练模型。模型的训练首先会先应用在训练数据集上,如果训练数据的损失很大,显然它在训练集上面还没有训练好。接下来分析一下在训练集上面没有学好的原因。

1. 模型偏差

  • 定义:模型过于简单,无法捕捉数据中的复杂关系。
  • 问题:即使找到最佳参数,模型的损失仍然很高,因为模型无法描述能使损失降低的函数。
  • 解决方法
    • 增加输入特征。
    • 使用更大的模型或深度学习来提高模型的灵活性。

2. 优化问题

  • 定义:梯度下降等优化算法可能无法找到全局最优解,可能会卡在局部最小值。
  • 问题:即使模型有足够的灵活性,优化算法也可能无法找到损失低的参数。
  • 解决方法
    • 使用不同的优化算法。
    • 调整学习率和其他超参数。

如果在机器学习模型训练过程中找不出损失最小的函数,可能的原因有两个:

  1. 模型偏差:模型过于简单,没有足够的灵活性来捕捉数据中的复杂关系。在这种情况下,即使找到了最佳参数,模型的损失仍然会很高,因为模型无法描述能使损失降低的函数。(“大海捞针”,针却不在海里)

  2. 优化问题:即使模型有足够的灵活性,优化算法(如梯度下降)可能无法找到损失最低的参数。这可能是因为算法卡在了局部最小值,或者由于其他优化算法的问题。(“大海捞针”,找不到针)

如何判断具体是哪一种:

  • 比较不同模型:可以通过比较不同复杂度的模型在训练集上的表现来判断。如果一个更简单的模型已经能够获得较低的损失,而一个更复杂的模型无法获得更低的损失,那么这可能表明优化存在问题,而不是模型偏差。【先跑一些比较小的、比较浅的网络,或甚至用一些非深度学习的方法,比如线性模型、支持向量机(SupportVectorMachine, SVM),SVM 可能是比较容易做优化的,它们比较不会有优化失败的问题。机器学习 | 一文看懂SVM算法从原理到实现全解析-CSDN博客

  • 实验:文章中提到了残差网络的例子,通过比较不同层数的网络在训练集上的损失,可以判断是优化问题还是模型偏差。如果更深的网络在训练集上的损失没有随着网络深度的增加而减少,这可能表明优化不给力。

  • 验证集:使用验证集来评估模型的表现。如果模型在训练集上的损失很低,但在验证集上的损失很高,这可能是过拟合的迹象。如果训练集和验证集上的损失都很高,那么可能是模型偏差。

  • 交叉验证:使用 k 折交叉验证可以更准确地评估模型的泛化能力。通过在不同的训练集和验证集组合上评估模型,可以更好地判断模型的性能。

3. 过拟合(结合Task 2中深度学习模块下的内容)

  • 定义:模型在训练数据上表现很好,但在未见过的数据上表现差。
  • 原因:模型过于复杂,学习了训练数据中的噪声。(其它没有训练集做为限制的地方,因为模型的灵活性很大,模型就可以变成各式各样的函数,没有给它数据做为训练,就会产生各式各样奇怪的结果。)
  • 解决方法
    • 增加训练数据。
    • 使用数据增强。
    • 限制模型的复杂度,如减少参数、减少特征值、使用正则化、早停或丢弃法。

增加训练数据

  • 定义:增加训练数据是指将更多的数据样本纳入模型的训练过程中,以提高模型的泛化能力。
  • 目的:通过增加数据量,模型可以学习到更多的特征和模式,从而减少过拟合的风险,并提高对未知数据的预测准确性。
  • 方法
    • 收集更多与当前任务相关的数据。
    • 确保新数据的质量和多样性,以覆盖不同的特征和情况。
  • 优点
    • 直接增加模型学习的信息量。
    • 有助于模型学习到更广泛的数据分布。
  • 缺点
    • 可能需要更多的时间和资源来收集和处理数据。
    • 如果新数据与原有数据分布不一致,可能会导致模型性能下降。

使用数据增强

  • 定义:数据增强是一种技术,通过对现有数据进行变换或修改,生成新的数据样本,以增加训练数据的多样性。
  • 目的:通过变换原始数据,生成新的、变化的数据样本,使模型能够学习到数据的不同表现形式,增强模型对新情况的适应能力。
  • 方法
    • 图像数据:旋转、缩放、裁剪、颜色调整等。【对图像的处理一般是左右翻转或者放缩,一般不会上下颠倒】
    • 文本数据:同义词替换、句子重组、回译等。
  • 优点
    • 可以在不实际收集新数据的情况下增加数据多样性。
    • 通常成本较低,可以快速生成大量新样本。
  • 缺点
    • 增强的数据可能不总是反映真实世界的情况。【图像的上下颠倒】
    • 过度增强可能导致模型学习到错误的模式。

总结

  • 增加训练数据是通过引入更多的原始数据来提高模型性能,而数据增强是通过变换现有数据来创造新的数据点。
  • 增加训练数据更依赖于获取新的、真实的数据样本,而数据增强则是一种创造性的方法,通过算法生成新的数据变体。
  • 在实际应用中,两者可以结合使用,以最大化模型的性能和泛化能力。例如,在一个数据量有限的任务中,可以先使用数据增强来增加多样性,然后通过收集更多的数据来进一步改善模型。

    限制模型的复杂度

  • 减少参数:如果是深度学习的话,可以减少的神经元的数量或者让模型共用参数。(全连接网络(fully-connected network)其实是一个比较有灵活性的架构, 而卷积神经网络(Convolutional Neural Network,CNN)是一个比较有限制的架构。)
  • 减少特征值
  • 使用正则化、早停或丢弃法:
1.正则化(Regularization)通过惩罚权重的大小来限制模型复杂度
  • 定义:正则化是一种通过在损失函数中添加一个额外项(通常是模型权重的L1或L2范数)来限制模型复杂度的技术。
  • 目的:防止模型过度拟合训练数据,提高模型的泛化能力。
  • 方法
    • L1正则化:添加权重的绝对值之和,倾向于产生稀疏权重矩阵,即许多权重会变成0。
    • L2正则化:添加权重的平方和,使权重值尽可能小,但不会变成0。
  • 优点
    • 简单易实现。
    • 可以与其他技术(如早停和丢弃法)结合使用。
  • 缺点
    • 需要调整正则化强度的超参数。
    • 在某些情况下可能会抑制模型的学习能力。
2. 早停(Early Stopping)通过监控验证集损失来避免过度训练
  • 定义:早停是一种在训练过程中提前结束训练的技术,当验证集上的性能不再提升或开始下降时停止训练。
  • 目的:避免模型在训练集上过拟合。
  • 方法
    • 在每个训练周期后评估验证集的损失。
    • 如果验证集损失在连续几个周期内没有显著下降,或者开始上升,则停止训练。
  • 优点
    • 有效防止过拟合。
    • 节省训练时间,避免不必要的计算。
  • 缺点
    • 需要设置一个合适的“耐心”参数,即在停止训练前允许验证损失不下降的周期数。
3. 丢弃法(Dropout)通过随机丢弃神经元来增加模型的鲁棒性
  • 定义:丢弃法是一种在训练过程中随机“丢弃”(即暂时移除)神经网络中的一些神经元的技术,以防止它们共同适应训练数据。
  • 目的:提高模型的泛化能力,防止过拟合。
  • 方法
    • 在每次训练迭代中,随机选择一些神经元并将其输出设置为0。
    • 这导致每次训练时网络结构都略有不同,增加了模型的鲁棒性。
  • 优点
    • 有效减少过拟合。
    • 相当于训练多个不同的模型,增加了模型的多样性。
  • 缺点
    • 训练时间可能比不使用丢弃法的模型长。
    • 需要调整丢弃率,即每次迭代中被丢弃的神经元的比例。

4. 交叉验证

  • 定义:将训练数据分成两个部分,其中一部分作为验证集,其余作为训练集。
  • 目的:更准确地估计模型在未知数据上的表现。
  • 方法
    • k 折交叉验证:将训练集分成 k 份,进行 k 次训练和验证。

5. 不匹配

  • 定义:训练数据和测试数据的分布不一致。
  • 问题:即使模型在训练数据上表现良好,也可能在测试数据上表现不佳。
  • 解决方法
    • 理解数据的产生方式。
    • 确保训练和测试数据来自相同的分布。

总结

  • 在遇到新问题时,先使用简单的模型或非深度学习方法,以建立基线(baseline)
  • 如果深度模型的表现不如简单模型,可能是优化问题。
  • 在选择模型时,应考虑模型的复杂度和灵活性,避免过拟合和模型偏差。
  • 使用交叉验证来选择模型,而不是仅依赖于公开测试集的表现。
  • 注意数据的分布,避免不匹配问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值