Programação linear com restrições de matriz


10

Eu tenho um problema de otimização que se parece com o seguinte

minJ,BEuj|JEuj|stMJ+BY=X

Aqui, minhas variáveis ​​são as matrizes e B , mas o problema inteiro ainda é um programa linear; as demais variáveis ​​são fixas.JB

Quando tento inserir esse programa em minhas ferramentas de programação linear favoritas, encontro alguns problemas. Ou seja, se eu escrever isso na forma de programa linear "padrão", as matrizes de parâmetro M e Y acabam sendo repetidas uma tonelada de vezes (uma vez para cada coluna de X ).

Existe um algoritmo e / ou pacote que possa lidar com otimizações do formulário acima? No momento, estou ficando sem memória porque M e Y precisam ser copiadas tantas vezes!


B é Buma matriz de parâmetros ou você quer dizer Y ? Quais são as formas das várias matrizes?
Geoffrey Irving

[Oi Geoffrey!] J e B são variáveis, o resto são parâmetros. B tem relativamente poucas colunas, mas todas as dimensões restantes são bastante grandes (nada é quadrado).
Justin Solomon

[Olá!] Você deve editar a postagem para não dizer duas vezes que B é um parâmetro.
Geoffrey Irving

11
Curiosamente, mas provavelmente inutilmente, a versão desse problema com vez depode ser resolvido com alguns SVDs. JEuj2|JEuj|
Geoffrey Irving

11
@Geoffrey, isso não é uma coincidência :-)
Justin Solomon

Respostas:


12

visão global

Convém tentar uma variante do método de multiplicadores de direções alternadas (ADMM), que foi encontrado para convergir surpreendentemente rapidamente para problemas do tipo laço. A estratégia é formular o problema com um Lagrangiano aumentado e, em seguida, aumentar gradualmente o problema duplo. É especialmente agradável para este particular problema regularizada porque a parte nonsmooth de cada iteração do método tem uma solução exata, você pode simplesmente avaliar elemento por elemento, enquanto que a parte lisa envolve a solução de um sistema linear.l1l1

Neste post nós

  • derivar uma formulação geral do ADMM para uma generalização do seu problema,
  • derivar os subproblemas para cada iteração do ADMM e especializá-los para sua situação e, em seguida,
  • investigar o sistema linear resultante que necessita de ser resolvido cada iteração, e desenvolver um agente de resolução rápida (ou pré-condicionador) baseado em precomputing as decomposições de valores próprios (ou aproximações baixa classe dos mesmos) para e .MTMYYT
  • resumir com algumas observações finais

A maioria das grandes idéias aqui são abordadas no excelente artigo de revisão a seguir,

Boyd, Stephen, et al. "Otimização distribuída e aprendizado estatístico através do método de direção alternada dos multiplicadores". Foundations and Trends® em Machine Learning 3.1 (2011): 1-122. http://www.stanford.edu/~boyd/papers/pdf/admm_distr_stats.pdf

Antes de entrar em detalhes, quero observar que esta é uma resposta de método / algoritmo e não uma resposta de código existente prática - se você quiser usar esse método, precisará rolar sua própria implementação.

Formulação ADMM

Em geral, suponha que você queira resolver

minxi|xi|s.t.Ax=b.

O problema no post original se enquadra nessa categoria após a vetorização apropriada. (isso é apenas em princípio - veremos que a vetorização não precisa ser realizada na prática)

Você poderia resolver o problema equivalente, que possui Lagrangiano L(x,z,λ,γ)=

minx,zi|xi|+α2||xz||2+β2||Azb||2s.t.Az=b&x=z,
L(x,z,λ,γ)=Eu|xEu|+α2||x-z||2+β2||UMAz-b||2+λT(UMAz-b)+γT(x-z)=Eu|xEu|+α2||x-z+1 1αγ||2+β2||UMAz-b+1 1βλ||2+α2||1 1αγ||2+β2||1 1βλ||2.

O método de direção alternada dos multiplicadores resolve o problema duplo, via subida gradiente nas variáveis ​​duplas, exceto com projeções alternadas inexatas nos subproblemas duplos. Ou seja, faz-se a iteração x k + 1

