近端梯度与软阈值
先对光滑数据损失做梯度步,再用软阈值处理 L1,使小权重精确归零。
学习前需要掌握
背景与问题
L1 在零点不可按普通可微函数处理。近端梯度把可微的数据损失与非光滑惩罚分开:先沿平滑部分下降,再执行针对惩罚的近端运算。
这解释了为什么有些实现能够稳定地产生精确零系数,而不仅仅是把参数推得很接近零。
概念定义
对于平滑损失 g(w) 加 L1 项 λ||w||1,近端梯度先计算 z=w−η∇g(w),再对 z 的每个坐标做阈值为 ηλ 的软阈值变换。
软阈值保留符号,并从绝对值中减去阈值,不足阈值的部分变成零。它不同于硬阈值直接保留所有大系数原值。
直观理解
第一步只考虑怎样改善数据拟合,第二步再按惩罚规则收缩。把它们分开,既能核对梯度,又能明确零值究竟在哪一步出现。
梯度下降之后,再做一次收缩
给定 w=[1,-0.2,0.05]、平滑梯度 [2,-1,0.1]、η=0.1、λ=0.5。第一步 z=[0.8,-0.1,0.04],第二步阈值为 0.05,得到 [0.75,-0.05,0]。
最后一个坐标不是因为梯度恰好为零才被删除,而是梯度步后的绝对值低于阈值。这个小算例只核对一次更新,并没有证明整个优化过程已经收敛。
核心原理
阈值是学习率乘以惩罚强度,不应遗漏学习率。只改学习率但保持阈值不变,会实际改变正在优化的相对惩罚。
数据损失的梯度必须与所写目标的 sum/mean 和系数一致。梯度尺度写错,即使软阈值公式单独正确,整体也不是预期算法。
步长要与平滑损失的曲率及算法条件匹配。近端算子能处理非光滑项,并不意味着任意大步长都能收敛,或一轮更新就是最优解。
截距常按单独约定处理,不一定与权重一起阈值化;多输出、组稀疏或其他惩罚也不能无条件使用逐元素 L1 软阈值。
数学表达
核心表达
阈值 τ=学习率×L1 强度。截距通常不惩罚。收敛与尺度仍需检查。
变量含义
变量定义与本页概念定义一致,代码中的同名变量保持相同语义。
计算步骤
- 1计算数据梯度
- 2做普通梯度步
- 3应用软阈值
- 4单独更新偏置
代码对应位置
示例 1把梯度步与近端步分开打印:核对阈值 ηλ 与精确零值。
计算与实现步骤
- 计算数据梯度
- 做普通梯度步
- 应用软阈值
- 单独更新偏置
- 记录完整目标
- 检查收敛
代码实现
示例 1
把梯度步与近端步分开打印
example_01.py用途:核对阈值 ηλ 与精确零值。
import numpy as np
w = np.array([1.0, -0.2, 0.05])
gradient = np.array([2.0, -1.0, 0.1])
rate, strength = 0.1, 0.5
z = w - rate * gradient
threshold = rate * strength
updated = np.sign(z) * np.maximum(np.abs(z) - threshold, 0.0)
print("gradient_step:", z.round(4).tolist())
print("proximal_step:", updated.round(4).tolist())代码解析
解析始终位于完整代码下方,并按实际代码段逐项对应。
输入数据与任务
核对阈值 ηλ 与精确零值。
gradient- 损失对参数的局部变化率。
w- 模型权重或当前待优化参数。
Step 1 · 1–9 行
导入当前步骤需要的数值计算、预处理、模型或评价工具。依赖集中写在代码开头,便于复现。
import numpy as np
w = np.array([1.0, -0.2, 0.05])
gradient = np.array([2.0, -1.0, 0.1])
rate, strength = 0.1, 0.5
z = w - rate * gradient
threshold = rate * strength
updated = np.sign(z) * np.maximum(np.abs(z) - threshold, 0.0)
print("gradient_step:", z.round(4).tolist())
print("proximal_step:", updated.round(4).tolist())代码与数学原理
参数更新由当前梯度与学习率共同决定。
预期输出或运行结果
gradient_step: [0.8, -0.1, 0.04] proximal_step: [0.75, -0.05, 0.0]
常见错误 · 3 条
- 惩罚截距
- 数据未标准化
- 只看训练目标
实际应用
- 理解 Lasso
- 稀疏优化
常见错误
- 惩罚截距
- 数据未标准化
- 只看训练目标
推荐学习资料
参考库不会生成虚假资源或无效外部链接。