Datawhale X 李宏毅苹果书 向李宏毅学深度学习(进阶) 是 Datawhale 2024 年 AI 夏令营第五期的学习活动(“深度学习 进阶”方向)
Datawhale官方的task1链接:深度学习进阶-Task1
《深度学习详解》主要内容源于《机器学习》(2021年春),选取了《机器学习》(2017年春) 的部分内容,在这些基础上进行了一定的原创,补充了不少除这门公开课之外的深度学习相关知识。
为了尽可能地降低阅读门槛,笔者对这门公开课的精华内容进行选取并优化,对所涉及的公式都给出详细的推导过程,对较难理解的知识点进行了重点讲解和强化,以方便读者较为轻松地入门。
在理论严谨的基础上,本书保留了公开课中大量生动有趣的例子,帮助读者从生活化的角度理解深度学习的概念、建模过程和核心算法细节,包括——
-
卷积神经网络、Transformer、生成模型、自监督学习(包括 BERT 和 GPT)等深度学习常见算法,
-
对抗攻击、领域自适应、强化学习、元学习、终身学习、网络压缩等深度学习相关进阶算法。
目录
1. 局部极小值与鞍点
那我们如何判断临界点类型?
那我们如果进入了鞍点,有什么逃离的方法吗?
2. 批量梯度下降与随机梯度下降:前进的步伐
拓展: 小批量梯度下降法(MBGD)
批量大小的影响
3. 动量法:加速前进的助力
动量法的好处
4. 公式理解
泰勒级数近似
海森矩阵
总结
在第五期的进阶方向的学习内容中,Task1主要学习局部极小值与鞍点、批量和动量的知识点,对应《深度学习详解》一书中的3.1及3.2的内容。
在深度学习模型训练中,优化算法起着至关重要的作用。它决定了模型参数更新的方向和速度,进而影响模型的性能和泛化能力。本笔记将结合图文,深入浅出地解释深度学习中的优化概念和算法,包括局部极小值、鞍点、批量梯度下降、随机梯度下降、动量法以及自适应学习率。
1. 局部极小值与鞍点
优化算法的目标是找到损失函数的最小值。然而,损失函数的表面可能非常复杂,存在多个局部极小值和鞍点。
- 局部极小值: 损失函数在局部范围内最低的点,周围都是损失更高的区域,如图a所示。如果模型收敛到局部极小值,那么就无法进一步降低损失,模型性能将受到限制。
- 鞍点: 梯度为零,但周围既有损失更高的区域,也有损失更低的区域,形状像马鞍,如图b所示。鞍点比局部极小值更难以逃离,因为周围没有明确的下降方向。
那我们如何判断临界点类型?
判断一个临界点是局部极小值还是鞍点,需要了解损失函数的形状。虽然无法完整知道整个损失函数的样子,但我们可以利用泰勒级数近似,将损失函数在某点附近展开成多项式:
其中,g 是梯度,H 是海森矩阵。海森矩阵包含了函数的二阶导数信息,可以帮助我们判断临界点的类型:算出一个海森矩阵后,不需要把它跟所有的 v 都乘乘看,只要看 H 的特征值。
- 正定矩阵: 所有特征值都为正,对应局部极小值。
- 负定矩阵: 所有特征值都为负,对应局部极大值。
- 既有正特征值又有负特征值: 对应鞍点。
若 H 的所有特征值都是正的,H 为正定矩阵,临界点是局部极小值。若 H 的所有特征值都是负的,H 为负定矩阵,临界点是局部极大值。 若 H 的特征值有正有负,临界点是鞍点。
那我们如果进入了鞍点,有什么逃离的方法吗?
误差表面其实会根据维度会有不同的形态,果我们移动某两个参数,误差表面的变化非常的复杂, 有非常多局部极小值。低维度空间中的局部极小值点,在更高维的空间中,实际是鞍点。如图 a 所示的一维空间中的误差表面,有一个局部极小值。但是在二维空间(如 图 b 所示),这个点就可能只是一个鞍点。常常会有人画类似图 c 这样的图来告诉 我们深度学习的训练是非常复杂的。
那我们可以如何有效的识别鞍点,并且逃出鞍点呢?目前有没有比较有效的方法呢?
其实目前我们可以目前可以参考一下使用Adam及其变体、动量SGD和组合优化器,可以试着了解一下这些优化策略,都是常用的避免异常逼停的策略。
2. 批量梯度下降与随机梯度下降:前进的步伐
为了找到损失函数的最小值,我们需要不断更新模型参数。常见的参数更新方法包括批量梯度下降 (BGD) 和随机梯度下降 (SGD)。
- 批量梯度下降 (BGD): 使用全部训练数据计算梯度,更新参数,如图 a 所示。BGD 的优点是更新方向稳定,但缺点是计算量大,容易陷入局部最小值或鞍点。
- 随机梯度下降 (SGD): 使用少量训练数据(一个或几个)计算梯度,更新参数,如图3.8(b)所示。SGD 的优点是计算量小,容易逃离局部最小值,但缺点是更新方向随机,训练不稳定。
拓展: 小批量梯度下降法(MBGD)
SGD和BGD是两个极端, 而MBGD是两种方法的折衷,每次选择一批数据来求梯度。
该方法也容易陷入局部最优,现在说SGD一般都指MBGD
定义:小批量梯度下降(Mini-Batch Gradient Descent, MBGD)是对批量梯度下降以及随
机梯度下降的一个折中办法。其思想是:每次迭代 使用指定个(batch_size)样本来对
参数进行更新。
优点:通过矩阵运算,每次在一个batch上优化神经网络参数并不会比单个数据慢太多。每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。
缺点:batch_size的不当选择可能会带来一些问题。
批量大小的影响
实际上在计算梯度的时候,并不是对所有数据的损失 L 计算梯度,而是把所有的数据分 成一个一个的批量(batch),每个批量的大小是 B ,即带有 B 笔数据。每次在 更新参数的时候,会去取出 B 笔数据用来计算出损失和梯度更新参数。遍历所有批量的过程 称为一个回合(epoch)。
批量大小是每次迭代使用的训练数据数量。批量大小会影响计算速度、更新稳定性、优化效果和泛化能力。
- 计算速度: 批量大小越大,每次迭代计算量越大,但可以利用并行计算提高效率。
- 更新稳定性: 批量大小越大,更新方向越稳定,但容易陷入局部最小值。
- 优化效果: 批量大小越小,更容易逃离局部最小值,但训练时间更长。
- 泛化能力: 小批量训练模型泛化能力更好,因为它更容易跳出局部最小值,找到更好的局部最小值或鞍点。
在实际运用中,为什么批量大小继续增加,在没有爆显存前,迭代时间会增加? 文章中虽然提到batchsize小,效果会好。但batchsize越小似乎也不是越好?因为可能会不收敛?
当批量大小增加时,GPU的利用率确实会提高,但并不一定是GPU总是满负荷运行的带来的影响,往往在批量上调超过了硬件性能的阈值后,内存带宽也可能成为主要因素。迭代时间的变动主要与数据传输时间、GPU的计算效率和操作调度有关系。
小批量会带来泛化能力和梯度的噪声,有助于减少过拟合的风险等情况,但也不可以太小,可能会导致模型梯度不稳定,每次迭代更新的信息有限,可能需要更多的迭代次数才能收敛。
3. 动量法:加速前进的助力
动量法是一种改进的梯度下降方法,它结合当前梯度和过去梯度信息,更新参数。用物理学上的动量思想,在梯度下降的问题中做了修改,公式为:
其中 vi 是当前速度,γ 是动量参数,是一个小于1的正数,η 是学习率
相当于每次在进行参数更新的时候,都会将之前的速度考虑进来,每个参数在各方向上的移动幅度不仅取决于当前的梯度,还取决于过去各个梯度在各个方向上是否一致,如果一个梯度一直沿着当前方向进行更新,那么每次更新的幅度就越来越大,如果一个梯度在一个方向上不断变化,那么其更新幅度就会被衰减,这样我们就可以使用一个较大的学习率,使得收敛更快,同时梯度比较大的方向就会因为动量的关系每次更新的幅度减少,如下图
动量法的好处
- 加速收敛: 避免梯度下降过程中的锯齿状路径,加速收敛速度。
- 逃离局部最小值: 利用惯性跳过局部最小值,找到更好的局部最小值或鞍点。
4. 公式理解
对于文章中提到的泰勒级数近似和海森矩阵我找了一些文字说明和视频,来帮助我们理解
泰勒级数近似
泰勒级数近似是一种将函数在某点附近展开成多项式的方法。它可以帮助我们了解函数在该点附近的行为,并方便进行计算。
公式:f(x) ≈ f(a) + f’(a)(x - a) + f’‘(a)(x - a)^2/2! + f’‘’(a)(x - a)^3/3! + …
其中,f(x) 是函数,a 是展开点,f’(a), f’‘(a), f’‘’(a) 分别是函数在 a 点的一阶导数、二阶导数、三阶导数,2!, 3! 分别是 2 和 3 的阶乘。
应用:
在深度学习中,我们通常使用泰勒级数近似将损失函数在某点附近展开成二次多项式,以便分析损失函数的性质,例如判断临界点的类型。
如何用级数来求函数近似值?看泰勒公式是如何展开的_哔哩哔哩_bilibili
海森矩阵
海森矩阵是一个方阵,它包含了函数的二阶导数信息。海森矩阵可以帮助我们判断临界点的类型,并找到逃离鞍点的方向。
公式: H = [[∂^2f/∂θ_i∂θ_j] for i in range(n) for j in range(n)]
其中,H 是海森矩阵,f 是函数,θ 是参数向量,n 是参数的数量。
应用: 在深度学习中,我们通常使用海森矩阵来判断临界点的类型。如果海森矩阵是正定矩阵,那么临界点是局部极小值;如果海森矩阵是负定矩阵,那么临界点是局部极大值;如果海森矩阵既有正特征值又有负特征值,那么临界点是鞍点。
【懒人必看】快速学懂Hessian矩阵 海森矩阵_哔哩哔哩_bilibili
13.鞍点和海森矩阵_哔哩哔哩_bilibili
总结
深度学习中的优化是一个复杂的过程,需要综合考虑多种因素,例如局部极小值、鞍点、批量大小、动量法、自适应学习率等。选择合适的优化策略,了解这些可以帮助我们更好地训练模型,提高模型的性能和泛化能力。