PGM-Proximal Gradient Methods -#notebook

PGM方法,解决的是可以分离的非光滑凸优化问题,

推导过程实际上采用的是泰勒展开配方法(结合梯度下降更新公式)

问题背景

近端梯度下降法是众多梯度下降 (gradient descent) 方法中的一种,其英文名称为proximal gradident descent,其中,术语中的proximal一词比较耐人寻味,将proximal翻译成“近端”主要想表达"(物理上的)接近"。与经典的梯度下降法和随机梯度下降法相比,近端梯度下降法的适用范围相对狭窄。对于凸优化问题,当其目标函数存在不可微部分(例如目标函数中有 l_1 -范数或迹范数)时,近端梯度下降法才会派上用场。

Optimization problem

对于如下凸优化问题, f ( x ) f(x) f(x)是可微的,满足Lipschitz连续的凸函数, h ( x ) h(x) h(x)是不可微的,凸函数。

min ⁡ x F ( x ) ≜ f ( x ) + h ( x ) \min_\mathrm{x} F(\mathrm{x}) \triangleq f(\mathrm{x})+h(\mathrm{x}) xminF(x)f(x)+h(x)

Lipschitz continuous gradient condition:

lipschitz连续梯度条件指

f : R n → R f : \mathbb{R}^n\rightarrow \mathbb{R} f:RnR的连续,可微函数,如果其梯度满足 ∀ x , y ∈ R n \forall \mathbf{x},\mathbf{y} \in \mathbb{R}^n x,yRn,有
∥ ∇ f ( x ) − ∇ f ( y ) ∥ ≤ L ∥ x − y ∥ \|\nabla f(\mathbf{x}) - \nabla f(\mathbf{y})\| \le L\|\mathbf{x}-\mathbf{y}\| ∥∇f(x)f(y)Lxy
则称 ∇ f \nabla f f是Lipschitz连续的,其中 L L L是Lipschitz常数。

f ( x ) ≤ f ( x k ) + ⟨ ∇ f ( x k ) , x − x k ⟩ + L 2 ∥ x − x k ∥ 2 2 ⏟ U ( x , x k ) f(\mathbf{x})\leq\underbrace{f(\mathbf{x}^k)+\langle\nabla f(\mathbf{x}^k),\mathbf{x}-\mathbf{x}^k\rangle+\frac{L}{2}\|\mathbf{x}-\mathbf{x}^k\|_2^2}_{U(\mathbf{x},\mathbf{x}^k)} f(x)U(x,xk) f(xk)+f(xk),xxk+2Lxxk22


对满足多元变量的函数 f ( x ) f(\mathbf{x}) f(x)而言,对其进行在 x k \mathbf{x}^k xk处泰勒展开

f ( x ) = f ( x k ) + f ′ ( x k ) 1 ! ( x − x k ) + o ( ∥ x − x k ∥ ) ) = f ( x k ) + ⟨ ∇ f ( x k ) , x − x k ⟩ + o ( ∥ x − x k ∥ ) ) ≤ f ( x k ) + ⟨ ∇ f ( x k ) , x − x k ⟩ + L 2 ∥ x − x k ∥ 2 2 \begin{align*} f(\mathbf{x}) &= f(\mathbf{x}^k) + \frac {f^\prime (\mathbf{x}^k)}{1!}(\mathbf{x-x^k}) + o(\|\mathbf{x}-\mathbf{x}^k\|)) \\& = f(\mathbf{x}^k) + \langle \nabla f(\mathbf{x}^k),\mathbf{x}-\mathbf{x}^k \rangle+ o(\|\mathbf{x}-\mathbf{x}^k\|)) \\ &\le f(\mathbf{x}^k) + \langle \nabla f(\mathbf{x}^k),\mathbf{x}-\mathbf{x}^k \rangle + \frac L 2\| \mathbf{x}-\mathbf{x}^k\|^2_2 \end{align*} f(x)=f(xk)+1!f(xk)(xxk)+o(xxk))=f(xk)+f(xk),xxk+o(xxk))f(xk)+f(xk),xxk+2Lxxk22

