クイズ: スケールとゼロ点
한국어 원문으로 표시합니다.
어떤 층의 활성 관찰 범위가 0.4 부터 7.0 까지였다. 이 범위를 그대로 써서 스케일을 잡으면 무엇이 잘못되는가?
- uint8 로는 소수 범위를 표현할 수 없어 변환 자체가 실패한다
- 실수 0.0 이 표현 가능한 눈금 밖에 있어 패딩과 ReLU 의 0 이 0 이 아니게 된다
- 범위 폭이 255 보다 작아 스케일이 1 보다 커지고 정수가 넘친다
- 최솟값이 양수라 영점이 음수가 되어 자료형 범위를 벗어난다
어떤 텐서를 왕복시켰더니 최대 절대 오차가 스케일의 다섯 배로 나왔다. 가장 먼저 의심할 것은?
- 반올림 방식이 짝수 쪽 붙이기가 아니라 다른 것이다
- 역양자화에서 영점을 빼지 않고 더했다
- 값 일부가 관찰 범위 밖에 있어 양끝으로 잘렸다
- 스케일을 float32 가 아니라 float64 로 계산했다
ReLU 를 지나 전부 0 이상인 활성에 대칭 int8 을 걸면 비대칭 uint8 에 견주어 어떻게 되는가?
- 영점 뺄셈이 사라져 오차가 절반으로 줄어든다
- 자료형이 같은 8비트라 스케일도 오차도 달라지지 않는다
- 음수 값이 없어 포화가 전혀 나지 않으므로 오차가 0 이 된다
- 음수 쪽 눈금이 놀아 쓸 수 있는 눈금이 절반이 되고 스케일과 오차가 두 배가 된다
가중치 행렬 한 자리에만 큰 값이 있을 때 채널별 스케일이 텐서 전체 스케일보다 나은 이유는?
- 이상값이 든 채널을 빼고 나머지 채널만 양자화하기 때문이다
- 이상값이 든 채널 밖의 채널들이 그 값에 끌려가지 않고 자기 범위를 쓰기 때문이다
- 채널마다 영점을 다르게 두어 이상값을 0 근처로 옮기기 때문이다
- 채널을 나누면 정수 커널이 채널별로 병렬 실행되어 누적 오차가 줄기 때문이다
QuantizeLinear 의 정의에서 반올림은 짝수 쪽으로 붙인다. 입력 2.5 와 3.5 를 스케일 1 · 영점 0 으로 양자화하면?
- 2 와 4 가 된다
- 3 과 4 가 된다
- 2 와 3 이 된다
- 3 과 3 이 된다
대칭 int8 에서 한쪽 폭을 128 이 아니라 127 로 나누는 이유로 가장 정확한 것은?
- 128 로 나누면 스케일이 커져 오차가 늘기 때문이다
- 128 은 2의 거듭제곱이라 부동소수점 나눗셈에서 오차가 생기기 때문이다
- 영점이 0 일 때 양수 쪽으로 쓸 수 있는 눈금이 127 개까지이기 때문이다
- int8 의 최솟값 -128 이 자료형에서 예약되어 있어 쓸 수 없기 때문이다