Como funcionam os sistemas de tradução

Para um bom entendimento sobre o funcionamento dos sistemas de tradução, vamos conferir um exemplo prático. Abaixo temos uma frase em português e, na sequência, a mesma frase em inglês:

“De acordo com vários autores”

“According to several authors”

Podemos, de imediato, verificar que há diferenças significativas entre elas, como por exemplo, a quantidade de palavras. Uma frase traduzida para outro idioma não terá, necessariamente, a mesma quantidade de palavras; o que nos leva a nosso primeiro problema, pois não podemos fixar um tamanho específico da entrada e dizer que esse será o mesmo tamanho da saída, considerando a quantidade de palavras.

Encoder e Decoder

Neste caso, precisamos utilizar um sistema de encoder/decoder, onde temos um número de entradas que será diferente do número de saídas: o tamanho da entrada X não será, necessariamente, igual ao tamanho da saída Y; a saída Y pode ser maior ou menor do que a entrada X. Então, como podemos resolver esse problema?

Rede Neural Recorrente em um sistema de tradução - encoder e decoder

Na rede neural recorrente acima, temos as entradas sendo utilizadas em cada caixa no encoder, assim como acontece em uma LSTM, por exemplo, como vemos em detalhes na arquitetura e no empilhamento de LSTMs.

Mas em nossa rede atual, quando chegamos na primeira caixa do decoder, não temos somente um estado passando para a próxima caixa, mas também uma saída Y que é utilizada como entrada para a próxima LSTM – a próxima entrada no próximo time step – gerando outra saída que, por sua vez, será utilizada como entrada na sequência da estrutura.

Dessa forma, visto que cada saída é utilizada como entrada para um próximo time step, podemos ter quantas caixas quisermos. Poderemos definir o tamanho da saída Y, conforme nossa necessidade, com quantas caixas forem necessárias; porque as entradas no decoder não estão dependendo da entrada X do encoder.

Não é cada entrada X que está resultando numa saída Y, pois as entradas estão sendo as próprias Y anteriores. Essa é a diferença básica e a topologia usada para sistemas de tradução.

Como, então, podemos entender o problema de tradução existente entre uma frase em português que passa a ser uma frase em inglês? Como a frase é utilizada na entrada e como se dá o processo em relação ao encoder e decoder que acabamos de ver?

Lidando com Probabilidades na saída do decoder

Podemos pensar na solução, utilizando a lógica de probabilidades.

Equação probabilidades em um sistema de tradução

Temos toda uma entrada X que é o X¹, X² até Xnˡ; sendo que cada palavra representa um time step específico até um Xnˡ, que será o tamanho de nossa entrada X. Então, há nˡ palavras e estamos interessados em saber qual é a probabilidade da nossa saída – da sentença Y – que representa o Y¹, o Y² até o Yn (aqui estamos utilizando n e nˡ porque o n não será, necessariamente, igual a nˡ).

Queremos saber, então, qual é a probabilidade de gerar uma sentença Y, de um tamanho específico, em relação à nossa entrada X que tem outro tamanho específico.

Aqui não estamos interessados na probabilidade de uma saída Y sozinha, mas a probabilidade de uma sentença inteira de várias saídas Y. Estamos interessados na probabilidade cumulativa de todas essas saídas juntas serem a melhor tradução possível, considerando, inclusive, a ordem das palavras, dado que a barra utilizada na equação, no caso de uma probabilidade, significa uma condição.

Então, qual a probabilidade de uma saída específica, dado que temos uma entrada específica.

Placas com direções a seguir - buscando um caminho

A nossa rede neural vai tentar maximizar o resultado da maior probabilidade, resultando na sentença que tem a maior probabilidade de saída, considerando a entrada informada.

Esse é o nosso objetivo com o sistema de tradução: encontrar qual é a sentença que tem a maior probabilidade de ser a melhor tradução para uma outra sentença que foi indicada na entrada.

E para essa sentença de saída, podemos imaginar que existem muitas combinações possíveis. Como elas podem ter diferentes tamanhos, podemos traduzir uma frase usando diferentes palavras.

Pode-se utilizar uma tradução direta de palavra a palavra ou combinar duas palavras e agrupá-las numa palavra só, dentre outras combinações possíveis.

No próprio inglês temos, por exemplo, os phrasal verbs – palavras em que uma só palavra representa duas palavras em português, ou vice-versa. Então a rede neural precisa considerar todas essas situações, buscando encontrar a sentença completa que melhor traduz a sentença em outro idioma.

Palavra por palavra?

Conforme estamos destacando, é importante observar que não existe uma comparação palavra por palavra, não havendo uma saída específica para cada palavra na entrada.

O sistema não buscará traduzir uma palavra para depois traduzir a outra, e assim por diante. É evidente que dessa forma a tradução não teria muita qualidade, dado que os idiomas não têm uma correspondência direta, palavra a palavra.

Por este motivo se utiliza esta alternativa muito mais genérica: uma sentença inteira que irá gerar outra sentença inteira.

E como isso acontece na prática? Existem várias técnicas que podem ser aplicadas neste problema: podemos utilizar greedy Search, técnicas opostas ao greedy search, ou ainda opções que computacionalmente nos garantem velocidade, como beam search.

Em nosso Curso Aprendizado por Reforço, Algoritmos Genéticos, NLP e GANs vemos em detalhes tanto a teoria quanto a prática necessárias no desenvolvimento de um sistema de tradução, sempre focando no aprendizado do aluno, com didática e objetividade.

É um curso imperdível onde você vai aprender tudo que há de mais avançado no mundo do deep learning!

Leia também:

cursos