二次上界

这个公式和Lipschitz连续梯度条件相关,但它表达的是一个稍微不同的概念,通常被称为函数的梯度满足Lipschitz条件时的一个重要结果,也是凸优化中的一个关键不等式。这个不等式提供了一个对于凸函数 f f f在点 x \mathbf{x} x处的值与在另一点 x k \mathbf{x}^k xk处的值、梯度以及两点之间距离的一个上界估计。

公式是:

f ( x ) ≤ f ( x k ) + ⟨ ∇ f ( x k ) , x − x k ⟩ + L 2 ∥ x − x k ∥ 2 2 f(\mathbf{x}) \leq f(\mathbf{x}^k) + \langle \nabla f(\mathbf{x}^k), \mathbf{x} - \mathbf{x}^k \rangle + \frac{L}{2} \|\mathbf{x} - \mathbf{x}^k\|_2^2 f(x)f(xk)+f(xk),xxk+2Lxxk22

为了傻子都能看明白,我们将分步骤详细推导这个不等式如何从Lipschitz连续梯度条件得出。

1. 梯度的Lipschitz连续性

首先,我们知道如果函数(f)的梯度满足Lipschitz连续条件,则对于所有的 x , y ∈ R n \mathbf{x}, \mathbf{y} \in \mathbb{R}^n x,yRn,有:

∥ ∇ f ( x ) − ∇ f ( y ) ∥ ≤ L ∥ x − y ∥ \|\nabla f(\mathbf{x}) - \nabla f(\mathbf{y})\| \leq L\|\mathbf{x} - \mathbf{y}\| ∥∇f(x)f(y)Lxy

这意味着梯度的变化率被限制在一个常数(L)内。

2. 泰勒级数展开(一阶)

对于任何可微分函数(f),我们可以使用泰勒级数在点 x k \mathbf{x}^k xk处进行一阶展开:

f ( x ) = f ( x k ) + ⟨ ∇ f ( x k ) , x − x k ⟩ + o ( ∥ x − x k ∥ ) f(\mathbf{x}) = f(\mathbf{x}^k) + \langle \nabla f(\mathbf{x}^k), \mathbf{x} - \mathbf{x}^k \rangle + o(\|\mathbf{x} - \mathbf{x}^k\|) f(x)=f(xk)+f(xk),xxk+o(xxk)

其中 o ( ∥ x − x k ∥ ) o(\|\mathbf{x} - \mathbf{x}^k\|) o(xxk)表示比 ∥ x − x k ∥ \|\mathbf{x} - \mathbf{x}^k\| xxk高阶的无穷小量。

3. 利用Lipschitz连续性替代高阶项

在Lipschitz连续梯度的背景下,我们可以用 L 2 ∥ x − x k ∥ 2 2 \frac{L}{2} \|\mathbf{x} - \mathbf{x}^k\|_2^2 2Lxxk22来控制函数值的变化,这个项可以看作是对于由梯度Lipschitz连续性引起的函数值变化的一个上界估计。

4. 组合以上元素

结合上述元素,我们可以得到:

f ( x ) ≤ f ( x k ) + ⟨ ∇ f ( x k ) , x − x k ⟩ + L 2 ∥ x − x k ∥ 2 2 f(\mathbf{x}) \leq f(\mathbf{x}^k) + \langle \nabla f(\mathbf{x}^k), \mathbf{x} - \mathbf{x}^k \rangle + \frac{L}{2} \|\mathbf{x} - \mathbf{x}^k\|_2^2 f(x)f(xk)+f(xk),xxk+2Lxxk22

这个不等式表明,在 x k \mathbf{x}^k xk附近,函数(f)的值不会超过右侧的量,其中包含了在 x k \mathbf{x}^k xk点的函数值、梯度方向上的一次项变化,以及距离的平方项作为调整。

