“Para mim é emocionante ver tantas coisas que me interessam há muito tempo juntarem-se numa explosão de progresso repentino. Desde comportamentos complexos de programas simples, até à essência da linguagem e do sentido; e também dos aspetos práticos de grandes sistemas de computadores – todos estes fazem parte da história do ChatGPT”. As palavras são do cientista Stephen Wolfram, CEO de uma empresa global de tecnologia e autor do livro O que faz o ChatGPT e como funciona, título editado em Portugal pela Casa das Letras.
No livro, o autor procura as razões subjacentes ao sucesso de ChatGPT e o que passa dentro desta “mente de IA” baseada na combinação da tecnologia neuronal mais recente, mas também agregadora de questões fundamentais sobre a linguagem. O que faz o ChatGPT e como funciona é uma história sobre Tecnologia, Ciência, assim como Filosofia, explicada de forma simples e acessível, por um autor criador de alguns dos sistemas de software mais respeitados do mundo.
O livro consiste em dois artigos que o cientista escreveu pouco depois da estreia do ChatGPT. “O primeiro é uma explicação do ChatGPT e da sua capacidade de fazer a coisa muito humana de gerar linguagem. O segundo é um olhar sobre a possibilidade do ChatGPT ser capaz de utilizar ferramentas computacionais para ir além daquilo que os humanos conseguem fazer e, em particular, de ser capaz de aproveitar os ‘superpoderes´ de conhecimentos computacionais do nosso sistema Wolfram|Alpha”, sublinha Stephen Wolfram no prefácio ao seu livro.
De O que faz o ChatGPT e como funciona publicamos um excerto:
O que é que o ChatGPT está a fazer...e porque é que funciona
Ele só adiciona uma palavra de cada vez
O facto do ChatGPT conseguir gerar algo que aparenta ser escrito por um humano é notável e inesperado. Mas como é que o faz? E como é que funciona? O meu objetivo é de dar uma ideia geral daquilo que se passa dentro do ChatGPT – e depois explorar porque é que consegue criar aquilo que podemos considerar texto com sentido. Devo dizer desde já que me vou focar no panorama geral daquilo que se passa – e apesar de mencionar alguns pormenores de engenharia, não os vou aprofundar muito. (E a essência do que vou dizer aplica-se tão bem a outros “modelos de linguagem grande” [em inglês large language model ou LLMs] atuais como ao ChatGPT).
A primeira coisa a explicar é que o ChatGPT, fundamentalmente, está a tentar produzir uma “continuação razoável” do texto que ele tenha produzido até esse momento, onde “razoável” significa “o que seria esperado escrever depois de ler o que está escrito em milhares de milhões de páginas Web, etc.”
Digamos que temos a frase: “A melhor coisa sobre inteligência artificial (IA) é a sua capacidade de”. Imaginemos analisar milhares de milhões de páginas de texto escrito por humanos (por exemplo na Internet e em livros digitalizados) e encontrar todas as instâncias desta mesma frase – e depois verificar quais palavras a sucedem e com que frequência.
O ChatGPT efetivamente faz algo deste género, exceto que (como explicarei) não o faz com texto literal; ele procura coisas que de certa forma “coincidem em significado”. Mas o resultado final que produz é uma lista ordenada de palavras que podem continuar a frase juntamente com “probabilidades”:
O mais notável é que quando o ChatGPT faz algo como escrever um ensaio, o que está, essencialmente, é perguntar-se repetidamente “dado o texto até este momento, qual deverá ser a próxima palavra?” – e adiciona uma palavra de cada vez. (Mais precisamente, como explicarei, ele adiciona um token, que pode ser apenas parte de uma palavra, e é por isso que por vezes consegue “inventar novas palavras”.)
Então, a cada passo ele obtém uma lista de palavras e as suas respetivas probabilidades. Mas qual destas é que deve ser escolhida para acrescentar ao ensaio (ou o quer que seja) que esteja a escrever? É possível pensar que devia ser a palavra “melhor classificada” (i.e. a palavra que tem a maior “probabilidade” associada). E é neste momento que começamos a ver um pouco de vudu a emergir. Porque, por alguma razão – que talvez um dia venhamos a ter conhecimento científico para a perceber –, se escolhermos sempre a palavra melhor classificada recebemos, tipicamente, um texto “sintético”, que aparenta nunca “mostrar qualquer tipo de criatividade” (e às vezes repete-se totalmente). Mas, se por vezes escolhermos palavras pior classificadas (ao acaso) temos um texto que fica “mais natural”.
O facto de existir aleatoriedade significa que, utilizando a mesma pergunta várias vezes, é provável receber respostas diferentes de cada vez. E, mantendo a ideia de vudu, existe um parâmetro chamado “temperatura” que determina com que frequência é que se recorre às palavras pior classificadas, e, para a criação de ensaios, acontece que uma “temperatura” de 0.8 aparenta ser a melhor. (É importante sublinhar que não há nenhuma teoria a ser usada para este valor; é uma questão de tentativa-erro e ver que este valor é o melhor na prática. E, por exemplo, o conceito de “temperatura” existe porque estão a ser usadas distribuições exponenciais, conhecidas da Física Estatística, mas não há nenhuma ligação “física” – pelo menos tanto quanto sabemos)
Antes de continuar, devo explicar que, para efeitos de exposição, na maior parte dos casos, não vou utilizar o sistema completo do ChatGPT; em vez disso, vou utilizar o sistema mais simples do GPT-2, que tem a característica simpática de ser pequeno o suficiente para ser capaz de correr num computador de desktop normal. Assim, para essencialmente tudo o que eu demostrar, consigo incluir código explícito em Wolfram Language que podemos correr nos computadores que temos em casa.
Por exemplo, temos aqui como obter a tabela de probabilidades acima. Primeiro temos de obter a rede neuronal “modelo de linguagem” subjacente:
Mais tarde veremos o interior desta rede neuronal e falaremos de como funciona. Mas por enquanto podemos simplesmente aplicar este “modelo de rede” como uma caixa negra ao texto que temos até agora e pedir as primeiras 5 palavras, ordenadas por probabilidade, que o modelo diz que devem continuar a frase:
Isto pega no resultado anterior e transforma-o no formato explícito “dataset”:
Se “aplicarmos o modelo” repetidamente – a cada passo adicionando a palavra que tem a melhor probabilidade (especificada neste código como a decisão do modelo) isto é o que acontece:
O que é que acontece se se prolongar mais? Neste caso (de “temperatura” zero) o que recebemos rapidamente torna-se bastante confuso e repetitivo:
E se em vez de escolhermos sempre a palavra com maior “probabilidade” escolhermos às vezes, de forma aleatória, uma das outras palavras possíveis (com uma “frequência” correspondente à “temperatura” de 0.8)? Conseguimos mais uma vez construir um texto:
Cada vez que se se faz isto, as escolhas aleatórias serão diferentes, e assim o texto será diferente – como se pode verificar nestes cinco exemplos:
É de salientar que até no primeiro passo há várias “próximas palavras” possíveis para se escolher (à “temperatura” de 0.8), no entanto as suas probabilidades caem muito rapidamente (e sim, a linha reta neste gráfico log-log corresponde a uma relação muito típica das estatísticas gerais de linguagem):
Portanto, o que acontece se continuarmos? Temos aqui um exemplo. É melhor que o método de melhor-palavra (temperatura zero), mas é, no mínimo, um bocado estranho:
Isto foi feito com o modelo mais simples do GPT-2 (de 2019). Com o modelo GPT-3, que é maior e mais recente, os resultados são melhores. Temos aqui os resultados com o método melhor-palavra (temperatura zero) gerados com a mesma “pergunta”, mas com o maior modelo do GPT-3:
E temos aqui um exemplo à “temperatura de 0.8”:
De onde vêm as probabilidades?
Portanto, o ChatGPT escolhe sempre a próxima palavra com base em probabilidades. Mas de onde vêm essas probabilidades? Comecemos com um problema mais simples. Vamos considerar gerar um texto em inglês uma letra de cada vez (em vez de ser uma palavra de cada vez). Como é que conseguimos calcular qual deve ser a probabilidade de cada letra?
Uma coisa simples que podemos fazer é utilizar um excerto em inglês e calcular a frequência de cada letra diferente. Por exemplo, este código conta as letras no artigo da Wikipédia, em inglês, sobre “Gatos” (cats):
E este para “Cães” (dogs):
Os resultados são semelhantes, mas não são iguais (“o” é sem dúvida mais comum no artigo de “dogs” porque essa letra ocorre na palavra “dogs”). Mesmo assim, se utilizássemos uma amostra de texto em inglês grande o suficiente, seriam de esperar resultados constantes:
Eis um exemplo daquilo que recebemos se só gerarmos uma sequência de letras com as probabilidades acima:
Podemos separar isto em “palavras” ao acrescentar espaços como se fossem letras com uma certa probabilidade:
Podemos fazer um trabalho ligeiramente melhor de criar “palavras”, forçando uma distribuição de “tamanho de palavras” de acordo com a que existe em inglês:
Não obtivemos nenhuma “palavra real” neste exemplo, mas os resultados estão a ficar ligeiramente melhores. No entanto, para conseguir continuar a melhorar esta ideia, temos de fazer mais do que escolher cada letra de cada vez de forma aleatória. Por exemplo sabemos que quando temos a letra “q”, a próxima letra tem de ser um “u”.
Temos aqui um gráfico com as probabilidades para as letras individuais:
E temos aqui um outro gráfico que mostra as probabilidades de pares de letras (“2-grams”) em texto em inglês. As primeiras letras possíveis estão ao longo das colunas do gráfico e as segundas ao longo das linhas:
E assim conseguimos ver, por exemplo, que a coluna do “q” está em branco (probabilidade zero) exceto na linha do “u”. Muito bem, então agora em vez de gerar as nossas “palavras” uma letra de cada vez, vamos gerá-las duas letras de cada vez, usando estas probabilidades “2-grams”. Temos aqui um exemplo do resultado – que por acaso até tem algumas “palavras reais” em inglês:
Com uma quantidade suficientemente grande de texto em inglês conseguimos estimativas bastante boas, não só para probabilidades de letras isoladas ou de pares de letras (“2-grams”), mas também para maiores quantidades de letras. E se gerarmos “palavras aleatórias” com probabilidades “n-gram” progressivamente maiores, conseguimos ver que elas ficam de forma gradual “mais realistas”:
Mas agora vamos assumir – mais ou menos como o Chat- GPT faz – que estamos a lidar com palavras inteiras, e não com letras. Existem cerca de 40.000 palavras em inglês razoavelmente comuns. E ao olhar para o corpus de texto inglês (digamos uns milhões de livros com um total de uns milhares de milhões de palavras), conseguimos uma estimativa de quão comum cada palavra é. Ao usar isto conseguimos começar a gerar “frases” em que cada palavra é escolhida independentemente e de forma aleatória, com a mesma probabilidade com que aparece no corpus. Está aqui um exemplo do que obtemos:
Não é surpreendente que isto seja absurdo. Então, como é que o conseguimos melhorar? Tal como com as palavras, podemos começar por não só ter uma probabilidade para cada palavra, mas também, probabilidades para pares, ou “–grams”, de palavras maiores. Fazendo isto para pares temos aqui cinco exemplos do que obtemos começando com a palavra “cat”:
Está a ficar ligeiramente mais “composto”. Até seria de esperar que se utilizarmos “-grams” suficientemente grandes chegaríamos àquilo que é basicamente um ChatGPT – no sentido que teríamos algo que conseguisse gerar sequências de palavras com o tamanho de um ensaio com as “probabilidades gerais de ensaios corretas”. Mas há um problema: simplesmente não existe, nem perto do suficiente, texto em inglês escrito para conseguir deduzir essas probabilidades.
Num web crawl é capaz de haver algumas centenas de milhares de milhões de palavras; em todos os livros digitalizados é capaz de haver mais uma centena de milhares de milhões de palavras. Mas para as 40.000 palavras comuns, só o número de “2-grams” possíveis já é de 1,6 milhares de milhão – e o número de “3-grams” possíveis é de 60 biliões. Portanto não há forma de estimar as probabilidades, mesmo todas as palavras a partir do todo o texto que está disponível. Quando chegamos a “excertos de ensaios” de 20 palavras, o número de possibilidades é maior que o número de partículas no universo, portanto nunca seria possível escrevê-las todas.
Portanto o que é que se pode fazer? A ideia geral é de fazer um modelo que nos possibilita estimar as probabilidades de que sequências de palavras devem ocorrer – mesmo que nós nunca as tenhamos visto explicitamente no corpus do texto utilizado. No centro do ChatGPT está precisamente um chamado “modelo de linguagem grande” (LLM) que foi construido para fazer uma boa estimativa dessas probabilidades.
Comentários