Apendizagem de Máquina é Divertido: Parte 5

Aprendizagem Profunda e a Mágica das Sequências

Josenildo Costa da Silva
Machina Sapiens
16 min readMay 10, 2018

--

Nota do tradutor: Este post é uma tradução de um artigo por Adam Geitgey , de uma série de artigos originalmente em inglês. Leia a série completa original: Part 1, Part 2, Part 3, Part 4, Part 5, Part 6, Part 7 and Part 8!

Você pode ler em português a Parte 1, Parte 2, Parte 3, Parte 4, Parte 5, Parte 6, Parte 7 e Parte 8.

Nós todos conhecemos e amamos o Google Translate, o site que pode traduzir instantâneamente 100 línguas humanas diferentes como num passe de mágica. Está disponível até para celulares e smartwatches:

A tecnologia por trás do Google Translate é chamado de Tradução Automática. Ela mudou o mundo ao permitir as pessoas se comunicarem em situações que antes não era possível.

Mas todos nós já sabemos que estudantes do ensino médio tem utilizado Google Translate para … hummm … ajudá-los na sua tarefa de Inglês por mais de 15 anos. Cadê a novidade?

O fato é que nos últimos anos a aprendizagem profunda (deep learning) mudou completamente nossa abordagem para tradução automática. Pesquisadores na área de deep learning que não sabem praticamente nada sobre tradução de linguagem estão construindo soluções de aprendizagem de máquina relativamente simples que superam mundialmente os melhores sistemas desenvolvidos por especialistas.

A tecnologia por trás deste avanço é chamado aprendizado sequência-para-sequência (sequence-to-sequence). Esta é um técnica muito poderosa que pode ser utilizada para resolver muitos tipos de problemas. Depois de discutirmos como ela é utilizada para tradução, também iremos mostrar como o mesmo algoritmo pode ser utilizado para escrever chat bots inteligentes e descrever imagens.

Mão à obra!

Fazendo os Computadores Traduzirem

Como escrever um programa para traduzir línguagem humana?

A maneira mais simples é substituir cada palavra de uma sequência por uma palavra da língua alvo. Um exemplo de tradução do Inglês para o Espanhol, com esta abordagem, é dado abaixo:

Apenas substituimos cada palavra de Espanhol por uma palavra correspondente em Inglês.

Isto é fácil de implementar já que tudo o que precisamos é um dicionário onde consultar a tradução de cada palavra. Entretanto, os resultados são muito ruins pois ignora gramática e contexto.

A próxima estratégia que você pode tentar é adicionar regras específicas da língua para melhorar os resultados. Por exemplo, você pode traduzir sequências de duas palavras em grupo. Também pode trocar a ordem de substantivos e adjetivos, que aparecem frequentemente na ordem inversa em Espanhol [e Português] do que aparecem em Inglês:

Funcionou! Se continuarmos adicionando mais regras até cobrirmos toda a gramática, nosso programa vai ser capaz de traduzir qualquer frase, certo?

Era assim que os primeiros sistemas de tradução automática funcionavam. Linguistas inventavam regras complicadas e as programavam uma por uma. Alguns dos linguistas mais inteligentes do mundo trabalharam por anos durante a Guerra Fria para criar um sistema de tradução para traduzir comunicações em Russo de modo mais fácil.

Infelizmente esta abordagem só funciona em documentos muito simples e bem estruturados como boletins metereológicos. Em documentos do mundo real, não funcionou de modo confiável.

O problema é que linguagem humana não segue um conjunto fixo de regras. As linguagens humanas são cheias de casos especiais, variações regionais e repletas de exceções. O jeito que se fala Inglês [ou Português] é mais influenciado por quem invadiu quem centenas de anos atrás do que por aqueles que definem as regras da gramática.

Fazendo melhores traduções com estatística

Após a falha dos sistemas baseados em conhecimento, novas abordagens de tradução foram desenvolvidas utilizando modelos baseados em probabilidade e estatística no lugar de regras gramaticais.

Construir um sistema de tradução baseado em estatística requer uma grande quantidade de dados de treinamento contendo a exata tradução para pelo menos duas línguas. Este texto traduzido duplamente é chamado de corpora paralela (parallel corpora). Do mesmo modo que a pedra Rosetta foi utilizada por cientistas em meados de 1800 para decifrar hiéroglifos a partir do Grego, os computadores podem utilizar corpora parallela para para tentar descobrir como converter texto de uma língua para outra.

