Entendendo as convoluções

– http://colah.github.io/posts/2014-07-Understanding-Convolutions/
Postado em 13 de julho de 2014
redes neurais, redes neurais convolutivas, convolução, matemática, probabilidade

Em uma publicação anterior, construímos uma compreensão das redes neurais convolutivas, sem referir-nos a nenhuma matemática significativa. Para avançar, no entanto, precisamos compreender as convoluções.
Se quiséssemos entender as redes neurais convolutivas, basta entender grosseiramente as circunvoluções. Mas o objetivo desta série é levar-nos à fronteira das redes neurais convolutivas e explorar novas opções. Para fazer isso, teremos de entender profundamente as convoluções.
Felizmente, com alguns exemplos, a convolução torna-se uma ideia direta.
Lições de uma bola caída
Imagine que deixamos cair uma bola de alguma altura no chão, onde ela tem apenas uma dimensão de movimento. Quão provável é que uma bola vá uma distância c se você soltar e depois soltar novamente de cima do ponto em que aterrizou?
Vamos decompô-lo. Após a primeira queda, pousará a unidades do ponto de partida com a probabilidade f(a), onde f é a distribuição de probabilidade.
Agora, depois desta primeira queda, apanharemos a bola e soltamos a mesma altura acima do ponto em que primeiro caiu. A probabilidade de a bola rolar as unidades b para longe do novo ponto de partida é g(b), onde g pode ser uma distribuição de probabilidade diferente se cair de uma altura diferente.

Se corrigirmos o resultado da primeira queda, então sabemos que a bola foi a distância a, para que a bola passe para uma distância total de c, a distância percorrida na segunda queda também é corrigida em b, onde a + b = c. Portanto, a probabilidade de isso acontecer é simplesmente f (a) ⋅g (b).1
Pensemos sobre isso com um exemplo discreto específico. Queremos que a distância total c seja 3. Se a primeira vez que rola, a = 2, a segunda vez deve rolar b = 1 para alcançar nossa distância total a + b = 3. A probabilidade disso é f(2)⋅g(1).

No entanto, esta não é a única maneira de conseguir uma distância total de 3. A bola poderia rolar 1 unidades pela primeira vez, e 2 a segunda. Ou 0 unidades pela primeira vez e todas as 3 a segunda. Poderia ir qualquer a e b, desde que sumassem 3.

As probabilidades são f (1) ⋅g (2) e f (0) ⋅g (3), respectivamente.
Para encontrar a probabilidade total de que a bola alcance uma distância total de c, não podemos considerar apenas uma maneira possível de alcançar c. Em vez disso, consideramos todas as formas possíveis de dividir c em duas gotas a e b e somar a probabilidade de cada caminho.
… f (0) ⋅g (3) + f (1) ⋅g (2) + f (2) ⋅g (1) …
Nós já sabemos que a probabilidade para cada caso de a+b=c é simplesmente f(a)⋅g(b). Então, somando todas as soluções para a+b=c, podemos denotar a probabilidade total como:

Acontece, estamos fazendo uma convolução! Em particular, a convolução de f e g, desenvolvida em c é definida:

Se substituímos b=c-a, obtemos:

Esta é a definição padrão2 de convolução.
Para fazer isso um pouco mais concreto, podemos pensar nisso em termos de posições que a bola pode aterrar. Após a primeira queda, pousará em uma posição intermediária a com probabilidade f(a). Se aterrissar em a, tem probabilidade g(c-a) de aterragem em uma posição c.

Para obter a convolução, consideramos todas as posições intermediárias.

Visualizando convoluções
Há um truque muito bom que ajuda a pensar sobre convoluções com mais facilidade.
Primeiro, uma observação. Suponha que a probabilidade de uma bola ter uma certa distância x de onde começou é f(x). Então, depois, a probabilidade de iniciar uma distância x de onde desembarcou é f(-x).

Se sabemos que a bola aterra em uma posição c após a segunda queda, qual é a probabilidade de que a posição “a” seja anterior?

Portanto, a probabilidade de que a posição anterior fosse a seja g(-(a-c)) = g(c-a).
Agora, considere a probabilidade de cada posição intermediária contribuir para a bola finalmente pousar em c. Sabemos que a probabilidade de a primeira gota colocar a bola na posição intermediária a é f(a). Sabemos também que a probabilidade de ter sido em a, se aterrissar em c é g(c-a).

