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ãof′(x∗)=0
onde
f′ - derivado
f . Este critério é baseado em uma aproximação linear.
f(x) approxf(x∗)+f′(x∗)(x−x∗).
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(x−x∗) (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)= frac12xTAx−bTx+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:
- Eles também ocorrem na prática, por exemplo, ao construir uma regressão linear com mínimos quadrados
- 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)xj−bi,
Ou em forma de matriz
nablaf(x)=Ax−b,
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( barx−x) . 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 |x−y |
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)= frac12xTAx−bTx+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+1−x∗=xk− alphak nablaf(xk)−x∗=xk− alphak(Axk−b)−x∗=
(xk−x∗)− alphakA(xk−x∗)=(I− alphakA)(xk−x∗),
onde
I É a matriz de identidade, ou seja,
Ix=x para todos
x . Se
alphak equiv alpha vai acabar
|xk−x∗ |= |(I− alphaA)k(x0−x∗) | leq |I− alphaA |k |x0−x∗ |.
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(xk−xk−1).
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:
- Praticamente não complicam a descida usual do gradiente no plano computacional.
- 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+1−x∗=(I− alphakA)(xk−x∗)= ldots=
(I− alphakA)(I− alphak−1A) ldots(I− alpha1A)(x0−x∗)=Pk(A)(x0−x∗),
onde
Pk Algum grau polinomial
k . Por que não tentar pegar
alphak para que
Pk(A)(x0−x∗) 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)−Tn−1(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+1−x∗=Pk(A)(x0−x∗).
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
- 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
- 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(xk−xk−1))+ betak(xk−xk−1),
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 |x−yj |2, nablaf(x)= frac1m summj=1(x−yj)
e
g(x,i)=x−yi.
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(y−x) 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(y−x) 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:
- Digamos que começamos do ponto x0 .
- 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}
- 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=e−ck , 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:
- 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
- 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 convexaShewchuk JR Uma Introdução ao Método do Gradiente Conjugado Sem Dor AgonizanteTeoria de otimização convexa da Bertsekas DPNesterov Yu. E. Métodos de otimização convexosGasnikov A.V. Descida de gradiente universal