Além dos transformers - Neuro Symbolic AI
OK, desde 2018 a palavras transformers vem cada vez mais aparecendo no cotidiano popular. Inteligencias com ChatGPT, Copilot ou mesmo Apple Intelligence. Mas como dizia o sábio.
Para quem só usa martelo, todos os problemas são pregos.
Acredito que quem está no Tabnews já assistiu o vídeo onde o nosso querido Michael Teló da programação fez uma série de robôs para produzirem vídeos automaticamente. E para isso ele utilizou do IBM-WATSON que para mim é a melhor inteligência artificial que temos até hoje e não estamos usando o modelo de transformer.
IBM-Watson é um conjunto de algoritmos e heurísticas de AI para diversas finalidades que utiliza um tipo de Rede Neural avançada conhecida como Rede Neuro-Simbólica que é um palavreado muito grande para o processo de usar probabilidade como backend e simbologismo como frontend.
Para começar a explicar isso, precisamos voltar para a linguagem mais amada por mim. Prolog que apesar de eu não usar tanto como linguagem própria, gosto do seu motor de inferência para resolver algumas questões.
Veja, com o simbologismo conseguimos adicionar lógica via regras como por exemplo.
O que é um avó? Ele é o pai do meu pai ou o pai da minha mãe. Então um avó é o pai dos meus parentes.
No Prolog, você começa definindo alguns fatos sobre a relação de parentesco:
mae(eliza, paulo). % Eliza é mãe de Paulo
pai(joao, paulo). % João é pai de Paulo
pai(gustavo, eliza). % Gustavo é pai de Eliza
pai(jose, joao). % José é pai de João
Depois, você define regras para estabelecer como um avô é relacionado a um neto. Aqui estão as regras para isso vamos usar o sistema de parentesco.
parentes(X, Y) :- pai(X, Y). % X é pai de Y
parentes(X, Y) :- mae(X, Y). % X é mãe de Y
E com isso podemos determinar uma regra avô para determinar quem é o avó.
avo(Z, Y) :-
parentes(X, Y), % X é pai ou mãe de Y
parentes(Z, X). % Z é pai ou mãe de X
Resumidamente é o mesmo que dizer que:
Z
é avô deY
se houver umX
que é pai ou mãe deY
, eZ
é pai ou mãe deX
. Isso permite encontrar avôs através da relação de pais e filhos.
graph TD
Eliza -->|mãe| Paulo;
João -->|pai| Paulo;
Gustavo -->|pai| Eliza;
José -->|pai| João;
Só com algo simples vindo de uma linguagem de 1972 eu já consigo chegar a muita coisa como sistemas especialistas e sistemas de memória de conhecimento. Agora a AI neuro-simbólica é o mesmo que juntar isso com a "criatividade" em um modelo "vivo" que pode ser continuamente treinado.
Mas com uma Neuro-Simbólica, as abordagens se tornam virtualmente finitas. Basicamente tudo o que um computador pode fazer a IA neuro simbólica poderá fazer com algum nível de treino. Muito menos do que o convencional para gerar o modelo e realizar um fine-tuning.
Pode se tornar menos aleatória e reduzir altamente a quantidade de "alucinações" enquanto fica dezenas de vezes mais leve para computação tradicional. Sendo que um modelo mais simples seria o suficiente para dar o "start".
Com isso gostaria de terminar esse post, dizendo que o futuro não importa tanto se o passado não for condizente. Passamos mais de 70 anos estudando AI até chegar ao ponto de hoje e vamos passar mais tantos anos tentando melhora-la.
Então hoje em dia não é motivo para alarde, até porque vou repetir um milionésimo de vezes ISTO É UMA BOLHA, E BOLHAS ESTOURAM, no momento que o chatgpt, a openAI e softwares baseados em AI baterem sua lei de retornos decrescentes atingir seu limite, a bolha estoura e vamos continuar com nossas vidinhas de dev normalmente como fazemos.
O que for bom, a gente guarda na maleta, o que for ruim a gente joga fora ou busca novas soluções. Mas, a única certeza é que nem hoje e nem nunca uma tecnologia vai substituir um trabalhador do conhecimento.
Porque conhecimento é uma coisa que não pode ser automatizada.
Alan Turing em seu paper original sobre o computador já previu que teria coisas que o computador não seria capaz de fazer, e se vocês estão com a cabeça no lugar sabem que é o mesmo que dizer tem coisas que a AI não podem fazer.
Código completo em prolog para quem quiser testar um pouco
:- initialization(main).
mae(eliza, paulo). % eliza e mae de paulo
pai(joao, paulo). % joao e pai de paulo
pai(gustavo, eliza). %gustavo e pai de eliza
pai(jose, joao). %jose e pai de joao
parentes(X, Y) :- pai(X, Y).
parentes(X, Y) :- mae(X, Y).
avo(Z, Y) :-
parentes(X, Y), % X é pai ou mãe de Y
parentes(Z, X). % Z é pai ou mãe de X
main :-
findall(Z, avo(Z, paulo), Lista), % Coleta todos os avôs de Paulo
( Lista \= [] ->
write(Lista), nl
),
!.