推导的直观解释

直观上,这个不等式告诉我们,对于一个梯度满足Lipschitz连续条件的函数,我们可以用一个线性项(即梯度项)加上一个二次项来近似函数在另一点的值。这个近似不仅考虑了方向(通过梯度)还考虑了步长(通过距离的平方),并且保证了不会超过实际函数值太多,这对于分析和设计梯度下降算法非常有用。

f ( x ) = f ( x k ) + ∑ i = 1 n ∂ f ( x k ) ∂ x i ( x i − x i k ) + o ( ∣ x − x k ∣ ) f(\mathbf{x}) = f(\mathbf{x}^k) + \sum_{i=1}^n \frac{\partial f(\mathbf{x}^k)}{\partial x_i}(x_i - x_i^k)+ o(|\mathbf{x} - \mathbf{x}^k|) f(x)=f(xk)+i=1nxif(xk)(xixik)+o(xxk)

Proximal gradient method :

梯度下降的基本更新公式: x k + 1 ⇐ x k − η k ∇ f ( x k ) \mathbf{x}^{k+1} \Leftarrow \mathbf{x}^k - \eta_k \nabla f(\mathbf{x}^k) xk+1xkηkf(xk)

x k + 1 ⇐ arg ⁡ min ⁡ x U ( x , x k ) + h ( x ) x k + 1 ⇐ arg ⁡ min ⁡ x U ( x , x k ) + h ( x ) ⇐ arg ⁡ min ⁡ x ⟨ ∇ f ( x k ) , x − x k ⟩ + L 2 ∥ x − x k ∥ 2 2 + h ( x ) ⇐ arg ⁡ min ⁡ x L 2 ∥ x − x k + ∇ f ( x k ) / L ∥ 2 2 + h ( x ) ⇐ arg ⁡ min ⁡ x L 2 ∥ x − ( x k − ∇ f ( x k ) / L ) ∥ 2 2 + h ( x ) \begin{aligned} \mathbf{x}^{k+1} &\begin{array}{rcl} \Leftarrow\quad\arg\min_{\mathbf{x}}U(\mathbf{x},\mathbf{x}^k)+h(\mathbf{x}) \end{array} \\ \mathbf{x}^{k+1} &\begin{array}{rcl}\Leftarrow&\arg\min_\mathbf{x}&U(\mathbf{x},&\mathbf{x}^k)+h(\mathbf{x})\end{array} \\ &\begin{array}{rcl}\Leftarrow&\arg\min_{\mathbf{x}}\langle\nabla f(\mathbf{x}^k),\mathbf{x}-\mathbf{x}^k\rangle+\frac L2\|\mathbf{x}-\mathbf{x}^k\|_2^2+h(\mathbf{x})\end{array} \\ &\begin{array}{rcl}\Leftarrow&\arg\min_\mathbf{x}\frac L2\|\mathbf{x}-\mathbf{x}^k+\nabla f(\mathbf{x}^k)/L\|_2^2+h(\mathbf{x})\end{array} \\ &\begin{array}{rcl}\Leftarrow&\arg\min_\mathbf{x}\frac L2\|\mathbf{x}-(\mathbf{x}^k - \nabla f(\mathbf{x}^k)/L)\|_2^2+h(\mathbf{x})\end{array}\end{aligned} xk+1xk+1argminxU(x,xk)+h(x)argminxU(x,xk)+h(x)argminxf(xk),xxk+2Lxxk22+h(x)argminx2Lxxk+f(xk)/L22+h(x)argminx2Lx(xkf(xk)/L)22+h(x)

这个公式是在解释一个带有正则化项的优化问题的迭代更新步骤,它常见于机器学习和优化理论中,特别是在处理带有正则化(由 h ( x ) h(x) h(x)表示)的问题时。我们将一步步地解释这个推导过程。

