Atenção e Reduções Neurais Recorrentes Aumentadas

– https://distill.pub/2016/augmented-rnns/

CHRIS OLAH Google Brain
SHAN CARTER Google Brain
8 de setembro de 2016
Citação: Olah & Carter, 2016

As redes neurais recorrentes são um dos elementos básicos da aprendizagem profunda, permitindo que as redes neurais funcionem com sequências de dados como texto, áudio e vídeo. Podem ser usadas para ferver uma seqüência para baixo em uma compreensão de alto nível, para anotar sequências, e até mesmo para gerar novas seqüências do zero!

O design RNN básico luta com sequências mais longas, mas uma variante especial – “memória de longo e curto prazo” redes [1] – pode até funcionar com essas. Tais modelos foram encontrados para ser muito poderosos, conseguindo resultados notáveis em muitas tarefas, incluindo tradução, reconhecimento de voz e legendas de imagens. Como resultado, as redes neurais recorrentes tornaram-se muito difundidas nos últimos anos.
Como isso aconteceu, vimos um número crescente de tentativas de aumentar RNNs com novas propriedades. Quatro direções destacam-se como particularmente emocionantes:

As Máquinas de Turing Neurais possuem memória externa para as quais elas podem ler e gravar.

As Interfaces Atencionais permitem que as RNNs se concentrem em partes de sua entrada.

O tempo de computação adaptativa permite quantidades variáveis de computação por etapa.

Os programadores neurais podem chamar funções, criando programas à medida que correm.
Individualmente, essas técnicas são todas extensões potentes de RNNs, mas a coisa realmente impressionante é que elas podem ser combinadas e parecem ser apenas pontos em um espaço mais amplo. Além disso, todos eles dependem do mesmo truque subjacente – algo chamado atenção – para o trabalho.
O nosso palpite é que essas “RNNs aumentadas” terão um papel importante que desempenhar na extensão das capacidades de aprendizagem profunda nos próximos anos.

Máquinas Neurais Turing
Máquinas Neurais Turing [2] combinam um RNN com um banco de memória externo. Como os vetores são a linguagem natural das redes neurais, a memória é uma matriz de vetores:
A memória é uma matriz de vetores.
A Rede A grava e lê dessa memória cada etapa.

Mas como funciona a leitura e a escrita? O desafio é que queremos torná-los diferenciáveis. Em particular, queremos torná-los diferenciáveis em relação à localização em que lemos ou escrevemos, para que possamos aprender onde ler e escrever. Isso é complicado porque os endereços de memória parecem ser fundamentalmente discretos. Os NTMs tomam uma solução muito inteligente para isso: a cada passo, eles lêem e escrevem em todos os lugares, apenas para diferentes extensões.
Por exemplo, vamos nos concentrar em ler. Em vez de especificar um único local, o RNN produz uma “distribuição de atenção” que descreve como espalhamos a quantidade que nos preocupamos com diferentes posições de memória. Como tal, o resultado da operação de leitura é uma soma ponderada.

O RNN dá uma distribuição de atenção que descreve como espalhamos a quantidade que nos preocupamos com diferentes posições de memória.
O resultado lido é uma soma ponderada.

Da mesma forma, nós escrevemos em todos os lugares de forma diferente em diferentes extensões. Novamente, uma distribuição de atenção descreve o quanto escrevemos em cada local. Fazemos isso tendo o novo valor de uma posição na memória ser uma combinação convexa do conteúdo da memória antiga e do valor de escrita, com a posição entre os dois decidido pelo peso da atenção.

Em vez de escrever para um local, escrevemos em todos os lugares, apenas em diferentes níveis.
O RNN dá uma distribuição de atenção, descrevendo o quanto devemos mudar cada posição de memória para o valor de gravação.

Mas como as NTMs decidem quais posições na memória focam sua atenção? Eles realmente usam uma combinação de dois métodos diferentes: atenção baseada em conteúdo e atenção baseada em localização. A atenção baseada em conteúdo permite que as NTMs busquem através da sua memória e se concentrem em locais que combinam com o que eles estão à procura, enquanto a atenção baseada na localização permite o movimento relativo na memória, permitindo que o NTM se encaminhe.

