Distopia Algoritmica - Parte 2: O problema das limitações
Queria começar agradecendo a todos que de tantas formas distintas têm me ajudado a dar corpo e sentido a este projeto, ter amigos que apoiam e que vêem a importância de discutir tecnologia com os pés fincados na realidade faz toda a diferença.
Sei que prometi novidades para esta edição mas alguns problemas pessoais acabaram me impossibilitando de dar alguns passos no desenvolvimento do projeto, mas não estou aqui para falar com algum ressentimento sobre isso no clima da onipresente música da Simone no final de ano ao questionar o que é que eu fiz e ainda lembrar de Hiroshima de Nagasaki. Como grande parte do site está pronto, tenho pensado em aumentar a frequência da newsletter de quinzenal para semanal, mas ainda não estou certo disso, como teste, excepcionalmente na próxima semana vou publicar mais uma edição e será sobre a disputa territorial das big techs envolta da web semântica. Por enquanto, espero que aproveitem a continuação da série sobre os problemas envolta de algoritmos inteligentes, e quem quiser e puder contribuir finaceiramente com o projeto, faz um pix:
obs.: sempre esqueço de dizer isso, por enquanto a chave é meu email pessoal: lincoln000@protonmail.com
O problema das limitações
O maior problema que vejo nas falas fantásticas e fantasiosas sobre os algoritmos inteligentes se dá unicamente pela falta de noção sobre seu funcionamento, afinal começa a se popularizar algo que antes tinha discussões puramente acadêmicas e usos quase exclusivamente científicos ou ligados à indústria ou finanças, como sistemas de análise de crédito e programas que ajudam astrônomos a identificar corpos como buracos negros a partir de dados coletados por vários satélites.
É até curioso pensar que mesmo com os algoritmos inteligentes sendo cada vez mais presentes nos aparelhos que usamos e por isso essa sensação de “progresso”, na realidade faz décadas que apenas esticamos a corda, e esse é um termo que pego emprestado da famosa trilogia de Cixin Liu, onde apesar de coisas nada a ver que fala sobre computação (ele fala como se fosse algo inteiramente dependente da física), ele define muito bem 2 momentos bem distintos do desenvolvimento científico e tecnológico:
- O salto, onde aparece uma inovação que muda radicalmente as possibilidades, cria novas áreas de pesquisa e desenvolvimento e pode até mudar a percepção que se tem sobre alguma coisa. Bom exemplo disso é o próprio Perceptron, que apesar de não ser nada como foi noticiado na época (e que falei melhor aqui), é de fato uma ruptura com as possibilidades das máquinas até então.
- Esticar a corda, que é o que corresponde à imensa maior parte do tempo, já que enquanto o salto se refere a um momento específico, o desenvolvimento tecnológico e científico a partir do tal “salto” é longo, cheio de percalços e que faz mais sentido olhar o seu desenvolvimento em seu conjunto à muitas mãos e de acordo com tendências políticas e econômicas do que com a mítica inspiração, talento e trabalhos individuais. Os produtos que usam deep learning hoje são um ótimo exemplo.
Talvez mais importante que ter essa consciência sobre diferentes momentos é enxergar as coisas como elas são: imperfeitas e limitadas, não digo que é ruim e que não serve para nada, apenas tento através deste texto colocar as coisas em seu lugar: se há progresso em tornar uma aplicação viável é porque antes era inviável e se há desenvolvimentos sendo feitos é porque o estágio atual ainda não é o suficiente para abraçar todas as necessidades e possibilidades, é justamente sobre essas distâncias entre a publicidade que oculta a realidade em favor da utopia envolta da exaltação de empresas, e da sensação de estar vivendo o fantasioso futuro da ficção científica e a realidade da ciência por trás dos produtos vendidos como milagrosos. E sim, estamos numa estagnação.
Da origem ao uso
Um exemplo que uso a tempos é o do SIFT, em resumo o seu funcionamento se baseia em identificar contrastes e através disso fazer algo como um “círculo”(na realidade quadrado porque não tem como ser diferente numa matriz), e a partir desses pontos criamos histogramas, eles é que são usados para equiparar imagens e assim poder fazer coisas como reconhecimento facial. O grande problema disso é que apesar dos esforços para manter a assertividade e melhorias feitas no algoritmo em frameworks como o OpenCV, ele apresenta limitações intrínsecas que determinam o escopo do seu uso: é perfeito para uso pela polícia em aeroportos (ambiente controlado, imagem de frente, luz adequada, etc.) mas insuficiente para uma câmera que será colocada na rua a fim de tentar capturar o rosto da maior quantidade de pessoas possíveis em diferentes condições de iluminação e meteorológicas, com pessoas passando e seus rostos raramente ou nunca de frente, é realmente preocupante que alguém pense em usar este algoritmo dessa forma.
A falta de clareza sobre quais algoritmos usam na segurança pública e outras formas de monitoramento é um dos pontos que me preocupam, afinal é fácil falar em “o algoritmo que usamos coleta mais de 20 mil pontos biométricos”, sendo que isso nada significa sobre precisão ou qualidade dos resultados. E sim, precisamos separar uma coisa da outra, precisão tem a ver com a margem de erro, sendo erro a distância do ideal de acordo com a estatística, enquanto a qualidade dos resultados é algo mais complexo já que não basta ter um erro pequeno, é preciso funcionar bem em todas as situações propostas ao contexto de uso, por isso que, especialmente artigos acadêmicos e anúncios de empresas como Google e OpenAI podem ser tão enganosos quando colocam apenas alguns percentuais com datasets específicos, um algoritmo ter se ajustado bem a um conjunto de dados não implica necessariamente que funcionará bem em situações reais e nem que é viável devido ao seu custo computacional, isto é: de quanto ele exige de um computador para funcionar.
A falta de robustez
Para explicar o sentido de robustez aqui, preciso explicar um pouco do funcionamento interno de uma rede neural, algo básico compartilhado todos os algoritmos do tipo:
o objetivo básico de todo algoritmo de classificação (vou usar esse tipo como exemplo só por ser o que penso ser mais claro na explicação) é funcionar mais ou menos como uma função do 1º grau, e imagino que a grande maioria dos que ler este texto deve lembrar que o gráfico dessa função é só uma reta. O que precisamos fazer é pegar essa reta e encaixá-la de alguma forma num plano cartesiano de forma que separe os dados que representam os valores de entrada em grupos, mais ou menos assim:
Absolutamente tudo quando se trata de algoritmos inteligentes envolve representar os dados numericamente, isso vale para textos, imagens, voz, vídeo e o que mais imaginar. No caso da deep learning o buraco é mais embaixo: no interior das redes neurais densas e em várias camadas distintas compostas por diferentes algoritmos com diferentes finalidades, antes de chegar nessa camada que faz a real semparação entre grupos de dados, os dados são transformados para que o agrupamento seja melhorado a fim de dar mais assertividade à, neste caso, classificação.
Desenvolverei melhor isso mais à frente, mas da minha breve explicação anterior é possível compreender algumas coisas logo de cara:
- Só é possível o algoritmo funcionar com alguma margem de acerto estritamente para o que for treinado, se, por exemplo, treinar uma rede neural para identificar fotos de gatos e de cachorros; ao colocar uma foto de um pássaro ele responderá se é um gato ou cachorro, ainda que seja possível em alguns casos avaliar algo como um “nível de certeza”, isto é, o quão está dentro ou fora da região delimitada para tal grupo no plano cartesiano como o que exemplifiquei acima mas o algoritmo sempre dará uma resposta.
- Especialmente no caso da deep learning, onde há camadas de transformações sobre os dados de entrada antes de chegar de fato na classificação, leva a uma completa imprevisibilidade sobre o que afeta sua posição no “plano cartesiano” (hiperplano é o termo mais correto) em que os dados são representados, essa imprevisibilidade é explorada nos chamados ataques adversários, que é um assunto que vale a pena eu falar um pouco mais porque a existência desses ataques significa muita coisa.
Ataques adversários
Este não é um tema simples à primeira vista mas depois de se entender o básico se percebe como é até lógico.
Considero a forma mais simples de explicar usando mais uma vez o exemplo da classificação de imagens de cães e gatos. Para começar as imagens são transformadas em matrizes, afinal como eu disse, tudo tem de ser convertido a número de alguma forma, e devido a recursos dos processadores para lidar com cálculos em lote (o negócio se chama SIMD, que significa “Single instruction, multiple data”), matrizes e listas/arrays de matrizes são bem convenientes. Depois disso é a vez de colocar numa rede neural, aqui um exemplo simplificado de uma rede convolucional.
origem da imagem: Shi, Bibo & Hou, Rui & Mazurowski, Maciej & Grimm, Lars & Ren, Yinhao & Marks, Jeffrey & King, Lorraine & Maley, Carlo & Hwang, E. & Lo, Joseph. (2018). Learning better deep features for the prediction of occult invasive disease in ductal carcinoma in situ through transfer learning. 98. 10.1117/12.2293594.
Não entrarei em detalhes sobre como funciona a convolução e o maxpool, existem ótimos vídeos no youtube que explicam com a maior clareza e simplicidade, estão em inglês mas são bem intuitivos de entender, recomendo este, que é bem técnico mas que se compreende bem sem se prender tanto a representações matemáticas.
O importante é que na convolução há até a transformação do tamanho da matriz onde em teoria, o algoritmo busca ralçar características da imagem aprendidos segundo o padrão “percebido” pelo prendizado e depois disso há mais perda de dados para “filtrar” valores que não são significativos.
Na prática essa é uma forma de usar aprendizado de máquina para fazer algo como que falei lá sobre o SIFT mas de forma mais sofisticada: há um aprendizado sobre os padrões nas matrizes a fim de perceber suas características mais importantes e elimitar o resto, continuamos falando de formas de escolher “pontos” nas imagens. Compreender isso permite compreender o que na realidade são ataques adversários: é preciso vários testes para identificar o que tende a ser considerado ou não relevante em cada algoritmo treinado, ferramentas como o Captum ajudam, mas é preciso fazer uma verdadeira investigação e não apenas buscar fazer gráficos bonitos.
Como o algoritmo é como uma caixa-preta, é tudo realmente imprevisível até se começar a compreender o que foi reconhecido especificamente ao longo do treinamento, coisas como mudar apenas 1 pixel numa imagem, colocar uma camisa com a estampa de um quadro, uso de maquiagem nas bochechas para enganar algoritmos de reconhecimento facial, falei brevemente da moda anti-vigilância na primeira edição desta newsletter, e agora vocês entendem porque pode funcionar. Ressalto o “pode funcionar” porque raramente o mesmo ataque serve para 2 algoritmos dintintos ou treinados com datasets diferentes, então é improvável que alguma dessas tentativas seja de fato efetiva com alguma margem de segurança.
Mas você entende a fragilidade da “🌈 tecnologia 🌈”? Até o momento as redes convolucionais são as que melhor lidam com reconhecimento de padrões em imagens mas ainda assim, basta ter até mesmo um adesivo desses que muitas pessoas adoram colar nos notebooks colocado no lugar certo numa placa de trânsito para entender que a velocidade máxima em vez de ser 40km/h é 100km/h ou até mesmo algum lixo na rua pode fazer o veículo autônomo se confundir e ir para a contramão ou o mais absurdo: deixar de reconhecer a existência de outros carros só porque les estão carregando um sofá ou uma prancha de surf. Não falo que é assim sempre, mas há grandes margens de incerteza sobre o que é levado em conta ou não pelo algoritmo a tal ponto de haver muitas possibilidades de falhar através de coisas absolutamente sem sentido para nós, porque nós não somos IAs e IAs não pensam e nem reproduzem como nós apredemos e compreendemos as coisas.
É justamente sobre os conceitos de aprendizado que a 3ª parte dessa série sobre onde e como os algoritmos inteligentes falham. Na próxima edição deixarei de lado essa parte mais complicada e que exige certo esforço de imaginação sobre o funcionamento de uma rede para dar alguns passos dentro da teoria sobre aprendizado de máquina e porque não é justo nem faz o mínimo sentido dizer que aprende “como a gente”.