공부 정리 블로그

[Chapter9]언어모델(1) - ~smoothing 본문

대학원 수업/음성인식

[Chapter9]언어모델(1) - ~smoothing

따옹 2023. 5. 17. 20:08

 

Table of contents

arg maxP(W|O) (사후 확률, classification) = arg maxP(O|W) 음향 모델 x P(W) 언어모델

1. n-gram 언어모델

2. 카테 고리 기반 언어 모델(추천하는 방법은 아님)

3. DNN 기반 언어 모델 (단어 vector에 의미부여 : back-off, skip gram)

 

9. 언어모델 - 개요

ㅇ 언어 모델(마이크에 무엇이 들어오든 신경 쓰지 않음, 사전 확률 P(W))

- 특정단어 열이 주어졌을 때 다음에 나올 단어들의 확률을 추정하는 모델

) 내일오후3시에() 가자

(): 학교, 강남, 서점, 공원, … 

 

ㅇ T개의 단어로 구성된 문장 𝑊(𝑤0…𝑤𝑇)에 대해서 문장 생성확률 𝑃(𝑊)=𝑃(𝑤0…𝑤𝑇)을 계산

 

ㅇ 단어를 구분하는 단위 (동북아시아권 형태소 단위가 좋음)

- 형태소(morpheme): 의미를 가지는 언어단위 중 가장 작은 언어 단위이다그러므로 형태소는 더 쪼개면 전혀 의미가 없어지거나 또는 이전의 의미와 관련되는 의미가 없어지는 문법 단위이다.

)내일 오후 세시에 학교 가자

내일/오후////학교//

 

ㅇ 어절 : 어절은 띄어쓰기로 나누어지는 언어 단위이다. (유럽어권)

- 예제 : 내일/오후/세시에/학교/가자

어절은/한국어에서/문장을/…/단위이다.

길동이가/공부를/한다.

 

- 영어의 경우에는 단어의 단위가 어절임

Let’s/go/to/school/tomorrow/at/three/pm

 

ㅇ 음절

한글의 음절을 완성형으로 보면 '독', '녹' 두 개는 유사한 발음이지만 초성이 다른 유사한 음절이

 

2000개의 음절을 넣은 간단한 말뭉치를 만드는 걸로 끝나지 않는 이유는?

한 단어씩 한 단어씩 넣은 것을 (업데이트 필요)

 

언어모델 - 개요

어떤 발음을 발화했든지 상과없이 제일 첫 번째 단어는 마이크를 통해서 들어온 것은 <s>,

음성인식 결과를 만들어보면 어떤 문장으로 시작되는지 상관 없이 제일 첫 번째 단어는 sentence begin (마이크가 열리기 전에 나오는 단어(예외처리 해줘야하는 이유?))

 

언어 생성 확률 == 각 단어의 생성확률의 곱

ㅇ 언어모델(Cont.)

- 단어 별로 decomposition을 한 후, history(𝑤𝑘−1𝑤𝑘−2…𝑤0)로부터 다음 단어(𝑤𝑘)를 예측함

- T 개의 단어로 구성된 문장 𝑊(𝑤0…𝑤𝑇)에 대해서 문장 생성 확률은 아래와 같이 계산됨

- 단어별 생성 확률은 음성인식 decoding network의 각 단어의 end state에서 적용됨

index가 다르면 서로 다른 단어임

같냐/다르냐 만 알 수 있음(유사성 계산 불가능)

 

 각 단어의 생성확률의 곱으로 표현됨, 하지만 단어의 수가 많아질 수록 한정적인 computation 계산을 하는 것은 불가능 해짐

<s>/내일/오후/세시에/학교/가자/</s>

P(<s>,내일,오후,세시에,학교,가자,</s>) = P(<s>)*P(내일|<s>)*P(오후|내일,<s>)*P(세시에|오후,내일,<s>)*P(학교|세시에,오후,내일,<s>) *P(가자|학교,세시에,오후,내일,<s>)*P(</s>|가자,학교,세시에,오후,내일,<s>)

 

ㅇ 각 단어들은 컴퓨터 내부에서 어휘에 대한 index로 표현

- 어휘(Vocabulary): 인식 가능한 단어들의 집합

- 예: 어휘의 크기가 10만이고, 단어들은 어절 단위로 구분 되었으며, 어휘 내 단어들을 가나다순으로 정렬 했을때, 단어들이 아래의 순서의 단어로 어휘 내 위치해 있다고 가정한다.
가자’:12,844번째단어

내일’:24,882번째단어

세시에’:35,493번째단어

오후’:69,864번째단어

학교’: 95,867번째단어

 

