神经网络优化算法全解析:从梯度下降到Adam的演进与实战

发布时间:2026/8/27 4:07:22

神经网络优化算法全解析:从梯度下降到Adam的演进与实战
1. 项目概述为什么“最优化”是神经网络的灵魂如果你已经跟着这个系列走过了前四篇从感知机到反向传播从激活函数到损失函数那么恭喜你你已经搭建起了神经网络的理论骨架。但一个只有骨架的模型是无法“学习”的。今天我们要聊的“最优化”就是为这个骨架注入生命力的关键一步。你可以把它想象成训练一个运动员损失函数告诉你他现在的成绩有多差比如百米跑了15秒而最优化算法就是教练负责制定一套科学的训练计划如何调整动作、力量、节奏让运动员的成绩损失值一步步逼近世界纪录最优解。在神经网络中这个“训练计划”的核心就是如何调整网络中成千上万个参数权重和偏置。我们的目标非常明确找到一组参数使得损失函数的值达到最小。这个过程就是最优化。没有它神经网络就只是一堆随机连接的参数无法从数据中提取任何规律。因此理解最优化是真正让神经网络“动起来”、从理论走向实践的分水岭。无论你是想入门深度学习的新手还是希望夯实基础的中级开发者掌握最优化算法的核心思想与实操细节都将让你在模型调优时事半功倍。2. 核心思路拆解从“盲人爬山”到“智能导航”在深入具体算法之前我们必须建立一个正确的思维框架。最优化问题在数学上可以抽象为给定一个多元函数即损失函数 L(θ)其中θ代表所有参数寻找一个参数点 θ*使得 L(θ*) 取得最小值。想象你是一个身处连绵群山中的盲人你的目标是找到海拔最低的山谷全局最小点。你无法纵览全局唯一能依靠的就是用手杖探测脚下地面的倾斜方向梯度。最优化算法就是你依赖的“导航策略”。2.1 梯度指引方向的“手杖”梯度是一个向量它指向函数值增长最快的方向。那么很自然地梯度的反方向负梯度就是函数值下降最快的方向。几乎所有主流的最优化算法都基于这一核心洞察。用数学公式表示对于参数θ其梯度记为∇L(θ)。如果我们沿着负梯度方向对参数做一个小更新损失函数值就会下降。注意这里有一个至关重要的点梯度是在当前参数点θ处计算的它只提供了局部的最速下降方向。这就像盲人只能感知脚下的坡度而不知道整座山的全貌。因此最优化算法通常只能找到“局部最优解”某个小山谷而不一定是“全局最优解”整片区域的最低点。在神经网络这种高维、非凸的复杂损失函数中找到良好的局部最优解通常已经能带来出色的模型性能。2.2 学习率决定步伐的“步长”知道了方向负梯度下一步就是决定走多远。这个“步长”就是学习率Learning Rate通常用η表示。参数更新的基本公式可以写为θ_new θ_old - η * ∇L(θ_old)学习率是最重要的超参数之一没有之一。学习率太大步子迈得太大可能会直接从山谷这边跨到对面山坡上导致损失值震荡甚至发散越来越大。就像下坡时冲得太猛直接飞过了谷底。学习率太小步子太小虽然稳定但收敛速度极慢可能需要成千上万步才能到达谷底训练时间无法接受。自适应学习率高级的优化算法如Adam的核心改进之一就是让学习率能够根据训练情况动态调整有时大步探索有时小步精修。理解了“梯度”和“学习率”这两个基石我们就可以深入探讨具体的优化算法了。它们之间的区别主要在于如何更聪明地计算梯度方向和调整学习率。3. 经典算法深潜从SGD到Adam的演进之路3.1 随机梯度下降朴实无华的奠基者批量梯度下降Batch Gradient Descent在每次更新时需要使用全部训练数据计算梯度这在数据量巨大时计算成本高得不可接受。随机梯度下降Stochastic Gradient Descent SGD应运而生。核心思想每次随机从训练集中抽取一个样本计算该样本上的损失梯度并立即更新参数。θ θ - η * ∇L(θ; x_i, y_i)其中 (x_i, y_i) 是随机的一个样本。优点计算高效一次只处理一个样本内存占用小更新速度极快。引入随机噪声由于梯度估计基于单个样本噪声很大。这看似是缺点但在非凸优化中噪声有助于跳出较差的局部最优解有可能找到更好的解。缺点与挑战更新震荡剧烈单个样本的梯度不能代表整体数据的梯度方向导致参数更新路径曲折收敛不稳定。收敛速度慢虽然单次更新快但由于方向不稳定需要更多次的更新才能达到收敛。学习率选择困难需要精心设计学习率衰减策略如随时间逐步减小η否则难以收敛。实操心得 在实践中纯粹的“一次一个样本”的SGD很少使用。更常见的是一种折中方案小批量梯度下降。它每次随机抽取一小批样本如32、64、128个称为batch size用这批样本的平均梯度来更新参数。这既保留了SGD的随机性和高效性又使得梯度估计更加平稳。我们平时说的“SGD”很多时候指的就是这种小批量梯度下降。# 一个简化的SGD更新步骤示意伪代码风格 def sgd_update(parameters, gradients, learning_rate): for param, grad in zip(parameters, gradients): param - learning_rate * grad return parameters3.2 动量法给优化加上“惯性”为了解决SGD在山谷中震荡、徘徊的问题动量法引入了物理中的“动量”概念。核心思想参数更新不仅考虑当前的梯度还积累之前更新的方向形成一个“速度”变量v。就像推一个球下山球不仅受当前坡度影响还会保持之前滚动的惯性。更新速度v β * v - η * ∇L(θ)其中β是动量系数通常取0.9。更新参数θ θ v效果解析在梯度方向连续一致的区域如长斜坡动量会不断累积导致更新速度越来越快加速收敛。在梯度方向频繁改变的区域如山谷底部震荡由于动量系数β1历史方向的影响会衰减当前梯度的作用增强有助于稳定方向。一个生动的类比SGD像一个谨慎的徒步者每步都只根据脚下决定方向。动量法像一个骑自行车下坡的人他会越冲越快并且不容易被路上的小坑洼改变大方向。3.3 AdaGrad与RMSProp自适应学习率的开端前述方法对所有参数都使用同一个全局学习率。但神经网络中不同参数的重要性、更新频率可能不同。例如有的权重对应稀疏特征很少被激活我们希望它每次更新时步子大一点有的权重对应密集特征我们希望它更新得精细一点。AdaGrad的思想为每个参数维护一个历史梯度平方的累积和。在更新时用全局学习率除以这个累积和的平方根。这样频繁更新的参数累积和大其有效学习率会变小不频繁更新的参数累积和小其有效学习率相对较大。累积平方梯度r r (∇L(θ))^2参数更新θ θ - (η / sqrt(r ε)) * ∇L(θ)其中ε是一个极小值防止除零。AdaGrad的致命缺陷随着训练进行r会单调递增导致所有参数的有效学习率都会不断衰减最终变得无限小训练可能提前终止。RMSProp的改进针对AdaGrad的缺陷RMSProp引入了一个衰减系数ρ如0.9只累积最近一段时间的梯度平方让“累积和”r变成一个指数移动平均值避免了其无限增长。更新累积平方梯度r ρ * r (1 - ρ) * (∇L(θ))^2参数更新公式与AdaGrad形式相同。这样一来每个参数都有了根据其近期梯度幅度自适应调整的学习率。3.4 Adam集大成者的王者算法AdamAdaptive Moment Estimation可以说是当前最流行、默认首选的优化器。它结合了动量法和RMSProp的优点。核心机制计算梯度的一阶矩估计有偏即带动量的梯度。m β1 * m (1 - β1) * ∇L(θ)。这相当于动量。计算梯度的二阶矩估计有偏即带衰减的梯度平方。v β2 * v (1 - β2) * (∇L(θ))^2。这相当于RMSProp。偏差校正由于m和v在训练初期被初始化为0会导致估计偏向0。Adam进行了偏差校正使得估计更准确。m_hat m / (1 - β1^t)v_hat v / (1 - β2^t)其中t是时间步。参数更新θ θ - η * m_hat / (sqrt(v_hat) ε)Adam的优势兼具动量加速在梯度方向一致的区域能加速。自适应学习率为每个参数自适应调整步长。偏差校正缓解训练初期的冷启动问题。超参数鲁棒默认参数β10.9 β20.999 ε1e-8在大多数任务上表现良好无需大量调参。为什么Adam成为默认选择因为它几乎总是比朴素的SGD收敛得更快、更稳定。对于初学者和大多数标准任务如图像分类、自然语言处理使用Adam并采用其默认学习率如3e-4是一个安全且高效的选择。4. 优化器实战选择、调参与代码实现了解了原理我们来看看如何在实际项目中运用它们。4.1 主流优化器对比与选型指南优化器核心思想优点缺点适用场景SGD负梯度方向更新简单理论清晰最终收敛解可能泛化性好收敛慢易震荡需精心调学习率及衰减理论分析 或配合精细学习率调度追求极致模型性能SGD with MomentumSGD 动量项减少震荡加速在平坦区域和峡谷方向的收敛仍需要手动调整学习率是SGD的常用改进版适用于多种场景AdaGrad自适应学习率累积平方梯度适合稀疏数据对不常见特征更新更大学习率单调衰减至零可能导致训练过早停止处理稀疏特征的场景如自然语言处理但已被RMSProp/Adam取代RMSProp自适应学习率指数移动平均解决AdaGrad学习率衰减问题适应非平稳目标超参数衰减率ρ需要调整RNN训练的历史常用选择Adam动量 RMSProp 偏差校正收敛快超参数鲁棒通常效果最好可能不如精调SGD的泛化性能内存占用稍大深度学习默认首选适用于绝大多数前馈网络、CNN、RNN选型建议新手入门、快速原型无脑选Adam学习率设为3e-4或1e-3。追求极致性能如竞赛可以尝试精调SGD with Momentum配合学习率热身Warmup和衰减Decay有时能获得比Adam更好的最终精度。训练循环神经网络RNN/LSTMAdam或历史上常用的RMSProp都是不错的选择。4.2 学习率设置艺术与科学的结合学习率是优化器最重要的超参数。这里分享几个关键策略初始学习率Adam尝试3e-4、1e-3、5e-4。这是一个经验性的“甜蜜点”。SGD尝试0.1、0.01、0.001。通常需要比Adam更大的初始值但必须配合衰减。学习率调度固定学习率往往不是最优的。常见的调度策略有Step Decay每训练N个epoch学习率乘以一个衰减因子如0.1。Exponential Decay学习率按指数函数随时间衰减。Cosine Annealing学习率按余弦函数从初始值衰减到0。这通常能取得很好的效果。Warmup训练开始时从一个很小的学习率线性增加到预设的初始学习率有助于训练初期稳定。这在Transformer等大模型中几乎是标配。循环学习率一种更高级的策略让学习率在一个区间内周期性循环变化。这有助于模型跳出局部最优找到更平坦的损失盆地从而提升泛化能力。实操心得如何找到合适的学习率一个非常有效的方法是学习率范围测试。在训练初期如1个epoch内让学习率从一个极小值如1e-7线性或指数增长到一个极大值如10同时记录每个batch的损失。绘制损失-学习率曲线。理想的学习率通常位于损失开始持续下降但尚未剧烈震荡的区域曲线下降最陡峭的部分。这个方法能快速为你提供一个合理的初始学习率范围。4.3 代码示例在PyTorch中应用优化器以PyTorch框架为例展示如何使用不同的优化器。import torch import torch.nn as nn import torch.optim as optim # 假设我们有一个简单的模型 model nn.Sequential( nn.Linear(784, 256), nn.ReLU(), nn.Linear(256, 10) ) # 定义损失函数 criterion nn.CrossEntropyLoss() # 1. 使用SGD with Momentum optimizer_sgd optim.SGD(model.parameters(), lr0.01, momentum0.9) # 2. 使用Adam最常用 optimizer_adam optim.Adam(model.parameters(), lr3e-4) # 3. 使用RMSProp optimizer_rmsprop optim.RMSprop(model.parameters(), lr1e-3, alpha0.99) # alpha即RMSProp中的ρ # 训练循环中的一个batch步骤 def train_step(model, data, target, optimizer, criterion): optimizer.zero_grad() # 关键清空上一轮的梯度 output model(data) loss criterion(output, target) loss.backward() # 反向传播计算梯度 optimizer.step() # 优化器根据梯度更新参数 return loss.item() # 学习率调度器示例配合SGD使用 scheduler optim.lr_scheduler.StepLR(optimizer_sgd, step_size30, gamma0.1) # 在每个epoch后调用 scheduler.step()学习率会每30个epoch乘以0.1注意optimizer.zero_grad()是极易忘记但至关重要的步骤。如果不清零梯度会在每次.backward()时累积导致更新方向错误。务必在每次参数更新前执行。5. 高级话题与优化陷阱5.1 梯度消失与梯度爆炸这是训练深度网络时的经典难题尤其在RNN中。梯度爆炸梯度值变得极大导致参数更新步长巨大模型权重变成NaN训练崩溃。梯度消失梯度值变得极小导致深层网络的参数几乎得不到更新无法学习。解决方案梯度裁剪针对梯度爆炸。设置一个阈值当梯度的L2范数超过该阈值时将梯度按比例缩小。torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm1.0)权重初始化使用Xavier初始化或He初始化使各层激活值的方差保持稳定从源头上缓解问题。归一化层使用Batch Normalization、Layer Normalization等。它们通过规范化每层的输入分布使得网络对初始权重和学习率更不敏感极大地缓解了梯度问题并加速了训练。激活函数选择使用ReLU及其变种如Leaky ReLU替代Sigmoid/Tanh因为它们的梯度在正区间恒为1不易消失。5.2 优化中的过拟合与泛化优化算法追求训练损失最小但我们的终极目标是模型在未知数据上表现好泛化能力强。有时过于激进的优化反而会损害泛化。现象训练损失持续下降但验证损失在某个点后开始上升。这就是过拟合。优化器相关的应对策略早停监控验证集损失当其在连续多个epoch不再下降时停止训练。权重衰减在优化器的损失函数中加入L2正则化项即参数平方和乘以一个系数等价于在每次更新时让参数向零点收缩一点。这能有效抑制过拟合。在SGD中它通常直接作为参数weight_decay。optimizer optim.Adam(model.parameters(), lr1e-3, weight_decay1e-5) # L2正则化随机性像SGD这样带有噪声的优化器其噪声本身可以作为一种正则化有助于找到泛化更好的平坦最小值。这也是为什么精调SGD有时能超越Adam的原因之一。5.3 不同任务下的优化器微调经验计算机视觉Adam是安全的起点。对于大型CNN也常用SGD with Momentum配合Cosine Annealing学习率调度。自然语言处理Adam几乎是标准配置。对于Transformer模型使用AdamWAdam with decoupled weight decay即解耦权重衰减并配合Warmup策略效果更佳。强化学习常使用Adam但由于环境随机性大有时需要更小的学习率和梯度裁剪。生成对抗网络GAN的训练非常不稳定。通常对生成器和判别器使用Adam但可能需要不同的学习率如G: 1e-4 D: 4e-4并且学习率不能太高。6. 实战调试问题排查与性能分析即使选择了Adam训练过程也可能出问题。以下是一个快速排查清单问题1损失值不下降NaN或保持不变检查学习率学习率可能太高导致NaN或太低不变。尝试进行学习率范围测试。检查数据与标签确认输入数据是否已归一化标签格式是否正确。检查梯度打印出网络某一层的梯度范数看是否为零或为NaN。检查损失函数确认损失函数是否适用于你的任务。问题2损失值震荡剧烈降低学习率这是最直接有效的方法。增大Batch Size更大的batch size能提供更稳定的梯度估计。使用梯度裁剪防止因个别样本导致梯度突变。尝试增加动量如果使用SGD with Momentum适当增大动量系数如0.99有助于平滑更新。问题3训练后期验证精度波动或下降启用早停防止过拟合。增加正则化如Dropout、权重衰减。调整学习率衰减策略在后期使用更小的学习率进行精细调优。一个有用的调试工具可视化绘制损失/准确率曲线这是最基本的诊断工具。观察训练和验证曲线的差距。使用TensorBoard或Weights Biases这些工具可以实时可视化损失、准确率、权重分布、梯度直方图、计算图等让你对模型内部状态了如指掌。优化神经网络的训练过程是一个需要理论指导、经验积累和大量实验的工程。它没有银弹但掌握了这些核心算法、调参技巧和调试方法你就拥有了解决绝大多数优化问题的工具箱。记住从一个好的优化器如Adam和合理的学习率开始然后耐心地观察、分析和迭代你的神经网络终将学会你希望它掌握的知识。