Primeiro, o controlador fornece um vetor de consulta e cada entrada de memória é marcada para similaridade com a consulta.
As pontuações são então convertidas em uma distribuição usando softmax.
Em seguida, interpola a atenção do passo anterior.
Convolvemos a atenção com um filtro de mudança – isso permite que o controlador mova o seu foco.
Finalmente, aprimoramos a distribuição da atenção. Esta distribuição de atenção final é alimentada para a operação de leitura ou gravação.

Essa capacidade de leitura e gravação permite que as NTMs realizem muitos algoritmos simples, anteriormente além das redes neurais. Por exemplo, eles podem aprender a armazenar uma longa seqüência na memória e depois deslocá-la, repetindo uma e outra vez. Ao fazê-lo, podemos assistir aonde eles lêem e escrevem, para entender melhor o que estão a fazer:

Veja mais experiências em [3]. Esta figura está baseada na experiência Repeat Copy.

Eles também podem aprender a imitar uma tabela de pesquisa, ou mesmo aprender a classificar números (embora eles enganam)! Por outro lado, eles ainda não podem fazer muitas coisas básicas, como adicionar ou multiplicar números.
Desde o documento NTM original, houve vários documentos interessantes que exploram direções semelhantes. A GPU Neural [4] supera a incapacidade da NTM de adicionar e multiplicar números. Zaremba & Sutskever [5] treinam as NTMs usando aprendizagem de reforço em vez das leituras/gravações diferenciadas usadas pelo original. Neural Random Access Machines [6] trabalham em base aos ponteiros. Alguns trabalhos exploraram estruturas de dados diferenciáveis, como pilhas e filas [7, 8]. E as redes de memória [9, 10] são outra abordagem para atacar problemas semelhantes.
Em algum sentido objetivo, muitas das tarefas que esses modelos podem realizar – como aprender a adicionar números – não são tão objetivamente difíceis. A comunidade tradicional de síntese de programas os comeria para o almoço. Mas as redes neurais são capazes de muitas outras coisas, e modelos como a Neural Turing Machine parecem ter eliminado um limite muito profundo em suas habilidades.

Código
Existem várias implementações de código aberto desses modelos. As implementações de código aberto da Neural Turing Machine incluem Taehoon Kim (TensorFlow), Shawn Tan (Theano), Fumin’s (Go), Kai Sheng Tai (Torch) e Snip’s (Lasanha). O código para a publicação Neural GPU foi aberto e colocado no repositório TensorFlow Models. As implementações de código aberto da Memory Networks incluem o Facebook (Torch/Matlab), YerevaNN’s (Theano) e Taehoon Kim’s (TensorFlow).
Interfaces Atencionais
Quando eu estou a traduzir uma frase, presto especial atenção à palavra que eu estou a traduzir. Quando estou a transcrever uma gravação de áudio, escuto atentamente o segmento que estou ativamente anotando. E se você me pedir para descrever a sala na que eu estou sentado, vou olhar para os objetos que eu descrevo encuanto escrevo.
As redes neurais podem atingir esse mesmo comportamento usando a atenção, concentrando-se em parte de um subconjunto da informação que eles recebem. Por exemplo, uma RNN pode atender a saída de outra RNN. Cada passo, enfoca posições diferentes nas outras RNN.
Queremos que a atenção seja diferenciável, para que possamos aprender a focar. Para fazer isso, usamos o mesmo truque que o Neural Turing Machines usa: focamos em todos os lugares, apenas em diferentes extensões.
A Rede B concentra-se em diferentes informações da rede A em cada etapa.

A distribuição da atenção normalmente é gerada com atenção baseada em conteúdo. O RNN participante gera uma consulta descrevendo o que deseja focar. Cada item é dotado com a consulta para produzir uma pontuação, descrevendo o quão bem ela corresponde à consulta. As pontuações são alimentadas em uma softmax para criar a distribuição da atenção.
O RNN participante gera uma consulta descrevendo o que deseja focar.
Cada item é dotado com a consulta para produzir uma pontuação, descrevendo o quão bem ela corresponde à consulta. As pontuações são alimentadas em uma softmax para criar a distribuição da atenção.