初始问题和目标

我们从一个优化问题开始,目的是要更新 x k + 1 x^{k+1} xk+1,使得它最小化一个目标函数,该目标函数由几个部分组成:

  1. f ( x k ) f(x^k) f(xk):当前迭代点 x k x^k xk处的函数值。
  2. ∇ f ( x k ) T ( x − x k ) \nabla f(x^k)^T(x-x^k) f(xk)T(xxk):在 x k x^k xk点的函数 f f f的梯度与 x − x k x-x^k xxk的点积,表示 f f f x k x^k xk附近的一阶线性近似。
  3. 1 2 η k ∥ x − x t ∥ 2 2 \frac{1}{2\eta_k}\|x-x^t\|_2^2 2ηk1xxt22:正则化项,用于控制 x x x与当前点 x k x^k xk之间的距离,其中 η k \eta_k ηk是一个正的调节参数,可以理解为参数更新步长。我们令 η k = 1 L \eta_k = \frac 1 L ηk=L1
  4. h ( x ) h(x) h(x):正则化函数,用于引入额外的约束或优化目标,例如稀疏性或其他先验知识。

第一步:重写优化问题

原始的优化问题可以表达为寻找 x k + 1 x^{k+1} xk+1,使得下式最小:

x k + 1 = arg ⁡ min ⁡ x f ( x k ) + ∇ f ( x k ) T ( x − x k ) + 1 2 η k ∥ x − x k ∥ 2 2 + h ( x ) x^{k+1} = \underset{x}{\arg\min} f(x^k) + \nabla f(x^k)^T(x - x^k) + \frac{1}{2\eta_k}\|x - x^k\|_2^2 + h(x) xk+1=xargminf(xk)+f(xk)T(xxk)+2ηk1xxk22+h(x)

这里,我们尝试找到一个新的点 x x x,以在保持原始目标函数的线性近似和控制 x x x x t x^t xt之间距离的同时,最小化整体目标。

第二步 配方法

现在,考虑如何把梯度项融入这个框架。如果我们把梯度项视为引导 x x x移动的方向,则可以通过减去一个与梯度方向相对的项 x t − η t ∇ f ( x t ) x^t - \eta_t \nabla f(x^t) xtηtf(xt)来重新组织这个表达式。

这个式子怎么来的呢?

