Paralelos (não tão) inusitados: O que Lev Vygotsky e a Psicologia do Aprendizado têm em comum com a Programação?

Matheus Vasconcelos
10 min readDec 11, 2023

--

Foi o psicólogo Lev Vygotsky quem afirmou que o indivíduo não tem um acesso direto aos objetos, mas um acesso mediado, fornecido por um recorte da realidade, oriundo dos mecanismos simbólicos que dispõem seu meio sociocultural.

A máquina opera de maneira similar em orientação à objetos. Ela tem um conhecimento mediado pelo programador e pelo ambiente de programação, desenvolvido por diferentes pessoas (o que pode equivaler às diferentes culturas na psicologia do aprendizado).

A noção de gerar conceitos e entendimento é determinada a priori pelo meio e impulsionado pelo mais precioso dos bens da raça humana: a linguagem.

Lev Vygotsky

Semelhanças

Da mesma forma que paramos para pensar sobre esse bem tão fundamental, imagino eu que se as máquinas pudessem nutrir esse espírito contemplativo que nós temos, é muito provável que estivessem reverenciando algumas linguagens de programação como verdadeiras obras-primas.

A confluência, aparentemente estranha, entre programação e psicologia reside na forma de absorção do conteúdo. Quando criamos um objeto em alguma linguagem de programação, estamos instanciando uma entidade que, em muitos aspectos, assemelha-se à forma como nossa mente concebe e manipula conceitos.

De acordo com os estudos de Vygotsky, queremos compartilhar de uma base conceitual comum a todos com o objetivo de nos inserirmos e entendermos cada vez mais o meio que nos cerca. Resumindo, você nasce e se adeque a uma “teoria de mundo” proposta naquele momento.

Ademais, esse compartilhamento é desejado para atender determinadas demandas sociais que esperam uma capacidade de entendimento dos objetos. Um exemplo disso é você, leitor, que busca aqui (agradeço pela confiança, inclusive) conhecimento para realizar uma prova ou adquirir mais informações para suas ideias posteriores.

Para isso, desenvolvemos a famigerada capacidade de abstração. E isso leva tempo, assim como o avanço tecnológico. Gosto de pensar que o desenvolvimento das máquinas segue um modelo similar ao nosso, com os passar das gerações. Fomos abstraindo informações, sabendo absorver aquilo que é mais importante, e se adequando ao que o mundo nos pedia.

Um algoritmo de Machine Learning, por exemplo, pode fazer tarefas de forma “burra” ou inteligente, por mais que suas intenções sejam resolver o problema.

Não é exagero dizer que o ser humano passou por momentos assim, de maneira trágica, inclusive. Me lembro que Bertrand Russell no livro “No que Acredito” define uma vida boa como “aquela inspirada pelo amor e guiada pelo conhecimento”.

Ao dar um exemplo de vida inspirada pelo amor mas com conhecimento em falta, ele mencionou que as igrejas, na época da peste negra, aglomeravam fiéis para orar e pedir à Deus que aquele mal acabasse.

Tragédia anunciada: a falta de senso gerou mais mortes, apesar das boas intenções. Faltavam dados e informações para os fiéis daquela época compreenderem que aquilo não era muito inteligente.

Pode parecer estranho, mas é mais ou menos assim que a máquina pode agir. Com um objetivo em mente, ela pode mirar num alvo, e acertar em outro completamente errado, ou então fazer uma estrada extremamente árdua para realizar uma tarefa.

Por exemplo, faltavam dados para os computadores criarem algoritmos de automação que poderiam realizar em segundos aquilo que levava horas para ser feito.

E isso se dá em qualquer esfera tecnológica. Os gráficos de jogos dos anos 90 eram toscos (embora na época parecessem incríveis), mas hoje, cada vez mais, replicamos a realidade que vivenciamos em pixels numa tela de computador.

Mãos no código

Vamos começar a unir psicologia e programação com um exemplo simples: Imagine que o cérebro da criança, em desenvolvimento e um profundo reconhecedor de padrões, seja regido pela orientação à objetos no Python. (O mecanismo é ligeiramente parecido, de toda forma, como veremos!)