Um uso da atenção entre RNNs é a tradução [11]. Um modelo de seqüência-a-sequência tradicional deve ferver a entrada inteira para baixo em um único vetor e, em seguida, expande-o novamente. A atenção evita isso ao permitir que a RNN que processe a entrada para passar informações ao longo de cada palavra que vê e, em seguida, para que a RNN gere a saída para se concentrar em palavras à medida que elas se tornam relevantes.

Diagrama derivado da Fig. 3 de Bahdanau, et al. 2014

Esse tipo de atenção entre as RNNs tem uma série de outras aplicações. Ele pode usar-se no reconhecimento de voz [12], permitindo que uma RNN processe o áudio e depois tenha outro RNN skim sobre ele, focando em partes relevantes, pois gera uma transcrição.

Figura derivada de Chan, et al. 2015

Outros usos deste tipo de atenção incluem a análise de texto [13], onde permite que o modelo olhe para as palavras, pois gera a árvore de análise e para a modelagem conversacional [14], onde permite que o modelo se centre em partes anteriores da conversa como ele gera sua resposta.
A atenção também pode ser usada na interface entre uma rede neural convolutiva e uma RNN. Isso permite que o RNN veja a posição diferente de uma imagem a cada passo. Um uso popular deste tipo de atenção é para legenda de imagens. Primeiro, um conv Net processa a imagem, extraindo recursos de alto nível. Em seguida, uma RNN se executa, gerando uma descrição da imagem. À medida que ele gera cada palavra na descrição, a RNN concentra-se na interpretação da rede de rede das partes relevantes da imagem. Podemos visualizar explicitamente isso:

Figura de [3]
Mais amplamente, as interfaces de atenção podem ser usadas sempre que se deseja interagir com uma rede neural que tenha uma estrutura de repetição em sua saída.
As interfaces de atenção foram consideradas uma técnica extremamente geral e poderosa, e estão se tornando cada vez mais difundidas.

Tempo de Computação Adaptativa
RNN padrão fazem a mesma quantidade de computação para cada etapa do tempo. Isso parece não ser intuitivo. Certamente, deveriamos pensar mais quando as coisas são difíceis? Também limita RNNs a fazer operações de O(n) para uma lista de comprimento n.
Tempo de Computação Adaptativa [15] é uma maneira para as RNNs fazer diferentes quantidades de computação em cada etapa. A ideia da imagem grande é simples: permitir que a RNN faça várias etapas de computação para cada passo do tempo.
Para que a rede possa saber quantas etapas fazer, queremos que o número de etapas seja diferenciável. Conseguimos isso com o mesmo truque que usamos antes: em vez de decidir correr por um número discreto de etapas, temos uma distribuição de atenção sobre o número de etapas a serem executadas. A saída é uma combinação ponderada das saídas de cada etapa.

Há alguns detalhes mais, que foram deixados de fora no diagrama anterior. Aqui está um diagrama completo de um passo de tempo com três etapas de computação.

Isso é um pouco complicado, então vamos trabalhar passo a passo. Em um nível alto, ainda estamos a executar o RNN e produzindo uma combinação ponderada dos estados:

O peso para cada passo é determinado por um “neurônio parado”. É um neurônio sigmóide que olha para o estado RNN e dá um peso parado, o que podemos pensar como a probabilidade de que devamos parar nesse passo.

Temos um orçamento total para os pesos de parada de 1, então acompanhamos esse orçamento ao longo do topo. Quando chega a menos de epsilon, paramos.

Quando paramos, pode ter algum restante sobre o orçamento de parada porque paramos quando ele é inferior a epsilon. O que devemos fazer com isso? Tecnicamente, está sendo dado a etapas futuras, mas não queremos computá-las, então atribuí-lo ao último passo.

