Photo by Shubham Dhage on Unsplash

Eficiência em Redes Neurais: Entendendo a quantização

Edmar Miyake
TaqtileBR
Published in
9 min readJun 26, 2024

--

A quantização visa resolver um problema: as redes neurais modernas são compostas por milhões, se não bilhões, de parâmetros. Por exemplo, o menor modelo GPT-3 tem 7 bilhões de parâmetros. Se cada parâmetro for de 32 bits, precisaremos de 28 GB apenas para armazenar os parâmetros no disco.

Além disso, ao inferir o modelo, precisamos carregar todos os parâmetros do modelo na memória. Se estivermos usando a CPU para inferência, precisamos carregá-los na RAM; se estivermos usando a GPU, precisamos carregá-los na memória da GPU. Claro, modelos grandes não podem ser facilmente carregados em um PC padrão ou dispositivo pequeno, como um smartphone.

Assim como os humanos, os computadores são mais lentos para computar operações de ponto flutuante em comparação com operações inteiras. Por exemplo, se você tentar fazer mentalmente a multiplicação de 3 por 6 e também 2,98 por 5,948, certamente será muito mais rápido na multiplicação de 3 por 6.

Para mitigar esse processamento maior, uma alternativa é a quantização.

A quantização visa reduzir a quantidade de bits necessários para representar cada parâmetro, geralmente convertendo números de ponto flutuante em inteiros. Desta forma, por exemplo, um modelo que normalmente ocupa muitos gigabytes pode ser comprimido para um tamanho muito menor.

Observe que quantização não significa apenas arredondar todos os números de ponto flutuante para o inteiro mais próximo.

A quantização também pode acelerar o cálculo, pois trabalhar com tipos de dados menores é mais rápido. Por exemplo, o computador é muito mais rápido ao multiplicar matrizes compostas por inteiros do que matrizes compostas por números de ponto flutuante. E isso acarreta também um menor consumo de energia, o que é muito importante, por exemplo, para smartphones.

Como funciona a quantização em redes neurais

A rede neural pode ser composta por muitas camadas diferentes. Por exemplo, uma camada linear é composta por duas matrizes, uma chamada peso e uma chamada viés, que são comumente representadas usando números de ponto flutuante.

O objetivo da quantização é converter a entrada, a matriz de peso e a matriz de viés em inteiros. Isso permite que todas essas operações sejam realizadas como operações inteiras, que são mais rápidas em comparação com as operações de ponto flutuante. Além disso, a quantização reduz a precisão de cada número na matriz, mapeando-o em um intervalo que ocupa menos bits. Isso diminui o espaço ocupado na RAM e no disco.

Processo de quantização

No exemplo acima, os números de ponto flutuante ocupam quatro bytes (32 bits), quantizamos usando apenas 8 bits, podendo ser representando no intervalo de -127 a +127 (sacrificamos o -128 para obter um intervalo simétrico).

Então mapeamos cada número em sua representação de 8 bits de tal forma que podemos então mapear de volta para o array original em uma operação que é primeiro chamada de quantização e a segunda é chamada de desquantização.

Pegamos a saída, desquantizamos e a alimentamos para a próxima camada, de tal forma que a próxima camada nem perceba que houve uma quantização na camada anterior. Queremos fazer a quantização de tal forma que a saída do modelo não mude por causa da quantização, mantendo o desempenho.

Processo de desquantização. Erro introduzido na recuperação da matriz original.

Nesse processo, nosso objetivo é obter a matriz original. No entanto, normalmente perdemos um pouco de precisão. No exemplo acima, o segundo valor é similar, mas não exatamente o mesmo. Isso significa que a quantização introduz algum erro, tornando o modelo menos preciso do que o modelo não quantizado. Nosso objetivo ao quantizar é minimizar essa perda de precisão. Existem duas formas de fazer isso: quantização assimétrica e simétrica.

Quantização assimétrica

A quantização assimétrica mapeia o tensor original, que possui valores distribuídos entre um intervalo específico, em um novo intervalo composto por inteiros, por exemplo entre 0 e 255, que seriam representados usando 8 bits.

Processo de quantização assimétrica

Processo

  1. Identificação dos extremos: Primeiro, identificamos o menor e o maior valor no tensor original:

2. Cálculo da escala (s): A escala é calculada usando a fórmula seguinte, onde α e β são os valores máximos e mínimos no tensor original, e n é o número de bits (por exemplo, 8):

3. Cálculo do ponto zero (z):

4. Mapeamento dos valores: Cada valor no tensor original (x) é mapeado para um novo valor no intervalo de saída (q), usando a fórmula:

Limitação: Os valores resultantes são entre:

Desquantização

Para desquantizar e recuperar os valores aproximados do tensor original, usamos a fórmula:

Quantização simétrica

A quantização simétrica mapeia um intervalo simétrico de valores do tensor original em um novo intervalo simétrico, também usando 8 bits. A vantagem é que o zero no tensor original é sempre mapeado para o zero no intervalo de saída.

Processo

  1. Identificação do valor absoluto máximo: Determina-se o maior valor absoluto no tensor original (ex. |-54.12|).
  2. Cálculo da escala (s): A escala é calculada como:

onde |α| é o maior valor absoluto.

3. Mapeamento dos valores: Cada valor no tensor original é mapeado usando a fórmula:

Limitação: Os valores resultantes são limitados entre:

Desquantização

A desquantização é feita usando a fórmula:

Erros de quantização e escolha dos parâmetros α e β

A quantização introduz erros, pois comprimimos um intervalo grande de valores em um intervalo menor. O erro é calculado como a diferença entre os valores originais e os desquantizados. A quantização simétrica tende a introduzir mais erro se o tensor original não for simétrico.

