Transformers
Seq2Seq에서 RNN을 아예 빼버리고 attention으로 구성해보면 어떨까? → Transformer의 구조 현재는 seq2seq + attention에서는 하나의 벡터로…
2025/04/27
Jinsoolve.
이번 포스트에서는 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들이 생길 수 있다.
text(The → cat) (The → sits) (cat → The) (cat → sits) (cat → on) (sits → The) (sits → cat) (sits → on) (sits → the) (on → cat) (on → sits) (on → the) (on → mat) (the → sits) (the → on) (the → mat) (mat → on) (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
성# Language Model(LM)이란? 언어 모델이라는 건, 사실 다음에 올 단어를 확률로 예측하는 것이다. 이러한 언어 모델들을 어떻게 발 전시켜왔는 지 살펴보자. 이미 이…
2025/04/27
이전 포스트에서 RNN에서 Vanishing Gradient로 인해 장기 의존성 문제가 있다는 사실을 이야기했다. 이런 Vanishing Gradient를 해결하기 위해 크게…
2025/04/27
기존 RNN의 병목 현상을 해결하기 위해 Attention이 등장했다. Decoder에서 한 단어를 예상할 때, 해당 단어와 특별히 관련되어 있는 Encoder의 특정 단어를…
2025/04/27