Ao treinar os modelos de tempo de computação adaptativa, adiciona-se um termo “custo ponder” à função de custo. Isso penaliza o modelo pela quantidade de computação que ele usa. Quanto maior você fizer esse termo, mais irá compensar o desempenho por reduzir o tempo de computação.
O Tempo de Computação Adaptativa é uma idéia muito nova, mas acreditamos que isso, juntamente com idéias semelhantes, será muito importante.

Código
A única implementação de código aberto de tempo de computação adaptativa no momento parece ser Mark Neumann (TensorFlow).

Programador Neural
As redes neurais são excelentes em muitas tarefas, mas também lutam para fazer coisas básicas como a aritmética, que são triviais nas abordagens normais da computação. Seria muito bom ter uma maneira de fundir redes neurais com programação normal e obter o melhor dos dois mundos.
O programador neural [16] é uma abordagem para isso. Aprende a criar programas para resolver uma tarefa. Na verdade, ele aprende a gerar tais programas sem precisar de exemplos de programas corretos. Ele descobre como produzir programas como um meio para o fim de realizar alguma tarefa.
O modelo atual no documento responde perguntas sobre tabelas, gerando programas semelhantes a SQL para consultar a tabela. No entanto, há uma série de detalhes aqui que fazem que seja um pouco complicado, então vamos começar a imaginar um modelo um pouco mais simples, que é dada uma expressão aritmética e gera um programa para avaliá-lo.
O programa gerado é uma seqüência de operações. Cada operação é definida para operar na saída de operações passadas. Portanto, uma operação pode ser algo como “adicionar a saída da operação 2 passos atrás e a saída da operação 1 passo atrás”. É mais como um tubo Unix do que um programa com as variáveis sendo atribuídas e lidas.

O programa é gerado uma operação de cada vez por um controlador RNN. Em cada etapa, o controlador RNN produz uma distribuição de probabilidade para a próxima operação. Por exemplo, talvez tenhamos certeza de que queremos realizar adição no primeiro passo, então temos dificuldade em decidir se devemos multiplicar ou dividir no segundo passo e assim por diante…
Em cada etapa, o controlador RNN produz uma distribuição de probabilidade.

A distribuição resultante sobre as operações agora pode ser avaliada. Em vez de executar uma única operação em cada etapa, fazemos o truque de atenção usual para executá-los e, em seguida, a média das saídas juntas, ponderada pela probabilidade de executar essa operação.
Executamos todas as operações e a média das saídas juntas.

Enquanto podemos definir derivados através das operações, a saída do programa é diferenciável em relação às probabilidades. Podemos então definir uma perda e treinar a rede neural para produzir programas que dão a resposta correta. Desta forma, o Programador Neural aprende a produzir programas sem exemplos de bons programas. A única supervisão é a resposta que o programa deve produzir.
Essa é a idéia central do Programador Neural, mas a versão no documento responde perguntas sobre tabelas, em vez de expressões aritméticas. Existem alguns truques adicionais:
– Vários múltiplos: muitas das operações no Programador Neural lidam com tipos diferentes de números escalares. Algumas operações produzem seleções de colunas de tabela ou seleções de células. Somente as saídas do mesmo tipo são combinadas.
– Entradas de referência: O programador neural precisa responder a perguntas como “Quantas cidades têm uma população maior que 1.000.000?”, dada uma tabela de cidades com uma coluna de população. Para facilitar isso, algumas operações permitem que a rede faça referência às constantes na pergunta que estão a responder ou aos nomes das colunas. Este referenciamento acontece pela atenção, no estilo das redes de ponteiros [17].
O Programador Neural não é a única abordagem para que as redes neurais gerem programas. Outra abordagem adorável é o Neural Programmer-Interpreter [18], que pode realizar várias tarefas muito interessantes, mas requer supervisão sob a forma de programas corretos.
Pensamos que esse espaço geral, de colmatar o fosso entre a programação mais tradicional e as redes neurais é extremamente importante. Enquanto o Programador Neural não é claramente a solução final, pensamos que há muitas lições importantes para aprender com isso.
Código
A versão mais recente do Neural Programmer para responder perguntas foi aberta pelos seus autores e está disponível como um modelo TensorFlow. Há também uma implementação do Neural Programmer-Interpreter de Ken Morishita (Keras).