相关新闻

上下水版扫地机器人值不值?科沃斯X12 PRO体验与选购指南

上下水版扫地机器人值不值?科沃斯X12 PRO体验与选购指南

2026/8/27 4:07:22

你还在纠结扫地机器人到底买不买?尤其是看到“科沃斯 X12 PRO 扫地机器人 上下水版”这种名字,第一反应是不是:这不就是一个能自动拖地的升级版拖把吗?真的比我亲手拖得干净?还是买回来又是吃灰大户?我前段…

数据拟合函数选型与实战:从线性到逻辑斯蒂的模型选择指南

数据拟合函数选型与实战:从线性到逻辑斯蒂的模型选择指南

2026/8/27 3:57:22

1. 项目概述:为什么我们需要“拟合函数”?在数据分析、工程建模乃至日常的量化决策中,我们常常面对一堆看似杂乱无章的数据点。比如,你记录了产品上线后每天的活跃用户数,或者测量了不同温度下某种材料的电阻值。这些数…

卫星图像配准实战:从SIFT到深度学习的超高分辨率影像对齐技术

卫星图像配准实战:从SIFT到深度学习的超高分辨率影像对齐技术

2026/8/27 3:57:22

简介:图像配准是计算机视觉和遥感领域的核心技术,旨在将不同时间、视角或传感器获取的图像进行空间对齐。其核心原理是通过提取图像中的稳定特征点或区域,建立几何变换模型,实现像素级坐标映射。这项技术的价值在于为多源数据融合…

