6 / 24 · Conceito
Escala e ponto zero
Para sx=0.25,zx=128, quais são o código de preenchimento e o valor real de q=132? Qual código de viés representa 0.75 com sw=0.5?
As aulas podem ser lidas gratuitamente. Inscreva-se para salvar o progresso.
O código do zero real
A quantização afim usa uma escala positiva s e um ponto zero inteiro z. Nosso contrato inteiro arredonda x/s para o inteiro mais próximo, seleciona o inteiro par em um empate exato, soma z e depois satura na faixa de armazenamento. A desquantização interpreta um código como aproximadamente s(q−z). Mapear valores reais para uma grade inteira geralmente perde informações.
Para entrada uint8 com s=0.25,z=128, o zero real é o código 128. Os códigos 130 e 126 representam 0.5 e −0.5. O código bruto zero no preenchimento representaria, em vez disso, −32. Um buffer que armazena códigos brutos deve inserir z no preenchimento. Um buffer que armazena códigos já centralizados insere o inteiro zero. Marque esse ponto de conversão no caminho de dados.
Produto escalar resolvido
Centralize os códigos de entrada [130,126] subtraindo 128, obtendo [2,−2]. Os pesos [3,−2] usam escala 0.5 e ponto zero igual a zero. Acumule 2×3+(−2)×(−2)=10. A escala real do acumulador é 0.25×0.5=0.125, portanto o resultado real é 1.25. Com escala de saída 0.25 e ponto zero 128, ele se torna código 133. Pontos zero de pesos diferentes de zero também devem ser subtraídos antes da multiplicação.
A quantização por tensor compartilha uma escala. A quantização de pesos por canal exige viés e conversão de saída específicos de cada canal. Se dois canais de saída tiverem escalas de peso 0.5 e 0.25, o código dez do acumulador representa 1.25 e 0.625, respectivamente. A flexibilidade do software não estabelece suporte em hardware a nenhuma das duas configurações.
Quantizar 0.625 em escala 0.25 produz o empate 2.5, que arredonda para dois e código 130. A desquantização dá 0.5, um erro de −0.125. A entrada 0.375 também mapeia para esse código. O erro da grade de quantização difere do erro de saturação: limitar uma entrada fora da faixa pode exceder metade de um passo da escala. Compare as regras inteiras com QuantizeLinear do ONNX. Nossos exercícios implementam deliberadamente apenas um pequeno subconjunto int8/uint8.
Experimente
Para sx=0.25,zx=128, quais são o código de preenchimento e o valor real de q=132? Qual código de viés representa 0.75 com sw=0.5?
Ler a explicação
O preenchimento bruto é código 128 e q=132 representa um. A escala do acumulador é 0.125, portanto o código do viés é 0.75/0.125=6.