6 / 24 · 개념
scale과 zero point
sₓ=0.25,zₓ=128일 때 패딩 코드와 q=132의 실수 값은 무엇인가요? sᵥ=0.5의 누적기에 실수 바이어스 0.75를 더할 코드는 무엇인가요?
내용은 무료로 볼 수 있습니다. 수강 신청하면 학습 기록을 저장할 수 있어요.
실수 0을 나타내는 코드
선형 양자화는 실수 값 x를 정수 q로 바꾸며 양의 scale s와 정수 zero point z를 함께 사용합니다. 이 과정의 정수 계약은 먼저 x/s를 가장 가까운 정수로 반올림하되 정확히 절반이면 짝수를 선택하고, z를 더한 뒤 저장 범위로 포화하는 것입니다. 역변환은 x≈s(q−z)입니다. 소수 값을 정수 격자에 놓으므로 일반적으로 정확한 원래 값을 모두 보존할 수 없습니다.
uint8 입력의 s=0.25,z=128이라면 실수 0의 코드는 128입니다. 코드 130은 0.5, 코드 126은 −0.5를 나타냅니다. 따라서 패딩에 raw 코드 0을 넣으면 실수 −32가 들어갑니다. 원시 코드를 버퍼링하는 설계는 패딩을 z로 채우고, 이미 z를 뺀 값을 버퍼링하는 설계는 정수 0으로 채워야 합니다. 어느 단계에서 중심값을 빼는지 설계도에 표시하세요.
정수 내적 예제
입력 코드 [130,126]에 zₓ=128을 적용하면 중심 입력은 [2,−2]입니다. 가중치 코드 [3,−2]는 sᵥ=0.5,zᵥ=0으로 해석합니다. 정수 누적은 2×3+(−2)×(−2)=10입니다. 이 누적기의 실수 배율은 sₓsᵥ=0.125이므로 실수 결과는 1.25입니다. 출력 sᵧ=0.25,zᵧ=128을 사용하면 코드 133입니다. 가중치의 zero point도 0이 아니면 곱셈 전에 각 가중치에서 그 값을 빼야 합니다.
하나의 scale을 텐서 전체에 쓰는 per-tensor 방식과 출력 채널마다 다른 scale을 쓰는 per-channel 방식은 누적기의 단위를 다르게 관리합니다. 출력 채널 0의 가중치 scale이 0.5, 채널 1이 0.25라면 같은 정수 누적 코드 10도 각각 1.25와 0.625를 나타냅니다. 바이어스와 출력 multiplier를 출력 채널에 맞춰 선택해야 합니다. 작은 정수 모델이 지원하는 방식과 외부 모델의 방식을 혼동하지 마세요.
오차를 기록하는 방법
0.625를 s=0.25로 나누면 2.5입니다. 짝수 반올림은 2를 골라 z=128일 때 코드 130을 만듭니다. 역변환은 0.5여서 오차가 −0.125입니다. 0.375/0.25=1.5도 2로 반올림되어 같은 코드가 됩니다. 격자 사이 값과 범위를 벗어난 값은 서로 다른 이유로 정보가 줄어듭니다. 포화된 값은 일반 반올림 오차의 절반 scale 경계를 넘어설 수 있습니다. 반올림과 포화 규칙은 ONNX QuantizeLinear의 공식 정수 정의와 비교하세요. 이 과정은 그 중 단순한 int8·uint8 형태만 실습합니다.
직접 생각해 보기
sₓ=0.25,zₓ=128일 때 패딩 코드와 q=132의 실수 값은 무엇인가요? sᵥ=0.5의 누적기에 실수 바이어스 0.75를 더할 코드는 무엇인가요?
해설 보기
원시 패딩 코드는 128이고 q=132는 1입니다. 누적 scale은 0.125이므로 바이어스 코드는 0.75/0.125=6입니다.