在完成了上一期的Datawhale夏令营后,我从上一期的AI夏令营受益匪浅(详情可见我之前的博客,发了总共4弹的心得),因此我打算继续报名AI夏令营。这一次我报名的课程是“李宏毅深度学习(进阶班)”,主要的任务就是跟着经典书籍《LeeDL-Tutorial机器学习详解》(即“苹果书”,台湾大学李宏毅教授著),GitHub上有该书的链接:
https://github.com/datawhalechina/leedl-tutorial
“跟李宏毅学深度学习班”分为基础班和进阶班两班,由于我在上半年自学过吴恩达(Andrew Ng)老师的机器学习相关课程,自认为有一定基础,遂报进阶班。
接下来就是我在阅读教材时的一些心得了。
教材链接放这:
https://linklearner.com/activity/16/15/45
https://linklearner.com/activity/16/15/46
今天的任务就是学习书籍的第三章第一节“局部极小值与鞍点”与第二节“批量和动量”。
3.1 局部极小值与鞍点-内容精华
我们在进行“梯度下降”的操作时,通常当参数对损失微分为零的时候,梯度下降就不能再更新参数了,训练就停下来了,损失不再下降了。如果是把原函数所有参数打包一块,看做一个单变量函数的话就有如下情形:
但是这两种情形在停止训练时的训练损失仍然不够小,那是因为我们使用了一些操作把原本的多变量函数化成了单变量函数。如果我们换个方法,改成双变量,结果就可能会有如下两种情形了:
如果是取到了局部极小值的话,那很遗憾,我们需要选择其他点重新进行梯度下降了;
但是如果是取到了鞍点的话,我们仍然可以继续沿着鞍的边缘进行梯度下降,这样可能会让我们的训练损失达到我们的目标值。
所以我们解决问题的可能的关键是判断我们无法梯度下降的点是局部极小值还是鞍点了。
判断局部极小值或鞍点的方法
根据泰勒级数近似(Tayler series appoximation),我们可以近似得出如下关系式:
其中g代表梯度,它是一个向量,可以弥补 L(θ′)跟L(θ)之间的差距。
接下来的一块我直接引用教材的文字了不好打字出来
所以我们可以得出:
(还是不肯打字)
其实这点和我们学多元微积分时遇到的鞍点判断方法挺像的,可以看看MIT18.02的内容:
应该是18.02系列课的第四份讲义
也是通过不同的二阶导来判断改点的性质,个人认为这样证明比海森矩阵来得更方便些(但本质上还是一样的)。
逃离鞍点的方法
我们在训练一个网络的时候,参数数量动辄达百万千万级,所以误差表面其实有非常高的维度。多数的时候,我们训练到一个梯度很小的地方,参数不再更新,往往只是遇到了鞍点。
低维度空间中的局部极小值点,在更高维的空间中,实际是鞍点。
就像这张图一样,也许我们只需要更改一下参数,说不定就能逃离鞍点了。
隐藏任务
隐藏任务①:搜索资料,找到一个优化失败的案例,尝试用自己的话描述一遍情况
这其中最经典的应该就是梯度爆炸(Exploding Gradient)相关的问题了吧。
当网络层数很深或者权重初始化不当时(比如学习率的符号设反了),反向传播计算的梯度会迅速增大,这使得权重更新的步长非常大。梯度爆炸会导致模型的损失函数值变得极大,从而使模型训练不稳定,甚至无法继续训练。
隐藏任务②:过一遍文档,给自己的理解程度打一个分数,如果低于30%,尝试配合视频食用,另外尝试问问AI
我个人第一次跟着讲义和视频学下来能掌握个七八成的样子吧(毕竟有一定的数学功底嘻嘻)(那就75分doge),然后再根据老师的建议不懂的问GPT,可以说基本掌握了全部知识了。
小结
感觉这一节还是对数学的要求较高,可以说数学基础好的可以在20分钟内(视频跳过部分内容的话)搞定。因为泰勒展开和海森矩阵的推导内容在有着扎实的微积分基本功的前提下可以很快理解。
3.2 批量和动量-内容精华
基本概念
由于本节的基础概念较多,我决定单独列出本节的诸多概念,这是用我自己的话描述的,可能部分术语不太精确:
批量:将多个相似或相同的物品或任务聚集在一起,作为一个整体进行处理的方式
回合:遍历所有批量的过程
随机打乱:将一个集合的元素顺序随机重新排列
批量梯度下降法:使用整个训练数据集来计算损失函数的梯度,然后更新模型参数
随机梯度下降法(增量梯度下降法):在每次迭代时仅使用一个训练样本来计算损失函数的梯度并更新模型参数
动量法:参考了物理的动量概念,通过一定手段使梯度下降时不被局部最小值或鞍点卡住
批量对梯度下降的影响
由于GPU的架构与CPU大相径庭,批量大小从1至1000通过显卡计算需要耗费的时间几乎相当,批量的计算原理如图所示:
我们在“打包”批量时,会对原始数据进行“随机打乱”操作,即每一个回合开始之前重新划分批量。这有点像我们划分训练集、交叉验证集和测试集的操作。
我们在划分批量时,也需要注意到:
批量大的优势:计算时间短、串行时间短、噪声干扰小
批量大的劣势:并行时间长、优化能力弱、异常情况容易卡死
大的批量大小会让我们倾向于走到“峡谷”里面,而小的批量大小倾向于让我们走到“盆地”里面。
因此,我们可以得出:大的批量可以拿来做初步的训练,用并行计算的能力来增加训练的效率;然后再用小的批量做一些精细化的训练。
动量法
如图所示,我们的“小球”在梯度下降时在经过局部最小值时,仍然有一定“速度”,这就使得小球仍有继续向前的“动力”,也许就能找到更加合适的局部最小值。
引入动量后的移动参数将发生一定的改变:移动方向由梯度的反方向加上前一步移动的方向决定(如图所示)。
这样的话,我们就可以在一定程度上摆脱局部极小值或是鞍点带来的困境。