Visão geral dos métodos de gradiente em problemas de otimização matemática

Prefácio


Este artigo focará em métodos para resolver problemas de otimização matemática com base no uso de um gradiente de função. O objetivo principal é coletar no artigo todas as idéias mais importantes que, de alguma forma, estão relacionadas a esse método e suas várias modificações.





UPD Nos comentários, eles escrevem que em alguns navegadores e nas fórmulas de aplicativos para dispositivos móveis não são exibidos. Infelizmente, não sei como lidar com isso. Só posso dizer que usei as macros “inline” e “display” do editor Habrava. Se de repente você souber como consertar isso - escreva nos comentários, por favor.

Nota do autor


Na época em que escrevi, defendi uma dissertação, cuja tarefa exigia que eu tivesse um profundo entendimento de métodos basicamente teóricos de otimização matemática. No entanto, meus olhos (de todos os outros) ainda estão embaçados por fórmulas longas e assustadoras, por isso gastei muito tempo para isolar as ideias-chave que caracterizariam diferentes variações dos métodos de gradiente. Meu objetivo pessoal é escrever um artigo contendo a quantidade mínima de informações necessárias para uma compreensão mais ou menos detalhada do tópico. Mas esteja preparado, não se pode prescindir de fórmulas de qualquer maneira.

Declaração do problema


Antes de descrever o método, você deve primeiro descrever o problema, a saber: “Dado são muitos  m a t h c a l K e função f : m a t h c a l K r i g h t a r r o w m a t h b b R    precisa encontrar um ponto x i n m a t h c a l K   tal que f ( x ) g e q f ( x )  para todos x in mathcalK ", Que geralmente é escrito assim

f(x) rightarrow minx in mathcalK.


Em teoria , é geralmente assumido que f É uma função diferenciável e convexa e  mathcalK - conjunto convexo (e melhor ainda, se for o caso)  mathcalK= mathbbRn ), isso nos dá algumas garantias do sucesso da aplicação da descida de gradiente. Na prática, a descida do gradiente é aplicada com êxito, mesmo quando a tarefa não possui nenhuma das propriedades acima (um exemplo posteriormente neste artigo).

Um pouco de matemática


Suponha que, por enquanto, apenas precisamos encontrar um mínimo de uma função unidimensional

f(x) rightarrow minx in mathbbR.


No século XVII, Pierre Fermat criou um critério que permitia resolver problemas simples de otimização, a saber, se x - ponto mínimo f então

f(x)=0


onde f - derivado f . Este critério é baseado em uma aproximação linear.

f(x) approxf(x)+f(x)(xx).


Mais perto x para x , mais precisa essa aproximação. No lado direito, há uma expressão que, quando f(x) neq0 talvez goste mais f(x) menos é a essência principal do critério. No caso multidimensional, similarmente à aproximação linear f(x) aproxf(x)+ nablaf(x)T(xx) (a seguir xTy= sumni=1xiyi - produto escalar padrão, a forma de escrita se deve ao fato de que o produto escalar é o mesmo que o produto da matriz de um vetor de linha por um vetor de coluna), o critério é obtido

 nablaf(x)=0.


Valor  nablaf(x) - gradiente de função f no ponto x . Além disso, a igualdade do gradiente para zero significa a igualdade de todas as derivadas parciais para zero; portanto, no caso multidimensional, é possível obter esse critério simplesmente aplicando o critério unidimensional para cada variável separadamente.

Vale ressaltar que essas condições são necessárias, mas não suficientes, o exemplo mais simples é 0 para f(x)=x2 e f(x)=x3


Este critério é suficiente no caso de uma função convexa, em grande parte por isso foi possível obter tantos resultados para funções convexas.

Funções quadráticas


Funções quadráticas em  mathbbRn É uma função do formulário

f(x)=f(x1,x2, ldots,xn)= frac12 sumni,j=1aijxixj sumni=1bixi+c


Para economizar espaço (e se preocupar menos com índices), essa função geralmente é escrita em forma de matriz:

f(x)= frac12xTAxbTx+c,


onde x=(x1, ldots,xn)T , b=(b1, ldots,bn)T , A É uma matriz na qual na interseção i cordas e j coluna é o valor
 frac12(aij+aji) ( A acaba sendo simétrico - isso é importante). Próximo. ao mencionar uma função quadrática, terei a função acima.