Felizmente, há uma vasta coleção de textos duplamente traduzidos nos esperando nos lugares mais estranhos. Por exemplo, o Parlamento Europeu traduz suas atas em 21 línguas. Deste modo, pesquisadores podem utilizar frequentemente estes dados para ajudá-los a construir sistemas de tradução.

Dados para treinamento é geralmente excitante! Mas este é composto apenas de milhões de linhas de áridos documentos de governo…

Pensando em probabilidades

A diferença fundamental dos sistemas de tradução estatística é que eles não tentam gerar uma tradução exata. Ao invés disto, eles geram milhares de traduções possíveis e ordenam estas traduções pela sua probabilidade de estarem corretas. A estimação de quão “correto” é o resultado se baseia no conceito de similaridade em relação aos dados de treinamento. Funciona da seguinte forma:

Passo 1: Quebre a sentença original em pedaços

Primeiro, quebramos a sentença em pedaços mais simples que possam ser traduzidos facilmente:

Passo 2: encontre todas as traduções possíveis para cada pedaço

Depois, vamos traduzir cada pedaço utilizando as todas as traduções humanas para estes pedaços no nosso conjunto de treinamento.

É importante destacar que não estamos simplesmente buscando os pedaços em um dicionário de tradução. Ao invés disso, estamos observando como pessoas reais traduziram estes mesmos pedaços em frases reais. Isto irá nos ajudar a capturar todas as diferenças de uso em seus diferentes contextos.

Mesmo as frases mais simples apresentam uma grande quantidade de traduções possíveis.

Algumas possibilidades são utilizadas com mais frequencia que outras. Podemos atribuir um score baseado na frequencia de cada tradução que aparece no nossos dados de treinamento.

Por exemplo, é muito mais comun para alguém dizer “Quiero” com sentido de “I want” do que “I try”. Assim, podemos utilizar a frequencia da tradução de “Quiero” para “I want” no conjunto de treinamento e escolher a tradução com maior peso ao invés de uma tradução menos frequente.

Passo 3: gere todas as sentenças possíveis e encontre a mais provável

Em seguida, vamos gerar todas as frases possíveis utilizando todas as combinações possíveis dos pedaços de sentenças.

Somente com as traduções dos pedaços de sentenças listados no passo 2, já é possível gerar cerca de 2.500 variações da nossa frase apenas combinando os pedaços de maneiras diferentes. Veja alguns exemplos:

I love | to leave | at | the seaside | more tidy.
I mean | to be on | to | the open space | most lovely.
I like | to be |on | per the seaside | more lovely.
I mean | to go | to | the open space | most tidy.

Em um sistema do mundo real, contudo, haverá muito mais combinações de pedaços de frases, pois tentaremos também diferentes possibilidades de ordenação das palavras nas frases.

I try | to run | at | the prettiest | open space.
I want | to run | per | the more tidy | open space.
I mean | to forget | at | the tidiest | beach.
I try | to go | per | the more tidy | seaside.

Agora é hora de vasculhar todas as sentenças geradas para encontrar uma que soe “mais humana”.

Para isto, compararemos cada sentença gerada a milhões de sentenças de livros e de matérias de jornais escritas em Inglês. Quanto mais texto em Inglês nós tivermos à disposição, melhor.

Veja esta possível tradução:

I try | to leave | per | the most lovely | open space.

Não é provável que alguém escreva um frase assim em Inglês. Portanto, ela não será similar a nenhuma frase no nosso conjunto de treinamento. Vamos dar, então, uma avaliação baixa a esta tradução.

Mas observe esta outra possível tradução:

I want | to go | to | the prettiest | beach.

Esta frase é muito similar a outras frase no nosso conjunto de treinamento. Assim, ela vai receber uma boa avaliação.

Depois de tentar todas as sentenças possíveis, vamos escolher a frase que tem os pedaços mais prováveis e que ao mesmo tempo seja o mais similar possível à sentenças reais em Inglês.

Nossa tradução final seria “I want to go to the prettiest beach.” Nada mal!

Tradução baseada em Estatística foi um Grande Marco

Sistemas de tradução automática baseada em estatística tem uma performance melhor que sistemas baseados em regras, caso haja dados de treinamento suficiente. Franz Josef Och aprimorou esta ideia e a utilizou para construir o Google Translate no início dos anos 2000. Tradução automática estava finalmente disponível para o mundo.

Na época, foi uma surpresa para todos que uma abordagem “burra” baseada em probabilidade funcionasse melhor que sistemas baseados em regras desenvolvidos por linguístas. Isto levou a um ditado (um tanto cruel) que ficou famoso entre os pesquisadores nos anos 80:

“Toda vez que eu demito um linguísta, minha acurácia aumenta.”

