Os algoritmos para processamento de linguagem natural (PNL) se beneficiaram muito do amadurecimento das redes neurais recorrentes. Como a compreensão da linguagem tem um componente temporal, onde as palavras vão ganhando sentido conforme vão se concatenando em orações, frases e parágrafos (ou seja, ao longo do tempo), a estrutura das redes neurais recorrentes, desenvolvidas especificamente para processar dados temporais e manter uma memória capaz de conectar eventos passados e futuros, se mostrou mais apropriada do que os métodos computacionais anteriores. Mas ainda assim, mesmo a rede recorrente mais complexa se revelou insuficiente para modelar todas as nuances da linguagem, tendo desempenho aceitável limitado às tarefas mais simples.
O próximo grande pulo de desempenho na área foi o desenvolvimento dos chamados mecanismos de atenção, cuja implementação de maior sucesso foi na forma dos chamados transformers. Nos artigos [1] e [2], eu apresentei a ideia por trás dos transformers, que justificam porque eles são tão eficientes. Basicamente, essa inovação permitiu às redes neurais fazerem conexões entre diferentes regiões do texto, moduladas por esses mecanismos de atenção, para que regiões relativamente distantes mas relevantes entre si recebessem um tratamento diferenciado necessário à compreensão do texto. É mais ou menos como fazer uma conexão entre os eventos do capítulo 1 e do capítulo 2 de um livro para entender a trama. Os mecanismos de atenção são análogos ao conceito da memória das redes neurais recorrentes, mas com uma enorme vantagem: elas não precisam processar o texto sequencialmente, palavra por palavra, podendo receber todas as palavras de uma só vez, o que diminui o tempo de processamento já que é possível paralelizar as operações computacionais envolvidas.
A arquitetura que melhor se beneficiou do poder dos transformers foi o BERT. Sigla para Bidirectional Encoder Representations from Transformers (ou “representações bidirecionais de encoders geradas por transformers”), o modelo foi desenvolvido pelo Google em 2018. Quando de sua divulgação, ele quebrou recordes de desempenho nas mais variadas tarefas de PNL, surpreendendo os desenvolvedores da área. Pouco tempo depois, o Google liberou o código do BERT, tornando-o acessível à comunidade.
A ideia por trás do BERT pode ser separada em duas etapas. Na primeira, o modelo é treinado exaustivamente para que seja capaz de compreender uma língua, no que é chamado na área de modelagem da linguagem. Para isso, ele faz uso de duas estruturas internas na forma de um encoder e um decoder, os quais têm a tarefa tradicional de um autoencoder: ser capaz de representar o input da rede (no caso, textos) em um espaço multidimensional complexo (tarefa mais especificamente do encoder) que, nesse caso, tem a propriedade de capturar as nuances da língua necessárias à sua compreensão. Para atingir esse objetivo, o modelo é treinado com um conjunto robusto de textos, preferencialmente de natureza variada, para que de fato ele consiga “aprender a língua”. É comum ser utilizar nessa etapa uma coleção de livros e/ou todos os artigos disponíveis na Wikipedia. Os encoders e decoders do BERT possuem em sua estrutura interna implementações dos transformers, que têm a função de capturar as inter-relações entre as diferentes partes do texto que estão sendo processadas. Nessa etapa de modelagem da linguagem, o BERT é treinado não para reconstruir o texto original (como um autoencoder geralmente opera), mas com dois outros objetivos. O primeiro é prever algumas palavras que são mascaradas aleatoriamente, com uma probabilidade fixada pelo desenvolvedor. O segundo é prever se uma sentença (no caso, uma instância de dado que ele esteja processando) é sequência lógica da sentença anterior (ou seja, a instância anterior), informação disponibilizada pelo desenvolvedor já que ele alimenta o sistema não com sentenças aleatórias, mas com sentenças concatenadas em estruturas maiores como frases e parágrafos. Assim, ele é forçado a usar as palavras na proximidade da palavra mascarada, e o contexto das duas sentenças apresentadas ao modelo em sequência, para fazer a predição correspondente, e dessa forma, aprende a inferir uma palavra através do contexto da sentença onde está inserida, assim como entender as relações entre duas sentenças sequenciais. Como consequência, o BERT “aprende a língua”. É mais ou menos como nós mesmos somos capazes de completar a frase “Eu costumo [?] livros de ficção nas minhas férias”, ou de entender que “Fora desse período, só leio material técnico” é uma sequência lógica para a primeira frase; o fazemos porque conhecemos a estrutura da língua e, mais do que isso, as ideias que a língua busca expressar.
Na segunda etapa de sua aplicação, depois que o BERT já foi treinado para entender uma língua, ele pode ser usado nas tarefas mais diversas, sendo a mais simples a classificação de textos. Esse é o processo clássico de transfer learning, e trata da transferência do aprendizado genérico feito na primeira etapa para uma tarefa específica. Para isso, o modelo usa a parte do encoder, com seus parâmetros “calibrados” na tarefa genérica anterior (ou seja, converter o texto original no espaço multidimensional complexo, enquanto mantém as propriedades da língua), e depois, passa essa representação do texto para um classificador, o qual é treinado na tarefa em questão. No caso do BERT, esse classificador costuma ser uma rede neural densa simples, sem nenhuma camada escondida, mas nada impede que estruturas mais complexas sejam usadas. A aplicação do BERT não está limitada, entretanto, à classificação de textos. Ele pode também ser usado em tarefas mais complexas (quando recebe não uma sentença por vez, mas pares de sentenças) como aquela de implicação (se a primeira sentença for apresentada como premissa, a segunda pode ser considerada uma hipótese derivada?), similaridade (são as duas sentenças, ainda que escritas de forma diferente, semanticamente correspondentes?) ou para conectar perguntas e respostas (é a segunda sentença uma resposta apropriada para a primeira?).
Uma das grandes vantagens de usar atualmente o BERT para tarefas específicas é que o Google já disponibilizou modelos pré-treinados na primeira etapa, aquela de modelagem da linguagem, que costuma ser a etapa mais dispendiosa em termos de recursos computacionais. Para o inglês, existem vários tamanhos de modelo disponíveis, que variam entre si na quantidade de camadas presentes nos encoders, e na complexidade das representações em espaço multidimensional. O Google disponibiliza diferentes modelos porque, apesar de essa ser a tarefa mais onerosa, mesmo as tarefas específicas exigem recursos moderados. Apesar de haver diferenças significativas de desempenho entre o modelo menor (BERT-Tiny) e o maior (BERT-Large), pode ser que, para alguma aplicação específica, essas diferenças não tenham impacto prático, de forma que o desenvolvedor pode optar por um modelo mais simples, que requer menos recursos. Para exemplificar, o BERT-Tiny tem 2 camadas de encoder e produz representações do texto com 128 dimensões; já o BERT-Large tem 24 camadas e suas representações possuem 1024 dimensões. Além de inglês, existe um modelo específico para chinês, e outro, chamado de multilingual, que foi treinado em conjunto para representar 100 línguas diferentes (dentre elas o português). Mesmo assim, o Google encoraja que times independentes treinem o modelo em outras línguas específicas. Foi com essa motivação que a NeuralMind lançou em janeiro o BERT-Portuguese, disponível nos tamanhos Base e Large, em formato adequado para TensorFlow e PyTorch. Como era de se esperar, os modelos treinados especificamente para português têm desempenho melhor no tratamento de textos em português do que o modelo multilingual disponibilizado pelo Google.
Este artigo cobriu as principais características do BERT, seu funcionamento e algumas de suas possíveis aplicações. Fique ligado aqui no IA Expert, que em breve estaremos oferecendo um curso prático com a implementação dessa abordagem revolucionária.
bacana
Que bom que gostou 🙂