A visão computacional é uma das áreas mais influentes da inteligência artificial, mudando quase todos os aspectos de nossas vidas, assim como a IA generativa. Desde análise de imagens médicas e veículos autônomos até sistemas de segurança, a visão computacional alimentada por IA é fundamental para melhorar a segurança, a eficiência e os cuidados de saúde por meio de tecnologias como detecção de objetos, reconhecimento facial e classificação de imagens.
Mas a visão computacional não está apenas agitando áreas especializadas; também faz parte dos aplicativos de consumo que usamos diariamente. Melhorando o foco da câmera, editando fotos, reconhecimento de texto em tempo real e digitalização com uma câmera de smartphone, permitindo que dispositivos domésticos inteligentes, como câmeras de segurança, detectem e alertem os usuários sobre movimentos, estimativa de pose para aplicativos de monitoramento de condicionamento físico, identificação de calorias e alimentos para aplicativos de monitoramento de dieta, identificação facial para desbloquear telefones e detecção e classificação facial para organizar fotos por pessoa em álbuns. Esses aplicativos tornaram-se parte integrante das experiências diárias de milhões de pessoas.
Fonte: Real Computer Vision de Boris Denisenko em Médio
A maioria dos engenheiros de aprendizado de máquina não constrói seus modelos do zero para dar vida a esses recursos. Em vez disso, eles contam com modelos de código aberto existentes. Embora esta seja a abordagem mais viável, já que construir um modelo do zero é proibitivamente caro, ainda há muito trabalho a ser feito antes que o modelo possa ser usado em um aplicativo.
Primeiro, o modelo de código aberto pode resolver um cenário semelhante, mas não exatamente aquele que um engenheiro precisa. Por exemplo, um engenheiro de ML pode precisar de um aplicativo que compare diferentes bebidas, mas o modelo disponível foi projetado para comparar alimentos. Embora tenha um bom desempenho com alimentos, pode ter dificuldades quando aplicado em bebidas.
Em segundo lugar, as condições do mundo real que estes modelos necessitam para funcionar diferem muitas vezes significativamente dos ambientes para os quais foram inicialmente concebidos. Por exemplo, um modelo pode ter centenas de milhões de parâmetros, tornando-o muito grande e computacionalmente intensivo para ser executado, digamos, em um smartphone. A tentativa de executar tal modelo em um dispositivo com recursos computacionais limitados leva a um desempenho lento, consumo excessivo de bateria ou falha na execução.
Adaptação a cenários e condições do mundo real
Isso, mais cedo ou mais tarde, leva a maioria dos engenheiros que aplicam aprendizado de máquina para visão computacional em aplicativos de consumo a enfrentar a necessidade de:
- Adaptar um modelo de código aberto existente para se adequar ao seu cenário específico.
- Otimizando o modelo para funcionar dentro de capacidades limitadas.
Adaptar um modelo não é algo que você possa fazer facilmente. Você começa com um modelo pré-treinado e o adapta à sua tarefa específica. Isso envolve ajustar uma infinidade de parâmetros – o número de camadas, o número de neurônios em cada camada, a taxa de aprendizado, o tamanho do lote e muito mais. O grande número de combinações possíveis pode ser impressionante, com potencialmente milhões de configurações diferentes para testar. É aqui que entra em jogo a otimização de hiperparâmetros (HPO). O HPO ajuda a agilizar esse processo, permitindo que você encontre a melhor configuração mais rapidamente do que se ajustasse manualmente os parâmetros separadamente.
Depois de adaptar o modelo ao seu cenário, o próximo desafio é fazê-lo funcionar em um dispositivo com recursos limitados. Por exemplo, pode ser necessário implantar o modelo em um smartphone com apenas 6 GB de RAM. Nesses casos, a compactação do modelo torna-se essencial para reduzir o tamanho do modelo e torná-lo gerenciável para dispositivos com memória e poder de processamento limitados.
Técnicas de otimização de hiperparâmetros (HPO)
A otimização de hiperparâmetros envolve encontrar o melhor conjunto de parâmetros para sua rede neural para minimizar erros em uma tarefa específica. Digamos que você esteja treinando um modelo para estimar a idade de uma pessoa a partir de uma foto. O erro neste contexto refere-se ao desvio da estimativa de idade do modelo em relação à idade real da pessoa – medida, digamos, no número de anos em que está errada.
Pesquisa de grade
A pesquisa em grade é um método de força bruta que encontra a combinação ideal testando todos os conjuntos possíveis de parâmetros. Você começa com um modelo existente e o adapta à sua tarefa. Em seguida, você modifica sistematicamente os parâmetros — como o número de neurônios ou camadas — para ver como essas alterações afetam o erro do modelo. A pesquisa em grade envolve testar cada combinação desses parâmetros para encontrar aquele que produz o menor erro. O desafio é que existem vários parâmetros que você pode ajustar, cada um com uma ampla gama de valores potenciais.
Embora este método garanta encontrar a melhor opção, é extremamente demorado e muitas vezes impraticável.
Pesquisa aleatória
Outra abordagem é a pesquisa aleatória, onde você amostra aleatoriamente uma porção de combinações possíveis em vez de testar todas as combinações. Este método envolve a seleção de valores aleatórios para cada parâmetro dentro de um intervalo especificado e o teste dessas combinações. Embora seja mais rápido que a pesquisa em grade, não garante o melhor resultado. No entanto, é provável que encontre uma solução boa, se não a ideal. É uma troca entre velocidade e precisão.
Por exemplo, se houver 1.000 combinações de parâmetros possíveis, você poderá amostrar e testar aleatoriamente 100, o que levaria apenas um décimo do tempo em comparação com o teste de todas as combinações.
HPO usando algoritmos de otimização
Os métodos de ajuste de hiperparâmetros baseados em otimização usam diferentes abordagens matemáticas para encontrar com eficiência as melhores configurações de parâmetros. Por exemplo, a otimização bayesiana usa modelos probabilísticos para orientar a pesquisa, enquanto o TetraOpt – um algoritmo desenvolvido pelo autor e pela equipe – emprega otimização de trem tensor para navegar melhor em espaços de alta dimensão. Esses métodos são mais eficientes que a grade ou a busca aleatória porque visam minimizar o número de avaliações necessárias para encontrar hiperparâmetros ideais, concentrando-se nas combinações mais promissoras sem testar todas as possibilidades.
Esses algoritmos de otimização ajudam a encontrar soluções melhores com mais rapidez, o que é especialmente valioso quando as avaliações de modelos são computacionalmente caras. Seu objetivo é fornecer os melhores resultados com o menor número de tentativas.
Técnicas de compressão de modelo de ML
Uma vez que um modelo funciona em teoria, executá-lo em condições reais é o próximo desafio. Tomemos, por exemplo, ResNet para reconhecimento facial, YOLO para gerenciamento de tráfego e análise esportiva ou VGG para transferência de estilo e moderação de conteúdo. Embora poderosos, esses modelos costumam ser grandes demais para dispositivos com recursos limitados, como smartphones ou câmeras inteligentes.
Os engenheiros de ML recorrem a um conjunto de técnicas de compactação testadas e comprovadas para tornar os modelos mais eficientes para tais ambientes. Esses métodos — Quantização, Poda, Decomposição de Matriz e Destilação de Conhecimento — são essenciais para reduzir o tamanho e as demandas computacionais dos modelos de IA, preservando seu desempenho.
Quantização
Fonte: Master the Art of Quantization por Jan Marcel Kezmann em Médio
A quantização é um dos métodos mais populares para compactar redes neurais, principalmente porque requer um cálculo adicional mínimo em comparação com outras técnicas.
A ideia central é simples: uma rede neural compreende inúmeras matrizes preenchidas com números. Esses números podem ser armazenados em diferentes formatos em um computador, como ponto flutuante (por exemplo, 32,15) ou inteiro (por exemplo, 4). Diferentes formatos ocupam diferentes quantidades de memória. Por exemplo, um número no formato float32 (por exemplo, 3.14) ocupa 32 bits de memória, enquanto um número no formato int8 (por exemplo, 42) ocupa apenas 8 bits.
Se os números de um modelo forem originalmente armazenados no formato float32, eles poderão ser convertidos para o formato int8. Essa mudança reduz significativamente o consumo de memória do modelo. Por exemplo, um modelo ocupando inicialmente 100 MB poderia ser compactado para apenas 25 MB após a quantização.
Poda
Conforme mencionado anteriormente, uma rede neural consiste em um conjunto de matrizes preenchidas com números, conhecidas como “pesos”. A poda é o processo de remoção dos pesos “sem importância” dessas matrizes. Ao eliminar esses pesos desnecessários, o comportamento do modelo permanece praticamente inalterado, mas os requisitos de memória e computacionais são significativamente reduzidos.
Por exemplo, imagine que uma das matrizes da rede neural se pareça com isto:
Após a poda, pode ficar mais ou menos assim:
Os traços (“-“) indicam onde os elementos foram removidos durante a poda. Este modelo simplificado requer menos recursos computacionais para operar.
Decomposição de Matriz
A decomposição de matrizes é outro método de compressão eficaz que envolve quebrar (ou “decompor”) as grandes matrizes de uma rede neural em várias matrizes menores e mais simples.
Por exemplo, digamos que uma das matrizes de uma rede neural se pareça com isto:
A decomposição de matrizes nos permite substituir esta única matriz grande por duas menores.
Quando multiplicadas entre si, essas matrizes menores dão o mesmo resultado que a original, garantindo que o comportamento do modelo permaneça consistente.
Isso significa que podemos substituir a matriz da primeira imagem pelas matrizes da segunda.
A matriz original contém 9 parâmetros, mas após a decomposição, as matrizes juntas contêm apenas 6, resultando em uma redução de aproximadamente 33%. Uma das principais vantagens deste método é o seu potencial para comprimir fortemente os modelos de IA – várias vezes em alguns casos.
É importante observar que a decomposição da matriz nem sempre é perfeitamente precisa. Às vezes, um pequeno erro de aproximação é introduzido durante o processo, mas os ganhos de eficiência muitas vezes superam esta pequena desvantagem.
Destilação de Conhecimento
A Destilação de Conhecimento é uma técnica para construir um modelo menor, conhecido como “modelo do aluno”, transferindo conhecimento de um modelo maior e mais complexo, denominado “modelo do professor”. A ideia principal é treinar o modelo menor junto com o maior para que o modelo do aluno aprenda a imitar o comportamento do modelo do professor.
Funciona assim: você passa os mesmos dados pela grande rede neural (o professor) e pela rede compactada (o aluno). Ambos os modelos produzem resultados, e o modelo do aluno é treinado para gerar resultados tão semelhantes quanto possível aos do professor. Dessa forma, o modelo compactado aprende a ter desempenho semelhante ao modelo maior, mas com menos parâmetros.
A destilação pode ser facilmente combinada com quantização, poda e decomposição matricial, onde o modelo do professor é a versão original e o aluno é a versão compactada. Essas combinações ajudam a refinar a precisão do modelo compactado.
Na prática, os engenheiros muitas vezes combinam estas técnicas para maximizar o desempenho dos seus modelos ao implementá-los em cenários do mundo real.
A IA evolui ao longo de dois caminhos paralelos. Por um lado, alimenta avanços impressionantes em áreas como a saúde, ultrapassando os limites do que pensávamos ser possível. Por outro lado, adaptar a IA às condições do mundo real é igualmente crucial, trazendo tecnologia avançada para a vida quotidiana de milhões de pessoas, muitas vezes de forma integrada e despercebida. Esta dualidade reflecte o impacto da revolução dos smartphones, que transformou a computação de algo disruptivo e dispendioso numa tecnologia acessível e prática para todos.
As técnicas de otimização abordadas neste artigo são usadas pelos engenheiros para tornar a IA uma parte tangível da vida cotidiana. Esta investigação está em curso, com grandes empresas tecnológicas (como Meta, Tesla ou Huawei) e laboratórios de investigação a investir recursos significativos na descoberta de novas formas de otimizar modelos. No entanto, técnicas de HPO e métodos de compressão bem implementados já estão ajudando engenheiros em todo o mundo a trazer os modelos mais recentes para cenários e dispositivos cotidianos, criando produtos impressionantes para milhões de pessoas hoje e impulsionando a indústria por meio de suas descobertas publicadas e de código aberto.