maxλ,γminx,zeu(x,z,λ,γ),
xk+1 1=umargmEunxeu(x,zk,λk,γk)zk+1 1=umargmEunzeu(xk+1 1,z,λk,γk)γk+1 1=γk+α(xk+1 1-zk+1 1)λk+1 1=λk+β(UMAzk+1 1-b).

Sob certas condições moderadas nos parâmetros e (explicados no artigo de Boyd & Parikh acima), o método ADMM convergirá para a verdadeira solução. A taxa de convergência é linear, pois é no centro um método de subida de gradiente. Frequentemente, pode ser acelerado para ser super-linear 1) alterando os parâmetros e medida que avança com base nas heurísticas, ou 2) usando a aceleração de Nesterov. Para obter notas sobre a alteração dos parâmetros de penalidade, consulte o documento de pesquisa de Boyd e, sobre o uso da aceleração de Nesterov com o ADMM, consulte o documento a seguir,β α βαβαβ

Goldstein, Tom, Brendan O'Donoghue e Simon Setzer. "Métodos rápidos de otimização de direção alternada." CAM report (2012): 12-35. ftp://ftp.math.ucla.edu/pub/camreport/cam12-35.pdf

No entanto, mesmo que a taxa de convergência geral seja apenas linear, para problemas de foi observado que o método encontra o padrão de esparsidade muito rapidamente e converge mais lentamente nos valores exatos. Como encontrar o padrão de escarsidade é a parte mais difícil, isso é muito fortuito! As razões exatas pelas quais parecem ser uma área da pesquisa atual. Todo mundo vê o padrão de dispersão convergir rapidamente, mas ninguém parece saber exatamente por que isso acontece. Há um tempo, perguntei a Boyd e Parikh sobre isso por e-mail, e Parikh achou que isso poderia ser explicado pela interpretação do método em um contexto de sistemas de controle. Outra explicação heurística do fenômeno é encontrada no apêndice do artigo a seguir,eu1 1

Goldstein, Tom e Stanley Osher. "O método Bregman dividido para problemas regularizados por L1." Jornal SIAM em Ciências da Imagem 2.2 (2009): 323-343. ftp://ftp.math.ucla.edu/pub/camreport/cam08-29.pdf

É claro que agora a dificuldade está em resolver os subproblemas de atualização e para sua situação específica. Como o Lagrangiano é quadrático em , o subproblema de atualização simplesmente exige a solução de um sistema linear. O subproblema parece mais difícil, pois é indiferenciável, mas acontece que existe uma fórmula exata para a solução que pode ser aplicada elemento a elemento! Agora, discutimos esses subproblemas com mais detalhes e os especificamos para o problema na postagem original.z z z xxzzzx

Configuração para o subproblema de atualização (sistema linear)z

Para a atualização , temos a r g m i n z L ( x k , z , λ k , γ k ) = a r g m i n z αz

umargmEunzeu(xk,z,λk,γk)=umargmEunzα2||x-z+1 1αγ||2+β2||UMAz-b+1 1βλ||2.

Especializado no problema, isso se torna:

umargmEunZJ,ZBα2||Jk+1 1-ZJ+1 1αΓJ||Fro2+α2||Bk+1 1-ZB+1 1αΓB||Fro2+β2||MZJ+ZBY-X+1 1αΛ||Fro2,

onde denota a norma Frobenius (elementwise ). Este é um problema de minimização quadrático, em que as condições de otimização de primeira ordem podem ser encontradas pegando derivadas parciais do objetivo em relação a e e definindo-as como zero. Isto é, l 2 Z J Z B 0||||Froeu2ZJZB

0 0=-α2(Jk+1 1-ZJ+1 1αΓJ)+β2MT(MZJ+ZBY-X+1 1βΛ),0 0=-α2(Bk+1 1-ZB+1 1αΓB)+β2(MZJ+ZBY-X+1 1βΛ)YT.

Como observado nos comentários do pôster original Justin Solomon, este sistema para é simétrico, de modo que o gradiente conjugado é um método ideal sem matriz. Uma seção posterior discute esse sistema e como resolvê-lo / pré-condicioná-lo com mais detalhes.ZJ,ZB

Resolução do subproblema update (solução de limiar analítico)x