Por que estou falando sobre isso? O fato é que as funções quadráticas são importantes na otimização por dois motivos:

  1. Eles também ocorrem na prática, por exemplo, ao construir uma regressão linear com mínimos quadrados
  2. O gradiente de uma função quadrática é uma função linear, em particular para a função acima

     frac parcial parcialxif(x1,x2, ldots,xn)=aiixi+ sumj neqi frac12(aij+aji)xjbi,


    Ou em forma de matriz

     nablaf(x)=Axb,


    Assim, o sistema  nablaf(x)=0 - sistema linear. Um sistema que é mais simples que linear não existe. O pensamento que eu estava tentando entender é a otimização de uma função quadrática - a classe mais simples de problemas de otimização . Por outro lado, o fato de que  nablaf(x)=0 - as condições mínimas necessárias tornam possível resolver sistemas lineares através de problemas de otimização. Um pouco mais tarde, tentarei convencê-lo de que isso faz sentido.

Propriedades úteis de gradiente


Bem, parece que descobrimos que se uma função é diferenciável (tem derivadas em relação a todas as variáveis), então no ponto mínimo o gradiente deve ser igual a zero. Mas o gradiente carrega alguma informação útil quando é diferente de zero?

Vamos tentar resolver um problema mais simples: o ponto é dado x encontrar ponto  barx tal que f( barx)<f(x) . Vamos dar um ponto ao lado de x novamente usando aproximação linear f( barx) aproxf(x)+ nablaf(x)T( barxx) . Se você tomar  barx=x alpha nablaf(x) ,  alpha>0 então nós temos

f( barx) aproximadamentef(x) alpha | nablaf(x) |2<f(x).


Da mesma forma, se  alpha<0 então f( barx) será mais f(x) (a seguir ||x||= sqrtx21+x22+ ldots+x2n  ) Novamente, como usamos a aproximação, essas considerações serão verdadeiras apenas para pequenos  alpha . Para resumir o acima, se  nablaf(x) neq0 , o gradiente indica a direção do maior aumento local na função .

Aqui estão dois exemplos para funções bidimensionais. Imagens desse tipo geralmente podem ser vistas em demonstrações de descida de gradiente. Linhas coloridas são as chamadas linhas de nível , este é um conjunto de pontos para os quais a função assume valores fixos; no meu caso, são círculos e elipses. Marquei as linhas azuis do nível com um valor mais baixo, vermelho - com um valor mais alto.



Observe que para uma superfície definida por uma equação da forma f(x)=c ,  nablaf(x) define o normal (nas pessoas comuns - o perpendicular) a essa superfície. Observe também que, embora o gradiente seja exibido na direção do maior aumento da função, não há garantia de que, na direção oposta ao gradiente, você encontre um mínimo (por exemplo, a figura da esquerda).

Descida de gradiente


Restava apenas um pequeno passo para o método básico de descida por gradiente: aprendemos a partir do ponto x ficando ponto  barx com menor valor de função f . O que nos impede de repetir isso várias vezes? De fato, esta é a descida do gradiente: construímos a sequência

xk+1=xk alphak nablaf(xk).


Valor  alphak chamado de tamanho da etapa (no aprendizado de máquina - a velocidade do aprendizado ). Algumas palavras sobre a escolha  alphak : se  alphak - muito pequena, a sequência muda lentamente, o que torna o algoritmo não muito eficiente; se  alphak muito grande, a aproximação linear se torna fraca e talvez até incorreta. Na prática, o tamanho do passo é geralmente selecionado empiricamente; em teoria, geralmente é assumido um gradiente de Lipschitz, a saber, se

 | nablaf(x) nablaf(y) | leqL |xy |


para todos x,y então  alphak< frac2L garante diminuição f(xk) .

Análise para funções quadráticas


Se A É uma matriz invertível simétrica, Ax=b então para a função quadrática f(x)= frac12xTAxbTx+c apontar x é o ponto mínimo ( UPD . desde que esse mínimo exista - f não leva nem perto  infty valores somente se A positivo) e, para o método de descida de gradiente, podemos obter os seguintes

xk+1x=xk alphak nablaf(xk)x=xk alphak(Axkb)x=


(xkx) alphakA(xkx)=(I alphakA)(xkx),


onde I É a matriz de identidade, ou seja, Ix=x para todos x . Se  alphak equiv alpha vai acabar

 |xkx |= |(I alphaA)k(x0x) | leq |I alphaA |k |x0x |.


A expressão à esquerda é a distância da aproximação obtida na etapa k gradiente descendente até o ponto mínimo, à direita - uma expressão da forma  lambdak beta que converge para zero se | lambda|<1 (a condição que escrevi em  alpha no parágrafo anterior, é exatamente isso que garante). Essa estimativa básica garante que a descida do gradiente converja.

