티스토리 뷰

1. Traditional 한 Language modeling 

언어 모델이란 건 사실 간단히 말하면, 연속적인 단어들이 주어졌을 때 그 sequence 에 대한 probability 를 주는 모델이다. 이런 언어 모델을 다양한 NLP task 에 함께 쓰이는데 예를 들어 자동 번역 모델이라든지, 음성 인식 모델에 쓰이곤 한다. 

 

이 언어 모델을 word order 이나 word choice 에 있어서 좀 더 자주 쓰이는 패턴의 phrases 에 더 높은 probability 를 부여하는 모델이다. 

 

 

 

그렇다면 기존의 언어 모델은 어떻게 만들어졌느냐! 간단하게 말하면 count 를 이용해서 만들어졌다. 노가다처럼 들리지만, 주어진 corpus 에서 window 를 옮겨가면서 모든 단어에 대한 co-occurrence 를 기록한다. 여기서 사용하는 건 Markov assumption 이라는 건데,  첫번째 단어부터 n-1 번째 단어에 대한 n 번째 단어의 조건부 확률은 i 번째 단어부터 n-1 번째 단어에 대한 n번째 단어의 조건부 확률과 유사하다는 것. 간단히 말하면 n 번째 단어에 대해 그 단어에 앞서 등장한 단어들로 조건부 확률을 만들려고 할 때 꼭 1번째 단어부터 할 필요는 없다는 애기! 그래서 윈도우를 쓰는 거고, 그 윈도우 내의 몇 개의 단어들만 가지고 language model 을 만드는 거임. 그리고 그렇게 n 개의 단어만 선택해서 다음 단어를 예측하는 것이기 때문에 n-gram 모델이라고 부른다. 여기서 n은 타겟 단어를 예측하기 위해서 앞에 필요한 n 개의 단어 즉 윈도우의 크기이다. 

 

 

 

그런데 사실 이런 방식의 언어 모델은 상당히 큰 문제가 있다. 일단 그럼 모든 단어에 대해 같이 오는 단어들을 일일이 세서 저장한다는 건데, corpus 가 클 수록 당연히 이 corpus 내의 co-occurrence 정보를 기록해야 하는 메모리도 커져야 한다. 그리고 앞서 말했듯이 window 를 쓸 때 (n-gram counts) n-gram에서의 n 이 fix 되어있을 것 같지만 실제로는 n 을 3,4 이런 식으로 여러 개를 정해서 거기에 해당하는 n-gram counts 를 세는 거기 때문에 메모리가 엄청나게 늘 수 밖에 없다.. (아마 feature map 에 이 모든 count 를 넣고 이 모델을 쓸 때는 이 map 에서 search 해야되기 때문에 엄청 큰 RAM 필요) 상당히 비효율적인 방법이고 training 시간도 어마 무시하게 걸려서  해답은 RNN! (답정) 

2. Recurrent neural net

Recurrent neural net 을 사용하면 RAM 크기도 획기 적으로 줄어든다. 모든 n-gram counts 가 아니라 그냥 corpus 내의 단어수만큼만 필요하다 (mapping 해야 되니까). 

 

Recurrent network 는 기본적으로 업데이트 해야 하는 weight 파라미터가 3개이다. 

왼쪽부터 차례대로 hidden state weight, current word vector weight, softmax weight. 그리고 구하고자 하는 단어는 

 

 

 

 

해당 수식을 풀어서 얘기하면 1)에서 current hidden state 는 이 전의 hidden state x hidden state weight + 현재 word vector x word vector weight 이다. 그리고 2) 에서 current hidden state 에 softmax weigt을 곱하고 softmax 를 취해서 3) 이걸로 원하는 단어를 구한다. 당연히 최종 y hat 의 dimension 은 vocabulary size x 1 이고 vocabulary 내 모든 단어의 probability 가 출력값이겠지. 

 

 

 

그리고 컴퓨터로는 이걸 matrix 로 나타내서 matrix 계산을 하는데 (이전에 배웠듯이 계산이 더 빠름) 1)을 matrix 로 나타내면 위와 같다. 

 

 

수식과 해당 matrix 가 왜 결국 값은 값을 내는지 좀 더 자세히 표현해보면 위와 같다. 

 

당연히 각각 구해야 하는 weight parameter 의 shape 을 아는게 기본이겠지! 

word vector X 는 d x 1 (수식으로는 그냥 d 차원이라고 표현), 그리고 hidden state 는 Dh x 1 차원이라고 할 때, 구하고자 하는 파라미터들의 dimension 은

인데, |V| 는 vocabulary size 를 의미한다 (저 기호가 vector 길이 표현하는 심볼인듯). 

 

 

흥미로운 건 RNN 을 표현할 때 보는 수식이 보통 unfold 된 거라 마치 각각의 step 에서 different weight 을 쓸 것 같지만 그게 아니라 계속해서 같은 weight 을 쓴다는 거다. 언뜻 생각하기에 그럼 계속 같은 부분에 대해 (over and over) amplify 마치 이게 패턴처럼 이게 어떻게 먹히지 싶은데, 그럴 때는 해보는 게 최고! 

 

Entire sequence 에 대해서 2개나 3개의 단어만 가지고 각각의 weight parameter (word vector 랑 hidden state) 에 대한 derivative 를 구해보시오!  

 

 

3. Vanishing / Exploding gradient 