基于高德Skill的智能选址:从经验直觉到数据驱动的产品实践

基于高德Skill的智能选址:从经验直觉到数据驱动的产品实践

2026/8/27 4:57:29

1. 从“感觉不错”到“数据说话”:一个产品经理的自我革命做产品,尤其是做那种带点“玄学”判断的产品,比如选址,最怕的就是“拍脑袋”。几年前,我负责一个线下零售的选址分析工具,团队里有个老法师&#x…

智能零售柜商品识别数据集实战:VOC转YOLO与精度提升指南

智能零售柜商品识别数据集实战:VOC转YOLO与精度提升指南

2026/8/27 4:57:29

简介:目标检测技术在智能零售领域的落地,往往受制于标注数据的质量与格式。VOC格式的XML标注文件是公开数据集常用的载体,但直接用于现代检测框架时,常遇到字段不一致、坐标越界、类目划分粒度不足等问题。理解从原始标注到训练数…

从Prompt工程到AI Agent:大语言模型应用开发核心技术栈解析

从Prompt工程到AI Agent:大语言模型应用开发核心技术栈解析

2026/8/27 4:57:29

1. 项目概述:从“玩具”到“工具”的认知跃迁几年前,当我和团队第一次把玩GPT-3的API时,那种感觉更像是在测试一个有趣的“玩具”——输入一些稀奇古怪的问题,看它能吐出什么令人捧腹或惊讶的答案。但今天,当“大语言模…