Modificações de descida de gradiente


Agora eu gostaria de falar um pouco sobre as modificações comumente usadas na descida do gradiente, principalmente as chamadas

Métodos de gradiente inercial ou acelerado


Todos os métodos desta classe são expressos da seguinte maneira

xk+1=xk alphak nablaf(xk)+ betak(xkxk1).


O último termo caracteriza essa mesma "inércia", o algoritmo em cada etapa tenta se mover contra o gradiente, mas ao mesmo tempo se move parcialmente por inércia na mesma direção da iteração anterior. Tais métodos têm duas propriedades importantes:

  1. Praticamente não complicam a descida usual do gradiente no plano computacional.
  2. Com seleção cuidadosa  alphak, betak esses métodos são uma ordem de magnitude mais rápida que a descida gradual do gradiente, mesmo com uma etapa selecionada de maneira ideal.

Um dos primeiros métodos apareceu em meados do século XX e foi chamado de método da bola pesada , que transmitia a natureza da inércia do método: nesse método  alphak, betak independente de k e cuidadosamente selecionado, dependendo da função objetivo. Vale a pena notar que  alphak pode ser qualquer coisa, menos  betak - geralmente um pouco menos de um .

O método da bola pesada é o método inercial mais simples, mas não o primeiro. Nesse caso, na minha opinião, o primeiro método é muito importante para entender a essência desses métodos.

Método Chebyshev


Sim, sim, o primeiro método deste tipo foi inventado por Chebyshev para resolver sistemas de equações lineares. Em algum momento da análise da descida do gradiente, a seguinte igualdade foi obtida

xk+1x=(I alphakA)(xkx)= ldots=


(I alphakA)(I alphak1A) ldots(I alpha1A)(x0x)=Pk(A)(x0x),


onde Pk Algum grau polinomial k . Por que não tentar pegar  alphak para que Pk(A)(x0x) era menor? Um nó de polinômios universais que se desviam menos de zero é o polinômio de Chebyshev. O método de Chebyshev consiste essencialmente na seleção dos parâmetros de descida para que Pk era um polinômio de Chebyshev. Há realmente um pequeno problema: para uma descida normal do gradiente, isso simplesmente não é possível. No entanto, para métodos inerciais, isso é possível. Isso se deve principalmente ao fato de os polinômios de Chebyshev satisfazerem a relação de recorrência de segunda ordem

Tn+1(x)=2xTn(x)Tn1(x),


portanto, eles não podem ser criados para a descida do gradiente, que calcula um novo valor a partir de apenas um valor anterior e, por inércia, torna-se possível devido ao fato de os dois valores anteriores serem usados. Acontece que a complexidade do cálculo  alphak, betak não depende de k nem o tamanho do espaço n .

Método do Gradiente Conjugado


Outro fato muito interessante e importante (uma conseqüência do teorema de Hamilton-Cayley): para qualquer matriz quadrada A o tamanho n vezesn existe um polinômio P grau não mais n para qual P(A)=0 . Por que isso é interessante? É tudo sobre a mesma igualdade

xk+1x=Pk(A)(x0x).


Se pudéssemos escolher o tamanho da etapa na descida do gradiente de forma a obter exatamente esse polinômio de zeragem, a descida do gradiente convergiria para um número de iteração fixo não maior que a dimensão A . Como já descobrimos, não podemos fazer isso para descida gradiente. Felizmente, para métodos inerciais, podemos. A descrição e justificativa do método é bastante técnica, vou me limitar à essência: a cada iteração, são selecionados parâmetros que fornecem o melhor polinômio, que pode ser construído levando em consideração todas as medições feitas antes da etapa atual da medição do gradiente . Ao mesmo tempo

  1. Uma iteração de descida de gradiente (sem levar em consideração os cálculos de parâmetros) contém uma multiplicação de matriz por um vetor e 2-3 adições de vetor
  2. O cálculo dos parâmetros também requer multiplicação de matriz 1-2 por vetor, multiplicação de vetor escalar 2-3 por vetor e várias adições de vetores.

A coisa mais difícil no plano computacional é a multiplicação da matriz por um vetor, isso geralmente é feito no tempo  mathcalO(n2) No entanto, para uma implementação especial, isso pode ser feito em  mathcalO(m) onde m - o número de elementos diferentes de zero em A . Dada a convergência do método do gradiente conjugado, não mais que n iterações obtêm a complexidade geral do algoritmo  mathcalO(nm) , que em todos os casos não é pior  mathcalO(n3) para o método de Gauss ou Cholesky, mas muito melhor se m<<n2 isso não é tão raro.

