Uma cápsula é um grupo de neurônios cujo vetor de atividade representa os parâmetros de instanciação de um tipo específico de entidade, como um objeto ou uma parte do objeto. Usamos o comprimento do vetor de atividade para representar a probabilidade de que a entidade existe e sua orientação para representar os parâmetros de instanciação. — Fonte.
A magnitude é uma propriedade especial de cada parte que deve permanecer muito alta mesmo quando um objeto está em uma orientação diferente, como mostrado abaixo.
Digamos que uma cápsula detecte a face de um gato em uma imagem e produza um vetor com magnitude de 0,9. Isso significa que ele detecta uma face com 90% de confiança.
Se considerarmos para uma imagem diferente da face desse gato, uma na qual o gato encontra-se de perfil por exemplo, a orientação do vetor de saída desta cápsula mudará. As propriedades, posição, orientação e forma da parte da face foram alteradas nesta nova imagem, e a orientação do vetor de saída muda com cada uma dessas alterações de propriedade. Essas mudanças são mudanças nas atividades neurais dentro de uma cápsula. A magnitude do vetor deve permanecer muito próxima a 0,9, já que a cápsula ainda deve ter certeza de que o rosto existe na imagem.
Ou seja, quando esses relacionamentos são agrupados à representação interna de dados, torna-se muito fácil para o modelo entender que o que ele vê é apenas outra visão de algo que ele já viu anteriormente.
Considere a imagem abaixo por exemplo. Você pode reconhecer facilmente que esta é a Estátua da Liberdade, embora todas as imagens a mostrem de diferentes ângulos.
Seu cérebro pode reconhecer facilmente que este é o mesmo objeto, embora todas as fotos sejam tiradas de ângulos diferentes. CNNs não têm esse recurso.
Isso ocorre porque a representação interna da Estátua da Liberdade em seu cérebro não depende do ângulo de visão. Você provavelmente nunca viu essas fotos exatas dele, mas ainda assim consegue perceber imediatamente o que era.
Então, por que ter uma saída vetorial em vez de um único valor? Por que a orientação é um valor útil?
O fato de a saída de uma cápsula ser um vetor, com alguma orientação, torna possível usar um poderoso mecanismo de roteamento dinâmico para garantir que a saída de uma cápsula seja enviada para a cápsula-mãe apropriada na próxima camada de cápsulas.
O roteamento dinâmico é um processo para encontrar as melhores conexões entre a saída de uma cápsula e as entradas da próxima camada de cápsulas. Ele permite que as cápsulas se comuniquem umas com as outras e determinem como os dados se movem através delas, de acordo com as mudanças em tempo real nas entradas e saídas da rede. Ou seja, não importa que tipo de imagem de entrada uma rede cápsula vê, o roteamento dinâmico garante que a saída de uma cápsula seja enviada para a cápsula pai apropriada na camada seguinte.
Exemplo de roteamento: Maxpooling
Você já deve ter visto um exemplo de processo de roteamento simples em uma rede neural convolucional. A rede convolucional extrai features de uma imagem por meio de uma camada convolucional. Em uma arquitetura CNN típica, essas informações filtradas são então passadas para uma camada de maxpooling.
Se você gostaria de relembrar qual a função da camada de pooling, pode visitar esse outro artigo aqui.
A camada maxpooling cria uma rota que ignora todos os recursos, exceto os àqueles mais “ativos” ou de alto valor na camada convolucional anterior.
Esse processo de roteamento efetuado pelas CNN’s, descarta muitas informações de pixel e produz resultados muito diferentes para imagens do mesmo objeto em orientações diferentes.
Então, como funciona o roteamento dinâmico e como ele melhora um processo de roteamento simples como o maxpooling?
Quando uma rede cápsula é inicializada, as cápsulas filhas não têm certeza de para onde suas saídas devem ir, pois atuam como entrada para a próxima camada de cápsulas pais. Na verdade, cada cápsula começa com uma lista de possíveis pais, que são todas as cápsulas pais na próxima camada. Essa possibilidade é representada por um valor chamado coeficiente de acoplamento, c, que é a probabilidade de que a saída de uma determinada cápsula vá para uma cápsula-mãe na próxima camada. Um nó filho com dois pais possíveis começará com coeficientes de acoplamento iguais para ambos (0,5).
Os coeficientes de acoplamento em todos os pais possíveis podem ser representados como uma distribuição de probabilidade discreta. Por fim, em todas as conexões entre uma cápsula filha e todas as cápsulas pai possíveis, os coeficientes de acoplamento devem somar 1.
O roteamento dinâmico é um processo iterativo que atualiza esses coeficientes de acoplamento. O processo de atualização, realizado durante o treinamento da rede, é o seguinte para uma única cápsula:
- Uma cápsula filha representa uma parte de um objeto inteiro. Cada cápsula filha produz algum vetor de saída u; sua magnitude representa a existência de uma parte e sua orientação representa a postura generalizada da parte.
- Para cada pai possível, uma cápsula filha calcula um vetor de previsão, û , que é uma função de seu vetor de saída, u, vezes uma matriz de peso, W. Você pode pensar em W como uma transformação linear — uma translação ou rotação , por exemplo, que relaciona a pose de uma parte com a pose de uma parte maior ou do objeto inteiro (por exemplo, se um nariz está apontando para a esquerda, é provável que todo o rosto do qual faz parte também esteja apontando para a esquerda). Então û é uma previsão sobre a pose de uma parte maior, representada por uma cápsula pai.
- Se o vetor de predição tem um produto escalar grande com o vetor de saída da cápsula pai, v, então esses vetores são considerados concordantes e o coeficiente de acoplamento entre aquele pai e a cápsula filha aumenta. Simultaneamente, o coeficiente de acoplamento entre aquela cápsula infantil e todos os outros pais diminui.
- Este produto escalar entre o vetor de saída pai, v, e um vetor de previsão, û, é conhecido como uma medida de concordância da cápsula.
Esse processo é chamado de roteamento por acordo. Se a orientação dos vetores de saída das cápsulas em camadas sucessivas estiver alinhada, eles concordam que devem ser acoplados e as conexões entre eles são fortalecidas. Os coeficientes de acoplamento são calculados por uma função softmax que opera sobre os acordos, a, entre cápsulas e os transforma em probabilidades tais que os coeficientes entre um filho e seus possíveis pais somam 1.
Uma Rede Capsula pode ser dividida em duas partes principais:
1 — Um codificador convolucional.
2 — Um decodificador linear totalmente conectado.
O codificador recebe a imagem de entrada e aprende como representá-la como um vetor de 16 dimensões que contém todas as informações necessárias para essencialmente renderizar a imagem.
- Camada Convolucional — detecta recursos que são posteriormente analisados pelas cápsulas. Conforme proposto no artigo, contém 256 grãos de tamanho 9x9x1.
- Camada da cápsula primária (inferior) — Esta camada é a camada da cápsula de nível inferior que descrevi anteriormente. Contém 32 cápsulas diferentes e cada cápsula aplica oitavos kernels convolucionais 9x9x256 à saída da camada convolucional anterior e produz uma saída vetorial 4D.
- Camada de cápsula de dígito (superior) — Esta camada é a camada de cápsula de nível superior para a qual as cápsulas primárias direcionariam (usando roteamento dinâmico). Esta camada produz vetores 16D que contêm todos os parâmetros de instanciação necessários para reconstruir o objeto.
O decodificador pega o vetor 16D da Digit Capsule e aprende como decodificar os parâmetros de instanciação dados em uma imagem do objeto que está detectando.
O decodificador é usado com uma função de perda de distância euclidiana para determinar o quão semelhante o recurso reconstruído é comparado ao recurso real do qual está sendo treinado. Isso garante que as cápsulas mantenham apenas informações que se beneficiarão no reconhecimento de dígitos dentro de seus vetores. O decodificador é uma rede neural de feed-forward realmente simples que é descrita abaixo.
- Camada 1: Totalmente Conectada (Densa)
- Camada 2: Totalmente conectada (Densa)
- Camada 3: Totalmente Conectada (Densa) — Resultado Final com 10 classes
Capsule Networks introduzem um novo conceito no campo da visão computacional, que pode ser utilizado no aprendizado profundo para melhor modelar relacionamentos hierárquicos dentro da representação de conhecimento interno de uma rede neural. A intuição por trás deles é muito simples e elegante.
Hinton e sua equipe propuseram uma forma de treinar essa rede composta de cápsulas e a treinaram com sucesso em um conjunto de dados simples.
No entanto, ainda existem desafios. As implementações atuais são muito mais lentas do que outros modelos modernos de aprendizado profundo. Além disso, precisamos ver se eles funcionam bem em conjuntos de dados mais difíceis e em diferentes domínios.
Selecionei alguns repositórios no Github que abordam a implementação prática das Capsules Network e estou deixando disponiveis abaixo com referências de implementação dessas redes:
Além disso tem disponível no youtube a apresentação do próprio Geoffrey Hinton sobre Capsule Networks.
Finalmente, espero que esse material tenha sido útil e faça sentido pra você, principalmente aos iniciantes. Além disso na seção de referências é possível encontrar um material muito útil utilizado para elaboração desse artigo que pode te ajudar a ampliar seus conhecimentos no tema.
Lembrando que qualquer feedback, seja positivo ou negativo é so entrar em contato através do meu twiter, linkedin ou nos comentário aqui em baixo. Obrigado 🙂