본문 바로가기

문돌이 존버/Speech&Language Processing

비전공자 문돌이가 설명해주는 MFCC 벡터(vector) 1탄

반응형

이번 시간에는 아마도 많이 들어보셨을 것이라 생각되는, 음성인식 분야에서 매우 유명한 MFCC(Mel-Frequency Cepstral Coefficients) 벡터에 대해 설명드리려고 합니다. 마찬가지로 가장 기본적인 내용만 설명할 것이고 수식은 최대한 배제하는 방향으로 진행하겠습니다. 

현실 세계에서 발생하는 소리는 그 원본 자체가 그대로 깨끗하게 상대방에게 전달되지 않습니다. 내 목소리에서 나온 소리는 일종의 소음(=noise, 이하 노이즈)이 끼게 되죠. 컴퓨터에 입력되는 소리는 더더욱 노이즈가 많습니다. 마이크로폰을 통해 전달되는 소리, 수화기 너머 들리는 소리 등은 엄밀히 말해 원본 소리와 다른 소리입니다.

이렇게 노이즈가 많이 있다 하더라도 우리의 목표는 원본 소리를 최대한 알아차리고 이해하여 특정 반응을 보이는 것입니다. 도대체 어떻게 노이즈가 추가되는지, 원본 소리가 왜곡되는지 그 패턴을 찾는다면 노이즈가 낀 소리의 원본을 잘 추정할 수 있습니다. 여기에서 고안된 모델이 바로 Noisy Channel 모델입니다. 

<출처: Speech and Language Processing>

noisy channel이라고 불리는 일종의 통로를 지나면서 노이즈가 발생하고, 지저분한 소리를 decoder라는 단계에서 노이즈를 제거하며 원본 소리를 "추정(guess)"하는 것이죠. HMM에서 배운 것을 적용하자면 source sentence는 hidden states가 될 것이고, noisy sentence는 observation에 해당된다고 생각하면 이해하기 쉽습니다. 우리 눈에 보이는 것은 noisy sentence이지만 실제 알고 싶은 것은 source sentence인 것이죠.

위와 같은 모델링 과정에는 2가지 접근 방식이 필요한데요, HMM에서 설명한 내용이랑 똑같다고 보시면 됩니다. HMM에서도 모든 가능한 states 후보들의 확률값을 비교하지 않고, Viterbi 알고리즘을 이용하여 최댓값을 가지는 hidden states만을 고려했으니까요.

1. 확률값 측정 및 비교 
- 직관적으로 보면 source sentence 후보는 모든 문장이 될 것이고, 우리는 noisy sentence를 듣고 가장 유사한 source sentence 1개만을 알고 싶은 것입니다. source sentence 후보 각각의 확률값(noisy sentence의 원본일 가능성)을 안다면 비교할 수 있겠죠.

2. 디코딩(decoding) 또는 탐색(search) 문제
- 영어를 예로 들면 source sentence가 될 수 있는 후보들이 몇 개나 될까요? 그 누구도 셀 수 없을 것입니다. 우리는 모든 source sentence 후보들의 확률값을 알 수 없고, 알 필요도 없습니다. source sentence가 될 자격이 있는 후보들만 우선적으로 선별하는 작업이 필요한 것이죠.   

