[Week 4] Robust Optimization [2]

ESC·2023년 12월 13일
0

2023-Spring

목록 보기
7/9

Robust SOCPs

이번에는 원래의 constraint 자체가 second-order cone 형태로 주어진 robust SOCP에 대해 알아보자. SOCP의 목적함수는 LP와 동일하며, constraint는 일반적으로 다음과 같이 주어진다. AA의 각 행벡터를 aiRna_i\in \mathbb{R}^n이라 하자.

Ax+b2cTx+d,||Ax + b||_2 \leq c^Tx + d,
whereARm×n,bRm,cRn,dR\text{where}\,\,A\in \mathbb{R}^{m \times n},\,b\in \mathbb{R}^{m},\,c\in \mathbb{R}^{n},\,d\in \mathbb{R}

SOCPs with interval uncertainty

가장 간단하게 생각할 수 있는 uncertainty set은 행렬 AA에 원소 크기가 δ\delta로 제한된 Δ\Delta가 더해진 형태이다. 이를 수식으로 나타내면 아래와 같다. 이전에 LP에 conic uncertainty를 더하면 SOCP로 변환됨을 확인했기 때문에, 우변에 다음과 같이 자유롭게 더할 수 있다.

(A+Δ)x+b2(c+u)Tx+d||(A+\Delta)x + b||_2 \leq (c+u)^Tx + d
for allΔs.t.Δδ,\text{for all}\,\,\Delta\,\text{s.t.}\,||\Delta||_{\infty} \leq \delta,
uU={u:Fu+gK0}u \in \mathcal{U}=\left\{u:Fu +g \succeq_K 0\right\}

이때 좌변과 우변을 t0t \geq 0에 대해 (A+Δ)x+b2t||(A+\Delta)x + b||_2 \leq tt(c+u)Tx+dt \leq (c+u)^Tx + d로 분리해 생각하자. 그러면 우변은 이전과 동일하게 tcTx+dλTg,FTλ+x=0,λK0t \leq c^Tx + d - \lambda^Tg,\,\,F^T\lambda + x = 0,\,\,\lambda \succeq_{K^*} 0의 세 부등식으로 나타난다. 좌변은 계산을 통해 확인해 보자.
sup(A+Δ)x+b2=sup(i=1m[(ai+Δi)Tx+bi]2)1/2=sup{z2zi=aiTx+ΔiTx+bi,Δiδ}=inf{z2ziaiTx+bi+δx1}\sup ||(A+\Delta)x + b||_2 = \sup\left(\sum_{i=1}^m [(a_i + \Delta_i)^T x + b_i]^2 \right)^{1/2} = \sup \left\{||z||_2\,|\,z_i = a_i^T x + \Delta_i^T x + b_i,\,||\Delta_i||_{\infty} \leq \delta \right\} = \inf \left\{||z||_2\,|\,z_i \geq |a_i^T x + b_i| + \delta||x||_1 \right\}

따라서 처음의 무한 가지 경우의 수가 있는 부등식은, 아래의 m+3m+3개의 부등식으로 축약된다.

z2cTx+dλTg,FTλ+x=0,λK0||z||_2 \leq c^Tx + d - \lambda^Tg,\,\,F^T\lambda + x = 0,\,\,\lambda \succeq_{K^*} 0
ziaiTx+bi+δx1fori=1,2,...,mz_i \geq |a_i^T x + b_i| + \delta||x||_1\,\,\text{for}\,\,i=1,2,...,m

SOCPs with ellipsoidal uncertainty

Interval uncertainty를 약간 변형한 형태로, 이전과 유사하게 constraint를 도출할 수 있다. Uncertainty를 반영한 inequality는 다음과 같다.

(i=1m[(ai+Piu)Tx+bi]2)1/2t\left(\sum_{i=1}^m [(a_i + P_iu)^T x + b_i]^2 \right)^{1/2} \leq t
for allu21\text{for all}\,\,||u||_2 \leq 1

변수 zz를 도입해 zisupuaiTx+bi+uTPiTxz_i \geq \sup_u |a_i^Tx + b_i + u^TP_i^Tx|으로 쓰면 이는 ziaiTx+bi+PiTx2z_i \geq |a_i^Tx + b_i| + ||P_i^Tx||_2와 동치이고, 따라서 처음의 부등식은 아래와 같이 축약된다.

z2t,ziaiTx+bi+PiTx2||z||_2 \leq t,\,\,z_i \geq |a_i^Tx + b_i| + ||P_i^Tx||_2
fori=1,2,...,m\text{for}\,\,i=1,2,...,m

SOCPs with matrix uncertainty

이번엔 Δ\Delta의 l2-induced norm으로 주어진 형태의 uncertainty set에 대해 살펴보자. l2-induced norm은 Δ=supu2=v2=1uTΔv||\Delta|| = \sup_{||u||_2=||v||_2=1} u^T\Delta v로 정의되며, AA의 maximum singular value와 같다. 이런 경우에는 좀 더 복잡한 증명이 필요하다. PRm×nP \in \mathbb{R}^{m \times n}, ΔRn×n\Delta \in \mathbb{R}^{n \times n}에 대해 matrix uncertainty를 반영한 inequality는 아래와 같다.