Agora, voltamos ao subproble , a r g m i n x L ( x , z k , λ k , γ k ) = a r g m i n x i | x i | + αx

umargmEunxeu(x,zk,λk,γk)=umargmEunxEu|xEu|+α2||x-zk+1 1αγk||2

A primeira coisa a ver é que a soma pode ser dividida elemento por elemento,

Eu|xEu|+α2||x-zk+1 1αγk||2=Eu|xEu|+α2Eu(xEu-zEuk+1 1αγEuk)2,

Portanto, podemos resolver o problema do problema de otimização por elemento em paralelo, produzindo

xEuk+1 1=umargmEunxEu|xEu|+α2(xEu-zEuk+1 1αγEuk)2.

A forma geral desta equação é,

mins|s|+α2(s-t)2.

A função de valor absoluto está tentando puxar o ponto ótimo em direção a , enquanto o termo quadrático está tentando puxar o ponto ideal em direção a . portanto, a verdadeira solução está em algum lugar do segmento entre os dois, com o aumento de tendendo a puxar o ponto ideal em direção a diminuindo puxando o ponto ideal em direção a .s = t [ 0 , t ) α t α 0s=0 0s=t[0 0,t)αtα0 0

Esta é uma função convexa, mas não é diferenciável em zero. A condição para um ponto de minimização é que a subderivada do objetivo nesse ponto contenha zero. O termo quadrático tem derivada e a função de valor absoluto tem derivada para , subderivada com valor definido como o intervalo quando e derivada para . Assim, obtemos o subderivativo para a função objetivo geral, - 1 s < 0 [ - 1 , 1 ] s = 0 1 s > 0 s ( | s | + αα(s-t)-1 1s<0 0[-1 1,1 1]s=0 01 1s>0 0

s(|s|+α2(st)2)={1+α(st)s>0[1,1]+αt,s=0,1+α(st),s<0.

A partir disso, vemos que a subderivada do objetivo em contém se e somente se ; nesse caso, é o minimizador. Por outro lado, se não for o minimizador, podemos definir a derivada de valor único igual a zero e resolver o minimizador. Fazendo isso, 0 | t | 1s=00 s=0s=0argmins| s| +α|t|1αs=0s=0

argmins|s|+α2(st)2={t1α,t>1α,0,|t|1α,t+1α,t<1α

Especializando esse resultado novamente no problema real que estamos tentando resolver na pergunta original, onde produz, A atualização para é simplesmente t=ZEujk-1 1αΓEujk

JEujk+1 1={ZEujk-1 1αΓEujk-1 1α,ZEujk-1 1αΓEujk>1 1α,0 0,|ZEujk-1 1αΓEujk|1 1α,ZEujk-1 1αΓEujk+1 1α,ZEujk-1 1αΓEujk<-1 1α.
B
Bk+1 1=ZB-1 1αΓB,

como observado pelo pôster original Justin Solomon nos comentários. No geral, fazer a atualização para exige apenas um loop pelas entradas de suas matrizes e avaliação das fórmulas acima para cada entrada.J,B

Complemento Schur para o sistemaZJ,ZB

A etapa mais cara da iteração é resolver o sistema,

0 0=-α2(Jk+1 1-ZJ+1 1αΓJ)+β2MT(MZJ+ZBY-X+1 1βΛ),0 0=-α2(Bk+1 1-ZB+1 1αΓB)+β2(MZJ+ZBY-X+1 1βΛ)YT.

Para esse fim, vale a pena algum esforço para construir um bom solucionador / pré-condicionador para esse sistema. Nesta seção, fazemos isso vetorizando , formando um complemento Schur , fazendo algumas manipulações de produtos Krnoecker e depois removendo a vetorização. O sistema de complemento Schur resultante é uma equação de Sylvester ligeiramente modificada .

No que segue, as seguintes identidades sobre vetorização e produtos Kronecker são absolutamente essenciais:

  • vec(UMABC)=(CTUMA)vec(B),
  • (UMAB)(CD)=UMACBD ,
  • (UMAB)-1 1=UMA-1 1B-1 1 e
  • (UMAB)T=UMATBT .

Essas identidades são válidas sempre que os tamanhos e a inversibilidade da matriz são tais que cada lado da equação é uma expressão válida.

A forma vetorizada do sistema é,

(αI+β[IMTM(YM)TYMYYTI])[vec(ZJ)vec(ZB)]=[vec(αJ+βMTX+ΓJMTΛ)vec(αB+βXYT+ΓBΛYT)],

ou,

[I(αI+βMTM)β(YM)TβYM(αI+βYYT)I][vec(ZJ)vec(ZB)]=[vec(F)vec(G)],

onde e são notação condensada para o lado direito. Agora realizamos a eliminação de bloco gaussiano / complemento de Schur para eliminar o bloco inferior esquerdo da matriz, no processo de condensação dos produtos Kronecker. Isto é, FG

[I(αI+βMTM)β(YM)T0(αI+βYYT)Eu-β2YYTM(αEu+βMTM)-1 1MT][vec(ZJ)vec(ZB)]=[vec(F)vec(G)-βYM(αEu+βMTM)-1 1vec(F)].

Unvectorizing, as duas equações que temos que resolver em sequência são,

  1. ZB(αEu+βYYT)-(βM(αEu+βMTM)-1 1MT)ZB(βYYT)=G-βM(αEu+βMTM)-1 1FYT
  2. (αEu+βMTM)ZJ=F-βMTZBY.

Solução do sistema de complemento de Schur quando são quadrados, altosY,M

Nesta seção, resolvemos o sistema de complemento Schur para (equação 1. acima) usando SVDs pré-computados completos das matrizes e aplicando uma versão modificada do algoritmo Bartels-Stewart para o Sylvester equação. O algoritmo é ligeiramente modificado a partir da versão padrão para contabilizar o extra no segundo termo, o que a torna não exatamente a equação de Sylvester. Uma vez que é encontrado através da primeira equação, pode ser encontrado facilmente na segunda equação. A segunda equação é trivial para resolver através de qualquer método que você gosta.ZBYYT,MMT,MTMβYYTZBZJ

Esse método requer um custo inicial para pré-calcular dois SVDs completos antes do início do processo ADMM, mas é rápido para aplicar nas iterações reais do ADMM. Como o método lida com SVDs completos das matrizes de restrição, é apropriado quando elas estão próximas da classificação quadrada e alta. Um método mais complicado usando SVDs de baixa classificação também é possível, mas é apresentado em uma seção posterior.

O método se desenvolve da seguinte maneira. Deixe denotam precomputed decomposições completos valor singular, e condensar o lado direito para ser . Então a primeira equação se torna: Multiplicando pelos fatores ortogonais para limpar a esquerda e a direita e definindo um novo desconhecido temporário , isso se torna ainda mais

QDQT=YYT,WΣWT=MMT,VTVT=MTM
H
ZBQ(αEu+D)QT-WβΣ(αEu+Σ)-1 1ΣWTZBQDQT=H.
UMA=WTZBQ
UMA(αEu+D)-βΣ(αEu+Σ)-1 1ΣUMAD=WHQT.

Agora podemos encontrar resolvendo o sistema diagonal , UMA

((αEu+D)Eu+DβΣ(αEu+Σ)-1 1Σ)vec(UMA)=vec(WHQT).

Tendo encontrado , calculamos , e sabendo que resolvemos a segunda equação acima para , o que é trivial, pois já temos a decomposição de autovalores para .UMAZB=WUMAQTZBZJMTM

O custo inicial é computar duas decomposições positivas e simétricas de valores próprios positivos de e e, em seguida, o custo por iteração para uma solução completa é dominado por um punhado de multiplicações matriz-matriz, que estão na mesma ordem de magnitude como fazer 1 subiteração de CG. Se as decomposições iniciais de autovalores forem muito caras, elas poderão ser computadas inexatamente, por exemplo, encerrando a iteração de Lanczos mais cedo e mantendo os maiores autovetores. Em seguida, o método pode ser usado como um bom pré-condicionador para CG, em vez de um solucionador direto.MTMYYT

Método da solução quando são muito retangulares ou têm uma aproximação de classificação baixaM,Y

Agora voltamos nossa atenção para resolver ou pré-condicionar o quando a) as matrizes de entrada são muito retangulares - o que significa que elas têm muito mais linhas do que colunas ou vice-versa - ou b) elas têm uma aproximação de classificação baixa. A derivação abaixo envolve o uso extensivo da fórmula de Woodbury, complemento de Schur e outras manipulações semelhantes.ZJ,ZBM,Y

Começamos com nosso sistema de complemento Schur,

(αEu+βYYT)Eu-β2YYTM(αEu+βMTM)-1 1MT.

Algumas manipulações transformam esse sistema em uma forma mais simétrica,

(αEu+βEuMMT+βYYTEu)vec(ZB)=(Eu(Eu+βαMMT))vec(H).

Agora trazemos as aproximações de baixo escalão. Seja as SVDs reduzidas ou as aproximações de classificação baixa de e ( é um espaço reservado e não é usava). Substituindo-os em nosso sistema, obtém-se a seguinte matriz inversa que desejamos aplicar

QD1 1/2Q2T=YWΣ1 1/2VT=M
YMQ2
(αEu+βEuWΣWT+βYYTEu)-1 1.

Como a matriz com a qual invertermos é uma atualização de baixo nível para a identidade, a estratégia lógica é tentar usar a fórmula de Woodbury,

(UMA+vocêCvocêT)-1 1=UMA-1 1-UMA-1 1você(C-1 1+vocêTUMA-1 1você)-1 1vocêTUMA-1 1.

No entanto, alguns cuidados são necessários, pois as peças de baixo escalão e não são ortogonais. Portanto, para aplicar a fórmula de Woodbury, coletamos as atualizações de baixa classificação em uma única grande atualização. Faça isso e aplicando a fórmula de Woodbury produz, EuWYEu

(1 1αEu+β[EuWQEu][EuΣDY][EuΣTQTEu])-1 1=αEu-βα2[EuWQEu][Eu(Σ-1 1+βαEu)βαQWTβαQTW(D-1 1+βαEu)Y]-1 1[EuΣTQTEu].

O núcleo inverso pode ser calculado pela fórmula inversa 2x2 em blocos,

[UMABBTC]-1 1=[(UMA-BC-1 1BT)-1 1-UMA-1 1B(C-BTUMA-1 1B)-1 1-C-1 1BT(UMA-BC-1 1BT)-1 1(C-BTUMA-1 1B)-1 1].

Esta postagem já é longa o suficiente, então pouparei os longos detalhes do cálculo, mas o resultado final é que, ao conectar as submatrizes necessárias ao inverso em blocos e multiplicar tudo, gera a seguinte forma explícita para o inverso geral

(αEu+βEuMMT+βYYTEu)-1 1=1 1αEu-βα2(t11+s11+t12+s12+t21+s21+t22+s22),

onde

t11=αβEuWeu-1 1WTs11=(QWeu-1 1)D11(QTeu-1 1WT)t12=-αβQh-1 1QTWeu-1 1WTs12=-(Qh-1 1Weu-1 1)D22(h-1 1QTWT)t21=t12s21=-(Qh-1 1W)D22(h-1 1QTeu-1 1WT)t22=αβQh-1 1QTEus22=(Qh-1 1W)D22(h-1 1QTWT)D11=αβ(hEu-Eueu-1 1)-1 1D22=αβ(Eueu-h-1 1Eu)-1 1eu=αβΣ-1 1+Euh=αβD-1 1+Eu.

Nesta forma, podemos aplicar o inverso e encontrar o termo por termo através de 8 sanduíches de multiplicação de matrizes esquerda e direita. A fórmula geral para aplicar a soma dos produtos Kronecker é: ZB

((UMA1 1B1 1)+(UMA2B2)+)vec(C)=vec(B1 1TCUMA1 1+B2TCUMA2+).

Observe que todos os inversos explícitos com os quais terminamos são diagonais, portanto não há nada a ser "resolvido".

Código do solucionador linear

Eu implementei os dois solucionadores acima no Matlab. O parece funcionar bem. O código do solucionador está aqui.zJ,ZB

https://github.com/NickAlger/MeshADMM/blob/master/zkronsolve.m

Um script de teste para verificar se o solucionador funciona aqui. Também mostra por exemplo como chamar o código do solucionador.

https://github.com/NickAlger/MeshADMM/blob/master/test_zkronsolve.m

Observações finais

Os métodos do tipo ADMM são adequados para problemas como esse, mas você precisaria rolar sua própria implementação. A estrutura geral do método é bastante simples, portanto a implementação não é muito difícil em algo como o MATLAB.

A peça que falta nesta postagem que precisaria ser especificada para definir completamente o método para o seu problema é uma opção de parâmetros de penalidade . Felizmente, o método geralmente é bastante robusto, desde que os valores dos parâmetros não sejam loucos. O artigo de Boyd e Parikh tem uma seção sobre os parâmetros de penalidade, assim como as referências, mas eu experimentaria os parâmetros até obter taxas de convergência razoáveis.α,β

As estratégias de resolução de apresentadas são altamente eficazes se as matrizes de restrição forem: a) densas, quadradas e altas, ou b) tiverem uma boa aproximação de baixa classificação. Outra solver útil que poderia ser um tema de trabalho futuro seria um solucionador otimizado para o caso seguinte - a matriz de restrição é escassa e squareish e alto escalão, mas existe uma boa pré-condicionador para . Seria esse o caso se, por exemplo, fosse um laplaciano discreto.ZJ,ZBMαEu+MMTM


