从L0到L∞:深入理解范数家族及其在机器学习正则化中的应用
1. 从“距离”到“规则”为什么我们需要范数如果你在复习线性代数或者机器学习看到“范数”这个词第一反应是不是觉得它有点抽象甚至有点“数学恐惧症”别担心这很正常。我第一次接触范数时也觉得它就是个冷冰冰的公式。但后来在实际项目中尤其是在处理数据、优化模型时我才真正体会到它的威力。简单来说范数就是给向量或者更广义的给一个数学对象定义“长度”或“大小”的一种规则。为什么需要这个规则想象一下你有一堆数据点每个点由多个特征比如身高、体重、年龄描述构成一个多维向量。我们经常需要比较这些向量的“大小”或者衡量它们之间的“距离”。在二维或三维空间里我们很自然地用勾股定理计算距离这就是欧几里得范数L2范数。但在更高维、更复杂的数据世界里不同的“大小”定义即不同的范数会带来截然不同的结果和洞见。比如在机器学习正则化中L1范数倾向于产生稀疏解很多系数为0用于特征选择而L2范数则倾向于让所有系数都均匀地变小防止过拟合。不理解范数你就很难理解这些技术背后的“为什么”。所以这篇复习不是简单地罗列公式而是想和你一起从最直观的几何意义出发拆解几种核心范数L0, L1, L2, L∞的本质、计算、以及在算法和工程中的典型应用场景。我会尽量用“说人话”的方式结合一些我踩过的坑和心得帮你把这块知识夯实。无论你是准备考试还是想在实际编程中比如用NumPy的np.linalg.norm函数用得明明白白这篇内容都应该能帮到你。2. 核心范数家族详解从L0到L∞范数不是一个单一的概念而是一个家族。最常用的一类叫做p-范数Lp范数。对于一个n维向量x [x₁, x₂, ..., xₙ]ᵀ它的p-范数定义为||x||_p (|x₁|^p |x₂|^p ... |xₙ|^p)^(1/p)这里的关键是p的取值。p取不同的值就得到了我们常说的L1、L2范数等。这个公式看起来有点唬人但我们一个一个拆开看其实非常直观。下面我们重点讨论四个最具代表性的成员L0、L1、L2和L∞范数。需要提前说明的是L0范数严格来说并不是一个真正的范数不满足范数的齐次性条件但由于其巨大的实用价值大家通常都把它放在这个家族里一起讨论。2.1 L0范数非零元素的计数员L0范数定义为向量中非零元素的个数。根据上面的p-范数公式当p趋近于0时(|x_i|^p) 在 x_i ≠ 0 时为1在 x_i 0 时为0求和后再开1/p次方即0次方根在极限意义上就等于非零元素的个数。计算公式 ||x||₀ #{i | x_i ≠ 0}几何意义 在二维平面上所有L0范数等于1的向量其端点分布在哪是坐标轴不包括原点本身。因为只有一个分量不为零。L0范数等于2的点则分布在整个平面上除了坐标轴以外的区域。它度量的不是传统的“长度”而是向量的“稀疏性”。核心应用与坑点特征选择与稀疏编码这是L0范数最核心的应用场景。在机器学习中我们经常希望模型只依赖少数几个关键特征这样模型更简单、可解释性更强、且可能更不容易过拟合。最小化L0范数就是直接寻找非零元素最少的解。例如在压缩感知中目标就是找到一个稀疏的信号表示。最大的坑NP难问题。直接优化L0范数即寻找满足条件的最稀疏解是一个计算上非常困难的问题NP难。在实际中我们几乎无法直接求解。那怎么办工程上的一个经典技巧是用L1范数来近似或凸松弛L0范数。因为L1范数优化是凸问题有成熟的算法可以高效求解而且在一定条件下L1范数的解等价于L0范数的解。这就是为什么Lasso使用L1正则化可以用于特征选择的理论基础之一。一个编程注意点 在Python中没有直接计算L0范数的内置函数因为它的定义涉及计数。你可以用np.count_nonzero(x)来实现。但切记基于L0范数的优化问题不要尝试自己写暴力搜索算法去解对于稍大规模的问题那是不现实的。2.2 L1范数曼哈顿距离与稀疏诱导者L1范数也叫曼哈顿范数或出租车范数即p1的情况。计算公式 ||x||₁ |x₁| |x₂| ... |xₙ|几何意义 在二维空间中到原点L1范数等于1的点构成一个菱形旋转45度的正方形。为什么叫曼哈顿距离想象你在曼哈顿街区只能沿着垂直的街道行走从A点到B点的最短路径就是横向距离加上纵向距离这就是L1范数。它度量的是一种“网格路径”长度。核心应用与心得鲁棒回归如Lasso 在损失函数后加上模型权重的L1范数作为正则项就是著名的Lasso回归。它的核心作用是产生稀疏解即自动将一部分特征的系数压缩为0实现特征选择。这是我调参时最常用的工具之一尤其是在特征维度很高但怀疑只有部分特征起作用时。信号处理与压缩 类似于L0但可求解。L1范数最小化被广泛用于信号恢复和图像去噪。计算上的特点 L1范数在零点不可导因为绝对值函数在零点有个“尖角”。这个性质直接影响优化算法的选择。像梯度下降法这样的基于梯度的方法在这里会遇到麻烦次梯度下降是解决方案之一。在使用scikit-learn的Lasso时其底层算法坐标下降法就很好地处理了这个问题。一个实操对比 你可以简单试验一下用一组随机数据分别做普通线性回归和Lasso回归观察一下系数。你会发现Lasso的系数向量中会有很多精确的0而普通回归或Ridge回归L2的系数通常都是很小但非零的值。这个直观对比能让你立刻感受到L1范数的“稀疏威力”。2.3 L2范数熟悉的欧氏距离与平滑守护者L2范数是最常见、最直观的范数即p2的情况就是欧几里得距离。计算公式 ||x||₂ √(x₁² x₂² ... xₙ²)几何意义 在二维/三维空间这就是我们从小学习的点到原点的直线距离。所有L2范数等于1的点构成一个单位圆球。核心应用与心得岭回归Ridge Regression与权重衰减 在损失函数后加上权重的L2范数的平方||w||₂²作为正则项就是岭回归。它的主要作用是防止过拟合通过对大权值进行惩罚迫使所有权重都比较小、比较平均从而得到一个更平滑、更稳定的模型。在神经网络中这直接被称为权重衰减Weight Decay是训练中最常用的正则化技术之一。几何上的最优性 在许多优化问题中L2范数具有很好的几何性质。例如最小二乘法的解从几何上看就是在目标向量在列空间上的投影这个投影恰好是用L2范数度量下的最短距离。计算上的友好性 L2范数处处可导这使它非常适合与基于梯度的优化算法如梯度下降、Adam配合使用计算高效且稳定。一个关键区别 注意我们通常说的“L2正则化”项是½λ||w||₂²而不是λ||w||₂。使用平方形式主要是为了求导方便导数变成λw没有根号其防止过拟合的核心思想是一致的。在scikit-learn的Ridge中参数alpha对应的就是公式中的λ。2.4 L∞范数最大分量与极端情况考量者L∞范数也叫切比雪夫范数或最大范数可以看作是p→∞时p-范数的极限。计算公式 ||x||∞ max(|x₁|, |x₂|, ..., |xₙ|)几何意义 在二维空间中到原点L∞范数等于1的点构成一个正方形边与坐标轴平行。它度量的是向量所有分量中绝对值最大的那个。核心应用与场景误差的绝对上界 在数值计算或控制理论中如果我们关心的是最坏情况下的误差L∞范数就非常有用。它保证了所有分量的误差都不会超过某个上限。对抗样本生成 在机器学习安全领域这是一个热门应用。生成对抗样本时我们常常要求添加的扰动在L∞范数下很小比如每个像素点的改变不超过ε这样扰动在人眼看来不明显但却能欺骗模型。因为L∞约束限制了每个维度的最大变化量。编程实现 在NumPy中计算L∞范数非常容易np.linalg.norm(x, ordnp.inf)。自己实现的话就是np.max(np.abs(x))。为了更清晰地对比这几种核心范数我整理了一个表格总结了它们在二维空间下的几何形状、计算式、主要特性和典型应用场景范数类型别名p值二维空间单位“球”形状计算公式 (向量x)核心特性典型应用场景L0范数-(趋近0)坐标轴非原点非零元素个数度量稀疏性非真正范数优化是NP难问题特征选择、压缩感知理论指导L1范数曼哈顿范数1菱形旋转45°的正方形x₁L2范数欧几里得范数2圆形√(x₁² x₂²)最常用处处可导具有旋转不变性岭回归、神经网络权重衰减、最小二乘法L∞范数切比雪夫范数∞正方形边平行坐标轴max(x₁,3. 范数在机器学习中的实战正则化深度解析理解了单个范数的含义我们来看看它们如何组合起来解决实际问题。在机器学习中范数最经典的应用莫过于正则化。正则化的本质是在原始损失函数如均方误差、交叉熵的基础上增加一个对模型复杂度的惩罚项这个惩罚项通常就是模型参数权重w的某个范数。基本形式 总损失 经验损失(预测值, 真实值) λ * 正则化项(||w||)这里的λ是正则化系数控制着惩罚的力度。选择不同的范数作为正则化项会得到性质完全不同的模型。3.1 L1正则化Lasso自动的“特征筛选器”L1正则化对应Lasso回归其目标函数为 Minimize: Loss(y, Xw) λ * ||w||₁它是如何工作的由于L1范数在零点不可导其等高线是“带尖角的菱形”。当这个菱形与损失函数的等高线相切时切点有很大概率出现在坐标轴上即对应某个w_i 0。这就自动完成了特征筛选。实战心得与调参技巧数据标准化是必须的 由于L1正则化是对每个系数施加同样的惩罚力λ如果特征量纲不同数值大的特征天生会承受更大的“惩罚压力”这可能导致不公平的筛选。因此在使用Lasso前务必对特征进行标准化例如缩放到均值为0方差为1。正则化路径Regularization Path 一个非常实用的工具是观察系数随λ变化的路径。在scikit-learn中可以使用LassoCV或手动遍历一系列λ值绘制每个系数值的变化曲线。你会发现随着λ增大系数一个接一个地变为0。这能直观地告诉你特征的相对重要性。λ的选择 λ过大所有系数都会被压到0模型欠拟合λ过小正则化作用微弱可能过拟合。通常使用交叉验证如LassoCV内置的CV来选择最优λ。一个常见误区 Lasso筛选掉的变量不一定是不相关的而是指在保持其他变量不变的情况下该变量对目标的线性贡献可以被其他变量的组合所替代。这与基于统计检验的筛选有所不同。3.2 L2正则化Ridge平滑的“权重收缩器”L2正则化对应岭回归其目标函数为 Minimize: Loss(y, Xw) λ * ||w||₂² 注意通常是平方形式它是如何工作的L2范数的等高线是光滑的圆。它与损失函数等高线相切时切点会使得所有w_i同时按比例缩小但一般不会精确为0。这相当于给所有权重一个向零收缩的力但允许它们都保留一点贡献。实战心得与调参技巧解决多重共线性 这是岭回归最著名的应用。当特征之间高度相关时普通最小二乘法的解会变得极不稳定系数方差很大。加入L2惩罚后系数估计会变得稳定得多。与Lasso的对比选择如果你认为所有特征都可能与目标有关只是贡献度不同或者特征之间有相关性那么Ridge通常是更好的选择。如果你怀疑只有少数特征起作用想进行特征选择或模型解释那么Lasso更合适。当然还有Elastic Net这种结合了L1和L2的折中方案。在神经网络中的应用 在深度学习框架如PyTorch, TensorFlow中优化器如Adam, SGD的参数里有一个weight_decay项这就是L2正则化。设置一个合适的weight_decay通常是1e-4, 1e-3量级是防止网络过拟合的标准操作之一。计算优势 对于岭回归存在一个解析解w* (XᵀX λI)⁻¹ Xᵀy。虽然对于大数据集我们仍用迭代法但这个解析形式在理论分析和一些特定场景下很有用。3.3 Elastic NetL1与L2的“中庸之道”Elastic Net结合了L1和L2正则化其目标函数为 Minimize: Loss(y, Xw) λ₁ * ||w||₁ λ₂ * ||w||₂²更常见的参数化是使用一个混合比例参数ρ Penalty λ [ ρ * ||w||₁ (1-ρ)/2 * ||w||₂² ]为什么需要它Lasso有两个局限性第一当特征数n远大于样本数m时它最多只能选出m个特征第二对于一组高度相关的特征Lasso倾向于随机选择其中一个而忽略其他。Elastic Net通过加入L2项克服了这两个问题L2部分使模型像Ridge一样处理相关特征让它们的系数趋于相等L1部分则继续产生稀疏性。使用场景 当特征维度极高且特征之间存在明显的组相关性时Elastic Net通常比单纯的Lasso或Ridge表现更好。在scikit-learn中你可以使用ElasticNetCV来自动搜索最优的λ和ρ。4. 范数的编程实现与数值计算陷阱理论懂了最终还是要落到代码上。在实际编程中计算范数看似简单但也有一些细节和坑需要注意。4.1 使用NumPy进行高效计算NumPy的linalg.norm函数是计算各种向量范数和矩阵范数的瑞士军刀。import numpy as np x np.array([3, -4]) # L2范数 (默认) norm_l2 np.linalg.norm(x) # 输出: 5.0 (因为√(3²(-4)²)5) # 等价于 norm_l2_ord2 np.linalg.norm(x, ord2) # L1范数 norm_l1 np.linalg.norm(x, ord1) # 输出: 7.0 (因为|3||-4|7) # L∞范数 norm_inf np.linalg.norm(x, ordnp.inf) # 输出: 4.0 (因为max(|3|, |-4|)4) # 对于矩阵也可以计算范数例如Frobenius范数类似于向量的L2范数 A np.array([[1, 2], [3, 4]]) norm_fro np.linalg.norm(A, fro) # 输出: √(1²2²3²4²) √30 ≈ 5.477注意NumPy没有直接提供ord0的参数来计算L0“范数”。你需要用np.count_nonzero(x)。4.2 自定义实现与理解自己实现一遍有助于加深理解def vector_norm(x, p2): 计算向量的p-范数 参数: x: 一维numpy数组 p: 范数的阶可以是数字或inf 返回: 范数值 if p inf: return np.max(np.abs(x)) elif p 0: # 注意这不是严格意义上的范数 return np.count_nonzero(x) else: # 通用p-范数公式注意处理p1的情况可能不是范数 return np.sum(np.abs(x) ** p) ** (1.0 / p) # 测试 x np.array([1, -2, 0, 3]) print(fL1: {vector_norm(x, 1)}) # 6 print(fL2: {vector_norm(x, 2)}) # √(1409)≈3.742 print(fL∞: {vector_norm(x, inf)}) # 3 print(fL0: {vector_norm(x, 0)}) # 3 (非零元素1, -2, 3)4.3 数值计算中的常见陷阱与处理下溢/上溢问题 当计算高维向量的L2范数时直接先平方再求和可能造成数值上溢值太大超出表示范围。一个标准的稳定计算方法是norm np.sqrt(np.sum(x ** 2))可能不稳定。 更好的做法是norm np.linalg.norm(x)NumPy内部已做优化或手动实现max_abs np.max(np.abs(x)) if max_abs 0: return 0.0 # 缩放后再计算避免上溢 x_scaled x / max_abs return max_abs * np.sqrt(np.sum(x_scaled ** 2))零向量的处理 任何向量的L2范数为0当且仅当它是零向量。但在计算中由于浮点误差一个理论上应为0的向量其范数可能是一个极小的数如1e-15。在判断向量是否为零时通常使用一个很小的容差tolerance例如if np.linalg.norm(x) 1e-10:。正则化中的λ尺度 在实现L1/L2正则化时损失函数通常是(1/m)*ΣLoss λ*R(w)其中m是样本数。有时框架或教程会使用(1/m)*ΣLoss (λ/2)*||w||²的形式。注意你代码中的λ定义与公式、库函数中的定义是否一致。scikit-learn的Ridge和Lasso中的alpha参数通常对应的是目标函数中的λ。稀疏矩阵的范数计算 当处理超大稀疏矩阵时直接使用np.linalg.norm会将其转为稠密矩阵可能导致内存爆炸。对于稀疏矩阵如scipy.sparse格式应使用其自带的方法或专门为稀疏结构设计的范数计算函数。