(A+PΔ)x+b2t,Δδ||(A + P\Delta)x + b ||_2 \leq t,\,\,||\Delta|| \leq \delta

이제 다음 두 사실을 이용해 이 부등식을 풀 수 있는 형태로 만들어 보자. 증명은 생략하겠다.

1. Schur complement representation
x2t||x||_2 \leq t[txTxtIn]0\begin{bmatrix} t & x^T \\ x & tI_n \end{bmatrix} \succeq 0은 동치이다.

2. The(homogeneous) S-lemma
xTAx0xTBx0iffλ0s.t.BλAx^TAx \geq 0 \rightarrow x^TBx \geq 0\,\,\text{iff}\,\,\exists \lambda \geq 0\,\,\text{s.t.}\,\,B \succeq \lambda A

Schur complement를 이용해 이 부등식을 [t((A+PΔ)x+b)T(A+PΔ)x+btIm]0,Δ1\begin{bmatrix} t & ((A + P\Delta)x + b)^T \\ (A + P\Delta)x + b & tI_m \end{bmatrix} \succeq 0,\,||\Delta|| \leq 1
로 바꿀 수 있다. 이는 임의의 스칼라 sRs\in \mathbb{R}과 벡터 vRmv \in \mathbb{R}^m에 대해
ts2+2s((A+PΔ)x+b)Tv+tv220ts^2 + 2s((A + P\Delta)x + b)^Tv + t||v||_2^2 \geq 0임과 동치이다.
이 식에서 Δ1||\Delta|| \leq 1에 대해 infimum을 취하면 결국
ts2+2s(Ax+b)Tv+tv222sx2PTv20ts^2 + 2s(Ax + b)^Tv + t||v||_2^2 - 2||sx||_2||P^T v||_2 \geq 0과 같다.
이때 sup{uTxu22PTv22}=PTv2x2\sup \left\{u^Tx\,|\,||u||_2^2 \leq ||P^T v||_2^2 \right\} = ||P^T v||_2||x||_2임을 이용해, 이 부등식을
ts2+2s(Ax+b)Tv+tv22+2suTx0ts^2 + 2s(Ax + b)^Tv + t||v||_2^2 + 2su^Tx \geq 0
for allu22PTv22\text{for all}\,\,||u||_2^2 \leq ||P^T v||_2^2
로 나타낸 뒤, 행렬 형태로 나타내면

[svu]T[0000PPT000In][svu]0[svu]T[t(Ax+b)TxTAx+bt0x00][svu]0\begin{bmatrix} s \\ v \\ u \end{bmatrix}^T \begin{bmatrix} 0 & 0 & 0 \\ 0 & PP^T & 0 \\ 0 & 0 & -I_n \end{bmatrix}\begin{bmatrix} s \\ v \\ u \end{bmatrix} \succeq 0 \rightarrow \begin{bmatrix} s \\ v \\ u \end{bmatrix}^T \begin{bmatrix} t & (Ax+b)^T & x^T \\ Ax+b & t & 0 \\ x & 0 & 0 \end{bmatrix}\begin{bmatrix} s \\ v \\ u \end{bmatrix} \succeq 0
그리고 S-lemma를 이용하면, 최종적으로 matrix uncertainty inequality는 다음을 만족하는 xRn,λx\in\mathbb{R}^n,\,\lambda를 찾는 문제와 같다.

[t(Ax+b)TxTAx+btλPPT0x0λIn]0\begin{bmatrix} t & (Ax+b)^T & x^T \\ Ax+b & t - \lambda PP^T & 0 \\ x & 0 & \lambda I_n \end{bmatrix} \succeq 0

Example: robust regression

예시를 통해 위에서 살펴본 이론을 적용해 보자. Regression problem은 우리가 잘 알고 있듯, 주어진 데이터를 잘 설명하는 직선의 계수를 찾는 문제로 데이터 행렬 ARm×n,bRmA \in \mathbb{R}^{m \times n},\,b \in \mathbb{R}^{m}가 주어져 있을 때 Axb2||Ax - b||_2를 최소화하는 xRnx \in \mathbb{R}^{n}을 찾는 것이 목표이다. 이때 데이터 자체에 오염이 발생했다고 하고, 그 오염은 ΔRm×n\Delta \in \mathbb{R}^{m \times n}AA에 더해진 형태로 나타난다. 이때 Δ\Delta의 범위를 위의 세 경우와 같이 분류해 보자. 즉 Δij|\Delta_{ij}| 또는Δi2||\Delta_i||_2 또는 Δ||\Delta||높은 확률로 제한된 경우이다. Δ\Delta를 어떤 확률 분포를 따르는 random noise라고 하면 이 가정은 현실적임을 알 수 있다. 가령 gaussian noise의 경우 noise의 범위가 평균(0)에서 그리 멀지 않은 부분에 집중될 것이기 때문이다.
다음 theorem을 이용해 Δ\Delta에 관한 probability bound를 도출해 보자.