Vamos supor uma criança que mora numa casa que tenha uma janela com vista para a estrada, e ela sempre observa os carros, motos, e outros veículos, inomináveis num primeiro momento pra ela, mas depois entende o que são eles, ou pelo menos sua função.

Contudo, ao enxergá-los na mesma estrada sempre fazendo as mesmas coisas (se locomovendo com alguma velocidade) ela fixa os dois conceitos (carro e moto) numa mesma categorização, que poderíamos chamar de “Veículos”, muito embora a criança não conheça tal palavra.

Dito isso, podemos resumir como funciona esse reconhecimento de padrões da criança numa primeira fase.

O cérebro dela capta uma característica comum dos veículos (carros, motos, caminhonetes, etc) e associa como responsável pela locomoção: as rodas, ou mais precisamente o número de rodas, pois quando ela ve um outro objeto, digamos, uma placa (que não possui rodas) ela percebe que tal objeto não se locomove.

Vamos simular esse entendimento, antes de adentrar na explicação psicológica, nas linhas de código em Python:

1) Primeira observação

class Veiculo():
def __init__(self, rodas):
self.rodas = rodas

def __str__(self):
if self.rodas > 0:
return f"Rodas: {self.rodas}, Pode se mover: {True}"
else:
return f"Rodas: {self.rodas}, Pode se mover: {False}"

# Simulação da criança observando veículos
carro = Veiculo(4)
moto = Veiculo(2)
bicicleta = Veiculo(2)
patinete = Veiculo(2)
placa = Veiculo(0)

veiculos = [carro, moto, bicicleta, patinete, placa]

# Resultado
for veiculo in veiculos:
print(veiculo)
Carro: Rodas : 4, Pode se mover: True
Moto: Rodas : 2, Pode se mover: True
Bicicleta: Rodas : 2, Pode se mover: True
Patinente: Rodas : 2, Pode se mover: True
Placa: Rodas : 0, Pode se mover: False

Note que a nossa criança virtual parece conseguir internalizar o conceito de se mover e atrelá-lo ao fato do objeto possuir rodas que se movem com alguma velocidade.

2) Segunda observação

Mas, numa segunda observação, ela nota uma inconsistência, um caso que ela não considerou, por falta de dados, evidentemente (observação prévia). Ela nota que um cachorro e uma pessoa se locomovem rapidamente, porém, eles não tem nenhuma “roda”, objeto esse cujo conceito a criança absorveu e o associou à atividade de se mover.

Com isso, ela instancia uma nova classe e “corrige” a anterior:

class MeiosDeLocomocao:
def __init__(self, rodas, pessoa):
self.rodas = rodas
self.pessoa = pessoa

def __str__(self):
if self.rodas > 0 or self.pessoa:
return f"Rodas: {self.rodas}, Pode se mover: {True}"
else:
return f"Rodas: {self.rodas}, Pode se mover: {False}"

class Veiculo(MeiosDeLocomocao):
pass
class Animal(MeiosDeLocomocao):
pass
class Pessoa(MeiosDeLocomocao):
pass

carro = Veiculo(4, False)
print(f"Carro: {carro}")

moto = Veiculo(2, False)
print(f"Moto: {moto}")

pessoa = Pessoa(0, True)
print(f"Pessoa: {pessoa}")

placa = Pessoa(0, False)
print(f"Placa: {placa}")
Carro: Rodas: 4, Pode se mover: True
Moto: Rodas: 2, Pode se mover: True
Pessoa: Rodas: 0, Pode se mover: True
Placa: Rodas: 0, Pode se mover: False

Agora ela consegue entender, simultaneamente, que pessoas também se locomovem, assim como veículos. Podemos até parar por aqui, sabendo que esse processo continua e a criança vai renovando seu entendimento desse mecanismo periodicamente.