확률에 기초한 방법론으로 Noisy Channel 모델만 잘 설계한다면 새로운 소리(노이즈가 포함된)를 듣더라도 원본 소리를 잘 추정하여 적절한 액션을 취할 수 있습니다. 이렇게 Noisy Channel 모델을 설계할 때 반드시 필요한 개념이 아래에 나오는 베이지안 룰(Bayes' rule) 입니다. 

<출처: Speech and Language Processing>

위 수식은 참고만 하시고 차차 설명드리겠습니다. 먼저, 컴퓨터가 듣는 소리는 B에 해당하고, 소리의 근원이 되는 단어는 A에 해당합니다. 단어를 읽어야 소리가 나오겠죠. 즉 단어는 원인(cause), 소리는 단어에 따른 결과(result)가 되는 것입니다. 베이지안 룰을 이해할 때 이것만 기억하면 됩니다.

"소리를 들었을 때 그 소리의 근원인 단어를 알고 싶다!"

우리의 학습 과정은 어떻게 이루어지는지 보겠습니다. 단어들의 조합인 문장을 준비하고 Noisy Channel 모델을 적용시켜 노이즈가 포함된 소리를 생성해냅니다. 다시 말해, A를 먼저 준비하고 이의 결과인 B를 관찰하는 것이죠. 이를 수식으로 표현한 것이 P(B|A)이며, A가 있을 때 B가 나올 확률을 뜻합니다. 우리가 학습을 통해 알고 있는 확률값입니다. 

P(A)란 단어들의 조합으로 문장다운 문장이 만들어질 확률을 뜻하는데, 예를 들어, "I love you"와 "I you love"라는 2개의 문장이 있다면 P(A)는 $1\over2$ 입니다. "I you love"는 문장다운 문장이 아니니까요. P(B)는 새로운 소리(=observation)를 들을 확률을 뜻하며, 쉽게 말해 "I love you" 라는 문장을 들을 확률입니다. P(B)는 새로운 소리를 들을 확률이기 때문에 P(B|A), P(A)가 어떤 값이든 간에 변하지 않는 상수입니다. 뭔 일이 일어나든지 상관없이 어디선가 발생한 문장 "I love you" 소리를 들을 확률은 변하지 않죠. 

자! 다시 정리하면, 지금까지 나온 확률값은 P(B|A), P(A), P(B) 총 3개지만 말씀드렸듯이 P(B)는 중요하지 않기 때문에 버리도록 합시다. 우리가 필요한 확률은 P(B|A), P(A) 이며, 이를 곱한 것이 바로 우리가 알고 싶은 것, "소리를 들었을 때 그 소리의 근원인 단어를 알고 싶다!" 에 해당하는 값이 됩니다. 수식으로는 P(A|B)가 됩니다. 

그런데 P(A|B) 확률값은 단 1개 값으로 나올까 생각해보면, 그렇지 않다는 것을 알 수 있습니다. 새로운 소리 B에 대해 이에 해당하는 문장은 이거야, 저거야, 그거야 라고 여러 확률값이 나오지 않을까요? 그래서 마지막으로 필요한 단계가 확률값이 최대인 문장을 선택하는 것입니다. 수식은 $\hat{W}=\underset{W}argmaxP(W|A)$ 라고 표현되는데, 무시하셔도 됩니다. W는 words의 이니셜로 위에서 말한 문장을 뜻하며 A는 acoustic의 이니셜로 소리를 뜻합니다. 

전문용어도 소개해드리자면, P(W)를 Language Model, P(A|W)를 Acoustic Model, $\underset{W}argmax$을 Search Constraints라고 부릅니다. 

인간의 언어는 어휘 수도 많고, 한 문장이 매우 긴 경우도 있죠. 이를 음성인식 분야에선 LVCSR(Large Vocabulary Continous Speech Recogntion) 문제라고 부르는데 이때 꼭 필요한 과정이 특정 소리에 대한 여러 문장 후보들 가운데 가장 best match, 즉 확률값이 제일 높은 후보를 선택하는 것입니다.

MFCC에 대한 본격적인 설명은 다음 글에서 이어서 하겠습니다. 마무리를 하기 전, 꼭 명심해야 할 것이 있습니다. 사람의 귀, 즉 달팽이관은 소리를 연속적인(continous) 신호로 받아들입니다. 반면, 컴퓨터는 이를 연속적인 신호로 받아들이지 못해 연속적 신호를 반드시 이산적(discrete) 신호로 변환을 해줘야 하는데요. 아래 그림 오른쪽에 있는 빨간색 점들 하나하나가 변환된 이산적인 값을 나타냅니다. 

연속적 신호를 어떻게 이산적 값으로 변환을 할까 생각해보면 간단합니다. 연속적 신호의 일정 구간을 대상으로 특정 값을 대표로(=sampling) 뽑는 것이죠. 수많은 연속된 실수값을 다 뽑는 것은 불가능하기 때문에 해당 소리를 가장 잘 대표할 수 있는 값이 무엇일까 고민하며 뽑아야 하고, 이때 뽑힌 값들이 샘플(samples)에 해당됩니다.

<출처: Speech and Language Processing>

다음 시간에 설명할 MFCC 벡터 추출 과정은 위와 같이 이미 연속적 소리 신호를 이산적인 값으로 변환을 했다고 가정하고 시작합니다. 

728x90
반응형