본문 바로가기

Paper

[논문] Lexicon-Free Conversational Speech Recognition with Neural Networks

스탠퍼드에서 2015년에 발표한 Lexicon-Free Conversational Speech Recognition with Neural Networks 논문(http://ai.stanford.edu/~amaas/papers/ctc_clm_naacl_2015.pdf)을 공부하고 정리한 글입니다. CTC 관련 내용은 CMU의 딥러닝 강의(https://www.youtube.com/watch?v=c86gfVGcvh4&t=4205s)를 참고했고 DBRNN 부분은 Team AI 블로그를 참고 했습니다.(https://aikorea.org/blog/rnn-tutorial-1/)

Abstract

다음과 같은 3가지 구조만 사용한다. 

1. NN : map acoustic input to characters

2. Character-level language model(CLM)

3. Beam search decoding 

이러한 단순한 접근을 통해 기존 음성인식의 복잡한 구조(HMM-GMM, HMM-DNN) 제거했다. 

Introduction

말의 되풀이(repetitions), 말더듬(disfluencies), partial words, OOV 와 같은 문제들로 인해 conversational speech recognition은 어렵다. 지금까지의 음성인식 모델은 다음과 같이 발전해왔다.

 

 

2014년 CTC를 이용해 audio features를 sequence of characters로 direct mapping 시키는 모델이 성능이 좋았다 ; HMM-DNN에서 나온 word-level n-best list를 re-ranking해서 사용! 

이 논문에서는 CTC 기반이지만 word-level이 아닌 전체 character-level에서의 추론을 통해 학습과 디코딩을 진행한다. 따라서 lexicon이 필요없고 이를 위한 HMM-DNN 구조도 없다. 또한 새로운 단어(related to OOV), 불완전문장(fragments), 말더듬(disfluencies)을 전사할 수 있다.

다음과 같은 2개의 뉴럴넷을 사용하고 이를 Beam search decoding 과정에서 intergrate한다.

 1. DBRNN(with CTC Loss) : acoustic input features  ->  매 time step의 characters의 확률 분포

 2. Character-level language model(CLM) : LM의 파라미터 수를 크게 증가시키지 않고도 고차 n-gram 정보 사용 가능

Model

CTC

CTC에 대해 아주 간단하게 알아보자. 이에 대해 자세한 설명은 CTC 논문 리뷰에 정리할 것이다. 

 

 

예를 들어 CTC를 통해 /B/ /Y/ /F/ /Y/ 라는 target sequence를 추정한다고 해보자. 우선 symbol의 반복을 제거해주는 blank( - )를 포함한 symbol graph를 위 그림과 같이 만든다. 

 

 

시작 node와 마지막 node 및 transition 규칙들을 적용하고 다음 그림과 같이 Forward, Backward 알고리즘을 통해 posterial probability를 구한다.

 

 

결국 CTC는 acoustic feature에 대한 letter(label) sequence의 likelihood maximizing하는 방향으로 학습된다. 또한 위 알고리즘 자체가 alingment를 해주기 때문에 Input, output sequence의 alignment를 모르는 경우에 활용이 가능하다.  CTC는 아웃풋 시퀸스를 인풋시퀸스에 맞춰 time wraping하지만 아웃풋 시퀸스를 re-ordering하지 못하는 한계점이 있다. 이는 언어에 따라 어순이 중요한 기계번역에서는 큰 문제이지만, 음성인식은 해당하는 audio input에 대한 character sequence를 아웃풋으로 출력하므로 re-ordering이 중요하지 않다.

CTC Loss

CTC Loss를 정의하기 위해선 논문에서 정의한 notation을 따라갈 필요가 있다. notation들은 다음과 같다.

 

 

W는 정답 문자열이고 (타우≦T) 만큼의 길이를 가진다. 이는 인풋/아웃풋 sequence보다 작거나 같은데, blank(-)로 인해 반복되는 문자가 제거되었기 때문이다. C, X를 각각 길이 T의 아웃풋/인풋 문자열, 제타를 W와 blank를 포함하는 집합으로 정의한다.

 

 

Collapsing function k(*)를 blank를 활용해 반복되는 문자를 제거하는 함수로 정의한다. Cw는 앞서 정의한 k(*)를 적용한 값이 정답 W와 같아지는 모든 아웃풋 문자열 C를 의미한다. 이제 우리 목적 함수인 Lctc로 넘어가 보자. 수식의 맨 오른쪽 부터 보면 매 time step에서의 output C는 input X에 대해 조건부 독립이므로 그 확률을 시간에 대한 곱으로 표현했다. 이어서 Cw에 해당되는 C의 확률 대해서만 sum을 해 Lctc가 최종 정답 문자열 W의 likelihood가 되게 한다. 

Likelihood를 목적함수로 설정했으니, negative log likelihood 등을 Loss로 쓸 것 같다는 생각이 들었다.

최종 CTC Object function은 다음과 같다.

 

 

DBRNN

앞서 정의한 CTC loss는 매 time t에 인풋 X에 대한 characters c의 확률분포(p(c|x))를 필요로 한다.  이 확률분포를 DBRNN을 이용해 모델링한다. 기본 RNN은 밑에 그림에서 처럼 이전 state의 정보를 반영하기 위한 아키텍쳐로 정보의 흐름이 오른쪽으로만 가는 것을 알 수 있다.

 

RNN

 

하지만 음성인식은 문장은 앞부분 뿐만 아니라 뒷부분도 고려하는게 당연하다. 예를 들어,

 " 나는 ____를 뒤집어 쓰고 펑펑 울었다 "

위와 같은 문장에서 빈칸에 들어 갈 말을 추정할 때 사람은 쉽게 이불을 유추할 수 있다. 이는 빈칸 앞의 '나는' 보다, 빈칸 뒤의 '를 뒤집어 쓰고 ~'를 보고 유추하기 쉽다. 즉, 빈칸에 들어갈 이불이 아닌 단어(W)에 대해 다음과 같이 확률을 생각해 볼 수 있다. P( W | 를 뒤집어 쓰고 ~) < P(이불 | 를 뒤집어 쓰고 ~)

 

DBRNN

 

따라서 위 그림과 같은 구조를 가진 DBRNN이라는 전후 관계를 모두 고려하는 아키텍쳐를 생각해 볼 수 있다.

이는 음성인식에서 audio features를 character로 좀 더 정확하게 변환하는 데 도움이 된다. 

 

DBRNN softmax output architecture

 

DBRNN을 통해 softmax 아웃풋을 계산하면 우리가 원하는 확률은 다음과 같이 계산된다.

 

 

 

Decoding

디코딩 과정은 주어진 하나의 발화에 대한 하나의 cohesive한 character sequence를 만들기 위해, Beam search decoding을 통해 DBRNN과 CLM의 정보를 integrate한다. LM 확률을 고려하기 위해 CLM과 DBRNN의 아웃풋을 결합한다. 우리의 collapsing function k(*)하에 모든 characters sequence를 통합해 최종 가설에 확률을 할당한다.

다음과 같은 beam search decoding 알고리즘을 사용하는데, 이해하지 못했다 :( 기술 부채로 남겨두고 다음에 공부해 봐야지!

 

Beam search decoding algorithm

 

이러한 디코딩 방식의 특징을 정리해보면 다음과 같다.

1. 빠르다. charater-level이라 lexicon이 없어 lexicon으로 생기는 제약식이 없다.

2. word에 대한 softmax는 NN에서 병목현상에 빠지기 쉬운데 character에 대한 softmax는 상대적으로 덜하다.

여기서 얘기하는 병목현상은 아웃풋의 정확도(성능)와 관련된 것이라기 보단 속도와 관련된 cost를 얘기하는 듯 하다. word-level의 경우 LM에 word 수에 따라 softmax 연산량이 많이 증가하기 때문이다.

3. CLM은 매 타임스텝마다 적용 가능하지만, word model은 띄어쓰기나 시퀸스가 lexicon 안에 있는 단어 접두사로 될 likelihood를 계산할 때만 적용될 수 있다.

CLM의 적용 범위는 직관적으로 이해가 가는데, word model의 prefix 얘기는 잘 모르겠어서 또 하나의 기술 부채이다. 해당 부분에 대해 원문을 첨부해 두겠다.

Our character language model is applied at every time step, while word models can only be applied when we consider adding a space or by computing the likelihood of a sequence being the prefix of a word in the lexicon (Graves and Jaitly, 2014). (Andrew L. Maas et al. , 2015)

4. OOV word 문제를 없앴다. (lexicon이 없으니까)

 

Experiment & Analysis

CER, EV 등은 모델 평가 지표로 error rate를 의미

 

우측 상단에 결과를 보면 CTC + CLM(NN or n-gram..) 모델이 기존의 HMM-GMM이나 HMM-DNN 모델에 비해 성능이 뛰어나지 않음을 알 수 있다. 오히려 HMM-DNN 하이브리드 모델이 성능이 가장 좋은 것을 알 수 있다. 하지만 밑에 실제 전사된 text를 보면 CTC+CLM의 경우 HMM 기반 모델보다 'ima' 와 같은 lexicon에 포함되어 있지 않은 단어나 말더듬 등 일상 대화에서 빈번하게 일어나는 상황에 더 좋은 성능을 보였다. 

 

Conclusion

1. 상대적으로 단순하다. 코드 1000줄이면 전체 아키텍쳐를 짤 수 있음!

2. Character level이므로 데이터로부터 직접 orthography & phonics를 학습  ->  lexicon으로부터 자유롭다.

3. 복잡한 HMM 구조를 없앴다. 이런 단순한 음성인식 모델 구조가 향후 end to end 음성인식 모델에 도움이 될 것이다.

위에 성능 비교표를 보면 HMM 기반 모델들의 성능이 더 좋은 것을 알 수 있다.(특히 HMM-DNN 하이브리드 모델) HMM 기반 모델이 휴리스틱하고 복잡하다는 단점이 있지만 이는 반대로 생각하면 사람이 튜닝을 통해 성능 및 구조를 개선시키기 좋다는 말이기도 하다. 따라서 아직까지 음성인식 오픈 API들과 Kaldi는 HMM 기반 모델을 사용한다고 한다.

 


Reference

CMU Deep learning lecture 14

모두의 연구소 음성인식 풀잎스쿨

Team AI Blog

edited by sonura