Implementando isso agora! Para verificar, a matriz resolvida para e deve ser simétrica / positiva definida, pois vem de mínimos quadrados, certo? Isso parece empiricamente verdadeiro :-). Então, o CG é uma opção melhor que o GMRES? ZBZJ
23616 Justin Solomon

Além disso, acho que a atualização para B está errada? Estou trabalhando nisso com mais detalhes, mas o recall B não aparece na minha função de energia (no term), portanto, não tenho certeza de que ele deve receber apenas valores em Estou pensando nisso errado? Obrigado! |B|±(1 1-1 1/α).
Justin Solomon

11
[errr vez, ]B=ZB-ΓB/α
Justin Solomon

3
Surpreendente! Depois de colocar minhas próprias fórmulas para e (provavelmente próximo / equivalente ao que você postou, mas algo não estava funcionando), isso está superando em muito o método IRLS. Obrigado! JB
26630 Justin Solomon

11
Boas notícias. É tão bom ver quando as contribuições aqui levam a resultados reais.
Michael Grant

5

Você provavelmente deseja usar um método sem matriz para programação linear. Não conheço nenhum método especificamente voltado para a programação linear, mas existem métodos de pontos interiores sem matriz para programas quadráticos e para programas não lineares gerais. O caso do programa quadrático corresponde exatamente ao seu problema, onde os coeficientes da forma quadrática são todos os zeros. (Você também pode personalizar métodos que usam soluções lineares exatas para a estrutura do seu problema, mas esse tipo de implementação personalizada pode não valer a pena e é menos prático do que usar um método sem matriz.)