Frederick Jelinek

As Limitações de Tradução baseada em Estatística

Sistemas de tradução baseados em estatística funcionam bem, mas eles são complicados de construir e de manter. Cada novo par de línguas que você deseja traduzir requer especialistas para desenvolver e ajustar uma nova série de passos (pipeline) de tradução.

Como é muito trabalhoso construir estes vários pipelines, algumas escolhas tiveram que ser feitas. Se você solicitar que o Google traduza do Georgiano para o Telugo, ele primeiro traduzirá internamente para o Inglês como um passo intermediário, já que não há solicitações de traduções de Georgiano para Telugo em número suficiente que justifique um investimento neste par de línguas. Consequentemente, esta tradução pode ser realizada através de um pipeline menos avançado do que se você tivesse solicitado uma tradução mais popular, tal como do Francês para Inglês.

Não seria interessante se o computador pudesse realizar todo o trabalho de desenvolvimento para nós?

Fazendo Computadores Traduzirem Melhor — Sem pagar pessoal caro para isso

O santo graal da aprendizagem de máquina é um sistema de caixa preta que aprenda a traduzir por si mesmo — apenas observando os dados de treinamento. Com Tradução Baseada em Estatítica, humanos ainda são necessários para construir e ajustar os modelos estatísticos.

Em 2014, a equipe de Kyung Hyun Cho fez um grande avanço. Eles encontraram um modo de aplicar deep learning para construir este modelo de caixa preta. O modelo de deep learning proposto toma uma corpora paralela e a utiliza para aprender como traduzir entre estas duas línguas sem intervenção humana.

Duas grandes ideias tornaram isto possível — redes neurais recorrentes e codificação (encoding). Ao combinar estas duas ideias de modo inteligente, pode-se construir um sistema de tradução que aprende sozinho.

Redes Neurais Recorrentes

Já discutimos redes neurais recorrentes na parte 2 desta série, mas vamos fazer uma revisão rápida.

Uma rede neural normal (não-recorrente) é um algoritmo de aprendizagem de máquina de uso geral que toma uma lista de números como entrada e produz algum resultado (baseado em seu treinamento prévio). Redes neurais podem ser utilizadas como caixa preta para resolver uma grande quantidade de problemas. Por exemplo, podemos utilizar uma rede neral para calcular o valor aproximado de uma casa baseado nos seus atributos:

Redes neurais, como a maioria dos algoritmos de aprendizagem de máquina, não possuem estado (stateless). Você fornece uma lista de números e a rede calcula um resultado. Se você fornecer os mesmos números outra vez, a rede irá calcular o mesmo resultado. Ela não tem memória de cálculos passados. Em outras palavras, 2+2 será sempre 4.

Uma rede neural recorrente (RNR) é uma versão ligeiramente alterada de uma rede neural, onde o estado anterior da rede neural é uma das entradas para o próximo cálculo. Isto significa que os cálculos passados mudam o resultado de cálculos futuros!

Humanos o odeiam: o truque estranho que torna as máquinas mais espertas!

Mas para que serve isso? 2+2 não deveria ser sempre 4 independente do que já calculamos antes?

Este truque permite que a rede aprenda padrões sequenciais nos dados. Por exemplo, você pode usar RNR para prever a palavra mais provável em uma sentença baseado nas primeiras palavras:

Esta é uma maneira de implemntar um corretor automático.

RNR são úteis sempre que você precisar aprender padrões nos dados. Como línguas humanas são um grande e complexo padrão, as RNR são cada vez mais utilizadas em muitas áreas de processamento de linguagem natural.

Se você quer saber mais sobre RNR, você pode ler a parte 2 desta série, onde utilizamos uma RNR para gerar um livro falso de Ernest Hemmingway e utilizamos uma outra para gerar níveis falsos de Super Mário Brothers.

Codificação (Encodings)

A outra ideia que precisamos revisar é a de codificação (encodings). Discutimos sobre codificação na parte 4 desta série aplicado ao reconhecimento de rosto. Para explicar como funciona a codificação, vamos fazer um pequeno desvio e falar sobre como diferenciar duas pessoas utilizando um computador.

Quando se tenta diferenciar duas faces distintas com o computador, pode-se coletar medidas de cada rosto e usar as medidas para comparar os rostos. Por exemplo, Poderíamos medir o comprimento de cada orelha, ou o espaçamento entre os olhos e comparar estas medidas em duas fotografias para saber ser são da mesma pessoa.

Você provavelmente já está familiarizado com esta ideia devido a séries policiais na TV, como CSI:

Este gif do CSI é tão legal que vou utilizá-lo de novo — porque ele consegue explicar claramente a ideia mesmo sendo totalmente sem sentido.

A ideia de transformar um rosto em uma lista de medidas é um exemplo de codificação. A partir do dados original (a foto de um rosto) criamos a lista de medidas que o representa (a codificação).

Mas como já discutimos na Parte 4, não temos que inventar a lista específica de características faciais a serem mensuradas. Ao invés disso, podemos utilizar uma rede neural para gerar as medidas de um rosto. O computador pode descobrir de modo mais eficaz do nós quais são as melhores medidas para diferenciar duas pessoas similares.

Estas medidas faciais foram geradas por uma rede neural treinada para garantir que o rosto de pessoas diferentes resultem em números diferentes.

Esta é a nossa codificação. Ela nos permite representar algo realmente complicado (a foto de um rosto) através de algo simples (128 números). Com esta técnica, comparar dois rostos é muito mais fácil porque apenas temos que comparar estes 128 números para cada rosto, ao invés de comparar as imagens originais.

Sabe o que é melhor? Nós podemos fazer a mesma coisa com sentenças! Podemos inventar uma codificação que represente cada frase possível como uma série de números únicos:

Esta lista de números reprenta a frase em inglês “Machine Learning is Fun!”. Uma frase diferente seria representada por uma lista de números completamente diferente.

Para gerar esta codificação, vamos passar a frase para um RNR, uma palavra por vez. O resultado final, depois que todas as palavras forem processadas, será o valor que representa a frase toda:

Como a RNR tem “memória” de cada palavra que passou por ela, a codificação final representa todas as palavras na frase.

Excelente! Agora temos um modo de representar uma frase inteira como uma lista única de números! Não sabemos o que significa cada número na codificação, mas isto não importa realmente. Não precisamos saber exatamente como estes números foram gerados, desde que cada sentença seja representada de modo único por um conjunto de números.

Vamos Traduzir!

Até aqui, vimos como usar um RNR para codificar uma sentença como uma lista única de números. Mas como é que isto nos ajuda? Agora é que a coisa vai ficar divertida!

O que aconteceria se juntássemos duas RNR uma na outra? A primeira RNR poderia gerar uma codificação que representa uma sentença. A segunda RNR poderia receber a codificação e fazer uma lógica reversa para decodificar a frase original:

É claro que codificar e decodificar a frase original não é muito útil. E se (e aqui vai uma grande ideia!) treinássemos a segunda RNR para decodificar a sentença para Espanhol ao invés de em Inglês? Poderíamos utilizar um corpora paralelo como dados de treinamento para esta tarefa:

Desta maneira, temos um método genérico para converter sentenças do Inglês para o equivalente em Espanhol!

Esta ideia tem muito potencial:

  • Esta abordagem é limitada primariamente pela quantidade de dados de trainamento e a capacidade computacional de que você dispõe. Pesquisadores de aprendizagem de máquina inventaram esta técnica a poucos anos, mas já tem desempenho comparável a sistemas de tradução automática que levaram 20 anos para desenvolver.
  • Ela não depende de regras gramaticais de qualquer língua humana. O algoritmo descobre as regras por ele mesmo. Isto significa que você não precisa de especialistas para refinar e ajustar cada passo do seu processo de tradução. O computador faz isto pra você.
  • Esta abordagem funciona para quase todo tipo de problema sequência-para-sequência! E acontece que vários problemas interessantes são do tipo sequência-para-sequência. Continue lendo para descobrir que outras coisas bacanas é possível fazer!

Note que passamos por alto de alguns dos detalhes que são necessários para fazer isto funcionar com dados do mundo real. Por exemplo, há um trabalho adicional que você terá que fazer para lidar com tamanhos diferentes de entrada e saída (veja bucketing and padding). Há também o problema de traduzir corretamente palavras raras.

Construindo Seu Próprio Sistema de Tradução Sequência-para-Sequência

Se você deseja construir seu próprio sistema de tradução automática, há um demo incluso no TensorFlow que traduz do Inglês para o Francês. Contudo, não é para os fracos ou para os que tem pouco orçamento. Esta tecnologia ainda é nova e consome muitos recursos. Mesmo que você tenha um computador rápido com uma placa de vídeo de alto desempenho, pode tomar um mês de processamento contínuo para treinar seu próprio sistema de tradução.