Basta fornecer dados para a criança, em processo de formação de conceitos, que conseguimos fazê-la entender o que realmente acontece, ou pelo menos o que realmente se aproxima da realidade. Digo isso pois nunca nos aproximamos 100% do correto. Na verdade, num tom bem científico, nunca estamos mais certos do que antes, e sim menos errados.

A teoria de Vygotsky

A ideia de Vygotsky acerca desse aprendizado gradual foi dividir o percurso genético do desenvolvimento do pensamento conceitual em três estágios:

  1. Sincrético
  2. Pensamento por complexos
  3. Formação de conceitos (capacidade de abstração)

Em cada um deles, habita a forma pela qual a criança atua para lidar com os objetos e conceitos. Não é um desenvolvimento linear, de acordo com o próprio Vygotsky. Vamos resumir brevemente:

1) Fase Sincrética:

  • Características: Associações soltas, dependência de detalhes imediatos.
  • O que acontece: A criança agrupa coisas de maneira ampla, com base em proximidade e impressões superficiais. As associações são difusas e pouco específicas.

2) Fase Pensamento por complexos:

  • Características: Ligações práticas, foco em fatos, falta de abstração.
  • O que acontece: A criança começa a fazer ligações mais específicas e concretas. Categorias são formadas com base em similaridades observáveis. Ainda não há um pensamento abstrato completo ou lógico.

3) Fase Formação de Conceitos:

  • Características: Capacidade de abstrair características isoladas, unir e separar conceitos.
  • O que acontece: A criança desenvolve a habilidade de abstrair, separar e unir conceitos de maneira mais ampla. As categorias agora podem ser mais abstratas e menos dependentes de características externas visíveis.

A criança do nosso exemplo se encaixa em qual dessas três fases? Antes de responder, uma coisa é fundamental para que ela entenda tudo isso: os dados / informações.

Uma IA funciona não ironicamente de forma semelhante. É preciso muni-la de dados, assim como a criança teve novos dados para poder corrigir a “classe” criada anteriormente.

Há inúmeros algoritmos de reconhecimento de imagens que precisam de milhares de fotos para poder saber o que observar. Nós também temos a necessidade de observar, de absorver o que é importante para tal conceito e abstrair aquilo que nos auxiliará a lidar com o objeto na vida real.

Não vou me aprofundar totalmente no aprendizado de máquina, mas o mecanismo também é similar ao que possuímos na psicologia do aprendizado.

Em um outro texto desse blog, lembro que usei uma ideia do próprio Vygotsky, no qual ele expõe que “aula expositiva não gera aprendizagem, ela gera entendimento”. Aqui, já temos algumas diferenças para o aprendizado de máquina.

A máquina simplesmente observa milhares e até milhões de dados em alguns minutos (segundos na maioria dos casos) e consegue fornecer insights e informações importantes, algo que nós jamais conseguiríamos fazer.

Adaptando a frase usada por Vygotsky, podemos concluir que, para o aprendizado da máquina, “ela aprende sem entender” (pelo menos por enquanto, no ano de 2023!)

Pelo menos no sentido de que elas podem adquirir a capacidade de fazer previsões ou tomar decisões com base em padrões nos dados, mas não têm, por definição, uma compreensão conceitual ou consciente desses padrões.

Temos objetivamente três tipos de aprendizado de máquina:

  1. Aprendizado supervisionado
  2. Aprendizado por reforço
  3. Aprendizado não supervisionado

Agora, proponho um exercício de imaginação: e se pudermos comparar e verificar qual “representante” análogo de cada tipo de aprendizado de máquina nos tipos/fases do desenvolvimento do aprendizado?

Aprendizado supervisionado

O paralelo imediato seria mais a fase de pensamento por complexos, mas podemos considerar, na verdade, a transição entre a fase de pensamento por complexos e a fase de formação de conceitos, isso porque passamos informações de modo que a criança (ou máquina) entenda os padrões, ou seja, damos aquela ajudinha. Mas para isso, ela precisa ter a capacidade de troca de informações, para receber um dado, e, em alguns casos, tirar dúvidas.