我们观察式子,可以逐步推导:
x k + 1 = arg ⁡ min ⁡ x f ( x k ) + ∇ f ( x k ) T ( x − x k ) + 1 2 η k ∥ x − x k ∥ 2 2 + h ( x ) 上式中 ⁡ , f ( x k ) 与不影响该最优化问题的结果 = arg ⁡ min ⁡ x 1 2 η k ∥ x − x k ∥ 2 2 + ∇ f ( x k ) ⊤ ( x − x k ) + h ( x ) = arg ⁡ min ⁡ x 1 2 η k [ ( x − x k + 2 η t ∇ f ( x k ) ) ⊤ ( x − x k ) ] + h ( x ) 观察上一行式子,可以考虑配方 ⁡ , 引入 η 2 ∥ f ( x k ) ∥ 2 2 不影响该最优化问题的结果 = arg ⁡ min ⁡ x 1 2 η k [ η k 2 ∥ f ( x k ) ∥ 2 2 + ∥ x − x k ∥ 2 2 + 2 η k ∇ f ( x k ) ⊤ ( x − x k ) ] + h ( x ) = arg ⁡ min ⁡ x 1 2 η k [ ∥ x − x k + η k ∇ f ( x k ) ∥ 2 2 ] + h ( x ) = arg ⁡ min ⁡ x 1 2 η k [ ∥ x − ( x k − η k ∇ f ( x k ) ) ∥ 2 2 ] + h ( x ) \begin{align*} x^{k+1} &= \underset{x}{\arg\min} f(x^k) + \nabla f(x^k)^T(x - x^k) + \frac{1}{2\eta_k}\|x - x^k\|_2^2 + h(x) \\ &\operatorname{上式中},f(x^k)与不影响该最优化问题的结果 \\ &=\underset{x}{\arg\min} \frac{1}{2\eta_k}\|x-x^k\|_2^2+\nabla f(x^k)^\top(x-x^k)+h(x) \\ &=\underset{x}{\arg\min}\frac{1}{2\eta_k} \left[ (x-x^k+2\eta_t\nabla f(x^k))^\top(x-x^k) \right]+h(x) \\ &\operatorname{观察上一行式子,可以考虑配方},引入\eta^2 \|f(x^k)\|_2^2不影响该最优化问题的结果 \\ &=\underset{x}{\arg\min} \frac{1}{2\eta_k} \left[ \eta_k^2 \|f(x^k)\|_2^2 + \|x-x^k\|_2^2 +2\eta_k \nabla f(x^k)^\top(x-x^k) \right]+h(x) \\ & = \underset{x}{\arg\min} \frac{1}{2\eta_k} \left[\|x-x^k+\eta_k\nabla f(x^k) \|_2^2 \right]+h(x) \\ & = \underset{x}{\arg\min} \frac{1}{2\eta_k} \left[\|x-(x^k -\eta_k\nabla f(x^k)) \|_2^2 \right]+h(x) \end{align*} xk+1=xargminf(xk)+f(xk)T(xxk)+2ηk1xxk22+h(x)上式中,f(xk)与不影响该最优化问题的结果=xargmin2ηk1xxk22+f(xk)(xxk)+h(x)=xargmin2ηk1[(xxk+2ηtf(xk))(xxk)]+h(x)观察上一行式子,可以考虑配方,引入η2f(xk)22不影响该最优化问题的结果=xargmin2ηk1[ηk2f(xk)22+xxk22+2ηkf(xk)(xxk)]+h(x)=xargmin2ηk1[xxk+ηkf(xk)22]+h(x)=xargmin2ηk1[x(xkηkf(xk))22]+h(x)
这样,我们得到了一个更新的形式,它直接反映了梯度下降的步骤,并包含了对正则化项 h ( x ) h(x) h(x)的优化。

最终形式

通过上述推导,我们得到了最终的更新公式:
x k + 1 = arg ⁡ min ⁡ x 1 2 η k ∥ x − ( x t − η k ∇ f ( x k ) ) ∥ 2 2 + h ( k ) x^{k+1} =\underset{x}{\arg\min} \frac{1}{2\eta_k}\|x - (x^t - \eta_k \nabla f(x^k))\|_2^2 + h(k) xk+1=xargmin2ηk1x(xtηkf(xk))22+h(k)
这里, ( x k − η t ∇ f ( x k ) ) (x^k - \eta_t \nabla f(x^k)) (xkηtf(xk))反映了在没有正则化项的情况下,基于当前梯度的预期更新位置。整个表达式说明了在考虑正则化项 h ( x ) h(x) h(x)的同时,如何根据梯度信息和调节参数 η t \eta_t ηt来更新 x k + 1 x^{k+1} xk+1

这个公式展示了如何将梯度下降与正则化结合,用于解决更复杂的优化问题,其中 η k \eta_k ηk调节了梯度下降步骤的大小,而 h ( x ) h(x) h(x)提供了额外的优化约束或目标。

局限性与优点

Proximal Gradient Method(近端梯度法)是一种解决非光滑优化问题的有效方法,特别是那些包含可分离正则项的问题。它结合了梯度下降法和近端算子,以处理包含非光滑正则化项(如L1正则化)的优化问题。这种方法在机器学习和信号处理等领域特别有用。