相关新闻

C语言数据结构:链表进阶(环形链表、双向链表、内核链表)与队列详解

C语言数据结构:链表进阶(环形链表、双向链表、内核链表)与队列详解

上一篇讲解了单向链表基础:结构体封装、头插、尾插、尾删、valgrind 内存泄漏检测。本篇继续拓展环形链表判环、环长、环入口、双向链表、Linux 内核链表、链式队列,配套原理推导、核心逻辑,适合期末复习、嵌入式 C 面试准备。一、单向链表 —…

2026/10/28 12:40:17 阅读更多 →
OpenAI API 集成实战:从环境配置到生产级代码助手开发

OpenAI API 集成实战:从环境配置到生产级代码助手开发

1. 背景与核心概念:AI巨头的组织变动与技术生态 近期,OpenAI 长期首席运营官(COO)Brad Lightcap 离职创业的消息引发了技术社区的广泛关注。对于开发者而言,这不仅是商业新闻,更是一个审视和思考 AI 技术生…

2026/10/28 20:52:34 阅读更多 →
AI编程时代开发者核心竞争力:从编码到架构的升维竞争

AI编程时代开发者核心竞争力:从编码到架构的升维竞争

最近在技术圈里流传着一个很有意思的说法:“笑死了,已经可以完赛了”。乍一听,这像是一句游戏圈或者体育圈的调侃,但如果你把它放到AI编程助手的语境下,就会发现它精准地戳中了当前开发者的一个核心痛点:当…

2026/10/29 23:48:04 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/31 0:19:11 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/30 9:20:34 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/30 10:19:21 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/31 0:59:28 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/30 10:19:39 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/30 9:21:37 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 17:32:24 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/30 10:28:40 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/31 0:09:01 阅读更多 →