깊은스택2블록.한선 — P0 완료 (2026-07-01)
개요
crowny-butler/libs/깊은스택2블록.한선: 잔차+곱게이트 2블록 소프트어텐션 스택.
목표 (1) end-to-end 역전파 증명 (블록1 W_Q grad≠0) (2) XOR에서 2블록>1블록 깊이이점.
최종 결과
블록2 W_Q grad크기=0 블록1 W_Q grad크기=200
PASS: 블록1 W_Q grad≠0 → end-to-end 역전파 성공
2블록 최종: 1/4 1블록 최종: 0/4
PASS: 2블록 깊이이점 확인 (1 > 0)
핵심 교훈 (3가지 버그 수정)
(1) 소프트블록_순전파 댕글링 포인터
소프트블록_순전파는 내부
메모리마커() → 계산 →
메모리복원() →
반환 상태 순서.
복원 후 반환된 상태 포인터는 해제된 메모리 → y1=79730 garbage.
수정:
_블록fwd 인라인 구현 (마커 없음, 에폭루프 마커에 위임).
(2) 초기화값이 clip을 초과해 grad 차단
WQ2=9, WK2[0]=4 → score=(9+4)*(-1)=-13. clip=8이면
STE역전파(-13,8)=0.
→ d_inp2_0=0 → d_y1=0 → 블록1 역전파 단절.
수정: |WQ+WK|≤clip인 소형 초기값 사용:
WQ=1, WK=[1,-1], WV=[2,-2], W1=[2,-2], W2=[1,-1], Wg=1
(3) 컴파일 2>&1이 toau 파일 오염
./hanseonc_high 파일.한선 > out.toau 2>&1 → stderr 로그("[hanseonc] 토큰 파싱…")가
toau 바이너리에 섞임 → VM이 텍스트를 큐브로 오해 → 무한 실행/hang.
수정:
./hanseonc_high 파일.한선 > out.toau (2>&1 절대 금지)
아키텍처
inp(x0,x1) → Block1 → y1 → Wg_곱게이트(y1·sign(x1)) → inp2 → Block2 → y2
잔차 skip connections 각 블록 내부
파라[19]: WQ1 WK1[2] WV1[2] W1_1[2] W2_1[2] | WQ2 WK2[2] WV2[2] W1_2[2] W2_2[2] | Wg
가상타깃 트릭 (블록1 역전파)
상류 gradient d_y1 →
가상t1 = y1 - d_y1_up →
소프트블록_역전파(st1, 가상t1) 호출.
역전파 내부:
d_loss = y1 - 가상t1 = d_y1_up → 정확한 upstream gradient로 처리.
관련 파일
/Users/ef/crowny-butler/libs/깊은스택2블록.한선 (주 구현)
/Users/ef/crowny-butler/libs/소프트어텐션블록.한선 (역전파만 사용, 순전파 댕글링 버그 있음)
/Users/ef/crowny-butler/libs/삼진STE.한선 (STE투영, STE역전파)
잔여 이슈
- XOR 2블록 정확도 1/4 (4/4 미달): lr=1+small init → 1스텝 후 param 폭주·grad 소멸.
개선 필요 시: lr=0.01 + 더 많은 에폭 또는 그래디언트 클리핑 추가.
- 블록2 W_Q grad=0 (test1 단일샘플): it0_2=it1_2=-1 조합에서 두 term 상쇄. 정상 수학 결과.