Transformers
Seq2Seq에서 RNN을 아예 빼버리고 attention으로 구성해보면 어떨까? → Transformer의 구조 현재는 seq2seq + attention에서는 하나의 벡터로…
2025/04/27
Jinsoolve.
Categories
Tags
4월 안에는 꼭...
About
이번 포스트에서는 Word Vector에 대해서 알아보자.
먼저 아래와 같은 고민을 해보자.
우리는 어떻게 컴퓨터 에게 단어의 뜻을 이해시킬 수 있을까?
예전에 WordNet라는 단어들 간의 관계에 대한 데이터셋이 있었는데, 같은 의미이거나 상위적인 의미이거나 이런 걸 표현했다.
근데 이런 WordNet은 미묘한 뉘앙스를 이해하지 못하거나, 정적 데이터이다 보니 계속해서 변화하는 자연어의 의미를 반영하지 못 했다. 또한 주관적이기도 하고, 인간 자체 노동이 필요했다.
이런 방식이다보니, 정확한 단어의 유사도를 얻기 어려웠다.
예전 NLP에서 단어를 컴퓨터에게 이해시킬 때 one-hot vector 방식을 채택해서 discrete한 값을 갖게 되었다.
매우 유사한 단어지만, 그 유사성이나 관계를 제대로 표현하지 못 했다.
"You shall know a word by the company it keeps" (J. R. Firth 1957: 11)
그러다가 "결국 단어는 그 문맥으로 이해할 수 있는 거 아니야?" 라는 생각을 누군가가 하게 된다.
즉, 비슷한 단어들과 함께 등장하는 2개의 단어가 있다면 그 두 단어는 서로 유사하다 라는 말로 이해할 수 있을 것이다.
위 아이디어에서 Word Vector 가 등장하게 된다.
사실, Word Vector는 말 그대로 단어를 실수값들로 이루어진 벡터로 표현한 것 뿐이다.
이처럼 비슷한 단어라면 그 값 또한 비슷할 거다. distributed하게(=분산해서) 표현하다보니 이런 유사성을 표현할 수도 있었다.
비슷한 단어라면 비슷하게 뭉쳐 있을 것이다.
그럼 이 word vector들을 어떻게 구할 수 있을까?
Word2Vec은 이 word vector값이 무엇인지 구하게 해주는 Framework(즉, skeleton code 같은 것. 미리 짜여진 무언가)이다.
이런 Center word에 대해서 앞뒤로 문맥을 살펴보면서 어떤 단어 가 나타나는 지를 보고 학습하여 word vector를 구하는 방식이다.
여기서 는 의 앞뒤로 (window size 안쪽으로) 가 나올 확률을 의미한다.
모델이 학습하게 될 많은 자연어들, 문장들에서 어떤 단어 A 앞뒤로 어떤 단어 B가 자주 등장할수록 모델은 A 앞뒤로 단어 B가 나오는게 자연스럽다를 학습하게 될 것이다. 가장 자연스럽게 되도록 단어 A에 대한 word vector 값이 정해지게 된다.
그럼 이때 는 어떻게 구하는 지 살펴보자.
먼저 우리는 각 단어의 word vector들을 작은 랜덤값으로 초기화한다.
이제 이걸 토대로 다음과 같이 계산한다.
여기서 := 단어 w가 중심 단어에 있을 때의 word vector
이고, := 단어 w가 context word에 있을 때의 word vector
이다.
이런 식으로 벡터곱을 해주고, softmax를 해주면 단어 c의 주변에 단어 o가 오게 될 확률을 구할 수 있다.
말 그대로 벡터끼리의 내적(dot product)이다.
단어 c의 앞뒤로 o가 나오는게 자연스럽다면 이 값이 당연히 커질 것이다.
그럼 이제 어떻게 Loss 함수를 정해야 하는 지를 보자.
Likelihood. 쉽게 말하면, '얼마나 그럴 듯 한 지'를 수치로 표현한 것이다.
어떤 문장이 주어졌을 때, 각 중심 단어에 대해서 앞뒤 문맥이 자연스러운지를 표현한 확률을 모두 곱하면 그게 해당 문장이 그럴듯한지에 대한 지표가 된다.
이제 이걸 negative log likelihood를 취해서 손실함수로 만들자.
이 손실함수를 최소화시키도록 학습하면 된다.
는 모든 word vector를 하나에 모은 거대한 벡터라 하자.
단어가 총 개 라면, 각 단어마다 word vector가 2개(, ) 이므로 총 가 된다.
그리고 각 word vector의 차원은 d. 즉, d개의 실수들을 가진 벡터로 표현한다고 하자.
그런데 손실함수 계산할 때 이 단어들을 모두 학습시키면 너무 오래 걸린다. 이 window들이 너무나도 많기 때문이다.
그래서 Stochastic GD나 mini-batch GD를 사용한다.
예시를 통해서 이해해보자.
the cat sits on the mat
위와 같은 문장이 있다고 하자. 이때 window 크기 m = 2 이라 하자. 그럼 다음과 같은 18개의 window들이 생길 수 있다.
text1(The → cat) 2(The → sits) 3(cat → The) 4(cat → sits) 5(cat → on) 6(sits → The) 7(sits → cat) 8(sits → on) 9(sits → the) 10(on → cat) 11(on → sits) 12(on → the) 13(on → mat) 14(the → sits) 15(the → on) 16(the → mat) 17(mat → on) 18(mat → the)
→ 1 epoch에 대해서 1번 업데이트
1 epoch란?
전체 훈련 데이터를 다 사용해서 학습하는 과정
다음 같이 이루어짐.
Step 1:
(The → cat) → loss 계산 → 업데이트
Step 2:
(The → sits) → loss 계산 → 업데이트
Step 3:
(cat → The) → loss 계산 → 업데이트
...
Step 18:
(mat → the) → loss 계산 → 업데이트
→ 1 epoch에 대해서 18번 업데이트
batch size = 4라 가정하자.
위와 같이 업데이트 된다. → 1 epoch에 대해서 5번 업데이트
참고로, loss들을 평균내서 미분해서 gradient를 얻어낸 것과
loss들을 각각 미분해서 gradient를 얻어낸 후 gradient를 평균낸 것은 수학적으로 동일하다고 한다.
Seq2Seq에서 RNN을 아예 빼버리고 attention으로 구성해보면 어떨까? → Transformer의 구조 현재는 seq2seq + attention에서는 하나의 벡터로…
2025/04/27
언어 모델이라는 건, 사실 다음에 올 단어를 확률로 예측하는 것이다. 이러한 언어 모델들을 어떻게 발전시켜왔는 지 살펴보자. 이미 이전 포스트에서 자세히 살펴보았던 내용이다.…
2025/04/27
이전 포스트에서 RNN에서 Vanishing Gradient로 인해 장기 의존성 문제가 있다는 사실을 이야기했다. 이런 Vanishing Gradient를 해결하기 위해 크게…
2025/04/27
기존 RNN의 병목 현상을 해결하기 위해 Attention이 등장했다. Decoder에서 한 단어를 예상할 때, 해당 단어와 특별히 관련되어 있는 Encoder의 특정 단어를…
2025/04/27