优点

  1. 处理非光滑正则化项:Proximal Gradient Method能够有效处理包含非光滑正则化项的优化问题,这在传统的梯度下降法中是困难的。例如,L1正则化引入的稀疏性在很多应用中都是十分有价值的。
  2. 灵活性:该方法可以灵活应对各种不同的正则化项,只要相应的近端算子可以有效计算。
  3. 收敛性:对于某些特定类别的问题,Proximal Gradient Method提供了良好的收敛性质,即使是在非光滑问题上也是如此。
  4. 易于实现:相对于一些其他优化技术,Proximal Gradient Method通常比较容易实现,因为它将问题分解为梯度下降步和近端算子步,这两步都相对容易处理。

局限性

  1. 收敛速度:虽然Proximal Gradient Method在处理具有非光滑正则项的问题上很有效,但其收敛速度可能不如专门针对光滑问题设计的方法快。特别是在高维数据或大规模问题上,收敛速度可能成为瓶颈。
  2. 参数选择:步长和其他参数的选择对算法的性能有显著影响。不恰当的参数选择可能导致收敛速度慢或甚至不收敛。
  3. 复杂正则化项:虽然Proximal Gradient Method适用于许多类型的正则化项,但如果正则化项特别复杂,计算相应的近端算子可能变得困难或计算量大。
  4. 局部最小值:和许多优化算法一样,Proximal Gradient Method可能会收敛到局部最小值,特别是在非凸优化问题上。

应用场景的考量

尽管存在这些局限性,Proximal Gradient Method仍然是解决包含非光滑正则化项优化问题的强大工具。在选择使用此方法时,应根据具体问题的性质和需求权衡其优点和局限性。对于大规模或高度非光滑的问题,可能需要考虑加速技术或其他更高级的优化策略。

代码

考虑一个带有L1正则化的二次优化问题,即:

min ⁡ x   0.5 x T A x + b T x + λ ∥ x ∥ 1 \min_\mathbf{x} \, 0.5\mathbf{x}^TA \mathbf{x} + b^T \mathbf{x} + \lambda \|\mathbf{x}\|_1 xmin0.5xTAx+bTx+λx1

其中, x x x 是变量向量, A A A 是一个正定矩阵,确保了二次项是凸的; b b b 是一个向量; λ \lambda λ 是正则化项的权重,用于控制 x x x的稀疏程度; ∥ x ∥ 1 \|x\|_1 x1 表示 x x x的L1范数,即其绝对值之和,这个范数促使 x x x的许多元素变为0,从而实现稀疏。

分析问题:
我们需要执行以下步骤:

  1. 初始化问题参数:生成一个随机的正定矩阵A、向量b、初始解x,以及设置正则化参数lambda_

  2. 定义计算目标函数和梯度的函数compute_obj根据当前的x计算目标函数值和梯度。

  3. 定义L1范数的近端算子函数prox_l1实现了L1正则化项的近端算子。

  4. 执行优化循环:在每次迭代中,先计算当前x的目标函数值和梯度,然后使用近端梯度方法更新x

  5. 记录并可视化:记录每次迭代的目标函数值,最后绘制这些值随迭代次数的变化情况。

这样的代码结构清晰,易于理解,是利用Python解决此类优化问题的典型方式。以下是一个等价的Python代码实现:

import numpy as np
import matplotlib.pyplot as plt

def compute_obj(x, A, b):
    """
    Compute the objective function value and its gradient.
    """
    fobj = 0.5 * np.dot(x.T, np.dot(A, x)) + np.dot(b.T, x)
    grad = np.dot(A, x) + b
    return fobj, grad

def prox_l1(a, lambda_):
    """
    Proximal operator for the L1 norm.
    """
    return np.sign(a) * np.maximum(0, np.abs(a) - lambda_)

# Problem setup
n = 10
A = np.random.randn(n, n)
A = np.dot(A, A.T)  # Make A symmetric and positive definite
b = np.random.randn(n, 1)
x = np.random.randn(n, 1)
lambda_ = 1.0
L = np.linalg.eigvalsh(A).max()  # Lipschitz constant

