ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • chapter01. n-gram 언어모델
    논문리뷰 2024. 9. 1. 18:56

     변역하려는 문장

     

    상관관계있는 단어를 찾아냄. 비슷한 위치 비슷한 의미라고 가설을 세움

    연관된 단어 번역 배열

    나이브하게 번역

     

     

    단어들이 하나이상의 뜻을 가짐  - 그래서 한단어가 정확하게 번역안될수도있음

    단어들이 복잡한 형태변환을 가짐

     

    다만 단순 번역은 실제 자연어의 복잡성을 제대로 반영하지 못함

     

     

     

    어떻게 이러한 단서들을 모델링 할 수 있을까?

     

    Conditional Language Modelling  (조건부 언어모델)

    어떠한 문장이나 글이 있을때 이 글의 확률을 계산하는 모델

     

    문법적으로 맞는 문장이 등장할 확률이 많아짐 

     

    사과를 먹다  --> 0

    사과를 투표하다 ---> x

     

     

     

     

    chatgpt  -> 사과를 먹으면?

    언어모델이 확률 계산후 확률높은것을 output

     

     

     

     

     

     

    1.이러한 개념들을 실제로 확률적 모델로 구성하는지

     

    Predict the next word!

    사실상 (거의) 모든 자연어 처리 분야에서 주어진 Input에 대해 다음 단어를 예측하는 것을 목표로 함

     

     

    음성 인식: 주어진 음성에 대해 단어를 예측
    기계 번역: 주어진 외국어 글에 대해 번역된 단어를 예측
    글 완성 (Text Completion): 주어진 단어에 대해 다음 단어를 예측
    이미지 주석: 주어진 이미지에 대해 주석 단어를 예측
    문법 확인: 주변 단어에 대해 현재 단어를 예측 (및 교정)

     

     

     

     

    모든 단어의 집합을 V라고 정의

     

    V* V를 통해 만들어 질 수 있는 모든 문장의 집합, 무한히 길어질 수 있음

     

    확률적 예측

     

     

    이때 우리는 V* 안의 모든 문장들에 확률을 부여할려고
    보다 문법적으로 정확한 문장은 높은 확률
    그렇지 않으면 낮은 확률

     

     

    “I like to watch movies” -> 높은 확률
    “I like” -> 중간 확률
    “movies I watch to like” -> 낮은 확률

     

     

     

     

    어떠한 문장 W있을때, 이 문장은 단어들 w1, w2, w3.. 들로 이루어져 있음
    편의상 문장의 끝은 <STOP> 이라고 가정

     

    예시: “I like to watch movies <STOP>”
    w1 = I, w2 = like, w3 = to, w4 = watch, w5 = movies w6 = stop

     

     

    N-gram 언어 모델: 디자인

    첫번째 단어가 나왔을때 w1이 나왔을때 w2가 나올확률

    p(w2|w1)

     

    P(W) = P(w1) x P(w2 | w1) x P(w3 | w1, w2) x P(w4 | w1, w2, w3)

                      x P(w5 | w1, w2, w3, w4) x P(<STOP> | w1, w2, w3, w4, w5)  -> 1,2,3,4,5번째 단어가 나왔을때 끝날확률

    첫번째 단어의 확률
    첫번째 단어가 주어졌을 때 두번째 단어의 확률
    첫번째와 두번째 단어가 주어졌을 때 세번째 단어의 확률

     

     

     

     

    P(I like to watch movies)

       = P(I) x   w1= I

          P(w2 = like | w1 = I) x

          P(w3 = to | w1 = I, w2 = like) x

          P(w4 = watch | w1 = I, w2 = like, w3 = to) x

          P(w5 = movies | w1 = I, w2 =like, w3 =to, w4 = watch) x

          P(w6 = <STOP> | w1 = I, w2 =like, w3 =to, w4 = watch, w5 = movies)

     

    단어들의 확률은 어떻게 학습하는가?

     
    1.데이터셋을 문장 별로 나눈다
    2.각 경우의 수를 모두 센다

     

    나는으로 시작하는 50개의 문장 중, 30개가 아침을로 이어짐
    P(w2 = 아침을 | w1 = 나는) = 30/50=0.6

     

    P(w1 = 나는, w2 = 아침을) = P(w1 = 나는) x P(w2 = 아침을 | w1 = 나는)

                                                              = 0.5 x 0.6 = 0.3

     

     

    만약 단어의 위치가 상관 없다면?

    만약 단순히 문장 어디에서든 나는 아침을이 등장할 확률을 계산할려면?

     

    W가 없어짐

    chain rule만 적용됨

     

     

    P(나는 오늘)

       =P(나는) x (아침을 | 나는)

    P(나는) = 전체 단어 중 나는의 비율
    만약 전체 단어가 10000이고, 그중 나는500이라면
    P(나는) = 500/10000 = 0.05

     

     

    나는이 등장했을 때, “아침을으로 이어지는 비율
    P(아침을 | 나는) = (Count ( ))/( Count())
    만약 나는 아침을100번 등장한다면
    P(아침을 | 나는) = 100/500 = 0.2

     

     

    비슷하게, P(먹었다 | 나는, 아침을)

     = (Count( ))/(Count( ))

     

     

     

    최대우도법 (Maximum Likelihood Estimation) 

    - 그럴싸한 다음 단어 (Output) 를 예측

     

      model -> data 만들확률
    문장의 일부분 (Input)이 주어졌을 때, 가장 그럴싸한 다음 단어 (Output) 를 예측하는 것이 가능
     

    N-gram 언어 모델: 장점과 단점

     
    장점:
    1.간단 명료하다
    2.어떠한 가정도 하지 않는다 (단어들은 독립적이다 등…)

     

    단점:

     

    1.문장의 길이가 길어지면 확률 계산이 힘들어진다
    2.모든 경우의 수를 데이터셋에서 찾기 힘들다

     

     

    p(나는 아침을)

    p (나는) * p(아침을|나는) 

    -> 나는이 나올 확률을 찾음   나는의 갯수/ 전체 데이터 갯수

     

    p(아침을|나는) 

    ->                나는이 주어졌을때 아침을 찾는다.   -> 나는, 아침 단어 전체분에 나는다음에 아침이 나오는 갯수 확률 

                                                                             ->  나는 다음에 아침이 나오는 갯수   (나는 아침) <-붙어있는거 중간에 띄어쓰기

                                                                                ------------------------------------------------------

                                                                                  나는 나올 갯수

     

    만약 나는 아침을100번 등장한다면
    P(아침을 | 나는) = 100/500 = 0.2

     

    비슷하게, P(먹었다 | 나는, 아침을)

                             = (Count( ))/(Count( ))

     

    문장이 길어지면 등장 확률이 작아짐

    단점:

     

    1.문장의 길이가 길어지면 확률 계산이 힘들어진다  -> 나중에 거의 0과 비슷한숫자가 나옴
    2.모든 경우의 수를 데이터셋에서 찾기 힘들다

     

     

    N-gram 언어 모델: 문제점 극복방법

    문장의 길이가 길어질수록 확률은 계속해서 작아진다
    이를 완화하기 위해 흔히 로그를 사용한다
    그럼에도 불구하고 완전한 해결책은 아님
    P(나는 아침을 먹고 사과도 먹고 친구랑 같이 …..)
    매우 작은 확률을 가질 것.
     
     
    문장의 길이가 길어질수록 확률은 계속해서 작아진다
    이를 완화하기 위해 흔히 로그를 사용한다
    그럼에도 불구하고 완전한 해결책은 아님
    이 문장은 확률 0을 가질 것--> 말이 안됨 확률이 0이될수는 없어서

    è
    만약 데이터셋의 크기를 엄청나게 키워서, 가능한 모든 문장을 전부 포함시킨다면 (인터넷에 존재하는 모든 글 사용…..)
    데이터를 모을 때, 새로운 단어의 등장 확률은 계속해서 감소

    단어들의 사용빈도를 다 정리함.

     

     

     

    Zipf’s law

    순위가 높을수록(1로 갈수록) 빈도가 높고(숫자큼 2826) 예 순위 10일때 빈도 2826
     
    -> 자주쓰이는 단어는 자주쓰이고, 순위가 낮을수록 조금 쓰인다.
    이러한 현상은 모든 자연어에서
    동일하게 나타남

     

    일부 단어는 매우 높은 빈도를 갖고, 나머지 대부분의 단어는 낮은 빈도를 갖는다.

    예) 전문용어: 매우 낮은 빈도인 반면, 나, 너 우리 등은 높은 빈도

     

     

    또한 자연어에는 지속적으로 새로운 단어가 등장 (신조어)
    -> 0의 확률이 나와서

    따라서 인위적으로 확률을 조정해 줄 필요가 있음

     

    N-gram 언어 모델: 문제점

    문제점 1 .  문장이 길어질수록 확률이 크게 줄어든다

    ->Markov assumption
     

    문제점 2.  모든 경우의 수를 관측하는 것은 불가능하고, 따라서 많은 문장들이 0 확률을 가진다

    -> Smoothing

     

    지금까지 확률을 계산할 때는 어떤 단어의 확률이 이전 단어 모두에 영향을 받는다고 가정
    P(먹었다 | 나는 아침을)  p(마지막단어 | 이전 99단어)
    자연스러운 가정이지만, 문장이 길어질 때 확률이 크게 낮아지는 문제가 있음
    어떤 단어가 이전 N개의 단어에만 영향을 받는다고 가정

     

     

    만약 이전 한 개의 단어에만 영향을 받는다고 가정한다면
    P(먹었다 | 나는 아침을) = P(먹었다 | 아침을)     -> 아침을 단어 나올때 먹었다 단어가 나올확률만 따짐
     
    P(먹었다 | 아침을) =
    (Count( ))/
    ---------------------------
    (Count( ))
    아침을이 나왔을때 아침을 먹었다가 나올확률계산

     

     

    Bi-gram 언어모델  -> n-gram 

    ->아무리 문장이 길어지더라도, 이에 따라 확률이 크게 줄어들지 않음 (이전 하나만 의존하므로)

     

    P(W) = P(w1) x P(w2 | w1) x P(w3 | w1, w2) x P(w4 | w1, w2, w3)

                      x P(w5 | w1, w2, w3, w4) x P(<STOP> | w1, w2, w3, w4, w5)

    첫번째 단어의 확률
    첫번째 단어가 주어졌을 때 두번째 단어의 확률
    첫번째와 두번째 단어가 주어졌을 때 세번째 단어의 확률
    예시)

    나는 아침을 먹고 물도 마셨다.

    p(나는)
    p(아침을 |나는 )
    p( 먹고| 나는 아침을)
    p  ( 물도     |나는 아침을 먹고)
    p( 마셨다 | 나는 아침을 먹고 물도)

     

     

     

     

     

    나는  이 전체 단어중 100개 나오는데   -> 아침을 이 나오는개 전체중 15개 나옴

     

    아침을 먹었다.-->   5/15  확률

    아침을 만들었다-->   7/15

    아침을 안먹었다 -->  3/15

     

     

     

     

     

     

    데이터셋 = 총단어 16

    count(나는) =3         
    count(나는 운동을) = 2     
    count (나는 운동을 한다.)=2    


    P(나는 운동을 한다)

    P(나는)    3/16
    P(운동을   |나는)  2/3
    P( 한다    |나는 운동을)    2/2

    P(나는 운동을 한다) =(3/16)* (2/3)* (2/2) 

    =============

    총데이터셋 = 19

    P(나는 밥을 먹는다)

    count(나는)  =3
    count(나는 밥을)  =2
    count( 나는 밥을 먹는다) =2
     


    P(나는) = 3/19   
    P(밥을|나는) = 2/3       
    P(먹는다|나는 밥을) = 2/2

     

    P(나는 밥을 먹는다) = (3/19)  x (2/3) x(2/2)

     

    ===============================

     

     

    아무리 말이 안되는 문장이라도 등장 확률이 0은 아님
    기본 아이디어: 데이터셋에 없는 문장이라도 기본적으로 매우 작은 확률을 가지고 있다고 가정하자
    이미 등장한 문장들의 확률을 조금 감소시키고, 그 확률을 등장하지 않은 문장들에게 나누어주자
     
    Add-one smoothing 확률 계산 방법:
    P(먹었다 | 나는 아침을) = (Count ( 다)  + 1)/(Count( ))
     
    단순히 확률 계산 시, 모든 경우의 수에 빈도를 1 더해줌

     

     

    하지만 확률은 모두 더했을 때 1이 되어야 하는데, 분자에만 1을 인위적으로 더할 경우 더 이상 1로 합쳐지지 않음

     

     

     

     

    P(먹었다 | 나는 아침을) +
    P(투표하고 | 나는 아침을) +
    P(계산하고 | 나는 아침을) + …...
    이 모든 확률을 더한다면 (총 단어의 개수가 V할때)
    ((Count ( 다)  + 1)  +(Count ( 고)  +1)  + …..)/(Count( 을)  + x)
    이때 총 더해진 1의 개수는 총 단어의 개수와 동일
    따라서 x = V

     

    여기에 Add-one smoothing 을 적용하면 확률이 0인것에 확률의 재분배됨

     

    요약

    •많은 자연어 처리 문제는 주어진 Input을 가지고 다음 단어를 예측하는 것으로 생각될 수 있다
    •N-gram 언어 모델은 이를 해결하기 위한 가장 기초적인 방법 중 하나이며, 여러 장점과 단점이 있다
    •이러한 단점을 해결하기 위해 Markov assumption( 이전 단어 일부분만 사용) 과 Smoothing( 확률의 재분배) 이 흔히 사용된다
Designed by Tistory.