基于QLoRA的视觉语言大模型高效指令微调实战指南

基于QLoRA的视觉语言大模型高效指令微调实战指南

2026/8/27 4:57:29

简介:指令微调是提升预训练大模型在特定任务上表现的关键技术。其核心原理是通过引入高质量的指令-输出配对数据,引导模型学习并强化特定领域的任务模式与响应格式,从而实现从通用能力到专业能力的迁移。在工程实践中,参数高效微调…

数学建模实战:CNN核心原理与PyTorch应用指南

数学建模实战:CNN核心原理与PyTorch应用指南

2026/8/27 4:57:29

1. 项目概述:当数学建模遇上卷积神经网络 如果你正在准备数学建模竞赛,或者手头有一个涉及图像、信号或序列数据的分析项目,却对“卷积神经网络”这个听起来高大上的词感到既向往又头疼,那你来对地方了。我参加过不少数学建模比赛…

数维杯数学建模实战指南:从环境配置到Docker交付

数维杯数学建模实战指南:从环境配置到Docker交付

2026/8/27 4:47:28

1. 这不是一份“说明书”,而是一份赛前30天的实战作战地图“数维杯”这四个字,对很多数学建模新手来说,第一反应是——“又一个比赛?和美赛、国赛有什么区别?”我带过七届校队,从2017年第一届数维杯开始跟进…

