CBOW란?
CBOW는 Word2Vec의 방식 중 하나이다.
CBOW는 주변에 있는 단어들을 가지고, 중간에 있는 단어들을 예측하는 방법이다.
예문 : "The fat cat sat on the mat"
{"The", "fat", "cat", "on", "the", "mat"}으로부터 sat을 예측하는 것은 CBOW가 하는 일("sat"이 빠져있음)이다.
예측해야하는 단어 "sat"은 중심단어(center word)라고 하고, 예측에 사용되는 주변 단어(context word)라고 한다.
중심 단어(sat)을 예측하기 위해서 앞, 뒤로 몇 개의 단어를 볼지를 결정했다면 이 범위를 윈도우(window)라고 한다.
예를 들어, 윈도우 크기가 2이고, 예측하고자 싶은 단어가 sat이라면 앞의 두 단어(fat, cat), 뒤의 두 단어(on, the)가 참고된다. 윈도우 크기가 n이라면, 실제 중심 단어를 예측하기 위해서 사용되는 주변 단어의 개수는 2n이 된다.
윈도우 크기를 정했다면, 윈도우를 계속 움직이면서 주변 단어와 중심 단어 선택을 바꿔가며 학습을 위한 데이터셋을 만들 수 있다. 이 방법을 슬라이딩 윈도우(sliding window)라고 한다.
위 그림에서는 중심 단어(예측하고 싶은 단어)는 sat이 되며, 윈도우 크기는 2가 된다. 입력은 one-hot vector로써 들어가게 된다.
Word2Vec은 딥러닝 모델이 아니다(생긴건 비슷한데...) 보통 딥러닝은 입력층과 출력층 사이의 은닉층의 개수가 충분히 쌓인 신경망을 의미한다. 하지만, Word2Vec는 입력층과 출력층 사이에 하나의 은닉층만이 존재하며, 은닉층이 1개인 경우에는 일반적으로 심층신경망(Deep)이 아니라 얕은신경망(Shallow)라고 부른다. 또한, Word2Vect의 은닉층은 일반적인 은닉층과는 달리 활성화 함수가 존재하지 않으며, 룩업 테이블(주어진 연산에 대해 미리 계산된 결과들의 집합을 가리킨다. 이집합은 주어진 연산에 대한 결과를 계산하는 시간보다 빠르게 값을 취득할 수 있도록 사용되는 레퍼런스로 사용된다)이라는 연산을 담당하는 층이다. 이를 투사층(projection layer)라고 부르기도 한다.
CBOW의 인공 신경망을 좀 더 확대하여, 동작 메커니즘에 대해서 상세하게 알아보자. 이 그림에서 주목해야할 것은 두 가지 이다.
첫번째는 투사층(Projection layer)의 크기가 M이라는 점이다. 즉, CBOW를 수행하고 나면 각 단어의 임베딩 벡터의 차원은 5가 될 것이다.
두번째는 입력층과 투사층(projection) 사이의 가중치 W는 V x M 행렬이며, 투사층(projection)에서 출력층 사이의 가중치 W '는 M x V 행렬이다. 여기서 V는 단어 집합의 크기를 의미한다. 즉, 위의 그림처럼 Input layer(원-핫 벡터)의 차원이 7이고, M은 5라면 가중치 W는 7 × 5 행렬이고, W '는 5 × 7 행렬이 될 것이다. 주의할 점은 이 두 행렬은 동일한 행렬을 전치(transpose)한 것이 아니라, 서로 다른 행렬(W 와 W ')이라는 점이다. 인공 신경망의 훈련 전에 이 가중치 행렬 W와 W '는 대게 굉장히 작은 랜덤 값을 가지게 된다. CBOW는 주변 단어로 중심 단어를 더 정확히 맞추기 위해 계속해서 이 W와 W '를 학습해가는 구조이다.
입력으로 들어오는 주변 단어의 원-핫 벡터와 가중치 W 행렬의 곱이 어떻게 이루어지는지 보자.
위 그림에서는 각 주변 단어의 원-핫 벡터를 x로 표기하였다. 입력 벡터는 원-핫 벡터이다.
i번째 인덱스에 1이라는 값을 가지고 그 외의 0의 값을 가지는 입력 벡터(e.g. [0,0,0,1,0,...,0])와 가중치 W 행렬의 곱은 사실 W행렬의 i번째 행을 그대로 읽어오는 것과(lookup) 동일하다. 그래서 이 작업을 룩업 테이블(lookup table)이라고 부른다.
앞서 CBOW의 목적은 W와 W '를 잘 훈련시키는 것이라고 언급한 적이 있는데, 사실 그 이유가 여기서 lookup해온 W의 각 행벡터가 사실 Word2Vec을 수행한 후의 각 단어의 M차원의 크기를 갖는 임베딩 벡터들이기 때문이다.
각 주변 단어의 원-핫 벡터에 대해서 가중치 W가 곱해서 생겨진 결과 벡터들은 투사층에서 만나 이 벡터들의 평균인 벡터를 구하게 된다.
만약 윈도우 크기가 2라면, 입력 벡터의 총 개수는 2n이므로 중간 단어를 예측하기 위해서는 총 4개가 입력 벡터로 사용된다. 그렇기 때문에 평균을 구할 때는 4개의 결과 벡터에 대해서 평균을 구하게 된다.
투사층에서 벡터의 평균을 구하는 부분은 CBOW가 Skip-Gram과 다른 차이점이기도 하다. 뒤에서 보게되겠지만, Skip-Gram은 입력이 중심 단어 하나이기때문에 투사층에서 벡터의 평균을 구하지 않는다.
구해진 평균 벡터(v)는 두번째 가중치 행렬 W '와 곱한다. 곱셈의 결과로는 원-핫 벡터들과 차원이 V로 동일한 벡터가 나온다. 만약 입력 벡터의 차원이 7이었다면 여기서 나오는 벡터도 마찬가지가 된다.
이 벡터에 CBOW는 소프트맥스(softmax) 함수를 취하는데, 소프트맥스 함수로 인한 출력값은 0과 1사이의 실수로, 각 원소의 총 합은 1이 되는 상태로 바뀌게 된다. 이렇게 나온 벡터를 스코어 벡터(score vector)라고 한다. 스코어 벡터의 각 차원 안에서의 값이 의미하는 것은 아래와 같다.
스코어 벡터의 j번째 인덱스가 가진 0과 1사이의 값은 j번째 단어가 중심 단어일 확률을 나타낸다. 그리고 이 스코어 벡터는 우리가 실제로 값을 알고있는 벡터인 중심 단어 원-핫 벡터의 값에 가까워져야 한다. 스코어 벡터를 𝑦^라고 하겠다. 중심 단어를 y로 했을 때, 이 두 벡터값의 오차를 줄이기위해 CBOW는 손실 함수(loss function)로 cross-entropy 함수를 사용한다.
cross-entropy 함수에 실제 중심 단어인 원-핫 벡터와 스코어 벡터를 입력값으로 넣고, 이를 식으로 표현하면 위와 같다.
그런데 y가 원-핫 벡터라는 점을 고려하면, 이 식은 위와 같이 간소화시킬 수 있다. 이 식이 왜 loss function으로 적합한지 알아보자. c를 중심 단어에서 1을 가진 차원의 값의 인덱스라고 한다면,
는 y^가 y를 정확하게 예측한 경우가 된다. 이를 식에 대입해보면 -1 log(1) = 0이 되기 때문에, 결과적으로 y^가 y를 정확하게 예측한 경우의 cross-entropy의 값은 0이 된다. 즉,
이 값을 최소화하는 방향으로 학습해야 한다.
이제 역전파(Back Propagation)를 수행하면 W와 W '가 학습이 되는데, 학습이 다 되었다면 M차원의 크기를 갖는 W의 행이나 W '의 열로부터 어떤 것을 임베딩 벡터로 사용할지를 결정하면 된다. 때로는 W와 W '의 평균치를 가지고 임베딩 벡터를 선택하기도 한다.
정리
[ Input layer + Projection layer ]
Input layer와 Projection layer를 거치게 되면 평균벡터(v)
를 구할 수 있다. ( n 은 window size임으로 2가 입력되게 된다.)
각각의 벡터(V_fat, V_cat, V_on, V_the)는
와 같이 구할 수 있으며, W는 가중치를 의미하며 값들(2.1, 1.8, 1.5, 1.7, 2.7)은 학습을 통해 구해야 한다. ( W ' 도 동일 )
[ Projection layer + Output layer ]
일단 W 와 W ' 은 완전히 다른 행렬이다(전치행렬 관계 아님). W ' 행렬도 학습을 통해 점차 값이 변할 것이다.(아마도...?내가 직접 실험은 안해봐서...)
Input + Projection의 결과물인 평균벡터(v)를 가중치 W ' 와 곱해서 결과 벡터(z)가 나오게 되는데, 이를 softmax 함수를 취한다. ( 각 원소의 총 합이 1이 되며, 값이 높을수록 해당 값일 확률이 높음 )
소프트맥스 까지 거친 벡터(y^hat)을 기존 정답(sat의 원-핫 인코딩)과 비교를 통해 W , W ' 를 조정해 나간다.
비교 방법은 Loss 함수 중 Cross Entropy를 사용한다.
그렇다면 왜 Cross Entropy 일까?
c를 중심 단어에서 1을 가진 차원의 값의 인덱스라고 한다면,
는 y^가 y를 정확하게 예측한 경우가 됩니다. 이를 식에 대입해보면 -1 log(1) = 0이 되기 때문에, 결과적으로 y^가 y를 정확하게 예측한 경우의 cross-entropy의 값은 0이 됩니다. 즉,
이 값을 최소화하는 방향으로 학습해야 합니다.
앞서 말했던 W, W'를 조정은 역전파(Back Propagation)를 수행하면서 학습이 된다.
때로는 W와 W'의 평균치를 가지고 임베딩 벡터를 선택하기도 한단다.
어휴;; 사용만 하는건 쉬운데 이해를 하니까 머리가 아프다...ㅎ
억울한건 이해는 되는데 글로 쓰기가 어렵넹ㅎㅎㅎㅎㅎ 💫💫
출처 : https://wikidocs.net/60854
'자연어처리(NLP)' 카테고리의 다른 글
TF-IDF 해석 방법(+ 예제, 실험) (0) | 2023.01.05 |
---|---|
Skip-gram (0) | 2022.12.16 |
워드투벡터(Word2Vec) (0) | 2022.12.16 |
워드 임베딩(Word Embedding) (0) | 2022.12.16 |
NLP에서 원-핫 인코딩(One-hot encoding)이란? (0) | 2022.12.16 |