Somando as, temos a convolução.
A vantagem dessa abordagem é que nos permite visualizar a avaliação de uma convolução em um valor c em uma única imagem. Ao mudar a metade inferior, podemos avaliar a convolução em outros valores de c. Isso nos permite entender a convolução como um todo.
Por exemplo, podemos ver que ele pica quando as distribuições se alinham.

E encolhe quando a intersecção entre as distribuições fica menor.

Ao usar esse truque em uma animação, realmente se torna possível compreender visualmente as convoluções.
Abaixo, podemos visualizar a convolução de caixa de duas funções:
http://colah.github.io/posts/2014-07-Understanding-Convolutions/img/Wiki-BoxConvAnim.gif
Da Wikipedia
Armado com essa perspectiva, muitas coisas se tornam mais intuitivas.
Consideremos um exemplo não probabilístico. As convoluções às vezes são usadas na manipulação de áudio. Por exemplo, pode-se usar uma função com dois picos, mas zero em qualquer outro lugar, para criar um eco. À medida que a nossa função de comutação dupla desliza, um pico atinge um ponto primeiro, adicionando esse sinal ao som de saída, e mais tarde, segue outro pico, adicionando uma segunda cópia atrasada.
Convolução dimensional mais alta
As convoluções são uma ideia extremamente geral. Nós também podemos usá-las em um número maior de dimensões.
Consideremos como nosso exemplo uma bola a cair novamente. Agora, à medida que cai, é a mudança de posição não só em uma dimensão, mas em duas.

A convolução é a mesma que antes:

Exceto, agora a, b e c são vetores. Para ser mais explícito,

Ou na definição padrão:

Assim como as convoluções unidimensionais, podemos pensar em uma convolução bidimensional como deslizar uma função em cima de outra, multiplicando e adicionando.
Uma aplicação comum disso é o processamento de imagem. Podemos pensar em imagens como funções bidimensionais. Muitas transformações de imagem importantes são convoluções onde você convolve a função de imagem com uma função local muito pequena chamada “kernel”.

Da documentação do River Trail
O kernel desliza para cada posição da imagem e calcula um novo pixel como uma soma ponderada dos pixels que flutua.
Por exemplo, ao calcular a média de uma caixa de pixels de 3×3, podemos desfocar uma imagem. Para fazer isso, p nosso kernel leva o valor 1/91/9 em cada pixel na caixa,

Derivado da documentação Gimp
Nós também podemos detectar bordas, levando os valores -1 e 1 em dois pixels adjacentes e zero em qualquer outro lugar. Ou seja, nós subtraimos dois pixels adjacentes. Quando os pixels do lado a lado são semelhantes, isso nos dá aproximadamente zero. Nas bordas, no entanto, os pixels adjacentes são muito diferentes na direção perpendicular à borda.

Derivado da documentação Gimp
A documentação do gimp tem muitos outros exemplos.

Redes Neurais Convolucionais
Então, como a convolução se relaciona com as redes neurais convolutivas?
Considere uma camada convolucional 1-dimensional com entradas {xn} e saídas {yn}, como discutimos na publicação anterior:

Como observamos, podemos descrever as saídas em termos das entradas:
yn = A (xn, xn + 1, …)
Geralmente, A seria múltiplos neurônios. Mas suponha que seja um único neurônio por um momento.
Lembre-se de que um neurônio típico de uma rede neural é descrito por:
σ (w0x0 + w1x1 + w2x2 … + b)
Onde x0, x1… são as entradas. Os pesos, w0, w1,… descrevem como o neurônio se conecta às suas entradas. Um peso negativo significa que uma entrada inibe o disparo do neurônio, enquanto um peso positivo o estimula. Os pesos são o coração do neurônio, controlando o seu comportamento.3 Dizer que os neurônios múltiplos são idênticos é o mesmo que dizer que os pesos são os mesmos.
É essa fiação de neurônios, descrevendo todos os pesos e quais são idênticos, que a convolução irá lidar com nós.
Normalmente, descrevemos todos os neurônios em uma camada ao mesmo tempo, e não individualmente. O truque é ter uma matriz de peso, W:
y = σ (Wx + b)
Por exemplo, obtemos:
y0 = σ (W0,0x0 + W0,1×1 + W0,2×2 …)
y1 = σ (W1,0x0 + W1,1×1 + W1,2×2 …)
Cada linha da matriz descreve os pesos que ligam um neurônio às suas entradas.
Retornando à camada convolucional, porém, porque existem várias cópias do mesmo neurônio, aparecem muitos pesos em várias posições.