# Optimization loop
history = []
for iter in range(100):
    fobj, grad = compute_obj(x, A, b)
    fobj += lambda_ * np.linalg.norm(x, 1)
    history.append(fobj)
    print(f'iter: {iter}, fobj: {fobj:.2f}')
    
    # Update x using the proximal gradient method
    x = prox_l1(x - grad / L, lambda_ / L)

# Plot the history of the objective function
plt.plot(history)
plt.xlabel('Iteration')
plt.ylabel('Objective Function Value')
plt.title('Objective Function Value Over Iterations')
plt.show()

针对近端算子在处理L1正则化项时的具体形式,我们可以详细推导。

公式推导

考虑更新参数的优化问题的一般形式为:
x k + 1 = arg ⁡ min ⁡ x 1 2 η k ∥ x − ( x t − η k ∇ f ( x k ) ) ∥ 2 2 + h ( k ) x^{k+1} =\underset{x}{\arg\min} \frac{1}{2\eta_k}\|x - (x^t - \eta_k \nabla f(x^k))\|_2^2 + h(k) xk+1=xargmin2ηk1x(xtηkf(xk))22+h(k)
对于例子中的带 L 1 L_1 L1正则化的式子,可以进一步具体表达成如下优化问题:
arg ⁡ min ⁡ x 1 2 ∥ x − a ∥ 2 2 + λ ∥ x ∥ 1 = arg ⁡ min ⁡ x 1 , . . . , x n ∑ i = 0 n [ 1 2 ( x i − a i ) 2 + λ ∣ x i ∣ ] \begin{align*} &\arg \min_\mathbf{x} \frac{1}{2}\|\mathbf{x} - a\|^2_2 + \lambda \|\mathbf{x}\|_1 \\ & =\underset{x_1,...,x_n}{\arg \min} \sum_{i=0}^n \left[ \frac12(x_i - a_i)^2+\lambda|x_i| \right] \end{align*} argxmin21xa22+λx1=x1,...,xnargmini=0n[21(xiai)2+λxi]

这里, a a a 是一个给定的向量 x k − η ∇ f ( x ) \mathbf{x}^k - \eta \nabla f(\mathbf{x}) xkηf(x) λ \lambda λ 是正则化参数。目标是找到一个向量 x \mathbf{x} x,最小化 x \mathbf{x} x a a a的欧氏距离的平方和 x \mathbf{x} x的L1范数的加权和。

为了解这个问题,我们可以将 x \mathbf{x} x中的每一个元素 x i x_i xi分解为正数、负数和零的三部分,然后分别处理。

对于L1范数 ∥ x ∥ 1 \|\mathbf{x}\|_1 x1,它可以写为所有 x i x_i xi的绝对值之和。因此,我们可以将目标函数重写为:

∑ i ( 1 2 ( x i − a i ) 2 + λ ∣ x i ∣ ) \sum_i \left( \frac{1}{2}(x_i - a_i)^2 + \lambda |x_i| \right) i(21(xiai)2+λxi)

由于上述式子中每个 x i x_i xi是独立的,我们可以分别对每个 x i x_i xi进行优化。考虑单个项:

arg ⁡ min ⁡ x i 1 2 ( x i − a i ) 2 + λ ∣ x i ∣ \arg \min_{x_i} \frac{1}{2}(x_i - a_i)^2 + \lambda |x_i| argximin21(xiai)2+λxi

