Lecture 6 - Natural Language Processing with Deep Learning
발표자 : Tobig's 13기 이혜민
Contents
1.Language Modeling
2.N-gram Language Model
3.Neural Language Model
4.RNN Language Model
5.Perplexity
1. Language Modeling
많은 사람들이 자동완성 기능, 인터넷 검색과 같은 Language Model을 일상생활에서 사용합니다.
- Language Modeling : 현재까지 주어진 문장의 다음 단어를 예측하는 것
- Language Model : 주어진 문장의 다음 단어를 예측하는 것을 수행하는 모델
- 문장에 이미 주어진 단어 x(1)부터 x(t)가 주어졌을 때, 다음에 올 단어 x(t+1)의 확률을 나타낼 수 있습니다. => 특정 문장에 확률 할당 가능
- 특정 문장의 확률(좌변)을 식의 우변과 같이 연속된 조건부확률로 풀어 쓴 이후에, LM을 통해서 알아낼 수 있는 값들(두번째 줄)을 통해서 확률을 계산할 수 있습니다.
2. N-gram Language Model
(1) Definition
Q : How to learn a Language Model?
A : (pre-deep learning) Learn n-gream Language Model
n-gram : a chunck n consecutive words (연이은 단어들의 덩어리)
n-gram 모델은 카운트에 기반한 통계적 접근을 사용하고 있기 때문에 SLM의 일종입니다. 하지만 이전에 등장한 모든 단어를 고려하는 것이 아니라, 일부 단어만 고려하는 접근 방법을 사용합니다.
'일부 단어를 몇 개 보느냐'를 결정하는 것이 n-gram에서의 n이 가지는 의미입니다.
IDEA : Collect statistics about how frequent diffrent n-grams are, and use these to predict next word (n-그램의 빈도에 대한 통계를 수집하고 이를 다음 단어를 예측하는데 사용)
예) The students opened their __
- unigrams : the, students, opened, theirs
- bigrams : the students, students opened, opened their
- trigrams : the students opened, students opened their
- 4-grams : the students opened their
Markov Assumption : X(t+1)은 n-1개의 단어에만 영향을 받는다라는 가정
-> 다음 단어를 예측하기 위해서 확률을 계산하는 것이 아니라 여기서는 some large corpus of text에서 count해서 근사화하는 값을 계산합니다.
(2) Problems
ex) 4-gram Language Model로 다음 단어 예측하기
As the proctor started the clock, the students opened their __
n-gram 언어 모델은 언어 모델링에 바로 앞의 n-1개의 단어만 참고합니다.
4-gram 언어 모델이라고 가정하여 위 문장을 가지고 앞서 배운 n-gram 언어 모델링을 하는 방법을 알아보겠습니다. 모델은 바로 앞 3개의 단어만 참고하며 더 앞의 단어들은 무시합니다.
위 예제에서 다음 단어 예측에 사용되는 단어는 students, opened, their입니다.
P(w|boy is spreading)=count(boy is spreading w)count(boy is spreading)
그 후에는 훈련 코퍼스에서 (n-1)-gram을 카운트한 것을 분모로, n-gram을 카운트한 것을 분자로 하여 다음 단어가 등장 확률을 예측했습니다. 예를 들어 갖고있는 코퍼스에서 students opened their가 1,000번, students opened their books가 400번, students opened their exams가 100번 등장했다면 각 확률은 아래와 같습니다.
P(books|students opened their=0.4
P(exams|students opened their)=0.1
1. 희소 문제 (Sparsity problems)
문장에 존재하는 앞에 나온 단어를 모두 보는 것보다 일부 단어만을 보는 것으로 현실적으로 코퍼스에서 카운트 할 수 있는 확률을 높일 수는 있었지만, 여전히 n-gram 모델에 대한 희소 문제가 존재합니다.
- 훈련 코퍼스에 'students opened their '라는 단어 시퀀스가 존재하지 않으면 n-gram 언어 모델에서 해당 단어 시퀀스의 확률 P(students opened their exams)는 0이 되버립니다.
- 언어 모델이 예측하기에 students opened their 다음에는 books이란 단어가 나올 수 없다는 의미이지만 해당 단어 시퀀스는 현실에서 실제로는 많이 사용되므로 제대로 된 모델링이 아닙니다.
n을 작게 선택하면, 훈련 코퍼스에서 카운트는 잘 되겠지만 근사의 정확도는 현실의 확률분포와 멀어집니다. 그렇기 때문에 적절한 n을 선택해야 합니다. 앞서 언급한 trade-off 문제로 인해 정확도를 높이려면 n은 최대 5를 넘게 잡아서는 안 된다고 권장되고 있습니다.
2. 저장 문제 (Storage Problems)
n이 커지거나 corpus가 증가하면, 모델 사이즈가 커진다는 문제점도 있습니다. 기본적으로 코퍼스의 모든 n-gram에 대해서 카운트를 해야 하기 때문입니다.
(3) Process
앞의 개념을 통해서 예시로 n-gram 동장 방식을 알아보겠습니다.
- 3-gram으로 정하면 n-1인 2개의 단어(today, the)만 남게 됩니다.
- 해당 단어들을 기반으로 확률 분포를 얻어내면, 가능성이 있는 단어들이 분포로 나오게 됩니다.
- 분명히 희소성의 문제가 보이지만 이를 무시하고 본다면 나쁘지 않은 결과입니다.
- 이전의 과정과 같이 codition (조건 선택) -> sampling (확률 분포에서 제일 확률이 높은 단어를 선택하는 것) -> condition (조건 선택) -> ... -> 새로운 확률 분포를 얻고 샘플링하는 과정을 반복하면서 해당 텍스트를 생성해 낼 수 있습니다.
- 생각보다 문법적인 결과입니다. 하지만, 전체적인 의미에서 일관성이 없고 n을 늘리게 되면 우려되는 희소성 때문에 n-gram의 한계점을 볼 수 있습니다.
3. Neural Language Model
이전 n-gram Language Model 문제점에 대한 대안으로 대체적으로 성능이 우수한 인공 신경망을 이용한 언어 모델이 많이 사용되고 있습니다.
n-gram 언어 모델은 충분한 데이터를 관측하지 못하면 언어를 정확히 모델링하지 못하는 희소 문제(sparsity problem)가 있었습니다. 희소 문제는 기계가 단어 간 유사도를 알수 있다면 해결할 수 있는 문제입니다.
언어 모델 또한 단어의 유사도를 학습할 수 있도록 설계한다면, 훈련 코퍼스에 없는 단어 시퀀스에 대한 예측이라도 유사한 단어가 사용된 단어 시퀀스를 참고하여 보다 정확한 예측을 할 수 있을 겁니다. 이런 아이디어를 가지고 탄생한 언어 모델이 신경망 언어 모델 NNLM입니다.
Window-based Neural Network Language Model (NNLM)
- "Curse of dimensionality (차원의 저주)"를 해결하기 위해 제안된 신경 기반 Language Model
- Language Model이면서 동시에 단어의 "distributed representation"을 학습
- NNLM은 n-gram 언어 모델과 유사하게 다음 단어를 예측할 때, 앞의 모든 단어를 참고하는 것이 아니라 정해진 n개의 단어만을 참고합니다. 이 범위를 윈도우(window)라고 합니다.
-> window size : 4
- input : 단어들의 시퀀스
- output : 다음 단어에 대한 확률 분포
Input 단어 x의 시퀀스를 window 사이즈 만큼 입력하여, one-hot vector를 거쳐 임베딩 합니다.
임베딩 한 벡터 값들을 concatenate하여 가중치 값과 연산하여 hidden layer를 거치게 됩니다. 최종적으로 softmax 함수를 통해 확률 분포를 output 할 수 있으며 해당 분포를 통해서 제일 가능성이 높은 다음 단어를 예측하게 됩니다.
< Improvements >
- 단어의 embedding을 통해 n-gram이 없을 확률에 대한 희소성 문제가 없습니다.
- 관측된 모든 n-gram을 저장할 필요가 없습니다.
< Problems >
- Fixed window is too small
- Window가 커질수록 가중치 W도 커집니다. (Window 크기의 한계)
- 룩업 테이블(lookup table) : 원-핫 벡터의 특성으로 인해 i번째 인덱스에 1이라는 값을 가지고 그 외의 0의 값을 가지는 원-핫 벡터와 가중치 W 행렬의 곱은 사실 W행렬의 i번째 행을 그대로 읽어오는 것과(lookup) 동일하다는 개념입니다.
- 룩업 테이블 작업을 거치면 V의 차원을 가지는 원-핫 벡터는 이보다 더 차원이 작은 M차원의 단어 벡터로 맵핑됩니다. 테이블 룩업 과정을 거친 후의 이 단어 벡터를 임베딩 벡터(embedding vector)라고 합니다.
- 해당 벡터와 가중치 metrix에서의 연산에서는 각각의 벡터들이 각각 다른 W 가중치 섹션을 곱하게 되면서 단어와 단어 간의 'No Symmetry'하게 되는 문제점을 가지게 됩니다.
4. Recurrent Neural Network(RNN) Language Model
(1) Recurrent Neural Network(RNN)
기존의 뉴럴 네트워크 알고리즘은 고정된 크기의 입력을 다루는 데는 탁월하지만, 가변적인 크기의 데이터를 모델링하기에는 적합하지 않습니다.
RNN(Recurrent Neural Network, 순환신경망)은 시퀀스 데이터를 모델링 하기 위해 등장으며, 기존의 뉴럴 네트워크와 다른 점은 ‘기억’(hidden state)을 갖고 있다는 점입니다.
- 위 다이어그램에서 빨간색 사각형은 입력, 노란색 사각형은 기억, 파란색 사각형은 출력을 나타냅니다.
- 첫번째 입력이 들어오면 첫번째 기억이 만들어집니다. 두번째 입력이 들어오면 기존의 기억과 새로운 입력을 참고하여 새 기억을 만듭니다.
- 입력의 길이만큼 이 과정을 얼마든지 반복할 수 있으며, RNN은 이 요약된 정보를 바탕으로 출력을 만들어 냅니다.
는 t 시간 스텝에서의 입력 벡터, 는 t 시간 스텝에서 RNN의 기억을 담당하는 hidden state, 는 출력 벡터입니다. U, W, V는 모델의 파라미터입니다.
첫 다이어그램에 없던 은 hidden state의 초기값으로, 구현을 위해 필요한 부분이며 일반적으로 0으로 초기화 합니다.
은닉층 :
네트워크의 기억에 해당하는 hidden state 는 입력 x와 과거의 기억 을 조합하여 만들어집니다. 조합하는 방식은 파라미터 U와 W에 의해 결정됩니다. U는 새로운 입력이 새로운 기억에 영향을 미치는 정도를, W는 과거의 기억이 새로운 기억에 영향을 미치는 정도를 결정한다고 볼 수 있습니다. 비선형함수로는 tanh나 ReLU가 주로 사용됩니다. 여기에서는 tanh를 쓰겠습니다.
출력층:
출력, 즉 예측값은 마지막 hidden state 로부터 계산됩니다. 와 V를 곱하는데, 여기서 V는 hidden state와 출력을 연결시켜주며 출력 벡터의 크기를 맞춰주는 역할을 합니다. 마지막으로 출력을 확률값으로 변환하기 위해 softmax 함수를 적용합니다. softmax 함수는 모든 출력값을 0 ~ 1 사이로 변환하고, 출력값의 합이 1이 되도록 합니다.
RNN의 핵심 : 반복적으로 같은 가중치 W를 적용하는 것
- 은닉상태 h(t)는 이전 은닉 상태 h(t-1)와 해당 단계의 입력 x(t)의 구성이다.
#python code
hidden_state_t = 0 # 초기 은닉 상태를 0(벡터)로 초기화
for input_t in input_length: # 각 시점마다 입력을 받는다.
output_t = tanh(input_t, hidden_state_t) # 각 시점에 대해서 입력과 은닉 상태를 가지고 연산
hidden_state_t = output_t # 계산 결과는 현재 시점의 은닉 상태가 된다.
<각 벡터와 행렬의 크기>
Xt : (d×1)
Wx : (Dh×d)
Wh : (Dh×Dh)
ht−1 : (Dh×1)
b : (Dh×1)
단어 벡터의 차원 : d, 은닉 상태의 크기 : Dh
(2) Improvements & Disadvantages
< Improvements >
- 모든 길이의 입력을 처리할 수 있다.
- 단계 t는 이론적으로 여러 이전 단계의 정보를 사용할 수 있다.
- 아무리 입력이 길어도 모델의 크기가 증가하지 않는다. (모델의 크기는 WH와 WE로 고정되어 있다.)
- 모든 time step에 동일한 가중치를 적용한다.
- 각 입력에 동일한 변환을 적용한다. 따라서 하나의 입력을 처리하는 좋은 방법을 배우면 시퀀스의 모든 입력에 적용된다.
< Disadvantages >
- 이전 은닉 상태를 기반으로 다음 은닉 상태를 계산해야 하기 때문에 순차적인 계산이 필요하다. 따라서, 반복하는 과정에서 매우 계산이 느립니다.
- 여러 단계에서 정보에 액세스하는 것이 매우 어렵습니다.
- 큰 단점은 시퀀스 중 중요한 입력과 출력 단계 사이의 거리가 멀어질 수록 그 관계를 학습하기 어려워진다는 점입니다.
- 신경망이 깊어질수록 Vanishing gradient로 인해, 문장 초반부의 단어가 결과에 미치는 영향이 적어집니다.
+) 이점을 극복하기 위해 RNN의 여러 변형 모델들이 제안되고 있으며, 대표적인 변형 모델로는 LSTM, attention 기반 모델이 있습니다.
(3) Training a RNN Language Model
- x1에서 xT까지의 단어 시퀀스가 있는 텍스트 코퍼스 모음을 얻습니다.
- RNN 모델에 단어 시퀀스를 입력한 다음, 모든 단계 T에 대한 출력 분포인 Y(T)를 계산합니다. (모든 단계에서의 다음 단계에 대한 확률을 계산합니다.)
- 예측 확률 분포 Y(T)와 사실 두 벡터 사이에 대한 교차 엔트로피를 이용하여에 손실 함수를 정의합니다.
- 최종적으로, 모든 단계에서의 loss 평균으로 T의 모든 훈련 셋의 전체 loss를 구합니다.
- 다만 실제 RNN-model을 학습할 경우, 위의 그림과 같이 계산을 하게 되면 많은 양의 계산이 필요하기 때문에 문장 혹은 문서 단위로 입력을 주게 되며, SGD를 통해서 Optimize하는 것도 하나의 방법이라고 합니다.
(4) Backpropagation for RNNs
- RNN을 학습하는 것은 기존의 신경망 모델을 학습하는 것과 매우 유사합니다. 그러나 기존의 backpropagation과 다르게 순환 신경망은 계산에 사용된 시간, 시점의 수가 영향을 주어Backpropagation Through Time (BPTT) '시간에 따른 역전파'라는 약간 변형된 알고리즘을 사용합니다.
- 각 출력 부분에서의 gradient가 현재 시간 스텝에만 의존하지 않고 이전 시간 스텝들에도 의존합니다.
- 만약, 예시로 t=2의 시점에서 발생한 손실을 역전파 하려면 손실을 입력과 은닉층 사이의 가중치로 미분하여 손실에 대한 각각의 비중을 구해서 업데이트 해야 합니다. 이 연산 과정에서 은닉층의 '이전 시점의 값들'이 연산에 포함되는데 이전 시점의 값은 세부적으로 (가중치, 입력값, 이전 시점의 값들의 조합)으로 이루어져 있다. 순환 신경망은 각 위치별로 같은 가중치를 공유하기 때문에 t=2 시점의 손실을 역전파 하기 위해서는 t=0 시점의 노드 값들에도 '모두 영향을 주어야' 한다.
BPTT(Backpropagation Through Time) : 각 레이어마다의 weight는 실제론 동일한 웨이트여야 하므로 모든 업데이트도 동일하게 이루어져야 한다. 따라서 각 layer마다 동일한 위치의 weight에 해당하는 모든 derivative error를 다 더한다음 (더하는 거나 평균 내는거나 사실상 같은 의미) weight를 1번 업데이트 해준다.
(어차피 edge하나를 펼친거니까 k스텝으로 펼쳐서 k개의 에러를 구한다음, 에러를 하나로 합치고 이 edge에 대해 업데이트 해주면 끝) 사실상 이것이 BPTT의 핵심적인 부분이다.
(5) what can RNNs do?
RNN의 입력과 출력은 우리가 네트워크에게 시키고 싶은 것이 무엇이냐에 따라 얼마든지 달라질 수 있습니다.
1. 고정크기 입력 , 고정크기 출력
-> 순환적인 부분이 없기 때문에 RNN이 아닙니다.
2. 고정크기 입력 & 시퀀스 출력
-> 예)이미지를 입력해서 이미지에 대한 설명을 문장으로 출력하는 이미지 캡션 생성
3. 시퀀스 입력 & 고정크기 출력
-> 예) 문장을 입력해서 긍부정 정도를 출력하는 감성 분석기
4. 시퀀스 입력 & 시퀀스 출력
-> 예) 영어를 한국으로 번역하는 자동 번역기
5. 동기화된 시퀀스 입력 & 시퀀스 출력
예) 문장에서 다음에 나올 단어를 예측하는 언어 모델
다양한 RNN 활용
- RNN은 Tagging, Sentence classification, Encoder Module에도 활용이 많이 되고 있습니다.
5. Perplexity
Evaluating Language Models : Perplexity
언어 모델의 성능을 평가하는 척도인 perplexity(PPL)를 측정하는 방법은 정량 평가/extrinsic evaluation 방법의 하나입니다. PPL은 문장의 길이를 반영하여 확률값을 정규화한 값이라고 할 수 있습니다. PPL을 이용하여 언어 모델에서 테스트 문장들의 점수를 구하고, 이를 기반으로 언어 모델의 성능을 측정합니다.
- Perplexity는 Language Model의 성능을 측정하는 척도입니다.
- Language model을 통해 예측한 corpus의 inverse를 corpus 길이로 normalize 해준 값 입니다.
- cross-entropy에다가 로그 씌우고 exponential을 씌어서 구할 수 있으며, perplexity가 낮을 수록 좋은 Language Model이라고 할 수 있습니다.
최근 Perplexity가 감소하고 있음을 확인할 수 있는데, 해당 값이 낮을 수록 좋습니다.
6. 출처
- https://www.youtube.com/watch?v=iWea12EAu6U&list=PLoROMvodv4rOhcuXMZkNm7j3fVwBBY42z&index=6
(강의 자료 : 2019 Winter CS224N - Lecture 6)
- https://wikidocs.net/21692 (n-gram language model)
- https://blog.naver.com/dmsquf3015/222055564808
- https://mystudyplace.tistory.com/22 (NNLM model)
- https://wikidocs.net/22886 (RNN model)
- https://newsight.tistory.com/94 (backpropagation vs BPTT)
- https://kh-kim.gitbook.io/natural-language-processing-with-pytorch/00-cover-8/03-perpexity#perplexity (perplexity)
Author And Source
이 문제에 관하여(Lecture 6 - Natural Language Processing with Deep Learning), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://velog.io/@tobigs-text1415/Natural-Language-Processing-with-Deep-Learning
저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
(강의 자료 : 2019 Winter CS224N - Lecture 6)
Author And Source
이 문제에 관하여(Lecture 6 - Natural Language Processing with Deep Learning), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@tobigs-text1415/Natural-Language-Processing-with-Deep-Learning저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)