Altifigence Academy

9 / 24 · 개념

직접 합성곱 기준 모델

두 입력 채널 [2,3], 가중치 [4,−1], 바이어스 1을 처리할 때 바이어스를 각 입력 채널의 반복마다 더하면 어떤 잘못된 결과가 나오나요?

읽기 쉬운 모델이 기준이 되는 이유

기준 모델은 빠른 실행보다 연산 계약을 눈으로 확인하기 쉬운 것이 우선입니다. 출력 채널, 출력 행, 출력 열을 순회한 다음 입력 채널과 커널 행·열을 누적합니다. 각 항에서 입력 좌표를 계산하고 범위 밖이면 0을 공급합니다. 이 순서를 그대로 쓰면 첫 오차가 생긴 출력 좌표와 어느 곱에서 달라졌는지 추적할 수 있습니다. 하드웨어의 최적화된 순서와 같게 작성할 필요는 없습니다.

한 출력 채널 m의 식은 아래와 같습니다. 바이어스 b[m]는 공간 위치마다 한 번만 초기 누적에 넣습니다. c,r,s의 반복 안에 넣으면 바이어스가 항의 수만큼 더해집니다. 정수 모델이라면 x와 w는 이미 zero point를 뺀 중심값이며 바이어스는 곱 단위입니다.

y[m,h,w]=b[m]+∑c∑r∑sx[c,hSh−Pt+rDh,wSw−Pl+sDw]w[m,c,r,s]y[m,h,w]=b[m]+\sum_c\sum_r\sum_s x[c,hS_h-P_t+rD_h,wS_w-P_l+sD_w]w[m,c,r,s]

작은 다채널 예제

공간 크기 1×1인 입력 채널 두 개의 값이 2와 3이라고 합시다. 첫 출력 채널의 가중치는 [4,−1], 바이어스는 1입니다. 결과는 1+2×4+3×(−1)=6입니다. 둘째 출력 채널의 가중치는 [−2,5], 바이어스 −1이면 결과는 −1−4+15=10입니다. 출력 채널끼리 누적기를 공유할 경우 6을 다음 채널의 초기값으로 이어 쓰지 않도록 초기화 조건을 확인합니다.

공간 예제 [1,2,3;4,5,6;7,8,9]와 커널 [1,2;3,4]의 출력은 [37,47;67,77]입니다. 모델 로그의 첫 위치에는 네 항 1,4,12,20이 나오고 합이 37이어야 합니다. 두 번째 위치는 2,6,15,24입니다. 같은 최종값이라도 중간 항이 다르면 우연한 상쇄가 있을 수 있으므로 손계산 위치 하나를 상세히 기록합니다.

독립성을 유지하는 검증

직접 모델은 같은 연산을 창 펼치기와 내적으로 계산한 두 번째 모델과 비교합니다. 두 모델이 주소 계산 함수를 모두 공유하면 그 함수의 오류가 함께 통과할 수 있습니다. 손계산 fixture와 다른 형태의 모델을 함께 쓰는 이유입니다. 무작위 입력을 생성할 때도 seed를 고정하고 실패한 텐서를 저장해야 같은 오류를 다시 분석할 수 있습니다. 비교는 정수 누적 결과와 출력 변환 후 결과를 나누어 수행합니다.

이 과정의 model.mjs는 입력 X[C][H][W]와 가중치 W[M][C/G][R][S]를 사용하며 배치 차원은 하나로 제한합니다. 배열의 행 길이, 채널 수와 그룹 조건을 검사합니다. 외부 프레임워크 파일을 불러오는 기능은 없습니다. 출력 모양이 맞아도 모든 원소가 0인 검증만 사용하면 주소 오류를 놓칠 수 있으므로 서로 다른 값, 음수와 비대칭 가중치를 준비합니다. 기준 모델의 계약은 ONNX Conv 문서의 채널 모양과 대조하되 이 실습의 제한을 그대로 기록하세요.

직접 생각해 보기

두 입력 채널 [2,3], 가중치 [4,−1], 바이어스 1을 처리할 때 바이어스를 각 입력 채널의 반복마다 더하면 어떤 잘못된 결과가 나오나요?

해설 보기

올바른 결과는 1+8−3=6입니다. 바이어스를 두 번 넣으면 8−3+2=7입니다. 바이어스 초기화 위치를 채널 감소 반복 밖으로 옮깁니다.

선택은 이 브라우저에만 적용됩니다. 언제든 푸터에서 변경할 수 있습니다.