.. _sec_convexity: Convexidade =========== A convexidade desempenha um papel vital no projeto de algoritmos de otimização. Em grande parte, isso se deve ao fato de que é muito mais fácil analisar e testar algoritmos em tal contexto. Em outras palavras, se o algoritmo funcionar mal, mesmo na configuração convexa, normalmente, não devemos esperar ver grandes resultados de outra forma. Além disso, embora os problemas de otimização no aprendizado profundo sejam geralmente não convexos, eles costumam exibir algumas propriedades dos convexos próximos aos mínimos locais. Isso pode levar a novas variantes de otimização interessantes, como :cite:`Izmailov.Podoprikhin.Garipov.ea.2018`. .. raw:: html
mxnetpytorchtensorflow
.. raw:: html
.. code:: python %matplotlib inline from mpl_toolkits import mplot3d from mxnet import np, npx from d2l import mxnet as d2l npx.set_np() .. raw:: html
.. raw:: html
.. code:: python %matplotlib inline import numpy as np import torch from mpl_toolkits import mplot3d from d2l import torch as d2l .. raw:: html
.. raw:: html
.. code:: python %matplotlib inline import numpy as np import tensorflow as tf from mpl_toolkits import mplot3d from d2l import tensorflow as d2l .. raw:: html
.. raw:: html
Definições ---------- Antes da análise convexa, precisamos definir *conjuntos convexos* e *funções convexas*. Eles levam a ferramentas matemáticas que são comumente aplicadas ao aprendizado de máquina. Convex Sets ~~~~~~~~~~~ Os conjuntos são a base da convexidade. Simplificando, um conjunto :math:`\mathcal{X}` em um espaço vetorial é *convexo* se para qualquer :math:`a, b \in \mathcal{X}` o segmento de linha conectando :math:`a` e :math:`b` também estiver em :math:`\mathcal{X}`. Em termos matemáticos, isso significa que para todos :math:`\lambda \in [0, 1]` temos .. math:: \lambda a + (1-\lambda) b \in \mathcal{X} \text{ whenever } a, b \in \mathcal{X}. Isso soa um pouco abstrato. Considere :numref:`fig_pacman`. O primeiro conjunto não é convexo, pois existem segmentos de linha que não estão contidos nele. Os outros dois conjuntos não sofrem esse problema. .. _fig_pacman: .. figure:: ../img/pacman.svg O primeiro conjunto é não convexo e os outros dois são convexos. As definições por si só não são particularmente úteis, a menos que você possa fazer algo com elas. Neste caso, podemos olhar as interseções como mostrado em :numref:`fig_convex_intersect`. Suponha que :math:`\mathcal{X}` e :math:`\mathcal{Y}` são conjuntos convexos. Então :math:`\mathcal{X} \cap \mathcal{Y}` também é convexo. Para ver isso, considere qualquer :math:`a, b \in \mathcal{X} \cap \mathcal{Y}`. Como :math:`\mathcal{X}` e :math:`\mathcal{Y}` são convexos, os segmentos de linha que conectam :math:`a` e :math:`b` estão contidos em :math:`\mathcal{X}` e :math:`\mathcal{Y}`. Dado isso, eles também precisam estar contidos em :math:`\mathcal{X} \cap \mathcal{Y}`, provando assim nosso teorema. .. _fig_convex_intersect: .. figure:: ../img/convex-intersect.svg A interseção entre dois conjuntos convexos é convexa. Podemos reforçar este resultado com pouco esforço: dados os conjuntos convexos :math:`\mathcal{X}_i`, sua interseção :math:`\cap_{i} \mathcal{X}_i` é convexa. Para ver que o inverso não é verdadeiro, considere dois conjuntos disjuntos :math:`\mathcal{X} \cap \mathcal{Y} = \emptyset`. Agora escolha :math:`a \in \mathcal{X}` e :math:`b \in \mathcal{Y}`. O segmento de linha em :numref:`fig_nonconvex` conectando :math:`a` e :math:`b` precisa conter alguma parte que não está em :math:`\mathcal{X}` nem em :math:`\mathcal{Y}`, uma vez que assumimos que :math:`\mathcal{X} \cap \mathcal{Y} = \emptyset`. Consequentemente, o segmento de linha também não está em :math:`\mathcal{X} \cup \mathcal{Y}`, provando assim que, em geral, as uniões de conjuntos convexos não precisam ser convexas. .. _fig_nonconvex: .. figure:: ../img/nonconvex.svg A união de dois conjuntos convexos não precisa ser convexa. Normalmente, os problemas de aprendizado profundo são definidos em conjuntos convexos. Por exemplo, :math:`\mathbb{R}^d`, o conjunto de vetores :math:`d`-dimensionais de números reais, é um conjunto convexo (afinal, a linha entre quaisquer dois pontos em :math:`\mathbb{R}^d` permanece em :math:`\mathbb{R}^d`). Em alguns casos, trabalhamos com variáveis de comprimento limitado, como bolas de raio :math:`r` conforme definido por :math:`\{\mathbf{x} | \mathbf{x} \in \mathbb{R}^d \text{ e } \|\mathbf{x}\| \leq r\}`. Função Convexa ~~~~~~~~~~~~~~ Agora que temos conjuntos convexos, podemos introduzir *funções convexas* :math:`f`. Dado um conjunto convexo :math:`\mathcal{X}`, uma função :math:`f: \mathcal{X} \to \mathbb{R}` é *convexa* se para todos :math:`x, x' \in \mathcal{X}` e para todos :math:`\lambda \in [0, 1]` temos .. math:: \lambda f(x) + (1-\lambda) f(x') \geq f(\lambda x + (1-\lambda) x'). Para ilustrar isso, vamos representar graficamente algumas funções e verificar quais satisfazem o requisito. Abaixo definimos algumas funções, convexas e não convexas. .. raw:: html
mxnetpytorchtensorflow
.. raw:: html
.. code:: python f = lambda x: 0.5 * x**2 # Convex g = lambda x: np.cos(np.pi * x) # Nonconvex h = lambda x: np.exp(0.5 * x) # Convex x, segment = np.arange(-2, 2, 0.01), np.array([-1.5, 1]) d2l.use_svg_display() _, axes = d2l.plt.subplots(1, 3, figsize=(9, 3)) for ax, func in zip(axes, [f, g, h]): d2l.plot([x, segment], [func(x), func(segment)], axes=ax) .. figure:: output_convexity_94e148_15_0.svg .. raw:: html
.. raw:: html
.. code:: python f = lambda x: 0.5 * x**2 # Convex g = lambda x: torch.cos(np.pi * x) # Nonconvex h = lambda x: torch.exp(0.5 * x) # Convex x, segment = torch.arange(-2, 2, 0.01), torch.tensor([-1.5, 1]) d2l.use_svg_display() _, axes = d2l.plt.subplots(1, 3, figsize=(9, 3)) for ax, func in zip(axes, [f, g, h]): d2l.plot([x, segment], [func(x), func(segment)], axes=ax) .. figure:: output_convexity_94e148_18_0.svg .. raw:: html
.. raw:: html
.. code:: python f = lambda x: 0.5 * x**2 # Convex g = lambda x: tf.cos(np.pi * x) # Nonconvex h = lambda x: tf.exp(0.5 * x) # Convex x, segment = tf.range(-2, 2, 0.01), tf.constant([-1.5, 1]) d2l.use_svg_display() _, axes = d2l.plt.subplots(1, 3, figsize=(9, 3)) for ax, func in zip(axes, [f, g, h]): d2l.plot([x, segment], [func(x), func(segment)], axes=ax) .. figure:: output_convexity_94e148_21_0.svg .. raw:: html
.. raw:: html
Como esperado, a função cosseno é *não convexa*, enquanto a parábola e a função exponencial são. Observe que o requisito de que :math:`\mathcal{X}` seja um conjunto convexo é necessário para que a condição faça sentido. Caso contrário, o resultado de :math:`f(\lambda x + (1-\lambda) x')` pode não ser bem definido. Desigualdades de Jensen ~~~~~~~~~~~~~~~~~~~~~~~ Dada uma função convexa :math:`f`, uma das ferramentas matemáticas mais úteis é a *desigualdade de Jensen*. Isso equivale a uma generalização da definição de convexidade: .. math:: \sum_i \alpha_i f(x_i) \geq f\left(\sum_i \alpha_i x_i\right) \text{ and } E_X[f(X)] \geq f\left(E_X[X]\right), onde :math:`\alpha_i` são números reais não negativos tais que :math:`\sum_i \alpha_i = 1` e :math:`X` é uma variável aleatória. Em outras palavras, a expectativa de uma função convexa não é menos do que a função convexa de uma expectativa, onde a última é geralmente uma expressão mais simples. Para provar a primeira desigualdade, aplicamos repetidamente a definição de convexidade a um termo da soma de cada vez. Uma das aplicações comuns da desigualdade de Jensen é para ligar uma expressão mais complicada por uma mais simples. Por exemplo, sua aplicação pode ser no que diz respeito ao log-verossimilhança de variáveis aleatórias parcialmente observadas. Ou seja, usamos .. math:: E_{Y \sim P(Y)}[-\log P(X \mid Y)] \geq -\log P(X), uma vez que :math:`\int P(Y) P(X \mid Y) dY = P(X)`. Isso pode ser usado em métodos variacionais. Aqui :math:`Y` é normalmente a variável aleatória não observada, :math:`P(Y)` é a melhor estimativa de como ela pode ser distribuída e :math:`P(X)` é a distribuição com :math:`Y` integrada. Por exemplo, no agrupamento :math:`Y` podem ser os rótulos de cluster e :math:`P(X \mid Y)` é o modelo gerador ao aplicar rótulos de cluster. Propriedades ------------ As funções convexas têm algumas propriedades úteis. Nós os descrevemos abaixo. Mínimos locais são mínimos globais ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Em primeiro lugar, os mínimos locais das funções convexas também são os mínimos globais. Podemos provar isso por contradição como segue. Considere uma função convexa :math:`f` definida em um conjunto convexo :math:`\mathcal{X}`. Suponha que :math:`x^{\ast} \in \mathcal{X}` seja um mínimo local: existe um pequeno valor positivo :math:`p` de forma que para :math:`x \in \mathcal{X}` que satisfaz :math:`0 < |x - x^{\ast}| \leq p` temos :math:`f(x^{\ast}) < f(x)`. Suponha que o mínimo local :math:`x^{\ast}` não é o mínimo global de :math:`f`: existe :math:`x' \in \mathcal{X}` para o qual :math:`f(x') < f(x^{\ast})`. Também existe :math:`\lambda \in [0, 1)` como :math:`\lambda = 1 - \frac{p}{|x^{\ast} - x'|}` de modo a :math:`0 < |\lambda x^{\ast} + (1-\lambda) x' - x^{\ast}| \leq p`. Contudo, de acordo com a definição de funções convexas, temos .. math:: \begin{aligned} f(\lambda x^{\ast} + (1-\lambda) x') &\leq \lambda f(x^{\ast}) + (1-\lambda) f(x') \\ &< \lambda f(x^{\ast}) + (1-\lambda) f(x^{\ast}) \\ &= f(x^{\ast}), \end{aligned} o que contradiz nossa afirmação de que :math:`x^{\ast}` é um mínimo local. Portanto, não existe :math:`x' \in \mathcal{X}` para o qual :math:`f(x') < f(x^{\ast})`. O mínimo local :math:`x^{\ast}` também é o mínimo global. Por exemplo, a função convexa :math:`f(x) = (x-1)^2` tem um mínimo local em :math:`x=1`, que também é o mínimo global. .. raw:: html
mxnetpytorchtensorflow
.. raw:: html
.. code:: python f = lambda x: (x - 1) ** 2 d2l.set_figsize() d2l.plot([x, segment], [f(x), f(segment)], 'x', 'f(x)') .. figure:: output_convexity_94e148_27_0.svg .. raw:: html
.. raw:: html
.. code:: python f = lambda x: (x - 1) ** 2 d2l.set_figsize() d2l.plot([x, segment], [f(x), f(segment)], 'x', 'f(x)') .. figure:: output_convexity_94e148_30_0.svg .. raw:: html
.. raw:: html
.. code:: python f = lambda x: (x - 1) ** 2 d2l.set_figsize() d2l.plot([x, segment], [f(x), f(segment)], 'x', 'f(x)') .. figure:: output_convexity_94e148_33_0.svg .. raw:: html
.. raw:: html
O fato de que os mínimos locais para funções convexas também são os mínimos globais é muito conveniente. Isso significa que, se minimizarmos as funções, não podemos “ficar presos”. Observe, porém, que isso não significa que não possa haver mais de um mínimo global ou que possa mesmo existir um. Por exemplo, a função :math:`f(x) = \mathrm{max}(|x|-1, 0)` atinge seu valor mínimo no intervalo :math:`[-1, 1]`. Por outro lado, a função :math:`f(x) = \exp(x)` não atinge um valor mínimo em :math:`\mathbb{R}`: para :math:`x \to -\infty` ele assíntotas para :math:`0`, mas não há :math:`x` para o qual :math:`f(x) = 0`. Os conjuntos de funções convexas abaixo são convexos ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Nós podemos convenientemente definir conjuntos convexos via *conjuntos abaixo* de funções convexas. Concretamente, dada uma função convexa :math:`f` definida em um conjunto convexo :math:`\mathcal{X}`, qualquer conjunto abaixo .. math:: \mathcal{S}_b := \{x | x \in \mathcal{X} \text{ and } f(x) \leq b\} é convexo. Vamos provar isso rapidamente. Lembre-se de que para qualquer :math:`x, x' \in \mathcal{S}_b` precisamos mostrar que :math:`\lambda x + (1-\lambda) x' \in \mathcal{S}_b` enquanto :math:`\lambda \in [0, 1]`. Como :math:`f(x) \leq b` e :math:`f(x') \leq b`, pela definição de convexidade, temos .. math:: f(\lambda x + (1-\lambda) x') \leq \lambda f(x) + (1-\lambda) f(x') \leq b. Convexidade e derivados secundários ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Sempre que a segunda derivada de uma função :math:`f: \mathbb{R}^n \rightarrow \mathbb{R}` existe, é muito fácil verificar se :math:`f` é convexa. Tudo o que precisamos fazer é verificar se o hessiano de :math:`f` é semidefinido positivo: :math:`\nabla^2f \succeq 0`, ou seja, denotando a matriz Hessiana :math:`\nabla^2f` por :math:`\mathbf{H}`, :math:`\mathbf{x}^\top \mathbf{H} \mathbf{x} \geq 0` para todo :math:`\mathbf{x} \in \mathbb{R}^n`. Por exemplo, a função :math:`f(\mathbf{x}) = \frac{1}{2} \|\mathbf{x}\|^2` é convexa, pois :math:`\nabla^2 f = \mathbf{1}`, ou seja, seu Hessian é uma matriz de identidade. Formalmente, qualquer função unidimensional duas vezes diferenciável :math:`f: \mathbb{R} \rightarrow \mathbb{R}` é convexa se e somente se sua segunda derivada :math:`f'' \geq 0`. Para qualquer função multidimensional duas vezes diferenciável :math:`f: \mathbb{R}^{n} \rightarrow \mathbb{R}`, é convexo se e somente se for Hessiano :math:`\nabla^2f \succeq 0`. Primeiro, precisamos provar o caso unidimensional. Para ver isso convexidade de :math:`f` implica :math:`f''\geq 0` usamos o fato de que .. math:: \frac{1}{2} f(x + \epsilon) + \frac{1}{2} f(x - \epsilon) \geq f\left(\frac{x + \epsilon}{2} + \frac{x - \epsilon}{2}\right) = f(x). Uma vez que a segunda derivada é dada pelo limite sobre diferenças finitas, segue-se que .. math:: f''(x) = \lim_{\epsilon \to 0} \frac{f(x+\epsilon) + f(x - \epsilon) - 2f(x)}{\epsilon^2} \geq 0. Para ver isso :math:`f'' \geq 0` implica que :math:`f` é convexo usamos o fato de que :math:`f'' \geq 0` implica que :math:`f'` é uma função monotonicamente não decrescente. Sejam :math:`a < x < b` três pontos em :math:`\mathbb{R}`, onde :math:`x = (1-\lambda)a + \lambda b` e :math:`\lambda \in (0, 1)`. De acordo com o teorema do valor médio, existem :math:`\alpha \in [a, x]` e :math:`\beta \in [x, b]` de tal modo que .. math:: f'(\alpha) = \frac{f(x) - f(a)}{x-a} \text{ and } f'(\beta) = \frac{f(b) - f(x)}{b-x}. Por monotonicidade :math:`f'(\beta) \geq f'(\alpha)`, por isso .. math:: \frac{x-a}{b-a}f(b) + \frac{b-x}{b-a}f(a) \geq f(x). De :math:`x = (1-\lambda)a + \lambda b`, temos .. math:: \lambda f(b) + (1-\lambda)f(a) \geq f((1-\lambda)a + \lambda b), provando assim convexidade. Em segundo lugar, precisamos de um lema antes comprovando o caso multidimensional: :math:`f: \mathbb{R}^n \rightarrow \mathbb{R}` é convexo se e somente se para todos :math:`\mathbf{x}, \mathbf{y} \in \mathbb{R}^n` .. math:: g(z) \stackrel{\mathrm{def}}{=} f(z \mathbf{x} + (1-z) \mathbf{y}) \text{ where } z \in [0,1] é convexo. Para provar que a convexidade de :math:`f` implica que :math:`g` é convexo, podemos mostrar que para todos :math:`a, b, \lambda \in [0, 1]` (portanto :math:`0 \leq \lambda a + (1-\lambda) b \leq 1`) .. math:: \begin{aligned} &g(\lambda a + (1-\lambda) b)\\ =&f\left(\left(\lambda a + (1-\lambda) b\right)\mathbf{x} + \left(1-\lambda a - (1-\lambda) b\right)\mathbf{y} \right)\\ =&f\left(\lambda \left(a \mathbf{x} + (1-a) \mathbf{y}\right) + (1-\lambda) \left(b \mathbf{x} + (1-b) \mathbf{y}\right) \right)\\ \leq& \lambda f\left(a \mathbf{x} + (1-a) \mathbf{y}\right) + (1-\lambda) f\left(b \mathbf{x} + (1-b) \mathbf{y}\right) \\ =& \lambda g(a) + (1-\lambda) g(b). \end{aligned} Para provar o contrário, nós podemos mostrar isso para todo\ :math:`\lambda \in [0, 1]` .. math:: \begin{aligned} &f(\lambda \mathbf{x} + (1-\lambda) \mathbf{y})\\ =&g(\lambda \cdot 1 + (1-\lambda) \cdot 0)\\ \leq& \lambda g(1) + (1-\lambda) g(0) \\ =& \lambda f(\mathbf{x}) + (1-\lambda) g(\mathbf{y}). \end{aligned} Finalmente, usando o lema acima e o resultado do caso unidimensional, o caso multi-dimensional pode ser comprovado da seguinte forma. Uma função multidimensional :math:`f: \mathbb{R}^n \rightarrow \mathbb{R}` é convexa se e somente se para todos :math:`\mathbf{x}, \mathbf{y} \in \mathbb{R}^n` :math:`g(z) \stackrel{\mathrm{def}}{=} f(z \mathbf{x} + (1-z) \mathbf{y})`, onde :math:`z \in [0,1]`, é convexo. De acordo com o caso unidimensional, isso vale se e somente se :math:`g'' = (\mathbf{x} - \mathbf{y})^\top \mathbf{H}(\mathbf{x} - \mathbf{y}) \geq 0` (:math:`\mathbf{H} \stackrel{\mathrm{def}}{=} \nabla^2f`) para todo :math:`\mathbf{x}, \mathbf{y} \in \mathbb{R}^n`, que é equivalente a :math:`\mathbf{H} \succeq 0` de acordo com a definição de matrizes semidefinidas positivas. Restrições ---------- Uma das boas propriedades da otimização convexa é que ela nos permite lidar com as restrições de maneira eficiente. Ou seja, permite-nos resolver problemas da forma: .. math:: \begin{aligned} \mathop{\mathrm{minimize~}}_{\mathbf{x}} & f(\mathbf{x}) \\ \text{ subject to } & c_i(\mathbf{x}) \leq 0 \text{ for all } i \in \{1, \ldots, N\}. \end{aligned} Aqui :math:`f` é o objetivo e as funções :math:`c_i` são funções de restrição. Para ver o que isso faz, considere o caso em que :math:`c_1(\mathbf{x}) = \|\mathbf{x}\|_2 - 1`. Neste caso, os parâmetros :math:`\mathbf{x}` são restritos à bola unitária. Se uma segunda restrição é :math:`c_2(\mathbf{x}) = \mathbf{v}^\top \mathbf{x} + b`, então isso corresponde a todos :math:`\mathbf{x}` em um meio-espaço. Satisfazer as duas restrições simultaneamente significa selecionar uma fatia de uma bola como o conjunto de restrições. Função de Lagrange ~~~~~~~~~~~~~~~~~~ Em geral, resolver um problema de otimização restrito é difícil. Uma maneira de lidar com isso vem da física com uma intuição bastante simples. Imagine uma bola dentro de uma caixa. A bola rolará para o local mais baixo e as forças da gravidade serão equilibradas com as forças que os lados da caixa podem impor à bola. Em suma, o gradiente da função objetivo (ou seja, a gravidade) será compensado pelo gradiente da função de restrição (necessidade de permanecer dentro da caixa em virtude das paredes “empurrando para trás”). Observe que qualquer restrição que não esteja ativa (ou seja, a bola não toca a parede) não será capaz de exercer qualquer força na bola. Ignorando a derivação da função de Lagrange :math:`L` (consulte, por exemplo, o livro de Boyd e Vandenberghe para obter detalhes :cite:`Boyd.Vandenberghe.2004`), o raciocínio acima pode ser expresso através do seguinte problema de otimização do ponto de sela: .. math:: L(\mathbf{x},\alpha) = f(\mathbf{x}) + \sum_i \alpha_i c_i(\mathbf{x}) \text{ where } \alpha_i \geq 0. Aqui, as variáveis :math:`\alpha_i` são os chamados *Multiplicadores de Lagrange* que garantem que uma restrição seja devidamente aplicada. Eles são escolhidos apenas grandes o suficiente para garantir que :math:`c_i(\mathbf{x}) \leq 0` para todos os :math:`i`. Por exemplo, para qualquer :math:`\mathbf{x}` para o qual :math:`c_i(\mathbf{x}) < 0` naturalmente, acabaríamos escolhendo :math:`\alpha_i = 0`. Além disso, este é um problema de otimização *ponto de sela* em que se deseja *maximizar* :math:`L` em relação a :math:`\alpha` e simultaneamente *minimizá-lo* em relação a :math:`\mathbf{x}`. Existe uma vasta literatura explicando como chegar à função :math:`L(\mathbf{x}, \alpha)`. Para nossos propósitos, é suficiente saber que o ponto de sela de :math:`L` é onde o problema de otimização restrito original é resolvido de forma otimizada. Penalidades ~~~~~~~~~~~ Uma maneira de satisfazer problemas de otimização restrita pelo menos aproximadamente é adaptar a função de Lagrange :math:`L`. Em vez de satisfazer :math:`c_i(\mathbf{x}) \leq 0`, simplesmente adicionamos :math:`\alpha_i c_i(\mathbf{x})` à função objetivo :math:`f(x)`. Isso garante que as restrições não sejam violadas demais. Na verdade, temos usado esse truque o tempo todo. Considere a diminuição do peso em :numref:`sec_weight_decay`. Nele adicionamos :math:`\frac{\lambda}{2} \|\mathbf{w}\|^2` à função objetivo para garantir que :math:`\mathbf{w}` não cresça muito. Usando o ponto de vista da otimização restrita, podemos ver que isso garantirá que :math:`\|\mathbf{w}\|^2 - r^2 \leq 0` para algum raio :math:`r`. Ajustar o valor de :math:`\lambda` nos permite variar o tamanho de :math:`\mathbf{w}`. Em geral, adicionar penalidades é uma boa maneira de garantir a satisfação aproximada da restrição. Na prática, isso acaba sendo muito mais robusto do que a satisfação exata. Além disso, para problemas não convexos, muitas das propriedades que tornam a abordagem exata tão atraente no caso convexo (por exemplo, otimização) não são mais válidas. Projeções ~~~~~~~~~ Uma estratégia alternativa para satisfazer as restrições são as projeções. Novamente, nós os encontramos antes, por exemplo, ao lidar com recorte de gradiente em :numref:`sec_rnn_scratch`. Lá, garantimos que um gradiente tem comprimento limitado por :math:`c` via .. math:: \mathbf{g} \leftarrow \mathbf{g} \cdot \mathrm{min}(1, c/\|\mathbf{g}\|). Isso acaba sendo uma *projeção* de :math:`g` na bola de raio :math:`c`. Mais geralmente, uma projeção em um conjunto (convexo) :math:`\mathcal{X}` é definida como .. math:: \mathrm{Proj}_\mathcal{X}(\mathbf{x}) = \mathop{\mathrm{argmin}}_{\mathbf{x}' \in \mathcal{X}} \|\mathbf{x} - \mathbf{x}'\|_2. Portanto, é o ponto mais próximo em :math:`\mathcal{X}` para :math:`\mathbf{x}`. Isso soa um pouco abstrato. :numref:`fig_projections` explica um pouco mais claramente. Nele temos dois conjuntos convexos, um círculo e um diamante. Os pontos dentro do conjunto (amarelo) permanecem inalterados. Pontos fora do conjunto (preto) são mapeados para o ponto mais próximo dentro do conjunto (vermelho). Enquanto para bolas de :math:`L_2` isso não altera a direção, este não precisa ser o caso em geral, como pode ser visto no caso do diamante. .. _fig_projections: .. figure:: ../img/projections.svg Projeções convexas. Um dos usos para projeções convexas é calcular vetores de peso esparsos. Neste caso, projetamos :math:`\mathbf{w}` em uma bola :math:`L_1` (a última é uma versão generalizada do diamante na imagem acima). Sumário ------- No contexto de aprendizagem profunda, o principal objetivo das funções convexas é motivar algoritmos de otimização e nos ajudar a entendê-los em detalhes. A seguir, veremos como a descida gradiente e a descida gradiente estocástica podem ser derivadas de acordo. - As interseções de conjuntos convexos são convexas. Os sindicatos não. - A expectativa de uma função convexa é maior do que a função convexa de uma expectativa (desigualdade de Jensen). - Uma função duas vezes diferenciável é convexa se, e somente se, sua segunda derivada tem apenas autovalores não negativos em toda a extensão. - Restrições convexas podem ser adicionadas por meio da função Lagrange. Na prática, basta adicioná-los com uma penalidade à função objetivo. - As projeções são mapeadas para pontos no conjunto (convexo) mais próximo do ponto original. Exercícios ---------- 1. Suponha que queremos verificar a convexidade de um conjunto desenhando todas as linhas entre os pontos dentro do conjunto e verificando se as linhas estão contidas. 1. Prove que é suficiente verificar apenas os pontos no limite. 2. Prove que é suficiente verificar apenas os vértices do conjunto. 2. Denote por :math:`\mathcal{B}_p[r] := \{\mathbf{x} | \mathbf{x} \in \mathbb{R}^d \text{ and } \|\mathbf{x}\|_p \leq r\}` a bola de raio :math:`r` usando a norma :math:`p`. Prove que :math:`\mathcal{B}_p[r]` é convexo para todos :math:`p\geq 1`. 3. Dadas as funções convexas :math:`f` e :math:`g` mostram que :math:`\mathrm{max} (f, g)` também é convexo. Prove que :math:`\mathrm{min} (f, g)` não é convexo. 4. Prove que a normalização da função softmax é convexa. Mais especificamente, provar a convexidade de :math:`f(x) = \log \sum_i \exp(x_i)`. 5. Prove que os subespaços lineares são conjuntos convexos, ou seja, :math:`\mathcal{X} = \{\mathbf{x} | \mathbf{W} \mathbf{x} = \mathbf{b}\}`. 6. Prove que no caso de subespaços lineares com :math:`\mathbf{b} = 0` a projeção :math:`\mathrm{Proj}_\mathcal{X}` pode ser escrita como :math:`\mathbf{M} \mathbf{x}` para algumas matrizes :math:`\mathbf{M}`. 7. Mostre que para funções convexas duas vezes diferenciáveis ​​\ :math:`f` podemos escrever :math:`f(x + \epsilon) = f(x) + \epsilon f'(x) + \frac{1}{2} \epsilon^2 f''(x + \xi)` para algum :math:`\xi \in [0, \epsilon]`. 8. Dado um vetor :math:`\mathbf{w} \in \mathbb{R}^d` com :math:`\|\mathbf{w}\|_1 > 1`, calcule a projeção na bola unitária :math:`\ell_1`. 1. Como etapa intermediária, escreva o objetivo penalizado :math:`\|\mathbf{w} - \mathbf{w}'\|_2^2 + \lambda \|\mathbf{w}'\|_1` e calcule a solução para um dado :math:`\lambda > 0`. 2. Você consegue encontrar o valor ‘certo’ de :math:`\lambda` sem muitas tentativas e erros? 9. Dado um conjunto convexo :math:`\mathcal{X}` e dois vetores :math:`\mathbf{x}` e :math:`\mathbf{y}` provam que as projeções nunca aumentam as distâncias, ou seja, :math:`\|\mathbf{x} - \mathbf{y}\| \geq \|\mathrm{Proj}_\mathcal{X}(\mathbf{x}) - \mathrm{Proj}_\mathcal{X}(\mathbf{y})\|`. `Discussions `__