ㅇ ‘내일/오후/세시에/학교/가자는아래와 같이 index의 열로 표현된다.

- 24,882/69,864/35,493/95,867/12,844

-> 숫자가 다르면 다른 단어로 간주하지만 대소 비교의 의미는 없어짐. 같냐 다르냐의 문제만 고려

 

9.1 n-gram 언어모델

computation 계산 문제를 해결하기 위한 history의 길이를 제한

ㅇ 문장이 길어짐에 따라 history 또한 길어짐

- 확률 계산이 computationally intractable하게 됨

- 계산이 가능하게 하기 위해서는 history의 길이를 줄여야 함

 

ㅇ 가정사항: 최근 n-1개의 단어로 구성 할 수 있는 모든 history는 같은 history로 다룸

ㅇ n-gram 모델

  1. Unigram : 현재 한 단어만 반영 / 돌잡이 아기 (엄마, 아빠,...)
  2. Bigram   : 바로 앞 단어까지 반영/ (아빠 물!, 의도는 알 수 없음)
  3. Trigram  : 바로 앞 두 단어까지 반영 

 

ㅇ Estimating n-Grams From Counts

hmm 학습 알고리즘 때 나옴. 단점 : 학습자료에 대한 overfiting

𝑓(𝑤_𝑖−2,𝑤_𝑖−1) : 조건부 == 2단어의 튜플의 개수

𝑓(𝑤_𝑖−2,𝑤_𝑖−1, ,𝑤_𝑖) : 세 단어의 튜플 카운트

 

ㅇ N-gram 언어 모델의 장점

- 통계적 모델로써 계산의 간편함

- 대용량 학습자료를 이용하여 쉽게 모델 생성이 가능함

 

ㅇ N-gram 언어 모델의 단점

- N의 제약으로 인하여 longer history에 대한 정보를 표현하지 못함

 

) 말뭉치에 아래 세 문장이 있음

<s> I am egg </s>

<s> Joe I am </s>

<s> I do like green and egg </s>

 

ㅇ Bigram 언어 모델 생성확률

P(I am egg) = P(I | <s>)*P(am | I)*P(egg | am) = 2/3*2/3*1/2 = 2/9

count tabel에 가지고 온 값으로 아래를 계산

- P( I | <s> ) = C(<s> I ) / C( <s> ) = 2 / 3

- P( am | I  ) = C( I am ) / C( I ) = 2 / 3

- P( egg | am) = C( am egg ) / C( am ) = 1 / 2

 

 (EM에 따라 만듦 -> test할 때, 학습자료 들어감 -> 다른 test 자료에 따른 정확도 반영 x )

(핵심)UnSeenBigram 을 어떻게 표현하느냐?

 

ㅇ n-gram 언어모델 ARPA format(N gram 저장 표준 포맷)

확률은

값들이 음수인 이유 : 확률은 본디 (0~1)인데, log 함수로 표현하면 logP<0

P(negative | comments, who)를 tri gram tuple의 확률을 log 로 표현

 

하지만, Tri-gram도 잘 안되는 이유?

ㅇ 메모리 문제

- 어휘의 크기가 10(10^5)인 경우, tri-gram tuple은 세 단어의 index로 표현됨

- table 형태로 저장하기 위해서는 3차원 integer table이 있어야 함

- 이 경우 tri-gram tuple수는 105*3이며, 필요한 바이트수는 4 * 10^(5*3)B = 4 * 10^3 * 10^3 * 10^3 * 10^3 * 10^3B = 4,000TB (1TB 외장하드가 4천개가 필요 함) => tuple frequency table을 만들기 위해 추정 해야하는 parameter수가 많음

 

학습자료가 왜 부족한가? 어느 정도 부족한가?

ㅇ 학습 자료의 부족

- 예) 특정 방송국이 100년 간 방송한 자료가 있다고 하자. (계산의 편의 상)1년에 300, 하루에 20시간을 방송하였다고 가정하면, 총 수집한 오디오의 양은 600,000시간 분량이다.

- 영미권 뉴스의 경우 100시간 당 100만 단어가 발화된다고 알려져 있다. 같은 기준을 적용하여, 100년간의 방송자료에 대해 transcription을 만들면 60(6*10^9)단어= ( 600,000 시간* (100만 단어/ 100시간))가 존재함.

- Table의 셀개수가 10^15개임을 감안하면, tri-gram tuple의 수가 현저히 부족하다.

 

코퍼스를 아무리 많이 모으더라도, 실제 발화에서 나타나는 𝑓(𝑤𝑖−2,𝑤𝑖−1,𝑤𝑖), 𝑓(𝑤𝑖−2,𝑤𝑖−1)를 적절히 추정하지 못하는 경우가 발생하며, 최악의 경우는 0이 되는 경우임. 아무리 모델을 잘 만들어도 인식하지 못함

