6 / 24 · Concepto
Escala y punto cero
Para sx=0.25,zx=128, ¿cuáles son el código de relleno y el valor real de q=132? ¿Qué código de sesgo representa 0.75 con sw=0.5?
Las lecciones se pueden leer gratis. Inscríbete para guardar el progreso.
El código del cero real
La cuantización afín usa una escala positiva s y un punto cero entero z. Nuestro contrato entero redondea x/s al entero más cercano, elige el entero par en un empate exacto, añade z y después satura al intervalo de almacenamiento. La descuantización interpreta un código aproximadamente como s(q−z). Asociar valores reales a una rejilla entera suele perder información.
Para una entrada uint8 con s=0.25,z=128, el cero real es el código 128. Los códigos 130 y 126 representan 0.5 y −0.5. En cambio, el código bruto de relleno cero representaría −32. Un búfer que almacene códigos brutos debe insertar z para el relleno. Un búfer que almacene códigos ya centrados inserta el entero cero. Marca ese punto de conversión en la ruta de datos.
Producto escalar resuelto
Centra los códigos de entrada [130,126] restando 128 y obtén [2,−2]. Los pesos [3,−2] usan escala 0.5 y punto cero cero. Acumula 2×3+(−2)×(−2)=10. La escala real del acumulador es 0.25×0.5=0.125, así que el resultado real es 1.25. Con escala de salida 0.25 y punto cero 128, pasa a ser el código 133. Los puntos cero de pesos distintos de cero también deben restarse antes de multiplicar.
La cuantización por tensor comparte una escala. La cuantización de pesos por canal requiere un sesgo y una conversión de salida específicos de cada canal. Si dos canales de salida tienen escalas de pesos de 0.5 y 0.25, el código de acumulador diez representa 1.25 y 0.625 respectivamente. La flexibilidad del software no demuestra compatibilidad de hardware con ninguna de las dos configuraciones.
Cuantizar 0.625 con escala 0.25 da el empate 2.5, que se redondea a dos y al código 130. La descuantización da 0.5, un error de −0.125. La entrada 0.375 también se asigna a ese código. El error de la rejilla de cuantización difiere del error de saturación: recortar una entrada fuera de intervalo puede superar medio paso de escala. Compara las reglas enteras con ONNX QuantizeLinear. Nuestros ejercicios implementan deliberadamente solo un pequeño subconjunto int8/uint8.
Inténtalo tú
Para sx=0.25,zx=128, ¿cuáles son el código de relleno y el valor real de q=132? ¿Qué código de sesgo representa 0.75 con sw=0.5?
Leer la explicación
El relleno bruto es el código 128 y q=132 representa uno. La escala del acumulador es 0.125, así que el código del sesgo es 0.75/0.125=6.