1. 软阈值(Soft Thresholding)函数的作用
软阈值(Soft Thresholding)可以求解如下优化问题:
arg min
x
∥
X
−
B
∥
2
2
+
λ
∥
x
∥
1
\argmin_x \| X - B\|_2^2 + \lambda\| x\|_1
xargmin∥X−B∥22+λ∥x∥1
其中:
X
=
[
x
1
,
x
2
,
…
,
x
N
]
T
X = [x_1, x_2, \dots, x_N]^T
X=[x1,x2,…,xN]T
B
=
[
b
1
,
b
2
,
…
,
b
N
]
T
B = [b_1, b_2, \dots, b_N]^T
B=[b1,b2,…,bN]T
根据范数的定义,可以将上面优化问题的目标函数拆开:
F ( X ) = ∥ X − B ∥ 2 2 + λ ∥ X ∥ 1 = [ ( x 1 − b 1 ) 2 + λ ∥ x 1 ∥ ] + [ ( x 2 − b 2 ) 2 + λ ∥ x 2 ∥ ] + ⋯ + [ ( x N − b N ) 2 + λ ∥ x N ∥ ] F(X) = \|X-B \|_2^2 + \lambda\| X\|_1 \\= [(x_1-b_1)^2+\lambda \| x_1\|] + [(x_2-b_2)^2+\lambda \| x_2\|] + \dots + [(x_N-b_N)^2+\lambda \| x_N\|] F(X)=∥X−B∥22+λ∥X∥1=[(x1−b1)2+λ∥x1∥]+[(x2−b2)2+λ∥x2∥]+⋯+[(xN−bN)2+λ∥xN∥]
也就是说,我们可以通过求解 N N N 个独立的形如函数
f ( x ) = ( x − b ) 2 + λ ∣ x ∣ f(x) = (x-b)^2 + \lambda |x | f(x)=(x−b)2+λ∣x∣
的优化问题,来求解这个问题。由中学时代学过的求极值方法知道,可以求函数 f ( x ) f(x) f(x) 导数:
d
f
(
x
)
d
x
=
2
(
x
−
b
)
+
λ
sgn
(
x
)
\frac{df(x)}{dx} = 2(x-b) + \lambda \textrm{sgn}(x)
dxdf(x)=2(x−b)+λsgn(x)
sgn
(
x
)
=
1
,
x
>
0
\textrm{sgn}(x) = 1, x > 0
sgn(x)=1,x>0
sgn
(
x
)
=
−
1
,
x
<
0
\textrm{sgn}(x) = -1, x < 0
sgn(x)=−1,x<0
这里解释一下变量
x
x
x 绝对值的导数,当
x
>
0
x > 0
x>0 时,
∣
x
∣
=
x
| x|=x
∣x∣=x,因此其导数等于 1;当
x
<
0
x < 0
x<0 时,
∣
x
∣
=
x
| x|=x
∣x∣=x,因此其导数等于 -1;综合起来,
x
x
x 绝对值的导数等于
sgn
(
x
)
\textrm{sgn}(x)
sgn(x)。令函数
f
(
x
)
f(x)
f(x) 导数等于 0,得:
x
=
b
−
λ
2
sgn
(
x
)
x = b - \frac{\lambda}{2} \textrm{sgn}(x)
x=b−2λsgn(x)
这个结果等号两端都有变量 x x x,需要再化简一下。下面分三种情况讨论:
- 当 b > λ / 2 b > \lambda / 2 b>λ/2 时
假设 x < 0 x < 0 x<0,则 sgn ( x ) = − 1 \textrm{sgn}(x) = -1 sgn(x)=−1,所以 x = b + λ / 2 > 0 x = b + \lambda/2 > 0 x=b+λ/2>0,与假设 x < 0 x < 0 x<0 矛盾;
假设 x > 0 x > 0 x>0,则 sgn ( x ) = 1 \textrm{sgn}(x) = 1 sgn(x)=1,所以 x = b − λ / 2 > 0 x = b - \lambda/2 > 0 x=b−λ/2>0,成立;
所以此时在 x = b − λ / 2 > 0 x = b - \lambda/2 > 0 x=b−λ/2>0 处取得极小值:
f ( x ) ∣ x = b − λ / 2 = ( b − λ 2 − b ) 2 + λ ( b − λ 2 ) = b λ − λ 2 4 = − ( λ 2 ) 2 + 2 b λ 2 = − ( λ 2 ) 2 + 2 b λ 2 − b 2 + b 2 = − ( λ 2 − b ) 2 + b 2 < b 2 = f ( 0 ) f(x)|_{x = b - \lambda/2} = (b - \frac{\lambda}{2}-b)^2 + \lambda(b - \frac{\lambda}{2}) \\= b\lambda - \frac{\lambda^2}{4} \\= -(\frac{\lambda}{2})^2 + 2b\frac{\lambda}{2} \\= -(\frac{\lambda}{2})^2 + 2b\frac{\lambda}{2} - b^2 + b^2 \\= -(\frac{\lambda}{2} - b)^2 + b^2 < b^2 = f(0) f(x)∣x=b−λ/2=(b−2λ−b)2+λ(b−2λ)=bλ−4λ2=−(2λ)2+2b2λ=−(2λ)2+2b2λ−b2+b2=−(2λ−b)2+b2<b2=f(0)
即此时极小值小于 f ( 0 ) f(0) f(0),而当 x < 0 x <0 x<0 时
d f ( x ) d x = 2 ( x − b ) + λ sgn ( x ) = 2 x − 2 b − λ < 2 x − 2 ( λ 2 ) − λ = 2 x − 2 λ < 0 \frac{df(x)}{dx} = 2(x-b) + \lambda \textrm{sgn}(x) \\ = 2x-2b-\lambda \\ < 2x-2(\frac{\lambda}{2}) - \lambda \\ =2x-2\lambda < 0 dxdf(x)=2(x−b)+λsgn(x)=2x−2b−λ<2x−2(2λ)−λ=2x−2λ<0
即当 x < 0 x <0 x<0 时函数 f ( x ) f(x) f(x) 为单调降函数 (对任意 Δ x < 0 , f ( 0 ) < f ( Δ x ) \Delta x < 0, f(0) < f(\Delta x) Δx<0,f(0)<f(Δx))。因此,函数在 x = b − λ 2 > 0 x = b - \frac{\lambda}{2} > 0 x=b−2λ>0 处取得最小值。
- 当 b < λ / 2 b < \lambda / 2 b<λ/2 时
假设 x < 0 x < 0 x<0,则 sgn ( x ) = − 1 \textrm{sgn}(x) = -1 sgn(x)=−1,所以 x = b + λ / 2 < 0 x = b + \lambda/2 < 0 x=b+λ/2<0,成立;
假设 x > 0 x > 0 x>0,则 sgn ( x ) = 1 \textrm{sgn}(x) = 1 sgn(x)=1,所以 x = b − λ / 2 < 0 x = b - \lambda/2 < 0 x=b−λ/2<0,与假设 x < 0 x < 0 x<0 矛盾;
所以此时在 x = b + λ / 2 < 0 x = b + \lambda/2 < 0 x=b+λ/2<0 处取得极小值:
f ( x ) ∣ x = b + λ / 2 = ( b + λ 2 − b ) 2 + λ ( b + λ 2 ) = − b λ − λ 2 4 = − ( λ 2 ) 2 − 2 b λ 2 = − ( λ 2 ) 2 − 2 b λ 2 − b 2 + b 2 = − ( λ 2 + b ) 2 + b 2 < b 2 = f ( 0 ) f(x)|_{x = b + \lambda/2} = (b + \frac{\lambda}{2}-b)^2 + \lambda(b + \frac{\lambda}{2}) \\= -b\lambda - \frac{\lambda^2}{4} \\= -(\frac{\lambda}{2})^2 - 2b\frac{\lambda}{2} \\= -(\frac{\lambda}{2})^2 - 2b\frac{\lambda}{2} - b^2 + b^2 \\= -(\frac{\lambda}{2} + b)^2 + b^2 < b^2 = f(0) f(x)∣x=b+λ/2=(b+2λ−b)2+λ(b+2λ)=−bλ−4λ2=−(2λ)2−2b2λ=−(2λ)2−2b2λ−b2+b2=−(2λ+b)2+b2<b2=f(0)
即此时极小值小于 f ( 0 ) f(0) f(0),而当 x > 0 x >0 x>0 时
d f ( x ) d x = 2 ( x − b ) + λ sgn ( x ) = 2 x − 2 b + λ > 2 x − 2 ( − λ 2 ) + λ = 2 x + 2 λ > 0 \frac{df(x)}{dx} = 2(x-b) + \lambda \textrm{sgn}(x) \\ = 2x-2b+\lambda \\ > 2x-2(-\frac{\lambda}{2}) + \lambda \\ =2x+2\lambda > 0 dxdf(x)=2(x−b)+λsgn(x)=2x−2b+λ>2x−2(−2λ)+λ=2x+2λ>0
即当 x < 0 x <0 x<0 时函数 f ( x ) f(x) f(x) 为单调降函数 (对任意 Δ x < 0 , f ( 0 ) < f ( Δ x ) \Delta x < 0, f(0) < f(\Delta x) Δx<0,f(0)<f(Δx))。因此,函数在 x = b − λ 2 > 0 x = b - \frac{\lambda}{2} > 0 x=b−2λ>0 处取得最小值。
- 当 − λ 2 < b < λ 2 -\frac{\lambda}{2} < b <\frac{\lambda}{2} −2λ<b<2λ 时
假设 x < 0 x < 0 x<0,则 sgn ( x ) = − 1 \textrm{sgn}(x) = -1 sgn(x)=−1,所以 x = b + λ / 2 > 0 x = b + \lambda/2 > 0 x=b+λ/2>0,与假设 x < 0 x < 0 x<0 矛盾;
假设 x > 0 x > 0 x>0,则 sgn ( x ) = 1 \textrm{sgn}(x) = 1 sgn(x)=1,所以 x = b − λ / 2 < 0 x = b - \lambda/2 < 0 x=b−λ/2<0,与假设 x > 0 x > 0 x>0 矛盾;
即无论 x x x 为大于 0 还是小于 0 均没有极值点,那么 x = 0 x = 0 x=0 是否为函数 f ( x ) f(x) f(x) 的极值点呢?
对于 Δ x ≠ 0 \Delta x \neq 0 Δx=0
f ( Δ x ) = ( Δ x − b ) 2 + λ ∣ Δ x ∣ = ( Δ x ) 2 − 2 Δ x b + b 2 + λ ∣ Δ x ∣ = ( Δ x ) 2 − 2 Δ x b + λ ∣ Δ x ∣ + f ( 0 ) f(\Delta x) = (\Delta x - b)^2 + \lambda | \Delta x| \\ = (\Delta x)^2 - 2 \Delta xb + b^2 + \lambda |\Delta x| \\ = (\Delta x)^2 - 2 \Delta xb + \lambda |\Delta x| + f(0) f(Δx)=(Δx−b)2+λ∣Δx∣=(Δx)2−2Δxb+b2+λ∣Δx∣=(Δx)2−2Δxb+λ∣Δx∣+f(0)
当 Δ x > 0 \Delta x \gt 0 Δx>0 时,利用条件 b < λ 2 b < \frac{\lambda}{2} b<2λ 可得
f ( Δ x ) = ( Δ x ) 2 + 2 Δ x b + λ Δ x + f ( 0 ) > ( Δ x ) 2 − 2 Δ x λ 2 + λ Δ x + f ( 0 ) = ( Δ x ) 2 + f ( 0 ) > f ( 0 ) f(\Delta x) = (\Delta x)^2 + 2 \Delta xb + \lambda \Delta x + f(0)\\ > (\Delta x)^2 - 2 \Delta x \frac{\lambda}{2} + \lambda \Delta x + f(0)\\ = (\Delta x)^2 + f(0) > f(0) f(Δx)=(Δx)2+2Δxb+λΔx+f(0)>(Δx)2−2Δx2λ+λΔx+f(0)=(Δx)2+f(0)>f(0)
当 Δ x < 0 \Delta x \lt 0 Δx<0 时,利用条件 b < λ 2 b < \frac{\lambda}{2} b<2λ 可得
f ( Δ x ) = ( Δ x ) 2 − 2 Δ x b + λ ∣ Δ x ∣ + f ( 0 ) > ( Δ x ) 2 − 2 Δ x λ 2 + λ ∣ Δ x ∣ + f ( 0 ) = ( Δ x ) 2 + λ ( − Δ x ) + λ ∣ Δ x ∣ + f ( 0 ) = ( Δ x ) 2 + 2 λ ∣ Δ x ∣ + f ( 0 ) > f ( 0 ) f(\Delta x) = (\Delta x)^2 - 2 \Delta xb + \lambda |\Delta x| + f(0)\\ > (\Delta x)^2 - 2 \Delta x \frac{\lambda}{2} + \lambda |\Delta x| + f(0)\\ = (\Delta x)^2 + \lambda (-\Delta x) + \lambda |\Delta x| +f(0) \\ = (\Delta x)^2 + 2\lambda |\Delta x| +f(0) > f(0) f(Δx)=(Δx)2−2Δxb+λ∣Δx∣+f(0)>(Δx)2−2Δx2λ+λ∣Δx∣+f(0)=(Δx)2+λ(−Δx)+λ∣Δx∣+f(0)=(Δx)2+2λ∣Δx∣+f(0)>f(0)
因此,函数在
x
=
0
x=0
x=0 处取得最小值。
综合以上三种情况,
f
(
x
)
f(x)
f(x) 的最小值在以下位置取得:
argmin f ( x ) = { b + λ 2 , b < − λ 2 0 , ∣ b ∣ < λ 2 b − λ 2 , b > λ 2 \textrm{argmin} f(x) = \begin{cases} b+\frac{\lambda}{2} & ,b < -\frac{\lambda}{2} \\ 0 &, |b| < \frac{\lambda}{2} \\ b-\frac{\lambda}{2} &, b > \frac{\lambda}{2} \end{cases} argminf(x)=⎩⎪⎨⎪⎧b+2λ0b−2λ,b<−2λ,∣b∣<2λ,b>2λ
与前面的软阈值(Soft Thresholding)对比一下,发现了么?若将上式中的 b b b 视为变量, λ 2 \frac{\lambda}{2} 2λ 视为阈值,上式即为软阈值 (SoftThresholding) 的公式。
至此,我们可以得到优化问题
arg min
x
∥
X
−
B
∥
2
2
+
λ
∥
X
∥
1
\argmin_x \| X -B\|^2_2 + \lambda \| X\|_1
xargmin∥X−B∥22+λ∥X∥1
的解为
soft ( B , λ 2 ) = { B + λ 2 , B < − λ 2 0 , ∣ B ∣ < λ 2 B − λ 2 , B > λ 2 \textrm{soft}(B, \frac{\lambda}{2}) = \begin{cases} B+ \frac{\lambda}{2} & ,B < -\frac{\lambda}{2} \\ 0 &, |B| < \frac{\lambda}{2} \\ B-\frac{\lambda}{2} &, B > \frac{\lambda}{2} \end{cases} soft(B,2λ)=⎩⎪⎨⎪⎧B+2λ0B−2λ,B<−2λ,∣B∣<2λ,B>2λ
注:该式为软阈值(Soft Thresholding)的矩阵形式。
2. 软阈值(Soft Thresholding) 的变形
当优化问题变为
arg min x 1 2 ∥ X − B ∥ 2 2 + λ ∥ X ∥ 1 \argmin_x \frac{1}{2}\| X-B\|_2^2 + \lambda \| X\|_1 xargmin21∥X−B∥22+λ∥X∥1
因为对目标函数乘一个常系数不影响极值点的获得,所以可等价为优化问题
arg min x ∥ X − B ∥ 2 2 + 2 λ ∥ X ∥ 1 \argmin_x \| X-B\|_2^2 + 2\lambda \| X\|_1 xargmin∥X−B∥22+2λ∥X∥1
此时的解为 s o f t ( B , λ ) soft(B, \lambda) soft(B,λ)。
3. 软阈值(Soft Thresholding)的MATLAB代码
软阈值(Soft Thresholding)的函数代码可以写成专门针对问题
arg min x ∥ X − B ∥ 2 2 + λ ∥ X ∥ 1 \argmin_x \|X-B \|_2^2 + \lambda \| X\|_1 xargmin∥X−B∥22+λ∥X∥1
软阈值(Soft Thresholding)是如此简单以至于可以用一句代码去实现它:
当然,也可写为另一种形式:
function [soft_thresh] = softthresholding(b, lambda)
soft_thresh = sign(b).*max(abs(b) - lambda/2, 0);
end
python 代码:
# Soft Thresholding
def softthresholding(b, lam):
soft_thresh = sign(b) * max(abs(b) - lam//2, 0)
return soft_thresh
一定要注意:这种写法是针对最开始的优化问题:
arg min x ∥ X − B ∥ 2 2 + λ ∥ X ∥ 1 \argmin_x \|X -B \|_2^2 + \lambda \| X\|_1 xargmin∥X−B∥22+λ∥X∥1
只需调用 softthresholding( B , λ 2 B, \frac{\lambda}{2} B,2λ) 即可。
若要解决优化问题
arg min x ∥ X − B ∥ 2 2 / 2 + λ ∥ X ∥ 1 \argmin_x \|X -B \|_2^2 / 2+ \lambda \| X\|_1 xargmin∥X−B∥22/2+λ∥X∥1
只需调用 softthresholding( B , λ B, \lambda B,λ) 即可。
4. 软阈值(Soft Thresholding)测试代码
用以下一小段代码测试软阈值,用来求解优化问题:
arg min x ∥ X − B ∥ 2 2 / 2 + λ ∥ X ∥ 1 \argmin_x \|X -B \|_2^2 / 2+ \lambda \| X\|_1 xargmin∥X−B∥22/2+λ∥X∥1
这里用的对比函数是基追踪降噪 (BPDN_quadprog.m),参见 压缩感知重构算法之基追踪降噪,使用 BPDN 时,实际上就是观测矩阵为单位阵时的一种特殊情况:
clear all;close all;clc;
b = [-0.8487 -0.3349 0.5528 1.0391 -1.1176]';
lambda = 1;
x1=soft(b,lambda)
x2=BPDN_quadprog(b,eye(length(b)),lambda)
fprintf('\nError between soft and BPDN = %f\n',norm(x1-x2))
这里就不给出输出结果了。运行后,观察输出结果可知,soft函数与BPDN_quadprog函数的输结果相同。
另外,可以在matlab里输入以下命令看一个软阈值的图像:
x=-5:0.1:5;T=1;y=soft(x,T);plot(x,y);grid;