Pruned CTC가 LLM 네이티브 어휘 음성인식 학습 메모리를 줄인다
Pruned CTC for Memory-Efficient Large-Vocabulary ASR Training
무엇인가
LLM 기반 음성인식은 보통 토큰 단위 cross-entropy(LLM-CE)와 자기회귀 생성으로 학습하며, 디코딩이 순차적으로 이뤄진다. 스트리밍으로 가면 텍스트 방출 시점을 음성과 맞추기 위해 청크 수준 음성-텍스트 정렬에 의존하게 된다. CTC는 발화 단위 전사만으로 오프라인과 스트리밍을 모두 지원하는 자연스러운 대안이지만, 표준 구현이 프레임×어휘 활성값을 메모리에 그대로 물질화하기 때문에 15만~18만 급 네이티브 LLM 어휘에서는 학습이 사실상 불가능하다. 논문의 핵심 관찰은 모든 유효한 CTC 정렬이 blank와 타깃 토큰만 방문하고, 배치 전체를 모아도 그 합집합이 전체 어휘의 작은 부분집합이라는 점이다.
어떻게 동작하나
제안 방법 Pruned CTC는 정렬 계산과 정규화를 분리한다. 배치에 등장하는 클래스 집합 U(blank와 전사 라벨들)에 대해서만 정렬 격자를 계산하고, 정규화는 전체 어휘에 대해 그대로 유지한다. U에 속하지 않는 클래스 O는 하나의 'other' 클래스로 풀링해 log-sum-exp로 정규화 항에 반영하므로, U 안의 각 클래스는 원래 확률을 그대로 보존한다. 논문은 정확 산술에서 이 축소가 전체 어휘 CTC와 손실 및 1차 기울기가 정확히 동일하다는 것을 증명한다(Proposition 1). 로짓 기울기는 p_v(m) − γ_v(m) 형태이고, U 밖 라벨은 점유가 0이지만 p_v(m)만큼의 기울기를 계속 받기 때문에 헤드 기울기는 여전히 어휘 전체에 대해 dense하다. 구현에서는 어휘를 최대 C개 열 단위 청크로 투영하면서 online log-sum-exp로 프레임별 정규화 λ를 누적하고, 청크는 쓰고 나면 즉시 해제한다. 역전파는 청크를 재계산해 기울기를 만들고 scatter 항과 g_m·p_v(m) 항을 합쳐 dense 기울기를 복원한다. 그 결과 클래스축 활성 저장량이 Θ(MV)에서 Θ(MK+M)에 최대 M×C 임시 블록을 더한 수준으로 줄어든다. 여기에 k2 기반 유한 빔 정렬 프루닝(빔 100)을 추가로 적용하며, 빔 100에서 버려지는 정렬 사후 질량은 발화당 10^-11을 넘지 않는 것으로 추정된다.
무엇과 다른가
이 위에 세운 LLM-CTC는 사전학습 LLM을 네이티브 어휘 그대로 비자기회귀 ASR에 적응시키는 방법이다. 인과 어텐션을 유지해 스트리밍에서 KV 캐시 재사용이 가능하게 했다. 읽어내는 위치에 따라 두 변형이 있다. Speech-readout은 프롬프트 뒤에 음성 임베딩을 붙인 위치들에서 CTC 상태를 뽑고, Query-readout은 음성 임베딩 뒤에 학습된 벡터 q를 T개 복제해 붙인 위치들에서 CTC 상태를 뽑는다. 토크나이저가 쓰지 않는 클래스를 blank로 지정하고, LLM 헤드는 동결한 채 blank 로짓에 더해지는 offset η만 학습한다. 두 변형 모두 T개의 CTC 프레임을 Θ(1)번의 LLM 순전파로 만들어낸다. 스트리밍 확장은 발화를 청크로 나눠 각 청크가 왼쪽 히스토리 h초만 보게 하고, 청크별 쿼리 블록을 붙이며, 손실은 전사 전체에 한 번 적용해 청크 수준 정렬을 피한다. 추론에서는 KV 캐시를 재사용하고 CTC prefix beam search로 후보를 청크 간에 이어간다.
어떻게 쓰나
메모리 실험은 Zipformer-M 인코더와 GigaSpeech, H100 80G 한 장에서 이뤄졌다. 어휘 크기를 500에서 180,000까지, 총 배치 프레임 M을 16,000/32,000/64,000으로 바꿔가며 표준 CTC와 비교했다. M=16,000, V=180,000에서 헤드+손실 메모리는 43.0 GiB에서 1.29 GiB로 줄어 33.3배 차이를 보였고, 같은 어휘에서 M=32,000은 2.58 GiB, M=64,000은 5.16 GiB를 썼다. 메모리 절감은 세 배치 크기 모두 2,000~5,000 클래스 구간에서 시작된다. 표준 CTC 대비 런타임 비율은 500 클래스에서 9.14배였다가 180,000 클래스에서 1.41배로 떨어져, 어휘가 클수록 오히려 유리해진다. 전체 학습 스텝 기준으로는 메모리를 2.3~5.1배 줄이면서 스텝당 시간이 14~17% 늘었다. V=180,000에서 표준 CTC는 M=32,000과 64,000에서 OOM이 났지만 Pruned CTC는 각각 18.2 GiB, 34.5 GiB로 완주했다.
전제와 한계
LLM 쪽은 8B와 14B 모델을 A100 80G에서 LoRA로 학습하고 네이티브 LLM 헤드(V=151,936)를 동결해 측정했다. 헤드+손실 메모리는 8B에서 29.21 → 1.14 GiB(25.7배), 14B에서 29.79 → 1.20 GiB(24.8배)로 줄었다. 모델과 옵티마이저 상주분을 포함한 전체 스텝 피크 메모리는 8B가 56.06 → 34.67 GiB(38.2% 감소), 14B가 72.71 → 52.84 GiB(27.3% 감소)였고 스텝 시간은 각각 7.5%, 5.6%만 늘었다. 저자들은 헤드와 손실 밖의 저장·활성값이 전체 스텝 절감 폭을 제한한다고 밝힌다. 또한 축소만 하고 빔 프루닝을 하지 않은 unpruned reduced CTC가 Pruned CTC와 거의 같은 메모리·런타임을 보여, 측정된 절감의 대부분은 정확한 어휘 축소와 재계산에서 나온다고 설명한다.
정확도는 LibriSpeech(960시간), GigaSpeech(10,000시간), AISHELL-1(170시간, 4336자 어휘)에서 표준 CTC와 거의 동일한 WER/CER를 기록했다. GigaSpeech에서는 SPEAR-XLarge v2 인코더에 Qwen3 0.6B~32B를 붙여, 테스트 WER이 0.6B의 10.57%에서 32B의 9.94%로 내려가고 여섯 크기 모두 LLM-CE 대비 상대 WER 7% 이내를 유지했다. LLM-CE는 14B와 32B에서 각각 9.43%, 9.41%를 냈다. LLM-CTC는 LLM-CE 대비 RTF를 7.2~10.3배 줄였고, 4B·8B·14B·32B 시스템은 SPEAR-XLarge CTC와 RNN-T보다 낮은 테스트 WER를 보여 비자기회귀 ASR도 사전학습 LLM의 언어 지식에서 이득을 얻을 수 있음을 시사한다. Readout 비교에서는 인과 어텐션 조건에서 Query-readout이 비슷한 RTF로 더 낮은 WER을 냈고, full attention을 준 Speech-readout은 WER이 약간 더 낮았지만 RTF가 높고 스트리밍에서 KV 캐시 재사용이 불가능해 채택되지 않았다. 스트리밍은 Qwen3-ASR 0.6B와 1.7B를 2초 청크로 파인튜닝해 평가했으며, 좌측 히스토리 2·4·8초 모두에서 매칭된 오프라인 모델 대비 상대 WER 증가가 3% 미만이었고 히스토리를 2초에서 8초로 늘려도 WER 변화는 거의 없었다.
실무에서는 LLM의 네이티브 어휘를 유지한 채 CTC를 주 손실로 쓰고 싶은 팀, 특히 어휘가 커서 헤드 활성값이 학습 메모리를 지배하는 팀에 직접 쓸 수 있는 방법이다. 다만 몇 가지 전제를 확인해야 한다. 손실·기울기의 정확한 등가는 정확 산술을 가정한 결과이고, 유한 빔 프루닝은 L_β ≥ L을 만들며 프루닝 경계에서 손실에 불연속이 생길 수 있다. 선택된 클래스에서 두 기울기 항이 거의 상쇄될 때는 반올림 오차가 그 차이를 지배할 수 있어 정밀도 전략을 따로 골라야 한다(부록 B.2). 동적계획 저장량은 시퀀스 길이와 정렬 빔에 의존하고, 전체 학습 스텝 메모리 절감은 헤드·손실 밖의 저장과 활성값 때문에 헤드 단위 절감만큼 크지 않다. 코드와 사전학습 체크포인트는 공개될 예정이다.