[光学原理与应用-521]:对光的错误理解与纠偏

[光学原理与应用-521]:对光的错误理解与纠偏

2026/8/26 1:50:39

首先光是一种能量的载体和形态,宏观上观察到的光是由无数个微观的光量子组成的,每个光子在产生的瞬间,其在真空的空间中以确定不变的速度沿着一个初始的方向一直向前,在微观层面,每个光量子的运动轨迹是以波函数所展现…

SIP通话转接原理与REFER方法实战解析

SIP通话转接原理与REFER方法实战解析

2026/8/26 1:49:16

1. 通话转接不是“挂断再拨号”,而是SIP会话的动态重定向你有没有遇到过这样的场景:客服坐席A正在和客户通电话,突然需要把这通对话无缝转给专家坐席B,客户完全感知不到中间的断连——既没听到忙音,也没被要求重新拨号…

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

Kolla-ansible单节点OpenStack部署实战:从环境准备到排坑指南

2026/8/26 17:50:58

1. 为什么选择Kolla-ansible来部署单节点OpenStack?如果你正在寻找一种能把OpenStack从“概念”快速变成“可用的实验环境”的方法,那么Kolla-ansible几乎是当前最主流、最省心的选择。我见过太多人卡在手动编译依赖、配置服务、处理版本冲突的泥潭里&am…

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

