domingo, 14 de outubro de 2018

Avaliação Automática de Redações

No PROPOR 2018, publiquei um artigo sobre avaliação automática de redações, em parceria com a Letrus. É um assunto bem interessante do qual vou falar aqui.

Essa atividade é fazer com que uma IA dê uma uma nota para uma redação, como um avaliador humano faria, de preferência apontando onde houve possíveis erros ou más escolhas de palavras no texto. 

Vou explicar aqui um pouco como funciona e quais as limitações da IA nessa tarefa. Nós experimentamos dois models: um que modela explicitamente atributos da redação (como presença de certas palavras, contagens de verbos, substantivos, etc.) e outro que usa redes neurais (e que pode parecer muito abstrato à primeira vista).

Se achar o texto longo e quiser saber onde chegamos com isso, pode pular para as conclusões finais! Spoiler: não estamos no ponto de susbstituir corretores humanos, mas a IA é muito útil.

Critérios de Correção

No trabalho que fiz com a Letrus, lidamos com redações no formato do ENEM, o que é interessante pelos critérios de pontuação. As redações têm notas em cinco critérios, chamados de competências:
  1. Seguir a norma padrão da língua escrita; isto é, usar a gramática e ortografia corretamente
  2. Conformidade com o tipo de texto (argumentativo, quer dizer, defendendo um ponto de vista) e o tema proposto
  3. Organizar argumentos em defesa de um ponto de vista
  4. Uso de construções argumentativas no texto
  5. Elaboração de uma proposta de solução para o problema proposto
Cada um destes critérios é independente do outro - portanto, uma redação com gramática perfeita mas péssima estrutura de argumentação poderia ter nota alta na competência 1 e baixa na 4.

Além do mais, cada competência tem alguns critérios bem delineados sobre o quê desconta pontos, para tornar a correção humana padronizada. 

A IA aprende a dar notas, como de praxe, baseado em aprendizado de máquina. Isso significa que é necessário ter acesso a uma grande quantidade de redações já corrigidas, para (tentar) descobrir como se dá uma nota adequada a um texto. Mesmo com todas as regras do ENEM, dar notas é uma tarefa difícil -- basta pensar em todas as nuances e ambiguidades da língua! Portanto, via de regra, quanto mais dados disponíveis, melhor. No nosso caso, usamos mais de 50 mil redações corrigidas por humanos como base para treinar a IA.

Modelo 1 - Análise explícita de atributos

Nosso primeiro modelo funciona mais ou menos assim:


Nessa análise de PLN, extraímos uma série de atributos, como contagens de palavra por classe gramatical, quantidade de vírgulas, tamanho médio das frases, uso de palavras raras, erros gramaticais, entre outros. 

Além disso, verificamos se o texto tem algumas palavras-chave relevantes no ENEM. Por exemplo, o uso de palavras e expressões típicas da língua falada tem um impacto negativo na nota; por isso temos uma lista de expressões como você, , todo mundo

Por outro lado, o uso de certas expressões, chamadas conectivos, é esperado no começo de frases e parágrafos. Daí temos uma outra lista com expressões como dessa forma e entretanto.

Após extrair todas estas contagens e atributos, temos uma grande quantidade de números para cada redação. A última etapa é rodar um regressor, ou seja, um modelo de aprendizado de máquina capaz que mapeia um conjunto de variáveis (no nosso caso, os atributos que acabei de mencionar) a um valor alvo (a nota da redação). Na prática, treinamos cinco regressores, um para cada competência, já que elas são independentes.

"Mas qual regressor?", você pode perguntar. O modelo de regressão mais simples e difundido é o de regressão linear. Ele apenas multiplica o valor de cada atributo por um peso, soma tudo e adiciona mais um valor. O resultado dessa soma é a nota. Mesmo com essa simplicidade, a regressão linear deu bons resultados nos nossos experimentos.

Outro modelo bem mais poderoso, e que tem obtido ótimos resultados em competições do Kaggle é o Gradient Boosting. Esse é um método mais complicado, e não dá para explicar tudo aqui. Basicamente, ele treina uma árvore de decisão com partes dos dados, e em seguida, treina outra árvore para corrigir os erros da primeira. E repete isso mais uma, 10, 20, 100 vezes.

Pois bem. O Gradient Boosting deu ótimos resultados com nossas redações no ENEM. Em média, ele dá uma nota menos de 100 pontos acima ou abaixo da nota que os humanos deram. Ou seja, menos de 10% de erro, já que a nota vai de 0 a 1000. Nada mal!

Modelo 2 - Rede neural