=>이후의 연구 철학 :  모은 corpus에서 나타나지 않은 튜플에 대해 어느 정도 count(확률)를 만들어 주는 것이 적절할까?

 

위 문제를 아래의 두 가지 방법으로 해결:

Discounting & Smoothing

- 0의 값을 가지는 𝑓𝑤𝑖−2,𝑤𝑖−1,𝑤𝑖에 대해 작은 값으로 flooring 시킴

 

Backing-off:

- trigram 모델로 언어 모델 생성확률 계산 시 𝑓(𝑤_(𝑖−2),𝑤_(𝑖−1),𝑤_𝑖)이 작아 적절한 확률 추정이 어려운 경우, 모델링 파워는 낮지만 적은 양의 코퍼스로 부터 적절한 확률 추정이 가능한 bigram,unigram 언어모델 확률로 대체하는 방법

 

9.1.1 Discounting & Smoothing

(10^5)^3개 튜플 하나하나의 등장 빈도를 센다

한 번 나온 튜플의 누적 카운트들, 두 번 나온 튜플의 누적 카운트들, ...

 

0이 왜 나오는가?

아무리 학습자료를 모아본 들, 학습자료가 부족하게 됨 -> 대부분이 0개를 가지게 됨

근데 왜 아무도 없어...?

0*(수 없이 많은 튜플) => 아무리 많아봐야 0이 됨(누적카운트 0) => 이 녀석이 문제를 일으킴

 

그래서 unseen tuple 에 확률을 부여하려하는데,

확률의 총 합은 1(확률분포)이므로, 새로운 확률을 만들어 줬다는 것은 다른 scene에서 확률을 떼어줌

1에는 d1만큼, 0에 1-d1만큼 떼어준다.

 

 

9.1.1.1 Laplace Smoothing (add1 smoothing)

단어 8개일 때, 이론상 쓸 수 있는 bigram 튜플 8^2 개

여기서 관찰할 수 있는 seenbigram-tuple은 10개, 하지만 나올 수 없는 튜플들도 있음

만들어 질 수 없는 튜플

우리가 하고자하는 것 : 나머지 unseen은 어떻게 처리할 것인가?

<s> sell seel </s> = P(sell|<s>) x P(sell | sell) x  P(</s> | sell) -> 최댓값의 확률을 갖는 값으로 나올 수 없음(절대)

음향 모델을 아무리 잘 만들어도 음향 모델과 언어모델 곱이 0이 됨

그래서, 8단어로 구성하는 모든 tuple이 관측되면 좋지만, 54개의 corpus에 대해서 아주 작은 확률들을 부여해주려 함

seen, unseen 모두 1을 더해줌

 

이해하고 구현하긴 쉬우나, (단점)상당 수는 절대 발화될 튜플이 아닌데, 1 부여하므로 아무런 수학적 근거가 없음 => 성능이 좋지 않음

 

smoothing 하는 이유 ! seen에 대한 확률을 낮춰주려고 함(seen에 대해서 unseen 에 확률을 떼어줌)

seen tuple 1 -> 7/13
단어가 8개지만 7로 되는 이유
unseen tuple 0이던 확률이 1/15로 늘어남

 

ㅇ Laplace Smoothing의 문제점

- 일반적으로 비관측 이벤트가 관측 가능한 이벤트보다 많음

- 비관측 이벤트에 대해 너무 많은 확률을 할당

- 다른 smoothing 방법에 비해 성능이 매우 떨어짐

 

9.1.1.2 Add-k smoothing

1을 더하는 대신 1보다 작은 수 k를 더함

Laplace smoothing 보다 성능은 좋지만 여전히 성능이 떨어짐

여전히 성능이 떨어짐 => k를 더하는 수학적 이유가 없음

 

9.1.1.3 Good turing smoothing

n번 관측된 이벤트에 대해 n+1번 관측된 이벤트의 횟수를 사용(n=0, 1, …)

Good turing estimate으로 count 재추정

Seen : count - / UnSeen : count +

 

ex)

bigram tuple에 대한 출현 횟수와 카운트

unigram tuple 개수 V = 14585

Seen bigrams (n1 +... nr) = 138741(한 번 나온 tuple)+25413(2번) +10531+…(n번) = 199252

N=615876 (전체 tuple 개수)

unseen tuple 개수 구하기

EM으로 세어보면 한 번도 안 나온 애들인데 0.00065를 모두 뿌려줌

 

가정 : 이상적인 값은 r보다 작아져야 함

현실 : corpus가 유한