前言
在上一篇博客 经典的SDR算法: 用半正定松弛法 ( Semidefinite Relaxation) 求解二次优化问题 我们介绍了SDR算法的基本思想。 本文中, 我们重点再针对SDR具体使用时的细节进行阐述。 这里简单回顾下, 原QCQP问题为:
min
x
∈
R
n
x
T
C
x
s.t.
x
T
A
i
x
⊵
i
b
i
,
i
=
1
,
…
,
m
(1)
\begin{aligned} \min _{x \in \mathbb{R}^{n}} & \;\;x^{T} C x \\ \text { s.t. } & x^{T} A_{i} x \unrhd_{i} b_{i}, \quad i=1, \ldots, m \end{aligned}\tag{1}
x∈Rnmin s.t. xTCxxTAix⊵ibi,i=1,…,m(1)
通过引入一个新的变量
X
=
x
x
T
X = xx^T
X=xxT, 并以此为优化变量, 那么问题(1)可以被写为:
min
X
∈
S
n
Tr
(
C
X
)
s.t.
Tr
(
A
i
X
)
⊵
i
b
i
,
i
=
1
,
…
,
m
,
X
⪰
0
,
rank
(
X
)
=
1
(2)
\begin{aligned} \min _{X \in \mathbb{S}^{n}} & \operatorname{Tr}(C X) \\ \text { s.t. } & \operatorname{Tr}\left(A_{i} X\right)\unrhd_{i} b_{i}, \quad i=1, \ldots, m, \\ & X \succeq 0, \operatorname{rank}(X)=1 \end{aligned}\tag{2}
X∈Snmin s.t. Tr(CX)Tr(AiX)⊵ibi,i=1,…,m,X⪰0,rank(X)=1(2)
再通过放松掉
r
a
n
k
(
X
)
=
1
\mathrm{rank}(X)=1
rank(X)=1限制后, 可以直接使用CVX求解这一凸问题, 得到最优解
X
⋆
X^{\star}
X⋆。 这一篇博客我们主要围绕 如何从一个并不满足秩为1的矩阵
X
⋆
X^{\star}
X⋆中, 恢复出原QCQP问题所需要的向量
x
x
x。
EVD分解
一种最直观的想法就是, 要从
X
⋆
X^\star
X⋆ 中恢复
x
x
x, 可以通过求解如下的问题:
min
x
∈
R
n
∥
X
⋆
−
x
x
T
∥
F
2
\begin{aligned} \min _{x \in \mathbb{R}^{n}} & \|X^\star-xx^T\|_F^2 \end{aligned}
x∈Rnmin∥X⋆−xxT∥F2
来获得一个次优解。 而这个问题的最优解, 则由
x
x
x 等于
X
⋆
X^\star
X⋆ 的 最大 特征向量 乘以 最大特征值的 根 给出。对应的matlab代码为:
[V,D] = eig(X);
[value,num] = max(diag(D));
x = sqrt(value)*V(:,num);
因此 对 X ⋆ X^\star X⋆ 做 EVD 分解得到其最大特征向量, 则是一种直截了当的 SDR恢复方式。 在 Xianghao Yu 博士的经典论文 Alternating Minimization Algorithms for Hybrid Precoding in Millimeter Wave MIMO Systems 中 的 SDR算法部分, 使用的就是 EVD分解的方式。
这里插一段和主题看上去不太有关的话, 就是这个问题,为什么最优解是 最大特征向量? 可以延伸到一个更general的问题, 即低秩矩阵近似问题:
min
Z
∈
R
M
×
L
∥
X
−
Z
∥
F
2
s.t.
r
a
n
k
(
Z
)
≤
N
\begin{aligned} \min _{Z\in\mathbb{R}^{M\times L}} & \|X -Z\|_F^2\\ \text { s.t. } & \mathrm{rank}(Z) \le N \end{aligned}
Z∈RM×Lmin s.t. ∥X−Z∥F2rank(Z)≤N
那么上面的问题, 就是现在这个低秩矩阵近似问题的
N
=
1
N=1
N=1 时的特例。 (
r
a
n
k
(
Z
)
=
1
\mathrm{rank}(Z)=1
rank(Z)=1 的可行集 和
x
x
T
xx^T
xxT的值域是一致的。) 我们首先可以将
Z
Z
Z拆分为
Z
=
C
Y
Z = CY
Z=CY, 其中
C
∈
R
M
×
N
C\in\mathbb{R}^{M\times N}
C∈RM×N 且
C
T
C
=
I
C^TC=I
CTC=I,
Y
∈
R
N
×
L
Y\in\mathbb{R}^{N\times L}
Y∈RN×L。此时可以把优化问题等价转化为:
( C ⋆ , Y ⋆ ) = arg min C T C = I { min Y ∥ C Y − X ∥ F 2 } (C^\star, Y^\star) = \arg\min_{C^TC= I}\{\min_Y \|CY-X\|_F^2\} (C⋆,Y⋆)=argCTC=Imin{Ymin∥CY−X∥F2}
这里用到了两个结论, 以至于两个问题是完全等价的, 即
Z
⋆
=
C
⋆
Y
⋆
Z^\star = C^\star Y^\star
Z⋆=C⋆Y⋆。 首先是
Z
Z
Z 和
C
Y
CY
CY 的值域完全一致, 拆分不损失最优性。 其次, 有如下结论:
inf
y
,
z
f
(
y
,
z
)
=
inf
y
{
inf
z
f
(
y
,
z
)
}
.
\inf_{y,z}f(y,z)=\inf_y\{\inf_zf(y,z)\}.
y,zinff(y,z)=yinf{zinff(y,z)}.
这使得我们可以先固定
C
C
C 求取
Y
Y
Y 的闭式解。 而这时, 问题对于 单变量
C
C
C或
Y
Y
Y 而言,都是凸问题, 因此可以简单地使用求导为0的方式求取。 得到:
C
⋆
=
arg
min
C
T
C
=
I
t
r
(
(
I
−
C
C
T
)
X
X
T
)
Y
⋆
=
C
⋆
X
C^\star = \arg\min_{C^TC=I}\mathrm{tr}((I-CC^T)XX^T)\\ Y^\star = C^\star X
C⋆=argCTC=Imintr((I−CCT)XXT)Y⋆=C⋆X
那么问题就变为:
arg
min
C
T
C
=
I
t
r
(
−
C
X
X
T
C
T
)
\arg\min_{C^TC=I}\mathrm{tr}(-CXX^TC^T)
argCTC=Imintr(−CXXTCT)
这就是瑞利熵问题, 其解就是由
X
X
T
XX^T
XXT的最大的几个特征向量为列组成的矩阵。 关于瑞利熵问题, 我们已经在瑞丽熵 (Rayleigh quotient) 两种启发式证明 中进行了讲述。
高斯随机化
EVD分解法虽然简单, 但显然有着较高的误差,从而带来不可避免的损失。 那么类似于常见于梯度下降法中, 使用多组随机初始点,再挑选性能最优的作为解 这样的 “枚举思想”, SDR也有类似的并不高明但行之有效的性能优化手段。
其做法为: 生成
L
L
L 组随机向量
ξ
ℓ
∼
N
(
0
,
X
⋆
)
(3)
\xi_{\ell} \sim N\left(0, X^{\star}\right)\tag{3}
ξℓ∼N(0,X⋆)(3)
然后再取
ξ
⋆
=
arg
min
ℓ
ξ
ℓ
T
C
ξ
ℓ
\xi^{\star}=\arg\min_{\ell}\xi_{\ell}^TC\xi_{\ell}
ξ⋆=argminℓξℓTCξℓ.
但需要指出的是, 如果
ξ
l
\xi_l
ξl 不满足原QCQP问题中的约束, 那么需要进行稍微的“魔改”,使得满足原限制条件。 如假设原问题要求
x
i
2
=
1
x_i^2=1
xi2=1, 这常出现在二元检测中。 那么此时, 我们先要对 (3) 中生成的
ξ
ℓ
\xi_{\ell}
ξℓ进行如下操作:
[
ξ
ℓ
]
i
=
s
g
n
(
[
ξ
ℓ
]
i
)
[\xi_\ell]_i = \mathrm{sgn}([\xi_\ell]_i )
[ξℓ]i=sgn([ξℓ]i)
再求其所得的函数值。 可以看出, 针对不同的问题, 我们可能需要不同的“魔改”。 另一个例子, 如果原问题的限制条件为
x
T
A
i
x
≥
1
,
∀
i
x^TA_ix\ge 1, \forall i
xTAix≥1,∀i, 那么我们需要进行的操作就是:
ξ
=
ξ
min
i
ξ
T
A
i
ξ
\xi=\frac{\xi}{\sqrt{\min_i \xi^{T} A_{i} \xi}}
ξ=miniξTAiξξ
可见,作为一种启发式算法, 魔改的方式不唯一, 也不固定, 核心要义是要随机出来的向量能满足原问题的限制条件。 再比如大家很关心的在HBF问题和IRS问题中大放异彩的 恒模约束, 魔改方式可以为:
[
ξ
ℓ
]
i
=
[
ξ
ℓ
]
i
∣
[
ξ
ℓ
]
i
∣
[\xi_\ell]_i = \frac{[\xi_\ell]_i}{|[\xi_\ell]_i|}
[ξℓ]i=∣[ξℓ]i∣[ξℓ]i
总结以下流程:
- 求解SDP问题得到 X ⋆ X^\star X⋆
- 生成 L L L 组 ξ ℓ ∼ N ( 0 , X ⋆ ) \xi_{\ell} \sim N\left(0, X^{\star}\right) ξℓ∼N(0,X⋆)
- 将 ξ ℓ \xi_{\ell} ξℓ 魔改为 原 QCQP问题的可行解
- ξ ⋆ = arg min ℓ ξ ℓ T C ξ ℓ \xi^{\star}=\arg\min_{\ell}\xi_{\ell}^TC\xi_{\ell} ξ⋆=argminℓξℓTCξℓ
- x = ξ ⋆ x=\xi^{\star} x=ξ⋆
那么matlab代码方面, 关键点则在于 如何生成 一个 服从
N
(
0
,
X
⋆
)
N\left(0, X^{\star}\right)
N(0,X⋆) 的向量呢?
我们知道, v = randn(n)
可以得到一个 服从
N
(
0
,
I
)
N\left(0, I\right)
N(0,I) 的
n
n
n 维向量
v
v
v。 那现在我们对它进行乘法操作
v
=
A
v
v = Av
v=Av, 其分布则变为:
N
(
0
,
A
A
H
)
N\left(0, AA^H\right)
N(0,AAH)。 也就是说, 我们只需要找到能使得
A
A
H
=
X
⋆
AA^H=X^\star
AAH=X⋆ 的
A
A
A, 就可以轻松地使用
v
=
A
v
v = Av
v=Av 获得 满足分布的
v
v
v 向量了。 而获得这样的 A, 则只需要对
X
⋆
X^\star
X⋆ 做 Cholesky 分解即可, 对一个半正定矩阵
X
X
X 作该分解为:
X
=
L
L
H
\mathbf{X}=\mathbf{L} \mathbf{L}^{H}
X=LLH
那么具体的代码就可以如下给出:
for i = 1 : L
v = randn(n);
A = chol(Xstar); # chol 是内置matlab函数, 得到的是 L^H
V(:, i) = A' * v;
end
再举一篇论文的实例, 作为本节的结束。 在论文 Intelligent Reflecting Surface Enhanced Wireless Network: Joint Active and Passive Beamforming Design 中, 作者给出了一种 高斯随机化的方法。 其原问题为:
max
v
ˉ
v
‾
H
R
v
ˉ
s.t.
∣
v
ˉ
n
∣
=
1
,
∀
n
=
1
,
⋯
,
N
+
1
\begin{array}{cl} \max _{\bar{v}} & \overline{\boldsymbol{v}}^{H} \boldsymbol{R} \bar{v} \\ \text { s.t. } & \left|\bar{v}_{n}\right|=1, \forall n=1, \cdots, N+1 \end{array}
maxvˉ s.t. vHRvˉ∣vˉn∣=1,∀n=1,⋯,N+1
SDR 问题为:
max
V
tr
(
R
V
)
s.t.
V
n
,
n
=
1
,
∀
n
=
1
,
⋯
,
N
+
1
V
⪰
0
\begin{array}{cl} \max _{\boldsymbol{V}} & \operatorname{tr}(\boldsymbol{R} \boldsymbol{V}) \\ \text { s.t. } & \boldsymbol{V}_{n, n}=1, \forall n=1, \cdots, N+1 \\ & \boldsymbol{V} \succeq 0 \end{array}
maxV s.t. tr(RV)Vn,n=1,∀n=1,⋯,N+1V⪰0
而他的做法是, 求出 V V V后, 对其作 EVD分解 得到 V = U Σ U H \boldsymbol{V}=\boldsymbol{U} \Sigma \boldsymbol{U}^{H} V=UΣUH, 然后获得向量 v ˉ = U Σ 1 / 2 r \bar{\boldsymbol{v}}= \boldsymbol{U} \Sigma^{1 / 2} \boldsymbol{r} vˉ=UΣ1/2r, 其中 r ∈ C N ( 0 , I N + 1 ) \boldsymbol{r} \in \mathcal{C} \mathcal{N}\left(\mathbf{0}, \boldsymbol{I}_{N+1}\right) r∈CN(0,IN+1)。 再从由不同的 r \boldsymbol{r} r得到的所有 v ˉ \bar{\boldsymbol{v}} vˉ 中, 选出最大化 v ‾ H R v ˉ \overline{\boldsymbol{v}}^{H} \boldsymbol{R} \bar{\boldsymbol{v}} vHRvˉ 的 v ˉ \bar{\boldsymbol{v}} vˉ, 最后再人为地将 v = e j arg ( [ v ˉ v ˉ N + 1 ] ( 1 : N ) ) \boldsymbol{v}=e^{j \arg \left(\left[\frac{\bar{v}}{\bar{v}_{N+1}}\right]_{(1: N)}\right)} v=ejarg([vˉN+1vˉ](1:N)), 即满足恒模约束。
其实在 V = U Σ U H \boldsymbol{V}=\boldsymbol{U} \Sigma \boldsymbol{U}^{H} V=UΣUH 中, 作者得到的 v ˉ \bar{\boldsymbol{v}} vˉ 满足的分布就是 C N ( 0 , V ) \mathcal{C} \mathcal{N}\left(\mathbf{0}, \boldsymbol{V}\right) CN(0,V), 这和我们刚刚说的高斯随机化的思想是一致的。 重要的差别在于, 罗老师原作中提到的方法应该是 先魔改, 再选最优。 而这篇paper中却是先求最优, 再魔改。 这是一点小小的区别。
代码
这里给大家推荐一份代码, 就是上一篇博客和本文中都提到的 Alternating Minimization Algorithms for Hybrid Precoding in Millimeter Wave MIMO Systems 一文作者 Xianghao Yu 博士给出的代码,
https://github.com/yuxianghao/Alternating-minimization-algorithms-for-hybrid-precoding-in-millimeter-wave-MIMO-systems
主函数为 SDR-Altmin
. 当然在使用前, 需要自行前往 CVX 官网先下载安装 CVX 包, 由于相关安装教程已非常详尽, 便不再赘述。 这里简单摘录其中的SDR代码部分,可供参考:
cvx_begin quiet
variable X(Ns*NRF+1,Ns*NRF+1) hermitian
minimize(real(trace(C*X)));
subject to
trace(A1*X) == NRF*Ns;
trace(A2*X) == 1;
X == hermitian_semidefinite(Ns*NRF+1);
cvx_end
[V,D] = eig(X);
[value,num] = max(diag(D));
x = sqrt(value)*V(:,num);
然后是一份我自己写的代码, 主要是以武庆庆老师的 Intelligent Reflecting Surface Enhanced Wireless Network: Joint Active and Passive Beamforming Design 为背景, 求解其 (P4) 所写的。 问题如下:
(P4) :
max
v
ˉ
v
ˉ
H
R
v
ˉ
s.t.
∣
v
ˉ
n
∣
=
1
,
∀
n
=
1
,
⋯
,
N
+
1
,
\begin{aligned} \text { (P4) : } & \max _{\bar{v}} \quad \bar{v}^{H} \boldsymbol{R} \bar{v} \\ \text { s.t. } &\left|\bar{v}_{n}\right|=1, \forall n=1, \cdots, N+1, \end{aligned}
(P4) : s.t. vˉmaxvˉHRvˉ∣vˉn∣=1,∀n=1,⋯,N+1,
在代码中,我使用了SDR方法,分为两种,分别对应上面所说的两种高斯随机化的方案。 又使用了元素迭代的方法作为对比, 思想就是每次固定向量的其他元素而单独优化一个元素。 最后的性能显示, 两种高斯随机化的方案性能差不多, 而元素迭代算法的性能是最好的。
代码如下:
Nt = 16;
M = 4;
L = 100; % number of Gaussian randomizations
G = sqrt(2) / 2 * (randn(M, Nt) + 1j * randn(M, Nt));
hr = sqrt(2) / 2 * (randn(M, 1) + 1j * randn(M, 1));
hd = sqrt(2) / 2 * (randn(Nt, 1) + 1j * randn(Nt, 1));
phi = diag(hr') * G;
R = [phi * phi' phi * hd; hd' * phi' 0];
cvx_begin sdp quiet
variable V(M+1, M+1) hermitian
maximize(real(trace(R*V)));
subject to
diag(V) == 1;
V >= 0;
cvx_end
%% method 1
max_F = 0;
max_v = 0;
[U, Sigma] = eig(V);
for l = 1 : L
r = sqrt(2) / 2 * (randn(M+1, 1) + 1j * randn(M+1, 1));
v = U * Sigma^(0.5) * r;
if v' * R * v > max_F
max_v = v;
max_F = v' * R * v;
end
end
v = exp(1j * angle(max_v / max_v(end)));
v = v(1 : M);
v' * phi * phi' * v
%% method 2
max_F = 0;
max_v = 0;
[U, Sigma] = eig(V);
for l = 1 : L
r = sqrt(2) / 2 * (randn(M+1, 1) + 1j * randn(M+1, 1));
v = U * Sigma^(0.5) * r;
v = exp(1j * angle(v / v(end)));
v = v(1 : M);
if v' * phi * phi' * v > max_F
max_v = v;
max_F = v' * phi * phi' * v;
end
end
max_v' * phi * phi' * max_v
%% method 3 element iteration
T = phi * phi';
v = sqrt(2) / 2 * (randn(M, 1) + 1j * randn(M, 1));
for n = 1 : 10
for i = 1 : M
tmp = 0;
for j = 1 : M
if i~= j
tmp = tmp + T(i,j) * v(j);
end
end
v(i) = exp(1j * angle(tmp));
end
end
v' * phi * phi' * v