Se você acompanha a área de PLN e aprendizado de máquina em geral, deve saber que redes neurais profundas (deep learning!) são muito comuns e eficazes hoje em dia. Por isso resolvemos também usar uma arquitetura neural no problema do ENEM. E ela tem a seguinte estrutura:


A principal diferença é que agora não precisamos definir quais são os atributos da redação! A própria rede neural aprende quais padrões dentro texto levam a notas mais altas ou mais baixas. Como isso acontece?

Explicar o funcionamento de redes neurais para PLN, incluindo uma LSTM, é bem complicado, então vou falar apenas em linhas gerais. O modelo neural enxerga cada palavra como um vetor de números (sua projeção num espaço vetorial, ou embedding), e processa uma de cada vez. Em especial, usamos uma LSTM (Long Short-Term Memory), que é um tipo de camada de rede neural capaz de aprender certas propriedades de sequências de palavras.

Conforme a LSTM lê uma frase, ela multiplica o vetor de cada palavra por uma matriz de pesos, e armazena o resultado no seu estado oculto. Esse estado oculto é mais um vetor numérico interno da LSTM, e seus valores são determinados por uma série de operações envolvendo todas as palavras lidas até o momento.

Para ficar mais interessante, usamos uma BiLSTM: é como se fosse uma LSTM que lê a frase do começo para o fim, combinada com outra que a lê do fim para o começo. Essa técnica permite obter uma representação ainda mais rica da sentença.

Depois de rodar uma BiLSTM ao longo de uma sentença inteira, temos um único vetor para ela. O que fazemos a seguir? Rodamos outra BiLSTM sobre todos os vetores de sentenças de um texto! O procedimento é o mesmo da LSTM que lê palavras. No final, chegamos a um único vetor para a redação inteira.

A partir daí, podemos treinar um regressor que aprende a pontuar essa vetor final com a nota correta da redação -- ou cinco regressores, no nosso caso. O regressor usado aqui é basicamente um regressor linear. Por que não usar um modelo mais poderoso, como o Gradient Boosting que eu ilustrei acima? Primeiro, porque precisamos de um modelo que se encaixe facilmente à arquitetura neural, que precisa da propagação de gradientes do erro. Isso é até possivelmente teoricamente com o Gradient Boosting, mas seria tão difícil a ponto de matar o benefício. Segundo porque a própria arquitetura neural já contorna uma grande limitação da regressão linear: a própria linearidade. Uma rede neural de várias camadas permite fazer muito mais associações entre os dados, o que não é o caso de um regressor linear simples.

Por fim, pusemos a funcionar nossa rede neural. O resultado geral foi um pouquinho abaixo do método anterior com o Gradient Boosting, porém, na competência 5, a rede neural teve uma clara vantagem. Interessante notar que essa é justamente a competência mais difícil de todas de se automatizar. Pra dar uma ideia: enquanto a taxa de erro (RMSE) das competências 1 a 4 é entre 25 e 30, na competência 5 ele é de 38,85 para a rede neural e 41,49 para o Gradient Boosting.

Conclusões


Funcionou bem!

Nosso trabalho com o ENEM mostrou que a IA pode ter uma excelente performance na correção automática de redações. Mais ainda: para a subjetiva competência 5, redes neurais funcionam ainda melhor que um sistema que observe a presença de diversas palavras chaves definidas previamente.

Pronto para substituir humanos?

De jeito nenhum! Estamos muito longe mesmo dessa mítica IA capaz de entender todas as nuances da comunicação humana. 

Os modelos de IA só aprendem o que já viram em seus dados de treinamento. Muitos coisas sem sentido ou excelentes argumentações podem ser escritas sem terem nenhum precedente! Nesse caso, a IA só pode tentar comparar como que já aprendeu antes. E muitas vezes não vai responder de acordo.

Mas serve para alguma coisa?

Com certeza, e muito! 

Em primeiro lugar, se quisermos chegar a uma IA mais poderosa, temos que caminhar um passo de cada vez. A IA que temos hoje é muito mais eficiente do que a de cinco anos atrás. As pesquisas que fazemos agora dão a base para próximas pesquisas trazerem cada vez mais melhorias.

E em segundo lugar, já há sim algumas utilidades práticas para a nossa IA de correção de redações. Ela pode dar feedback para estudantes que estão treinando para redação. Naturalmente, a resposta da IA não pode ser tomada como verdade inquestionável, mas uma nota muito baixa já deve chamar a atenção do aluno, ou uma nota muito alta já é um excelente sinal. 

Outra utilidade vai além da redação em si: detectar corretores humanos que dão notas muito discrepantes. Se as notas que um humano dá para redações são muito discrepantes das notas da IA, isso é um sinal de que talvez ele não esteja levando a correção muito a sério.

