2019년 6월 3일 월요일

Streaming end-to-end speech recognition for mobile devices_2

이 논문에서는 구글에서 음성인식의 응답속도를 줄이기 위해 RNN-T model을 활용한 on-device 형태의 음성인식 시스템을 제안하였는데, 이 때 server-based system 대비 발생할 수 있는 성능 열화를 줄이기 위해 활용했던 알고리즘을 중심으로 논문을 기술하고 있다. 아래는 서론부에서 언급한 그 알고리즘들의 리스트가 되시겠다.
  • Layer normalization to stabilize training
  • Large batch size
  • Word-piece targets
  • Time-reduction layer to speed up training and inference
  • Network parameter quantization to reduce memory footprint and speech up computation
  • Shallow-fusion approach (AM + LM)

(사실 적어놓고 보니 그냥 E2E 모델에서 사용되는 방법인거 같다.) 이것들은 일반적인 음향모델을 좀 더 잘 훈련하기 위한 방법들로서 언급했다면, 근원적인 on-device향 모델의 한계로서 숫자음 인식 문제를 해결하기 위한 방법으로 다음을 언급했다.

  • TTS system으로 합성된 다양한 숫자음을 훈련에 활용
저런 방법들을 다 쓰니, 속도와 더불어 성능까지 올라간다고 하고 있다. 기존의 Embedded CTC와 비교해서 말이다.

우선 CTC나 RNN-T는 설명이 잘 된 논문들이 많으니 각설하고,
논문에서 언급한 내용들을 정리해 보니

<Model architecture>
Unidirectional LSTM 8층을 쌓고
Projected LSTM을 썼고
- LSTM output을 선형변환하여 차원 축소
Time-reduction layer (TRL)를 사용 했고
- 특정 layer의 출력을 N개씩 묶어 다음 layer로 보내는 방법으로 훈련과 inference 시간 단축, chain model에서와 같은 frame rate 조정을 통한 속도 향상)
- 여기서 TRL이 입력의 frame rate를 조절하는 것과는 다른 동작을 한다고 얘기하는데, 아무래도 frame rate는 정보가 삭제되는 것이고, TRL은 그래도 훈련상에 이런 decimation process가 고려되어 훈련이 이루어 지니 그걸 의미하는 것 같다.
- 아무래도 이 녀석은 encoder의 하위 layer에 적용이 되는 것이 상위 layer의 계산량을 줄이는 데 도움이 되기 때문에, 2번째 LSTM 위에 적용한 듯이 보인다.

<Training optimization>
Layer normalization을 사용했고
- layer별 출력을 batch가 아닌 해당 layer의 각 time step별 전체 node의 평균과 분산으로 whitening하는 방법으로, RNN 훈련 안정화를 위해 사용
Output node에 word-piece subword units을 사용했고
- Grapheme보다 나은 성능
Tensor processing units에 적합한 batched computation에 의한 FB (or BW) algorithm을 썼으며

<Efficient inference - Run-time optimization>
Prediction network의 중복 계산을 없애고 (50 ~ 60% prediction network 계산 절감)
Thread를 Prediction network, before and after TRL 3개로 나누어 asynchrony하게 처리하여 속도 절약 (single thread 대비 28% 속도 향상)
- 와 이렇게까지 해야하는 구나를 배웠다.

<Parameter quantization>
32-bits floating-point precision -> 8-bits fixed-point

<Contextual biasing>
Device마다 저장된 사용자 별 데이터를 바탕으로 (이를테면 전화부, 노래, 앱, 위치 등등) 이를 고려하여 decoding시에 on-the-fly로 graph를 생성하고 음성인식을 수행

<Text normalization>
"navigate to two twenty one b baker street" -> "navigate to 221b baker street" 같은 decoding이 가능하도록 하게 만들기 위해, class-based LM을 활용하는 것과 유사한 방법으로 class에 대한 tag를 추가하여 이를 E2E model이 뱉어내도록 하고 이를 WFST로 올바른 written domain의 결과로 만들어 내는 방법을 사용하고 있다.
- 사실 이런 방법을 쓰기에는 데이터가 많지 않으므로, TTS를 활용하여 5백만 문장을 생성하여 이런 패턴의 문장을 학습하도록 하였다.

Image result for streaming end-to-end speech recognition for mobile devices
< table from this paper >

위 테이블에 논문에 언급된 방법들을 추가할때마다 인식 성능이 올라가는 것이 보인다. 뭐 이밖에도 TTS 데이터를 활용한 것과, RTF에 대한 결과들도 다 있지만, 여기선 생략하고 나중에 필요할 때 보는게 좋겠다.

중요한 것은 real time on-device 음성인식 시스템을 구축하기위해 얼마나 많은 기술들이 추가되어야 하는지 예상을 하며 준비해 나가야 한다는 것이다. 천하의 구글도 on-device 인식 시스템 개발을 위해 수년간 실험하고 노력한 결과로서 무언가를 내어 놓는데, 이것들이 단순히 방대한 양의 데이터를 활용한 정도의 결과로 치부해서는 안될 것이다.

물론 많은양의 데이터의 수집이 선행되어야 하는 것 맞는 말이다. 하지만 "그것이 전부다"라는 생각은 위험하다. 데이터 수집은 중요한 일이며 동시에 시간이 걸리는 일임을 인식하고 데이터를 모아가는 동시에 그것들을 요리할 수 있는 다방면의 기술 습득을 병행하지 않으면 힘들게 모은 데이터들이 무용지물 될 것이 뻔하기 때문이다.

댓글 없음:

댓글 쓰기