O método do gradiente conjugado também funciona bem se f não é uma função quadrática, mas não converge em um número finito de etapas e geralmente requer pequenas modificações adicionais

Método Nesterov


Para as comunidades de otimização matemática e aprendizado de máquina, o nome "Nesterov" tem sido um nome familiar. Nos anos 80 do século passado, Yu.E. Nesterov apresentou uma versão interessante do método inercial, que tem a forma

xk+1=xk alphak nablaf(xk+ betak(xkxk1))+ betak(xkxk1),


não implica nenhum cálculo complicado  alphak, betak como no método do gradiente conjugado, em geral, o comportamento do método é semelhante ao método da bola pesada, mas sua convergência é geralmente muito mais confiável, tanto na teoria quanto na prática.

Descida do gradiente estocástico


A única diferença formal em relação à descida do gradiente usual é o uso de uma função em vez de um gradiente g(x, theta) tal que E thetag(x, theta)= nablaf(x) ( E theta - expectativa aleatória  theta ), então a descida do gradiente estocástico tem a forma

xk+1=xk alphakg(xk, thetak).


 thetak - Este é um parâmetro aleatório que não afetamos, mas ao mesmo tempo, em média, vamos contra o gradiente. Como exemplo, considere as funções

f(x)= frac12m summj=1 |xyj |2,   nablaf(x)= frac1m summj=1(xyj)


e

g(x,i)=xyi.


Se i leva valores 1, ldots,m igualmente provável apenas média g É um gradiente f . Este exemplo também é indicativo do seguinte: a complexidade do cálculo do gradiente em m vezes mais que a complexidade computacional g . Isso permite que a descida do gradiente estocástico seja feita ao mesmo tempo em m vezes mais iterações. Apesar do declínio estocástico do gradiente geralmente convergir mais lentamente que o normal, devido a um aumento tão grande no número de iterações, é possível melhorar a taxa de convergência por unidade de tempo. Até onde eu sei, no momento, a descida gradiente estocástica é o método básico de treinamento da maioria das redes neurais, implementado em todas as principais bibliotecas ML: fluxo tensor, tocha, caffe, CNTK, etc.

Vale ressaltar que as idéias dos métodos inerciais são usadas para a descida do gradiente estocástico e, na prática, frequentemente aumentam, em teoria, geralmente se supõe que a taxa de convergência assintótica não mude devido ao fato de que o principal erro na descida do gradiente estocástico é devido à dispersão g .

Descida do sub-gradiente


Essa variação permite que você trabalhe com funções não diferenciáveis, descreverei em mais detalhes. Novamente teremos que recordar a aproximação linear - o fato é que existe uma característica simples de convexidade através de um gradiente, uma função diferenciável f convexo se e somente se f(y) geqf(x)+ nablaf(x)T(yx) para todos x,y . Acontece que uma função convexa não precisa ser diferenciável, mas em qualquer ponto x certamente existe esse vetor g que f(y) geqf(x)+gT(yx) para todos y . Tal vetor g comumente chamado subgradiente f no ponto x , o conjunto de todos os subgradientes para pontos x chamado subdiferencial x e denotar  fparcial(x) (apesar da designação - não tem nada a ver com derivadas parciais). No caso unidimensional g É um número e a propriedade acima significa simplesmente que o gráfico f fica acima da linha que passa (x,f(x)) e ter uma inclinação g (veja as fotos abaixo). Noto que pode haver vários subgradientes para um ponto, até um número infinito.



Geralmente, não é muito difícil calcular pelo menos um subgradiente para um ponto; uma descida do subgradiente usa essencialmente um subgradiente em vez de um gradiente. Acontece que isso é suficiente; em teoria, a taxa de convergência diminui, no entanto, por exemplo, nas redes neurais uma função indiferenciada ReLU(x)= máx(0,x) eles gostam de usá-lo apenas porque o treinamento é mais rápido (a propósito, este é um exemplo de uma função não convexa e não diferenciável na qual a descida do (sub) gradiente é aplicada com êxito. Relu rede neural convexa, mas com várias camadas, contendo Relu , não convexo e não diferenciável). Como exemplo, para uma função f(x)=|x| subdiferencial é calculado de maneira muito simples

\ parcial f (x) = \ begin {cases} 1, & x> 0, \\ -1, & x <0, \\ [-1, 1], & x = 0. \ end {cases}