Não conheço nenhum pacote de otimização comercial que implemente variantes sem matriz de métodos de pontos interiores. O IPOPT deve implementar um método de ponto interior sem matriz para programação não linear, mas não consegui rastrear as chamadas de API que permitem que você o use.

Além do CVX, você provavelmente poderia usar GAMS ou AMPL para inserir a matriz uma vez e configurar suas restrições na linguagem de modelagem para usar essa matriz. No entanto, os métodos usados ​​pelo solucionador back-end para CVX, GAMS e AMPL não usam solucionadores sem matriz; tudo exigirá a matriz completa do coeficiente para o programa linear na forma padrão, que será enorme (será um produto Kronecker de matrizes). O que provavelmente acontecerá é que você insira seu programa linear no formulário acima usando a linguagem de modelagem e, em seguida, a linguagem de modelagem converterá os dados em um formulário utilizável pelos solucionadores de back-end. Este formulário exigirá enormes matrizes e suspeito que você tenha os mesmos tipos de erros (a menos que execute em uma máquina com memória suficiente).


Parece que eu tentei todas as coisas certas! Inicialmente, experimentei o CVX e ele falhou, então mudei para o IPOPT. Mas o IPOPT estava tendo o mesmo problema. Eu não sabia que ele tem uma opção sem matriz, então vou ver se consigo descobrir.