Além disso, técnicas de tradução estão sendo melhoradas tão rapidamente que é dificil se manter atualizado. Muitos desenvolvimentos recentes (como por exemplo adicionar mecanismo de atenção e rastreamento de contexto) estão melhorando os resultados significativamente, mas estes desenvolvimentos são tão recentes que nem tem páginas na Wikipédia ainda. Se você quer fazer alguma coisa séria na área de aprendizagem sequência-para-sequência, terá que se manter atualizado dos novos avanços assim que eles são propostos.

O Poder dos Modelos Sequência-para-Sequência

O que dá para fazer com modelos sequência-para-sequência?

Há cerca de um ano, pesquisadores da Google demonstraram que se pode utilizar sequência-para-sequência para construir bots Inteligentes. A ideia é tão simples que é incrível ver que ela funciona.

Primeiro, eles capturaram logs de conversas entre empregados da Google e o seu time de suporte técnico. Eles, então, treinaram um modelo sequência-para-sequência onde a pergunta do empregado servia de sequência de entrada e a respota do suporte técnico servia de “tradução” para aquela sequência.

Quando um usuário interagia com o bot, ele “traduzia” cada mensagem dos usuários para obter a resposta adequada.

O resultado foi um bot semi-inteligente que podia (algumas vezes) responder perguntas técnicas reais. Veja abaixo um exemplo de conversa entre um usuário e o bot do paper deles:

Humano: conexão recusada ou algo assim
Maquina: posso saber a versão da rede que você conecta?
Humano: eu não estou muito certo se eu sei isto
Maquina: a conexão de rede está solicitando um certificado de usuário?
Humano: sim
Maquina: você está em casa ou no escritório neste momento? escritório?
Humano: eu estou em casa
Maquina: tente isto. vá para página <URL oculta> e digite o seu nome e senha
Humano: feito
Maquina: tente fazer login com <NOME oculto> e verifique se está funcionando agora
Humano: sim, agora funciona!
Maquina: ótimo. posso ajudar em mais alguma coisa?

Eles também tentaram construir um bot baseado em milhões de legendas de filmes. A ideia era utilizar conversas entre os personagens dos filmes para treinar um bot a conversar como um humano. A sentença de entrada é uma linha de diálogo dita por um personagem e a “tradução” é o que o outro personagem disse em resposta:

Os resultado são realmente interessantes. Não apenas o bot conversa como um humano, mas apresentou alguns pequenos vestígios de inteligencia:

Humano: meu nome é david. qual é meu nome?
Maquina: david.
Humano: meu nome é john. qual o meu nome?
Maquina: john.
Humano: você é um líder, ou um seguidor?
Maquina: eu sou um líder.
Humano: você é um seguidor ou um líder?
Maquina: eu sou um líder.

E isto é só o ínicio das possibilidades. Não somos limitados a converter sentenças em outras sentenças. Também é possível fazer um modelo de imagem para sequência que transforma imagens em texto!

Um time diferente na Google fez exatamente isto, substituindo a primeira RNR por uma Rede Convolutiva (como fizemos na Parte 3). Isto permite que a entrada seja uma imagem ao invés de uma sentença. O resto funciona basicamente do mesmo modo:

E simples assim, podemos transformar imagens em palavras (desde que tenhamos uma montanha de dados de treinamento!)

Andrej Karpathy partiu destas ideias e construiu um sistema capaz de descrever imagens em grandes detalhes processando multiplas regiões de uma imagens separadamente:

Imagem do paper escrito por Andrej Karpathy

Isto permite que possamos construir um motor de busca de imagens que seja capaz de encontrar imagens para consultas extremamente específicas:

Examplo do http://cs.stanford.edu/people/karpathy/deepimagesent/rankingdemo/

Há ainda pesquisadores trabalhando no problema reverso: gerar uma imagem inteira a partir de uma descrição textual!

Com estes poucos exemplo, você já pode começar a imaginar as possibilidades. Já vimos que há aplicações de sequência-para-sequência em todas as áreas de reconhecimento de voz até visão computacional. Aposto que haverá muito mais no ano que vem.

Se você quiser aprender mais sobre modelos de sequência-para-sequência e tradução, aqui estão alguns links que podem servir de ponto de partida:

Nota do autor: Se você gostou deste artigo, considere assinar a minha lista de emails Machine Learning is Fun! Só irei enviar mensagens quando eu tiver alguma coisa nova e interessante para compartilhar. Esta é a melhor maneira de ficar sabendo quando eu escrever mais artigos iguais a este.

Você pode me seguir no Twitter em @ageitgey, me enviar email diretamente ou me encontrar no linkedin. Eu vou adorar poder ajudá-lo ou a sua equipe com aprendizagem de máquina.

Agora, continue a jornada com Machine Learning is Fun! Part 6!

--

--