Talvez a última coisa importante a saber é que a descida do sub-gradiente não converge em um tamanho de passo constante . É mais fácil ver a função acima. f(x)=|x| . Até a ausência de uma derivada em um ponto quebra a convergência:

  1. Digamos que começamos do ponto x0 .
  2. Etapa de descida do sub-gradiente:

    x_ {k + 1} = \ begin {cases} x_ {k} -1, & x> 0, \\ x_k + 1, & x <0, \\ ??? & x = 0. \ end {cases}

  3. Se x0>0 nos primeiros passos subtrairemos um, se x0<0 depois adicione. De uma forma ou de outra, em algum momento nos encontraremos no intervalo [0,1) a partir do qual chegamos [1,0) , e então saltaremos entre dois pontos desses intervalos.

Em teoria, para descidas por sub-gradientes, é recomendável executar uma sequência de etapas

 alphak= frac1(k+1)c.


Onde c geralmente 1 ou  frac12 . Na prática, muitas vezes vi etapas bem-sucedidas  alphak=eck , embora, para essas etapas de um modo geral, não haja convergência.

Métodos proximais


Infelizmente, não conheço uma boa tradução para "proximal" no contexto da otimização, por isso chamarei esse método. Os métodos proximais apareceram como uma generalização dos métodos de gradiente projetivo. A ideia é muito simples: se houver uma função f representado como uma soma f(x)= varphi(x)+h(x) onde  varphi É uma função convexa diferenciável e h(x) - convexo, para o qual existe um operador proximal especial proxh(x) (neste artigo vou me limitar apenas a exemplos, não descreverei em termos gerais), as propriedades de convergência da descida do gradiente para  varphi permanecer e para descida gradiente para f se após cada iteração aplicar esse operador proximal ao ponto atual xk , em outras palavras, a forma geral do método proximal é assim:

xk+1=prox alphakh(xk alphak nabla varphi(xk))


Eu acho que até agora é completamente incompreensível por que isso pode ser necessário, especialmente considerando que eu não expliquei o que é um operador proximal. Aqui estão dois exemplos:
  1. h(x) - função indicadora de um conjunto convexo  mathcalK isso é

    h (x) = \ begin {cases} 0, & x \ in \ mathcal {K}, \\ + \ infty, & x \ notin \ mathcal {K}. \\ \ end {cases}


    Neste caso prox alphakh(x) É uma projeção no aparelho  mathcalK , ou seja, "o mais próximo x ponto de ajuste  mathcalK " Assim, restringimos a descida do gradiente apenas ao conjunto  mathcalK , o que nos permite resolver problemas com restrições. Infelizmente, o cálculo da projeção no caso geral pode ser ainda mais difícil, portanto esse método é geralmente usado se as restrições forem simples, por exemplo, as chamadas restrições de caixa: para cada coordenada

    li leqxi leqri


  2. h(x)= lambda |x |1= lambda sumni=1|xi| -  ell1 -regularização. Eles gostam de adicionar esse termo a problemas de otimização no aprendizado de máquina para evitar a reciclagem. A regularização desse tipo também tende a anular os componentes menos significativos. Para essa função, o operador proximal tem a forma (uma expressão para uma única coordenada é descrita abaixo):

    [prox _ {\ alpha h} (x)] _ i = \ begin {cases} x_i- \ alpha, & x_i> \ alpha, \\ x_i + \ alpha, e x_i <- \ alpha, \\ 0 e x_i \ em [- \ alpha, \ alpha], \ end {cases}


    o que é bem fácil de calcular.

Conclusão


Isso encerra as principais variações do método gradiente conhecidas por mim. Talvez, no final, notei que todas essas modificações (exceto talvez o método do gradiente conjugado) podem interagir facilmente entre si. Eu deliberadamente não incluí o método de Newton e os métodos quase-Newton (BFGS e outros) nesta lista: embora eles usem um gradiente, são métodos mais complexos e exigem cálculos adicionais específicos, que geralmente são mais caros do que calcular um gradiente. No entanto, se este texto estiver em demanda, terei prazer em fazer uma revisão semelhante sobre eles.

Literatura usada / recomendada


Boyd. S, Vandenberghe L. Otimização convexa
Shewchuk JR Uma Introdução ao Método do Gradiente Conjugado Sem Dor Agonizante
Teoria de otimização convexa da Bertsekas DP

Nesterov Yu. E. Métodos de otimização convexos
Gasnikov A.V. Descida de gradiente universal

Source: https://habr.com/ru/post/pt413853/


All Articles