O aprendizado supervisionado depende de rótulos, passados pelo usuário. É como se você fosse resolver um exercício da faculdade, tendo as respostas para conferir.

Por exemplo, estava eu resolvendo alguns desafios do Kaggle, plataforma de Machine Learning e ciência de dados, e me foi fornecido um conjunto de dados com “respostas”, e com base nessas respostas e seus respectivos dados correspondentes, eu consegui chegar em uma eficácia de 91%, aproximadamente.

Aprendizado por reforço

Aqui, o aprendizado é baseado na velha política de “aprenda com erros”. Há penalidades no caso de erro, e recompensas para os acertos.

Certa vez, numa feira de tecnologia, uma disputa de carrinhos robóticos criados pelos programadores tinha um princípio parecido. O carrinho precisava se manter entre as faixas que delimitavam a pista. Caso saíssem desse limite, havia uma penalidade.

Dito isso, podemos relacioná-lo analogamente à fase de pensamento por complexos. Embora alguns possam argumentar que a fase sincrética também faça sentido nessa analogia, já que algumas crianças com idade inferior a 1 ano já entendam esses mecanismos de recompensa e punição.

Então, já que unimos duas fases no tópico anterior, nesse aprendizado podemos afirmar que o correspondente ao aprendizado por reforço é a transição entre a fase sincrética e a fase de pensamento por complexos. Na fase de formação de conceitos também há esse comportamento, mas ele se inicia em fases anteriores.

Ademais, cada criança desenvolve de um jeito diferente, e mesmo na fase de pensamento por complexos, pode haver alguns resquícios da fase sincrética ou até mesmo uma antecipação do vislumbre da fase mais avançada de formação de conceitos.

Perceba que há mais um encontro entre a tecnologia e a psicologia. Skinner postulou a ideia de reforço positivo e negativo, uma espécie de aprendizado por reforço, por assim dizer, e que é algo inerente e permanente em todos nós, embora, como eu mencionei, há “picos” onde isso se desenvolve mais. Skinner descobriu isso no famoso experimento com ratos.

Não que um rato e uma máquina sejam idênticos, mas esse quesito exibe alguns padrões interessantes: se um ratinho age de uma maneira X e, consequentemente, um pedaço de queijo cai na sua frente, X se torna algo aprazível para o rato, o que reforça seu comportamento de realizar esse ato X.

O caso do carrinho na feira de tecnologia funciona de forma similar. Se ele se mantém pelo caminho, a máquina entende que aquilo é bom.

Aprendizado não supervisionado

Aqui, a máquina tem uma independência, mas não significa que ela é “mais inteligente”. Apenas que o processo pelo qual ela trabalha é diferente. Ela não precisa de rótulos.

Geralmente, as máquinas nesse tipo conseguem agrupar cluster (grupos) e entendem os padrões. Você não diz para ela o que tal coisa é, você apenas a deixa descobrir por si só. É bem parecido com a fase mais avançada de formação de conceitos. Nessa fase, Vygotsky postula que a criança já consegue abstrair conceitos e agrupá-los corretamente de acordo com um atributo.

Imagine que precisamos reconhecer algumas bandeiras de países. A máquina pode fazer isso, agrupando as semelhantes, seja por cor ou formato do desenho. Por exemplo, as bandeiras da Itália e do México podem ser agrupadas num mesmo cluster, assim como as bandeiras do Japão e da Coréia do Sul podem estar em outro cluster.

A definição lembra muito o exemplo que trouxemos no início. A criança começa a atribuir significado a partir de um atributo (ter ou não rodas). É claro que essa abstração, assim como no nosso exemplo, não é perfeita. Ainda há erros na interpretação.

Por isso, para Vygotsky, esse percurso do desenvolvimento não é linear, mas é como trajetórias (sincrético, pensamento por complexos e abstração) que se encontram em um determinado ponto do desenvolvimento.

--

--

Matheus Vasconcelos

Portfolio: https://www.kaggle.com/mhvasconcelos A Telecommunications Engineering student, passionate about science, programming, and data analysis.