O que corresponde às equações:
y0 = σ (W0x0 + W1x1-b)
y1 = σ (W0x1 + W1x2-b)
Então, enquanto, normalmente, uma matriz de peso conecta cada entrada a cada neurônio com diferentes pesos:

A matriz para uma camada convolucional como a acima parece bastante diferente. Os mesmos pesos aparecem em muitas posições. E porque os neurônios não se conectam a muitas entradas possíveis, há muitos zeros.

Multiplicar pela matriz acima é o mesmo que convolver com [… 0, w1, w0,0 …]. A função que desliza para diferentes posições corresponde a ter neurônios nessas posições.
E as camadas convolucionais bidimensionais?

A fiação de uma camada convolucional bidimensional corresponde a uma convolução bidimensional.
Considere o nosso exemplo de usar uma convolução para detectar bordas em uma imagem, acima, deslizando um kernel ao redor e aplicando-a a cada patch. Assim, uma camada convolucional aplicará um neurônio a cada parche da imagem.
Conclusão
Introduzimos uma grande quantidade de maquinaria matemática nesta postagem do blog, mas pode não ser óbvio o que ganhamos. A convolução é, obviamente, uma ferramenta útil na teoria da probabilidade e na computação gráfica, mas o que ganhamos do fraseamento das redes neurais convolutivas em termos de convoluções?
A primeira vantagem é que temos um idioma muito poderoso para descrever a fiação de redes. Os exemplos que tratamos até agora não foram complicados o suficiente para que esse benefício se torne claro, mas as convoluções nos permitirão livrar-nos de enormes quantidades de livro desprezível para nós.
Em segundo lugar, as convoluções vêm com significativas vantagens implementacionais. Muitas bibliotecas fornecem rotinas de convolução altamente eficientes. Além disso, enquanto a convolução nativamente parece ser uma operação O (n2), usando algumas idéias matemáticas bastante profundas, é possível criar uma implementação O (nlog (n)). Vamos discutir isso em detalhes muito maiores numa publicação futura.
De fato, o uso de implementações de convolução paralela altamente eficientes em GPUs tem sido essencial ao progresso recente na visão por computador.

Próximas postagens nesta série
Esta publicação faz parte de uma série de redes neurais convolutivas e as suas generalizações. As duas primeiras postagens serão revisadas para aqueles que estão familiarizados com a aprendizagem profunda, e os mais recentes devem ser de interesse para todos. Para obter atualizações, inscreva-se no meu feed RSS!
Por favor, comente abaixo ou ao lado. Os pedidos de envio podem ser feitos no github.

Reconhecimentos
Estou extremamente grato a Eliana Lorch, pela extensa discussão de convoluções e ajuda ao escrever esta publicação.
Também agradeço Michael Nielsen e Dario Amodei pelos seus comentários e apoio.
1. Queremos a probabilidade de a bola rolar unidades a pela primeira vez e também rolar as unidades b pela segunda vez. As distribuições P (A) = f (a) e P (b) = g (b) são independentes, com ambas as distribuições centradas em 0. Então P(a,b)=P(a)*P(b)=f(a)⋅g(b).↩
2. A definição não-padrão, que não vi anteriormente, parece ter muitos benefícios. Nas postagens futuras, acharemos esta definição muito útil porque se presta à generalização para novas estruturas algébricas. Mas também tem a vantagem de que muitas propriedades algébricas de convolutions são realmente óbvias.
Por exemplo, a convolução é uma operação comutativa. Ou seja, f*g=g*f. Por quê?

A convolução também é associativa. Ou seja, (f*g)*h=f*(g*h). Por quê?

3. Há também o viés, que é o “limiar” para saber se o neurônio dispara, mas é muito mais simples e não quero desordenar esta seção a falar sobre isso.

Sobre o autor

Sara Filipa

Comentar

por: Sara Filipa

Posts recentes

Comentários

Arquivos

Categorias

Meta