我们可以通过考虑 x i x_i xi的正负来分别处理:

  1. x i > 0 x_i > 0 xi>0,问题变为:
    arg ⁡ min ⁡ x i 1 2 ( x i − a i ) 2 + λ x i \arg \min_{x_i} \frac{1}{2}(x_i - a_i)^2 + \lambda x_i argximin21(xiai)2+λxi
    x i x_i xi求导,并令导数等于0,可以解得:
    x i = a i − λ x_i = a_i - \lambda xi=aiλ
    但是,这个解只在 a i > λ a_i > \lambda ai>λ时有效,因为我们假设了 x i > 0 x_i > 0 xi>0

  2. x i < 0 x_i < 0 xi<0,问题变为:
    arg ⁡ min ⁡ x i 1 2 ( x i − a i ) 2 − λ x i \arg \min_{x_i} \frac{1}{2}(x_i - a_i)^2 - \lambda x_i argximin21(xiai)2λxi
    同样地,对 x i x_i xi求导,解得:
    x i = a i + λ x_i = a_i + \lambda xi=ai+λ
    这个解只在 a i < − λ a_i < -\lambda ai<λ时有效,因为我们假设了 x i < 0 x_i < 0 xi<0

  3. a i a_i ai的绝对值小于等于 λ \lambda λ,最优的 x i x_i xi是0,因为这样可以最小化 x i x_i xi的L1范数而不增加太多的二次项损失。

从而,我们可以将条件 x i > 0 , x i = a i − λ x_i > 0, x_i = a_i - \lambda xi>0,xi=aiλ x i < 0 , x i = a i + λ x_i < 0, x_i = a_i + \lambda xi<0,xi=ai+λ合并成一个表达式,我们可以使用软阈值操作,这在数学和信号处理中非常常见。软阈值操作可以统一表示为:

x i = sign ( a i ) max ⁡ ( ∣ a i ∣ − λ , 0 ) x_i = \text{sign}(a_i) \max(|a_i| - \lambda, 0) xi=sign(ai)max(aiλ,0)

这个表达式的含义如下:

  • a i > λ a_i > \lambda ai>λ x i x_i xi将是 a i − λ a_i - \lambda aiλ,因为我们从 a i a_i ai的绝对值中减去 λ \lambda λ并保留符号。这对应于 x i > 0 x_i > 0 xi>0的情况。
  • a i < − λ a_i < -\lambda ai<λ x i x_i xi将是 a i + λ a_i + \lambda ai+λ,因为我们同样从 a i a_i ai的绝对值中减去 λ \lambda λ并保留符号,但是因为 a i a_i ai是负的,所以实际上是在 a i a_i ai上加上 λ \lambda λ。这对应于 x i < 0 x_i < 0 xi<0的情况。
  • ∣ a i ∣ ≤ λ |a_i| \leq \lambda aiλ x i x_i xi将是0,因为 max ⁡ ( ∣ a i ∣ − λ , 0 ) \max(|a_i| - \lambda, 0) max(aiλ,0)将返回0。这反映了L1正则化促进稀疏性的特性。

代码实现

将上述逻辑转换为代码,我们有:

  • np.sign(a):这个函数用于保留(a_i)的符号,即对于每个元素,确定它是正数、负数还是零。
  • np.abs(a) - lambda_:这个操作对应于调整(a_i)的值,实际上是在寻找上述推导中的交点。当(a_i)的绝对值大于(\lambda)时,这意味着我们需要移动(x_i)以减少总的目标函数值;当绝对值小于(\lambda)时,最优解是将(x_i)设为0(因为对应的项会被np.maximum(0, ...)过滤掉)。
  • np.maximum(0, np.abs(a) - lambda_):这确保了当(a_i)的绝对值小于(\lambda)时,(x_i)被置为0。否则,它减少了(a_i)的绝对值但保留了符号,这对应于上面的推导。

因此,不论 a i a_i ai的符号如何,上述表达式都能正确地给出 x i x_i xi的值,实现了软阈值操作。这个操作的效果是将 a i a_i ai向零收缩 λ \lambda λ的量,但如果 a i a_i ai的绝对值小于 λ \lambda λ,则直接将其设置为零,从而促进解的稀疏性。这正是L1正则化项在优化问题中的作用,也是prox_l1函数在代码中实现的逻辑。

  • 24
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值