Theorem.
t0t \geq 0에 대해
1. P(Δijt)2exp(t22)\mathbb{P}(|\Delta_{ij}| \geq t) \leq 2\exp(-\frac{t^2}{2})
2. P(Δi2n+t)exp(t22)\mathbb{P}(||\Delta_{i}||_2 \geq \sqrt{n} + t) \leq \exp(-\frac{t^2}{2})
3. P(Δim+n+t)exp(t22)\mathbb{P}(||\Delta_{i}|| \geq \sqrt{m} + \sqrt{n} + t) \leq \exp(-\frac{t^2}{2})

이를 이용해 각각 t2(δ)=2log(2mn/δ),t22(δ)=2log(m/δ),top2(δ)=2log1δt_{\infty}^2(\delta) = 2\log(2mn/\delta),\,t_{2}^2(\delta) = 2\log(m/\delta),\, \,t_{op}^2(\delta) = 2\log \frac{1}{\delta}로 설정하면 위의 upper bound가 δ\delta가 되도록 조정할 수 있다. 따라서 uncertainty set의 bound를 각각 위의 세 값으로 설정하면 각각 다른 robust least squares solution을 얻을 수 있다.

mport cvxpy as cp
import numpy as np
import matplotlib.pyplot as plt

np.random.seed(1)

# Generate data
m = 50
n = 20
A = 10 * np.random.randn(m, n)
u = np.random.randn(n)
u = u / np.linalg.norm(u)
b = A @ u + np.random.randn(m)

# Probabilities of exceeding the bounds on robustness
num_deltas = 23
deltas = np.logspace(-11, -1, num_deltas)

x_inf_sols = np.zeros((n, num_deltas))
x_2_sols = np.zeros((n, num_deltas))
x_op_sols = np.zeros((n, num_deltas))

nom_vals_inf = np.zeros(num_deltas)
nom_vals_2 = np.zeros(num_deltas)
nom_vals_op = np.zeros(num_deltas)

for ind, delta in enumerate(deltas):
    t_op = np.sqrt(n) + np.sqrt(m) + np.sqrt(2 * np.log(1 / delta))
    t_2 = np.sqrt(n) + np.sqrt(2 * np.log(m / delta))
    t_inf = np.sqrt(2 * np.log(2 * m * n / delta))
    
    print(f"Solving iteration {ind+1} of {num_deltas} with delta = {delta}")
    
    # First with infinity norm-bounded perturbations
    x_inf = cp.Variable(n)
    z_inf = cp.Variable(m)
    objective_inf = cp.Minimize(cp.norm(z_inf, 2))
    constraints_inf = [z_inf[i] >= cp.abs(A[i, :] @ x_inf - b[i]) + t_inf * cp.norm(x_inf, 1) for i in range(m)]
    problem_inf = cp.Problem(objective_inf, constraints_inf)
    problem_inf.solve(solver=cp.ECOS, max_iters=1000, verbose=False)
    x_inf_sols[:, ind] = x_inf.value
    
    # Now with ellipsoid (l2) perturbations
    x_2 = cp.Variable(n)
    z_2 = cp.Variable(m)
    objective_2 = cp.Minimize(cp.norm(z_2, 2))
    constraints_2 = [z_2[i] >= cp.abs(A[i, :] @ x_2 - b[i]) + t_2 * cp.norm(x_2, 2) for i in range(m)]
    problem_2 = cp.Problem(objective_2, constraints_2)
    problem_2.solve(solver=cp.ECOS, max_iters=1000, verbose=False)
    x_2_sols[:, ind] = x_2.value
    
    # Now with the operator norm perturbation
    x_op = cp.Variable(n)
    objective_op = cp.Minimize(cp.norm(A @ x_op - b, 2) + t_op * cp.norm(x_op, 2))
    problem_op = cp.Problem(objective_op)
    problem_op.solve(solver=cp.ECOS, max_iters=1000, verbose=False)
    x_op_sols[:, ind] = x_op.value

for ind, delta in enumerate(deltas):
    nom_vals_inf[ind] = np.linalg.norm(A @ x_inf_sols[:, ind] - b, 2)
    nom_vals_2[ind] = np.linalg.norm(A @ x_2_sols[:, ind] - b, 2)
    nom_vals_op[ind] = np.linalg.norm(A @ x_op_sols[:, ind] - b, 2)

x_nominal = np.linalg.lstsq(A, b, rcond=None)[0]
nominal_value = np.linalg.norm(A @ x_nominal - b)

# ... Additional code for Monte Carlo simulations and plotting ...

위의 코드를 통해 각각의 상황을 시뮬레이션할 수 있다. 결과는 아래와 같다.

xx^*는 uncertainty를 반영하지 않은 least squares solution. operator norm을 사용한 xopx_{op} 외의 다른 솔루션은 결과가 좋지 않다.

이전과 동일하게 x,x2x_{\infty},\,x_2는 작은 분산을 가진 대신 나쁜 결과를 보임을 monte carlo simulation을 통해 확인할 수 있다.

profile
@Yonsei University

0개의 댓글