Go语言构建企业级AI服务网关:统一管理英伟达等AI接口调用

2026/8/27 0:07:12

1. 项目概述:从零构建一个企业级的AI服务网关 最近在帮一个做内容审核的团队做技术架构升级,他们原来的业务里,每天有几十万张图片和短视频需要过审,最初是接了几个开源的AI模型自己部署,但效果和性能一直不太稳定。后…

LeetCode Hot100(51-60)算法精解与面试技巧

LeetCode Hot100(51-60)算法精解与面试技巧

2026/8/27 0:07:12

1. 题目背景与核心价值"hot100(51-60)"这个标题看起来像是某个编程题库或算法练习集中的一组题目编号。在技术社区中,类似命名通常指向LeetCode、牛客网等平台的热门题目集合。作为刷过300题的算法老手,我理解这类题目的核心价值在于&#xff…

CRC校验实战:从模2除法到HJ212协议排错

CRC校验实战:从模2除法到HJ212协议排错

2026/8/27 0:07:12

1. 为什么一个“校验码”能扛住工业现场90%的数据 corruption? 你有没有遇到过这样的场景:嵌入式设备通过RS-485上传温湿度数据,上位机偶尔收到一帧乱码——温度显示成-273℃,湿度跳到999%,但串口波形看起来完全正常&a…

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

摆脱论文困扰!盘点2026年全网爆红的的AI论文写作工具

2026/8/22 2:02:26

一天写完毕业论文在2026年已不再是天方夜谭。2026年最炸裂、实测能大幅提速的AI论文写作工具,覆盖选题构思、文献整理、内容生成、格式排版等核心场景,真正帮你高效搞定论文难题。 一、全流程王者:一站式搞定论文全链路(一天定稿首…

导师推荐!2026最新AI论文工具测评与实用推荐

导师推荐!2026最新AI论文工具测评与实用推荐

2026/8/26 18:07:30

2026年真正好用的AI论文工具,核心看生成的论文质量、低AI味、格式正确、学术适配四大指标。综合实测,千笔AI、ThouPen、豆包、DeepSeek、Grammarly 是当前最值得推荐的梯队,覆盖从免费到付费、从中文到英文、从文科到理工的全场景需求。 一、…

告别游戏崩溃:XCOM 2模组管理器的智能革命

告别游戏崩溃:XCOM 2模组管理器的智能革命

2026/8/26 17:57:52

告别游戏崩溃:XCOM 2模组管理器的智能革命 【免费下载链接】xcom2-launcher The Alternative Mod Launcher (AML) is a replacement for the default game launchers from XCOM 2 and XCOM Chimera Squad. 项目地址: https://gitcode.com/gh_mirrors/xc/xcom2-lau…