A grande imagem
Um humano com um pedaço de papel é, em certo sentido, muito mais inteligente do que um humano sem ele. Um humano com notação matemática pode resolver problemas que de outra forma não poderiam. O acesso aos computadores nos torna capazes de feitos incríveis que de outra forma estariam além de nós.
Em geral, parece que muitas formas interessantes de inteligência são uma interação entre a intuição heurística criativa dos seres humanos e alguma mídia mais nítida e cuidadosa, como a linguagem ou as equações. Às vezes, o meio é algo que existe fisicamente, e armazena informações para nós, nos impede cometer erros ou faz levantamento pesado computacional. Em outros casos, o meio é um modelo na nossa cabeça que manipulamos. De qualquer forma, parece fundamental para a inteligência.
Os resultados recentes na aprendizagem de máquinas começaram a ter esse sabor, combinando a intuição das redes neurais com outra coisa. Uma abordagem é o que se poderia chamar “pesquisa heurística”. Por exemplo, o AlphaGo [19] possui um modelo de como o Go funciona e explora como o jogo pode ser guiado pela intuição da rede neural. Da mesma forma, DeepMath [20] usa redes neurais como intuição para manipular expressões matemáticas. As “RNNs aumentadas” em que falamos neste artigo são outra abordagem, onde conectamos as RNNs a mídias projetadas, a fim de ampliar suas capacidades gerais.
Interagir com a mídia naturalmente envolve fazer uma seqüência de tomar uma ação, observando e tomando mais ações. Isso cria um grande desafio: como aprendemos as ações a devem ser tomadas? Isso soa como um problema de aprendizagem de reforço e certamente podemos tomar essa abordagem. Mas a literatura da aprendizagem de reforço está realmente a atacar a versão mais difícil desse problema, e as suas soluções são difíceis de usar. A coisa maravilhosa sobre a atenção é que isso nos dá uma maneira mais fácil de resolver esse problema ao tomar parcialmente todas as ações em diferentes extensões. Isso funciona porque podemos projetar mídia – como a memória NTM – para permitir ações fracionadas e ser diferenciável. A aprendizagem de reforço nos leva a tomar um único caminho, e tentar aprender com isso. A atenção leva todas as direções em um garfo e, em seguida, combina os caminhos novamente.
Uma grande fraqueza de atenção é que temos que tomar cada “ação” a cada passo. Isso faz com que o custo computacional cresça linearmente à medida que você faz coisas como aumentar a quantidade de memória em uma máquina Neural Turing. Uma coisa que você poderia imaginar fazer é ter a sua atenção esparso, de modo que você só precisa tocar algumas memórias. No entanto, ainda é desafiador, porque você pode querer fazer coisas como ter a sua atenção dependendo do conteúdo da memória, e fazer isso nativamente força você a olhar para cada memória. Vimos algumas tentativas iniciais de atacar esse problema, como [21], mas parece há que fazer muito mais. Se pudéssemos realmente fazer esse trabalho de atenção sub-linear, isso seria muito poderoso!
As redes neurais recorrentes aumentadas e a técnica subjacente de atenção são incrivelmente excitantes. Estamos ansiosos para ver o que acontece a seguir!

Reconhecimentos
Obrigado a Maithra Raghu, Dario Amodei, Cassandra Xia, Luke Vilnis, Anna Goldie, Jesse Engel, Dan Mané, Natasha Jaques, Emma Pierson e Ian Goodfellow por seus comentários e encorajamentos. Nós também estamos muito gratos a nossa equipe, o Google Brain, por terem apoiado o nosso projeto.