Portanto, a escolha correta dos parâmetros α e β é crucial para a eficácia da quantização. Esses parâmetros determinam como o intervalo de valores do tensor original será mapeado para o novo intervalo quantizado. Vamos explorar as estratégias comuns para escolher α e β e entender seus impactos.

Estratégia MinMax

Na estratégia MinMax, α é definido como o valor máximo no tensor original, e β é definido como o valor mínimo no tensor original.

  • Vantagem: Simplicidade e facilidade de implementação.
  • Desvantagem: Alta sensibilidade a outliers. Se o tensor original contiver valores extremos (outliers), esses valores irão expandir o intervalo de quantização, resultando em maior erro de quantização para a maioria dos outros valores.

Exemplo: Imagine um tensor distribuído principalmente entre -50 e +50, mas contendo um outlier de 1000. Usando a estratégia MinMax, α seria 1000 e β seria -50, o que resultaria em uma má distribuição dos valores quantizados e maior erro.

Estratégia Percentil

A estratégia percentil define α e β com base em percentis da distribuição dos valores no tensor original, em vez de usar os valores extremos.

  • Vantagem: Reduz o impacto de outliers, proporcionando uma quantização mais precisa para a maioria dos valores no tensor.
  • Desvantagem: Pode ainda não lidar bem com distribuições altamente assimétricas.

Exemplo: Utilizando o percentil de 99%, α e β seriam definidos como o valor no 99º percentil e no 1º percentil, respectivamente. Isso garantiria que a maioria dos valores fosse quantizada de forma mais precisa, minimizando o erro introduzido por outliers.

Estratégia de Erro Quadrático Médio (EQM)

A estratégia de erro quadrático médio busca minimizar o erro quadrático médio entre os valores originais e os valores quantizados.

  • Vantagem: Proporciona uma quantização otimizada, minimizando o erro global.
  • Desvantagem: Pode ser computacionalmente intensiva, pois geralmente requer busca em grade ou técnicas de otimização para encontrar os valores ideais de α e β.

Exemplo: A busca em grade pode ser utilizada para testar diferentes combinações de α e β, calculando o erro quadrático médio para cada combinação e escolhendo aquela que resulta no menor erro.

Estratégia de Entropia Cruzada

A estratégia de entropia cruzada é utilizada principalmente em modelos de linguagem, onde o objetivo é manter a distribuição de probabilidade relativa após a quantização.

  • Vantagem: Mantém a integridade da distribuição de probabilidade, crucial para tarefas de modelagem de linguagem.
  • Desvantagem: Específica para certos tipos de modelos, não sendo aplicável a todas as situações de quantização.

Exemplo: Em uma camada de softmax de um modelo de linguagem, a entropia cruzada é minimizada para garantir que a probabilidade relativa dos tokens seja mantida após a quantização, preservando a semântica do modelo.

Comparação de estratégias

Para ilustrar a diferença entre essas estratégias, considere um vetor com valores distribuídos entre -50 e +150, com um outlier de 1000.

  • MinMax: α = 1000, β = -50. Resulta em má distribuição dos valores quantizados e alto erro.
  • Percentil: α e β definidos pelos percentis 99% e 1%, respectivamente. Melhor distribuição e menor erro, exceto para o outlier.
  • EQM: Busca em grade encontra α e β que minimizam o erro quadrático médio, proporcionando a melhor precisão geral.
  • Entropia Cruzada: Mantém a distribuição de probabilidade relativa, essencial para modelos

Quantização pós-treinamento

A quantização pós-treinamento é um método utilizado para quantizar um modelo que já foi previamente treinado. Este método permite reduzir o tamanho do modelo e acelerar seu processamento, mantendo o máximo possível de precisão. As etapas deste processo são:

  1. Modelo Pré-Treinado e Dados de Inferência: Partimos de um modelo pré-treinado e de alguns dados de inferência, que não precisam ser rotulados. Esses dados podem ser diferentes dos usados no treinamento original. Por exemplo, se o modelo foi treinado para classificar imagens de cães e gatos, podemos usar qualquer conjunto de imagens de cães e gatos para a quantização.
  2. Anexação de Observadores: Em seguida, anexamos observadores ao modelo. Estes observadores coletam estatísticas, como os valores mínimo e máximo vistos durante a inferência.
  3. Coleta de Estatísticas: Executamos inferência no modelo usando os dados de inferência para que os observadores coletem estatísticas sobre os dados que passam por cada camada.
  4. Cálculo dos Parâmetros de Quantização: Com base nas estatísticas coletadas, calculamos os parâmetros de quantização, como a escala (s) e o ponto zero (z) para cada camada do modelo.
  5. Aplicação da Quantização: Utilizamos esses parâmetros para quantizar o modelo. As camadas originais são substituídas por suas versões quantizadas, onde os pesos são convertidos de números de ponto flutuante de 32 bits para inteiros de 8 bits.

Conclusão

A quantização surge como uma alternativa eficiente para o desafio de lidar com redes neurais profundas que possuem um vasto número de parâmetros. Ela permite que modelos de inteligência artificial sejam reduzidos em tamanho, viabilizando sua implementação em dispositivos com recursos limitados, como smartphones e PCs padrão.

Além da economia de espaço, a quantização acelera o processamento, pois operações com números inteiros são mais rápidas do que com números de ponto flutuante, resultando em menor consumo de energia — uma vantagem significativa para dispositivos móveis. Com a escolha correta da estratégia de quantização, é possível também reduzir significativamente o espaço e o tempo de processamento, mantendo ao mesmo tempo a precisão necessária para aplicações práticas.

--

--