Novo algoritmo do Google entende livros inteiros

Considere as seguinte frases:

A galinha não atravessou a rua porque ela estava cansada.
A galinha não atravessou a rua porque ela estava movimentada.

Quando nós lemos as duas sentenças, facilmente deduzimos que, no primeiro caso, ela se refere à galinha, e no segundo, se refere à rua. Os algoritmos de processamento de linguagem natural precisam incorporar o conceito de memória para entender esse tipo de relação. Os primeiros modelos bem sucedidos nessa tarefa usavam arquiteturas do tipo long short-term memory (LSTM), que mantêm células para as informações que devem ser memorizadas até o final do processamento, mas que estavam limitadas a entender o contexto de uma janela de até algumas centenas de palavras. A evolução seguinte foi o desenvolvimento dos transformers, onde uma equipe do Google introduziu o conceito de atenção para permitir que o algoritmo processasse uma janela de até algumas milhares de palavras, e assim surgiram os modelos mais recentes como o BERT, que recentemente passou a alimentar o mecanismos de buscas do Google.

Aumentar a capacidade dos transformers para janelas de contexto maiores tinha algumas limitações. Em primeiro lugar, o mecanismo de atenção considera todos os pares de palavras dentro da janela, de forma que um texto de 100 mil palavras deveria calcular parâmetros para 1 bilhão (100 mil x 100 mil) de possíveis combinações. Em segundo, o modelo atual mantém na memória as saídas de todas as camadas da rede para execução do back-propagation, o que no caso de redes mais complexas, com mais camadas, pode exaurir a memória disponível rapidamente. Foi por isso que o Google trabalhou para desenvolver a próxima evolução nessa empreitada, anunciada no último dia 16 de janeiro: o Reformer.

O Reformer usa duas estratégias para alcançar janelas de contexto de até 1 milhão de palavras, que podem ser processadas com um único acelerador de 16 GB de memória. A primeira é chamada de hashing sensitivo à localidade (locality-sensitive hashing, LSH). Através desta técnica, os vetores que representam as palavras são primeiro usados para calcular uma função de hash, de forma que vetores similares (como aqueles que representam palavras similares) recebem o mesmo hash, e assim os vetores podem ser agrupados em função do hash recebido. Então, os pares de relação são determinados em cima dos hashes, e não das palavras, o que diminui consideravelmente o número de pares a serem considerados pelo mecanismo de atenção.

A segunda estratégia busca lidar com o problema de memória implementando o conceito de camadas reversíveis. Ao invés de manter todos os valores calculados na memória, essa estrutura recalcula as entradas de cada camada na hora de executar a etapa de back-propagation. Isso funciona porque, ao invés de a rede fazer modificações nos valores de forma linear, ela separa o fluxo de operações matemáticas em duas correntes, aplicando as ativações em apenas uma delas, de forma revezada. Desta forma, um desses fluxos mantém todas as transformações necessárias, mas o outro registra somente as mudanças que ocorreram no primeiro, e assim, é possível executar a rede em “modo reverso”, simplesmente subtraindo as ativações aplicadas a cada camada. A grande vantagem é que, dessa forma, as operações não precisam ficar registradas em memória, e a etapa de backpropagation pode ser realizada com os valores determinados na hora.

Essas melhorias no método fazem com que o Reformer seja capaz de processar livros inteiros, entendendo seu contexto de forma integral. Isso quer dizer que o algoritmo vai ser capaz de determinar se ela mencionada na página 517 se refere à galinha previamente mencionada na página 18, ou à rua da página 23. Impressionante, não?

O modelo está disponível para consulta e uso no Github.