Referências
1. Understanding LSTM Networks  [link]
Olah, C., 2015.
2. Neural Turing Machines  [PDF]
Graves, A., Wayne, G. and Danihelka, I., 2014. CoRR, Vol abs/1410.5401.
3. Show, attend and tell: Neural image caption generation with visual attention
Xu, K., Ba, J., Kiros, R., Cho, K., Courville, A., Salakhutdinov, R., Zemel, R.S. and Bengio, Y., 2015. arXiv preprint arXiv:1502.03044, Vol 2(3), pp. 5. CoRR.
4. Neural GPUs Learn Algorithms  [PDF]
Kaiser, L. and Sutskever, I., 2015. CoRR, Vol abs/1511.08228.
5. Reinforcement Learning Neural Turing Machines  [PDF]
Zaremba, W. and Sutskever, I., 2015. CoRR, Vol abs/1505.00521.
6. Neural Random-Access Machines  [PDF]
Kurach, K., Andrychowicz, M. and Sutskever, I., 2015. CoRR, Vol abs/1511.06392.
7. Learning to Transduce with Unbounded Memory  [PDF]
Grefenstette, E., Hermann, K.M., Suleyman, M. and Blunsom, P., 2015. Advances in Neural Information Processing Systems 28, pp. 1828—1836. Curran Associates, Inc.
8. Inferring Algorithmic Patterns with Stack-Augmented Recurrent Nets  [PDF]
Joulin, A. and Mikolov, T., 2015. Advances in Neural Information Processing Systems 28, pp. 190—198. Curran Associates, Inc.
9. Memory Networks  [PDF]
Weston, J., Chopra, S. and Bordes, A., 2014. CoRR, Vol abs/1410.3916.
10. Ask Me Anything: Dynamic Memory Networks for Natural Language Processing  [PDF]
Kumar, A., Irsoy, O., Su, J., Bradbury, J., English, R., Pierce, B., Ondruska, P., Gulrajani, I. and Socher, R., 2015. CoRR, Vol abs/1506.07285.
11. Neural machine translation by jointly learning to align and translate
Bahdanau, D., Cho, K. and Bengio, Y., 2014. arXiv preprint arXiv:1409.0473.
12. Listen, Attend and Spell  [PDF]
Chan, W., Jaitly, N., Le, Q.V. and Vinyals, O., 2015. CoRR, Vol abs/1508.01211.
13. Grammar as a foreign language
Vinyals, O., Kaiser, L., Koo, T., Petrov, S., Sutskever, I. and Hinton, G., 2015. Advances in Neural Information Processing Systems, pp. 2773—2781.
14. A Neural Conversational Model  [PDF]
Vinyals, O. and Le, Q.V., 2015. CoRR, Vol abs/1506.05869.
15. Adaptive Computation Time for Recurrent Neural Networks  [PDF]
Graves, A., 2016. CoRR, Vol abs/1603.08983.
16. Neural Programmer: Inducing Latent Programs with Gradient Descent  [PDF]
Neelakantan, A., Le, Q.V. and Sutskever, I., 2015. CoRR, Vol abs/1511.04834.
17. Pointer networks
Vinyals, O., Fortunato, M. and Jaitly, N., 2015. Advances in Neural Information Processing Systems, pp. 2692—2700.
18. Neural Programmer-Interpreters  [PDF]
Reed, S.E. and Freitas, N.d., 2015. CoRR, Vol abs/1511.06279.
19. Mastering the game of Go with deep neural networks and tree search  [link]
Silver, D., Huang, A., Maddison, C.J., Guez, A., Sifre, L., Driessche, G.v.d., Schrittwieser, J., Antonoglou, I., Panneershelvam, V., Lanctot, M., Dieleman, S., Grewe, D., Nham, J., Kalchbrenner, N., Sutskever, I., Lillicrap, T., Leach, M., Kavukcuoglu, K., Graepel, T. and Hassabis, D., 2016. Nature, Vol 529(7587), pp. 484—489. Nature Publishing Group. DOI: 10.1038/nature16961
20. DeepMath – Deep Sequence Models for Premise Selection  [PDF]
Alemi, A.A., Chollet, F., Irving, G., Szegedy, C. and Urban, J., 2016. CoRR, Vol abs/1606.04442.
21. Learning Efficient Algorithms with Hierarchical Attentive Memory  [PDF]
Andrychowicz, M. and Kurach, K., 2016. CoRR, Vol abs/1602.03218.

Sobre o autor

Sara Filipa







por: Sara Filipa

Posts recentes

Comentários

Arquivos

Categorias

Meta