一般来说,PGD适用于特定的凸优化问题:假设目标函数
f
(
x
)
=
g
(
x
)
+
h
(
x
)
f(x)=g(x)+h(x)
f(x)=g(x)+h(x) 是由
g
(
x
)
g(x)
g(x) 和
h
(
x
)
h(x)
h(x) 叠加而成,其中,限定
g
(
x
)
g(x)
g(x) 是可微的凸函数、
h
(
x
)
h(x)
h(x) 是不可微 (或局部不可微) 的凸函数。
使用近端梯度下降,可以实现
O
(
1
/
ϵ
)
O(1/\epsilon)
O(1/ϵ)的收敛率
(
ϵ
=
f
(
x
k
)
−
f
(
x
∗
)
)
(ϵ=f(x^k) − f ( x^∗ ))
(ϵ=f(xk)−f(x∗)),即当前迭代结果与最优解之间的偏差)。通过对近端梯度法加速,可以达到
O
(
1
/
ϵ
)
O(1/ \sqrtϵ)
O(1/ϵ)收敛速率。
如下: 这里我有个疑问,几乎所有的教程都将这里写作了
∣
∣
z
−
x
∣
∣
2
2
||z-x||^2_2
∣∣z−x∣∣22而不是
(
z
−
x
)
2
(z-x)^2
(z−x)2考虑到z和x可能是向量,那么根据多元泰勒公式: 貌似不能使用
∣
∣
z
−
x
∣
∣
2
2
||z-x||^2_2
∣∣z−x∣∣22,当然
(
z
−
x
)
2
(z-x)^2
(z−x)2也是不恰当的,而应该使用海森矩阵:(下图以二阶泰勒为例) 如果写作
∣
∣
z
−
x
∣
∣
2
2
||z-x||^2_2
∣∣z−x∣∣22,相当于只考虑海森矩阵的对角线了。没有想出太好的解释,只能归咎于上面公式(2)和公式(3)的约等于符号了。
下面介绍一下为什么可以这么替换,其实原因还是Lipschitz条件(这好像是向量情况下的Lipschitz条件),即 这里给出了一个L的下界,且下界的形式与二阶导函数形式类似,从而泰勒展开式的二阶导便通过L替代,从而严格不等也变成了近似: 此处的L就是上面公式(3)中的
1
/
t
1/t
1/t。 然后 这里是使用了求导来寻找极小值的方法,即让(4)式对z求导。
近端梯度下降法
如果
f
f
f不可微,但可以分解为上述的两个函数
g
g
g和
h
h
h,则我们仍然可以使用平滑部分
g
g
g的二次近似来定义向最小值走的一步: 其中(6)到(7)的化简过程如下: (
L
=
1
/
t
L=1/t
L=1/t) 既然是常数,那我们就在优化问题中舍弃
φ
φ
φ。所以就得到了(7)式。 现在的优化问题已经变成了下面的问题: 即
x
x
x已知,要求得到一个
z
z
z使得上式最小化。这种问题,都可以适用软阈值函数解决。 关于软阈值函数的证明可见:https://blog.csdn.net/BIT_666/article/details/80051737
加速的近端梯度法
如下: 其实就是初始点作为
x
(
−
1
)
x^{(-1)}
x(−1),然后第二个点使用正常的近端梯度下降法求得,作为
x
(
0
)
x^{(0)}
x(0),然后从第三个点开始,满足(19)式。即
k
k
k从1开始。 然后软阈值函数也不使用上一次的
x
x
x来计算了,而是使用
v
v
v,即:
x
(
i
)
=
p
r
o
x
(
v
−
t
g
′
(
v
)
)
x^{(i)}=prox(v-tg'(v))
x(i)=prox(v−tg′(v))然后计算
v
v
v再进行下一次计算,而不是
x
(
i
)
=
p
r
o
x
(
x
(
i
−
1
)
−
t
g
′
(
x
(
i
−
1
)
)
)
x^{(i)}=prox(x^{(i-1)}-tg'(x^{(i-1)}))
x(i)=prox(x(i−1)−tg′(x(i−1)))
至于近端梯度下降法为什么有效,这里不讲专业的证明,只从
v
v
v的计算公式上看,
v
v
v在原来的基础上加了一个动量: 以此来提高迭代速度。