terça-feira, 1 de agosto de 2017

IA do Facebook desenvolveu nova linguagem e teve que ser desligada?

Recentemente, foi noticiado que uma IA desenvolvida pela equipe de pesquisa do Facebook começou a falar numa língua inventada por ela mesmo e teve de ser "desligada". A notícia em português está aqui, mas há também uma versão em inglês mais completa. Também há um artigo publicado sobre a pesquisa e um post técnico no blog do Facebook.

Vamos entender melhor essa história, além dos títulos sensacionalistas. Não há nenhuma IA inventando uma linguagem secreta para tramar a destruição da humanidade, por mais decepcionante que seja. Os pesquisadores interromperam o processo simplesmente porque o sistema tinha se tornado completamente inútil, mas logo recomeçaram com algumas alterações.


quarta-feira, 19 de julho de 2017

Usando o parser de Stanford com Python

Na última postagem, mostrei como treinar e usar o parser de Stanford com textos em português. Isso foi bastante útil para muita gente que precisa de análise sintática, mas outro ponto relevante é que muita coisa em PLN é feita em Python, enquanto o parser de Stanford é uma ferramente em Java.

Isso é bem inconveniente se você já tem ou pretende desenvolver um sistema em Python e só queria incluir o parser. Uma possível solução é fazer chamadas ao Java para rodar o parser para um determinado texto, o que até funciona. O problema é que cada chamada precisa carregar o parser em memória, o que leva um certo tempo. Esse tempo de leitura pode ser menos de um minuto dependendo do hardware, mas ao rodar com vários textos diferentes, torna-se um grande gargalo.

terça-feira, 1 de março de 2016

Treinando modelos do parser de Stanford

O Stanford CoreNLP é um conjunto de ferramentas para o processamento de línguas naturais bastante utilizado por pesquisadores e desenvolvedores. Modelos treinados para inglês para todas as funcionalidades do CoreNLP estão disponíveis para download, além de modelos para outras línguas com algumas funcionalidades. Neste post, vou mostrar como treinar um POS Tagger e um parser de dependências para o português.

sábado, 27 de abril de 2013

Palavras como vetores no espaço

Uma técnica relacionada ao Processamento de Língua Natural que tem me interessado bastante nos últimos tempos são os chamados modelos vetoriais. Sua ideia é considerar cada palavra como um vetor num espaço multi-dimensional. Na prática, significa que cada palavra pode ser entendida como uma sequência de números.

Isso pode gerar várias perguntas: Para que serve um vetor multi-dimensional? Por que usar números? De onde eles saem? 

As respostas são simples, apesar do conceito poder parecer estranho. Primeiro, explico a motivação. Esse tipo de técnica começou a ser usado já há algumas décadas, com o objetivo de facilitar técnicas de recuperação de informação, como a busca do Google ou de qualquer site da Internet. A ideia é a seguinte: para ter uma busca mais inteligente, quando se procura por uma determinada palavra, o sistema não deve buscar somente por ela, escrita exatamente da mesma forma. Em vez disso, é interessante buscar palavras relacionadas.

terça-feira, 29 de maio de 2012

Explorando a Wikipédia

A Wikipedia é um projeto admirável. Iniciada em 2001, sua versão original em inglês hoje inclui quase 4 milhões de artigos sobre os mais diversos temas. Já me ajudou em diversas ocasiões em que precisava saber alguma coisa sobre algum assunto em particular ou simplesmente matar curiosidades.

Mas além de servir para ser consultada por pessoas, a Wikipedia também tem auxiliado pesquisas em Processamento de Língua Natural. Como? Em primeiro lugar, oferecendo uma quantidade enorme de textos bem escritos (na maioria das vezes). Só isso já é útil para algumas aplicações, como os modelos de língua, que tentam determinar se uma sequência de palavras parece compor um texto real ou não. Para alcançar esse objetivo, um modelo de língua precisa ser treinado com textos. (Se você estiver se perguntando para que serve isso na prática, a resposta mais fácil é tradução automática: sistemas tradutores normalmente geram diversas versões do texto traduzido e exibem a que for melhor avaliada pelo seu modelo de língua. Mas isso já é outro assunto.) 

quarta-feira, 25 de janeiro de 2012

Involução das Línguas

Um tema relativamente comum em ficção científica são povos com tecnologias superevoluídas que viveram num passado distante e sumiram deixando apenas vestígios.

Este tema parece atrair bastante atenção dentro do gênero provavelmente por parecer irreal: normalmente a humanidade evolui em ciência e tecnologia, e não retrocede. Mas fugindo um pouco da ideia de tecnologias futurísticas, acredito que as línguas humanas se encaixam bem nessa descrição.