在上一篇博客 经典的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。
一种最直观的想法就是, 要从 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
总结以下流程:
那么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