十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Deep Learning for Computer Vision——Regularization and Optimization

Deep Learning for Computer Vision——Regularization and Optimization 本课核心要解决的两大问题正则化Regularization模型在训练集上太“死记硬背”了过拟合我们怎么给它套个紧箍咒让它在新数据上也能考高分优化Optimization上一课我们有了损失函数痛苦指标这节课我们具体怎么下山——怎么一步步修改权重 WW让损失降到最低第一部分正则化Regularization—— 给模型戴上“紧箍咒”1. 为什么要正则化奥卡姆剃刀原则白话解释如果两个模型在训练集上都得了100分完全猜对我们优先选那个更简单的模型。如果简单模型实在搞不定再换复杂的。2. 损失函数的新公式加刑现在损失函数变成两部分总损失数据损失Data Lossλ×正则化损失Regularization Loss数据损失模型在训练集上猜得有多痛苦越大越差。正则化损失模型自己带了多少“累赘”权重越大惩罚越重。λLambda正则化强度。这是一个超参数和KNN里的K一样要用验证集来调。λ0完全不管随便模型怎么复杂。λ∞无穷大模型敢有任何权重直接罚死模型变成全0啥也学不到。3. 两大常用正则化武器L1 和 L2一定要分清假设我们有一个权重向量 w[0.5,−0.5,1.0,0.0]正则化类型数学公式计算示例代入w性格特点几何直观L2 正则化岭回归0.250.251.001.5“和稀泥”它讨厌大数字逼迫所有权重都尽量小且分散。因为它平方了大数字1.0的惩罚1.0比小数字0.5的惩罚0.25大得多。L1 正则化Lasso0.50.51.002.0“极端洁癖”它只算绝对值会让大量不重要的特征权重直接变成0稀疏矩阵。用来做特征选择特别好。灵魂画图L1 vs L2 的等高线想象在二维坐标轴权重 w1w1​, w2w2​上L2的等高线是个圆形。它跟损失函数相交时很容易切在坐标轴上非零的地方所以权重多为非零小值。L1的等高线是个菱形正方形旋转45度。它的尖角顶在坐标轴上所以很多权重会被强制切成0。选哪个如果特征数量巨大比如文本分析认为很多特征没用 → 用L1砍掉无用特征。如果特征本来就很重要比如图像像素认为大家都有用 → 用L2让大家平分权重。第二部分优化Optimization—— 怎么找到最好的 W1. 最蠢但最直观的办法随机搜索Random Search做法生成几千组随机的 W挨个算损失选损失最小的那个。效果在CIFAR-1010类上瞎蒙准确率是10%随机搜索最好能到15.5%。结论比瞎蒙强点但跟傻子差不多绝不可取。2. 聪明办法沿着斜坡往下滚梯度下降既然我们要求损失函数 L(W) 的最小值而高维空间我们想象不出来我们看一维情况只有一个权重 x导数的定义斜率导数大于0函数在上升导数小于0函数在下降。在多维空间有N个权重中我们把每个权重的偏导数拼成一个向量这就是梯度Gradient。梯度的方向指向函数值上升最快的方向。我们想要下降所以参数更新公式是学习率×梯度3. 梯度下降的代码骨架最基础的版本# 伪代码 while True: # 1. 根据当前权重w计算损失函数关于w的梯度 dw compute_gradient(loss_function, data, w) # 2. 沿着梯度的反方向迈出一步步长 learning_rate w - learning_rate * dw第三部分深入梯度下降的痛点为什么需要高级优化器最基本的梯度下降Batch Gradient Descent有两个致命缺点痛点1计算太慢如果训练集有100万张图算一次梯度要跑遍100万张太慢。解法随机梯度下降SGD每次只随机抽一小批Mini-batch数据比如256张来算梯度用这个梯度代表全局梯度。痛点2在“陡峭峡谷”中左右横跳高条件数图示text⛰️ 山脊陡峭方向 ↑ 振荡巨大 ←—————→ 我们想去的平坦方向但走得极慢如果损失函数的形状像个长条形峡谷一个方向特别陡另一个方向特别平SGD会在陡坡上左右震荡在平坡上像蜗牛爬。痛点3陷入局部极小值Local Minima和鞍点Saddle Point局部极小值掉进小坑里以为到底了其实旁边还有个深谷。鞍点这是高维噩梦在二维图上像个马鞍一个方向向上一个方向向下梯度在此处为0。关键认知在深度学习高维空间中局部极小值很少见满大街都是鞍点因为要让所有方向都向上太难了只要有某个方向是平的或向下的梯度就是0SGD就卡死在这里不动了。第四部分四大优化器进化史为了解决上述痛点优化器经历了四代进化。我们把dx当成当前算出来的梯度。 第一代Vanilla SGD原始版# 缺点在峡谷震荡在鞍点卡死 x - learning_rate * dx 第二代SGD Momentum动量法—— 像推铁球下山核心思想不只看当前的梯度还要积累历史速度惯性。如果一直往一个方向走速度越来越快能冲过鞍点和小坑。# 先定义速度 v初始为0 v 0 while True: dx compute_gradient(x) # 更新速度旧速度*动量系数 当前梯度 v mu * v - learning_rate * dx # mu通常取0.9 x v # 更新参数作用在峡谷的陡峭方向梯度正负震荡累加起来抵消了在平坦方向一直有微小的正梯度越积越大嗖的一下就冲出去了 第三代RMSProp自适应学习率—— 给每个参数单独调步长核心思想梯度大的参数陡峭方向步长调小点防止震荡梯度小的参数平坦方向步长调大点加速前进。# 缓存梯度平方的移动平均 grad_squared 0 while True: dx compute_gradient(x) # 累加平方梯度哪边陡哪边累加得大 grad_squared decay_rate * grad_squared (1 - decay_rate) * dx * dx # 更新参数除以 sqrt(累加平方)陡峭方向除以大数步长变小平坦方向除以小数步长变大 x - learning_rate * dx / (np.sqrt(grad_squared) 1e-7) # 1e-7防止除以0 第四代Adam目前最主流Momentum RMSProp 的私生子核心思想既有动量存历史梯度又有自适应学习率存历史平方梯度。⚠️偏差修正Bias Correction这是Adam防止刚开始训练时步子迈太大的关键没有偏差修正的Adam起步会爆炸first_moment 0 # 一阶动量带速度 second_moment 0 # 二阶动量自适应 while True: dx compute_gradient(x) first_moment beta1 * first_moment (1 - beta1) * dx # 类似Momentum second_moment beta2 * second_moment (1 - beta2) * dx*dx # 类似RMSProp x - lr * first_moment / (np.sqrt(second_moment) 1e-7)问题因为first_moment和second_moment初始都是0在训练刚开始t1时算出来的值会被初始化为极小的数导致分母极小除以它后第一步步长巨大无比直接飞出银河系✅ 加了偏差修正first_moment 0 second_moment 0 for t in range(1, num_iterations): dx compute_gradient(x) first_moment beta1 * first_moment (1 - beta1) * dx second_moment beta2 * second_moment (1 - beta2) * dx * dx # 关键修正除以 (1 - beta^t)随着t增大分母趋近于1修正逐渐消失 first_unbias first_moment / (1 - beta1 ** t) second_unbias second_moment / (1 - beta2 ** t) x - learning_rate * first_unbias / (np.sqrt(second_unbias) 1e-7)结论Adam通常默认参数beta10.9,beta20.999,learning_rate1e-3。在99%的CV任务中先无脑上Adam效果都不差。第五部分学习率Learning Rate—— 你迈的步子有多大学习率是最重要的超参数没有之一太高10−110−1步子太大在谷底左右横跳甚至越过山丘Loss直接爆掉变成NaN。太低10−610−6步子太小像蚂蚁爬山训练100年也不收敛。理想10−3∼10−410−3∼10−4稳定下降。学习率衰减Learning Rate Schedules—— 训练到一半要“慢下来”刚开始可以大步流星快到底部时如果步子还很大就会在最优解附近转圈永远落不下去。所以阶梯式衰减Step Decay每训练30轮Epoch学习率直接除以10比如ResNet的经典操作。余弦退火Cosine Annealing像余弦曲线一样平滑地从最大值降到0。线性预热Linear Warmup刚开始用极小的学习率比如最大值的10%跑几轮防止Adam起步爆炸再慢慢升上去。第六部分正则化与优化器的关系AdamW 小科普在普通的SGD中L2正则化λwλw和权重衰减Weight Decay是等价的。但在Adam中因为自适应学习率的存在L2正则化会失效梯度大的被缩小梯度小的被放大导致L2惩罚不均。现代正解用AdamW。它不把正则化加在梯度里而是直接在更新参数的最后硬生生把权重乘一个小于1的系数如0.995这叫权重衰减干净又利落。 第三课终极认知闭环正则化给损失函数加刑L1稀疏L2平滑λλ 控制惩罚强度防止模型在训练集上作弊。优化本质利用梯度导数向量指引方向负梯度下山。SGD太笨遇到峡谷震荡遇到鞍点卡死计算全数据集太慢。Momentum加个惯性冲过鞍点抵消震荡。RMSProp自适应学习率陡坡慢点走平坡快点走。Adam集大成者 Momentum RMSProp 偏差修正防止起步炸当下CV默认首选。学习率策略配合预热和衰减让模型最后稳稳落进谷底。代码避坑指南在PyTorch里一行torch.optim.Adam(model.parameters(), lr1e-3, weight_decay1e-4)就把Adam和L2正则化全搞定了。如果训练时Loss突然变成nan99%是学习率设太高了赶紧降低一个数量级。
返回列表