Recurrent Neural Net 을 사용할 때 가장 흔히 발생하는 문제 중 하나가 vanishing / exploding gradient 문제이다. 즉, gradient 가 한없이 작아지거나, 한없이 커져버리는 것 (이 때 어떤 학생이 exploding gradient 가 나타난다는 건 어떤 단어의 영향이 실제보다 더 커진다는 걸 의미하느냐고 물었는데 교수가 답하길, 실제로는 값이 너무 커져서 - 무한, numpy 로는 NaN 의 값- 계산 불가능한 상태가 되는 거라고 얘기함). 
 

왜 이런 상태가 되는지 알아보기 위해서 current state 의 값을 구하는 1) 수식의 gradient 를 수식으로 표현하면서, uppder bound 와 lower bound 을 가지고 이 값의 범위를 정했다. 그런데 bound 의 최종 결과 값은 결국  

와 같이 표현되는데, t랑 k 는 time step 에 대한 지수이고, 첫번째 beta 는 word vector weight 의 initialized weight 이고, 두번째 beta 는 hidden state weight 의 intialized 값이다. 문제는 time step 이 지수이기 때문에 이 지수 밑에 오는 값들, 즉 word vector weight 과 hidden state weight 의 초기값의 곱이 1보다 크냐 작냐에 따라 해당 값이 explode 될  수도, 너무 작아져 버릴 수도 있다는 거다. (수식 진행은 솔직히 이해 잘 안 됨. 직접 해봐야 될 듯)  

 

 

 

3.1 Tricks for vanishing & exploding gradient

vanishing gradient 와 exploding gradient 중에서 더 풀기 쉬운 건 사실 exploding gradient 라고 한다. 이건 max threshold 를 정해놓고 (예를 들어 5), 그 값보다 커버리면 그냥 5를 취하는 간단한 max 함수이다. 엄청 단순한 건 같지만 실제로는 먹힌다는 사실! 
 
 
 

 

그리고 vanishing gradient 를 해결하기 위해서는 교수님이 자기가 논문쓰면서 발표한 trick 을 발표했는데, 문제가 되는 word vector weight 과 hidden state weight 의 초기값을 대각선 행렬에 1/2 를 곱한 식으로 만드는 거다. 그럼 결국 초기의 current hidden state 는 그냥 막무가내의 값이 아니라, word vector 와 hidden state 의 값을 더해 평균을 낸 (1/2 씩 해서 더했으니까), 어느 정도 이해 가능한 값이 된다는 거다. 

 

 

어쨌든 RNN 을 이용해서 다양한 task 를 할 수 있는데, opinion mining 같은 것도 할 수 있다. 예를 들어 어떤 comment 가 있을 때, 각각의 단어에 대해서 이 단어가 opinion 을 1) 내포하는지 2) explicit 하게 표현하는지 3) 포함하지 않는지에 대한 classify 라고 볼 수 있다. sequence 를 입력으로 받고, 각각의 단어에 대해 labeling 하는 task 가 되겠지? 실제로는 라벨링이 단순히 3개가 아니라, 해당 라벨의 첫번째 단어인지, 이어지는 단어인지에 대한 라벨이 추가되는 듯?? 

4. Bidirectional and Deep RNNs

우리가 수업 시간에 배운 단순한 RNN (왼-> 오로 진행되며, 1개의 층으로 이루어져 있음) 은 한계가 있다. 우선 기본 RNN 은 uni-directional 이라 보통 왼->오로 이동하는데 이럴 경우 현재 단어를 기준으로 그 단어의 오른쪽 context 는 무시된다는 문제가 있다. 이 경우 보통 RNN 을 2개를 결합해서 (왼->오, 오->왼) 2개의 hidden state 를 단순히 concatenate 한 vector 를 써서 bi-directional 하게 만들고 쓴다. (참고로 BERT 와 같이 단어를 무작위로 Mask 로 가려서 가려진 단어를 predict하게 해서 만드는 언어 모델은 un-directional, 즉 방향이 없다고 보면 된다). 

 

 

 

 

 

그리고 여기에 layer 을 더 더함으로써 deep 한 RNN 까지 만들 수 있다. 오예. 아래 그림에서는 2번째 layer 는 1번째 에서만 값을 받고, 3번째 layer 는 2번째만 값을 받는데, 3번째 layer 가 2번째와 1번째 (direct 하게) layers 로부터 각각 값을 받는 모델도 존재한다고 한다.  

 

종합: 

Statistical LM 이건 Neural LM 이건 LM 은 어쨌든 어떤 sequence 가 주어졌을 때, 그 sequence 의 확률을 반환하는 모델이다. 그리고 이런 모델을 학습하기 위해서 next word prediction 을 사용한다. 이 때, 통계 기반 모델의 경우 다음 단어의 예측을 위해서 조건부 확률을 사용한다. 좀 더 자세히 말하자면 앞에 나온 n 개의 단어로 이루어진 sequene 에 대한 next word 의 조건부 확률. 그리고 이 확률은 통계, 즉 co-occurrence count 를 기반으로 이루어진다. 그렇기 때문에 모델 안에 각 sequence 에 대한 co-occurrence 에 대한 정보가 다 들어가있음.

반면 neural LM 의 경우에는 weight matrix 를 가지고 linear calculation + activation 을 계산한 값을  next word prediction 의 probability 로 사용한다.  

 

헷갈리는 부분:

LM 과 word embedding 이 어떤 데서는 혼용돼서 쓰이고 그리고 training 방법도 너무 비슷해서 헷갈렸는데 일단 main difference 는 다음과 같다 (transformer 제외). LM 과 word embedding 모두 word prediction 이 training 방법인데, word embedding 의 경우 word embedding 을 배우는 것 자체가 목적이기 때문에 next word prediction 이 아니라 중심 단어 혹은 context 단어 예측을 사용한다. 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
글 보관함