
CS224N 첫 번째 강의 Word Vectors 시간입니다.

1. 강의 Introduction
2. 인간의 언어와 단어 의미 ← 이번 포스트에서 다룰 주제입니다.
3. Word2vec 개요 ← 이번 포스트에서 다룰 주제입니다.
4. Word2vec objective function gradients ← white board로 대체합니다.
5. 최적화 ← Lecture 2에서 다룹니다.
6. word vectors ← jupyter notebook

인간은 오랑우탄의 지능 차이는 크지 않지만, 인간이 오랑우탄과 같지 않은 이유는,
인간은 아주 큰 컴퓨터 네트워크를 가지고 있다는 점입니다.
언어의 역사는 10만 년 정도 되었고,
글쓰기는 5000년의 비교적 짧은 역사를 갖고 있지만, 인간의 지식을 전달할 수 있었다는 점에서 인간이 오랑우탄보다 발달한 큰 이유 중 하나입니다.
...
그렇지만 한 편으로는 컴퓨터 전송 속도에 비하면, 인간의 언어는 많이 느린 속도라는 단점(?) 도 있습니다. 그렇지만, 우리는 이미 많은 지식을 담고 있는 컴퓨터 네트워크를 가지고 있고, 정황과 다양한 조건 속에서 필요한 몇 가지 단어만 말하면 된다는 점에서 효율적입니다.
결론은 인간의 언어는 complex 하고 아주 큰 네트워크를 가진 컴퓨터와 같다는 점입니다.

좀 더 구체적인 설명으로 넘어가 봅니다.
단어의 의미(meaning)를 어떻게 표현할 수 있을까요?
사전적 의미:
- 단어, 구 등으로 표현되는 아이디어
- 사람이 단어, 기호 등을 사용하여 표현하고 싶어 한다는 생각
- 글, 예술 등의 작품에서 표현되는 아이디어
언어학자들이 공통적으로 생각하는 의미:
기표 (기호) ⟺ 의미 (아이디어 또는 사물)
위와 같이 표현하는 것을 denotational semantics (표시 의미론)라고 합니다.
이는 프로그래밍 언어에도 사용되는 방식입니다.

computer에서는 한 예로, wordnet과 같이 유의어 사전(thesaurus)을 이용하여 단어의 관계를 표현하는 방식을 취합니다.
nltk 라이브러리를 사용한 위의 python 코드로 결과를 확인해 볼 수 있습니다.
good과 관련된 명사, 형용사를 확인하거나
panda와 비슷한 상위어(Hypernym)를 조회할 수 있습니다.

그렇지만 wordnet과 같은 리소스만 사용하여 단어를 표현하는 것에는 문제가 있었습니다.
1. 뉘앙스가 없다.
- “proficient” 와 “good” 가 동의어로 나오지만, 이는 일부 상황에서만 맞는 얘기입니다.
2. 단어의 새로운 의미가 누락되어있다.
- 최신 정보를 유지할 수 없다.
3. 주관적이다.
4. create and adpt 시키는데 인간의 노동력이 필요하다.
5. 정확한 단어의 유사성을 compute 하는 것이 생각보다 잘 되지 않는다.
: discrete 한(이산적인) 단어 집합이 있기 때문에, 부분적인 동의어를 표현할 수 없습니다.
![]() |
![]() |
전통적인 NLP에서는 단어를 discrete 하게 표현했습니다. (~2012년까지 주로 이 방식을 취했고 2013년부터 neural net을 사용하면서 변화하기 시작했습니다.)
먼저 hotel, conference, motel이라는 단어를 word vector로 표현한다고 가정합니다.
여기서 위 세 개 단어는 localist representation (지엽적인 표현)이라고 하는데,
이는 단어의 의미를 담지 않고 독립적으로 표현된다는 의미로 이해하면 되고
바로 나올 one-hot vectors의 다른 표현이라고 보면 됩니다.
그래서 머신러닝에서 단어를 계산할 때 vector를 사용했고, 각 단어 위치를 주어 해당 단어의 위치에만 1, 나머지는 0으로 채워 해당 단어를 표현했습니다. 이것을 one-hot vector라고 합니다.
그렇지만 언어에는 아주 많은 단어가 있습니다.
그리고 단어는 확장 가능하여, 무한한 단어 공간을 가져야 할 수 있습니다.
이것이 좌측 페이지에서 설명하는 '첫 번째' 큰 문제이고
우측 페이지에서 '두 번째' 큰 문제에 대해 설명합니다.
우리는 단어의 관계를 알고 싶습니다.
시애틀 모텔을 검색하고자 할 때, 시애틀 호텔 등 관련된 정보까지 조회해준다면 아주 좋을 것입니다.
그렇지만 one-hot vector 에는 모텔-호텔 간에 similarity 가 존재하지 않습니다.
수학적으로 이 둘 벡터는 orthogonal (직교)입니다. 둘 사이에 유사성은 없습니다.
이것을 해결하기 위해 wordnet의 유사어 테이블을 제공하는 등의 방식을 제공하려 많은 연구가 있었지만,
만일 50만 단어를 모든 쌍에 대해 유사단어를 표현한 테이블을 가지려면 50만*50만 = 2조 5천억(?) size 혹은 그 이상을 가져야 하므로 불가능합니다.
대신, 벡터 자체적으로 유사성은 encoding 하는 방법을 배우도록 하는 방법을 연구했습니다.

여기서 새로운 아이디어로 발전되어 나온 것이, denotational semantic (표시 의미론)의 반대되는 개념인
distribution semantic (분산 의미론)입니다.
분산 의미론은 단어의 의미는 가까이에 자주 나타나는 단어로 지정된다는 것입니다.
단어 w가 텍스트에 나타날 때, 문맥은 (고정된 window size 내에서 ) 근처에 나타나는 단어 집합입니다.
w의 많은 컨텍스트를 사용하여 w의 representation을 구축합니다.
banking의 word representation을 얻고자 할 때,
많은 banking 이 나오는 문장을 수집하고 단어 주변의 단어 (= 문맥)을 통해 단어의 표현을 얻는 것이 굉장히 효과가 있었습니다.
![]() |
![]() |
이제 여기서 distributed representation이라는 개념이 등장합니다. (<-> localist representation)
banking에 대한 word vector는 이제 0, 1로 표현되지 않고 9차원 안에서 각각 -1~1 값을 가진 값들로 표현됩니다..
(실제로는 최소 50차원 이상을 사용한다고 합니다. 성능을 좋게 하려면 500, 1000, 2000.. 더 커져야겠죠. 50만은 넘지 않습니다.)
유사한 context에서 나타난 단어의 벡터와 유사하도록 각 단어에 대해 조밀한 벡터(dense vector)를 구축합니다.
Note:
word vectors는 word embeddings, word representations와 같은 말이고,
앞으로의 강의에서 word vectors는 distributed representation을 의미하는 것입니다.
우측 페이지에서 expect 단어를 2D차원에서 어떻게 표현되는지를 보여주고 있습니다. 의미론적으로 비슷한 동사들의 그룹이 표현된
공간 어딘가에 위치해있습니다.

이제 2013년에 Thomas Mikolov가 고안한 word2 vec 알고리즘을 알아보겠습니다.
이것은 요슈아 벤지오가 밀레니엄 시대에 많이 연구했던 분야인데, 이 연구에 의해
매우 간단하고 확장 가능한 방식으로 단어의 벡터 표현을 학습할 수 있게 되어 이후 활발한 연구를 가능케 했습니다.
Idea:
- 먼저 큰 텍스트부터 시작됩니다. 신문기사나 웹페이지 등의 많은, 연속된 텍스트들입니다.
이런 large pile of text를 corpus라고 하고 이것을 한국말로는 말뭉치라고 일컫습니다.
또한 말뭉치의 복수형은 corpora라고 합니다.
- 말뭉치에서의 모든 단어들은 vector로 표현됩니다. 이것은 랜덤 벡터로 시작합니다.
- 그리고 나서 할 일은 text의 각 위치를 살펴보는 big iterative algorithm을 수행하는 것입니다.
우리는 중간에 있는 단어 - center word, c - 가 그 주위의 단어 - outside words o - 의해 의미를 얻기를 원합니다.
단어의 의미는 즉 사용된 맥락(context of use)입니다.
- 그리고 c와 o의 유사성을 통해 c 가 주어졌을 때 o 가 나올, 혹은 그 반대의 확률을 계산합니다.
- 마지막으로 word vectors를 조정하여 확률을 극대화하는 과정을 수행하여 단어 표현을 얻습니다.
![]() |
![]() |
방금의 Idea를 좀 더 시각적으로 나타내 봅니다.
우리는 말뭉치의 일부를 보고 있습니다. 'into'라는 단어의 의미를 얻고자 합니다.
into라는 중심 단어가 있을 때 problems, tuning, banking, crises라는 window size 2 내에 있는 단어들이 각각 등장할 확률을
구하는 과정을 우측에서 보여줍니다.
이런식으로 예측을 시도하고, 얼마나 잘 predict 하는지 보고, predict을 더 잘할 수 있도록 단어의 vector representation을 변경하려 합니다.
into에서 넘어가 banking의 의미 표현을 구하려고 할 때, 이번에도 동일한 과정을 거칩니다.
중심 단어(c) banking 이 주어질 때, fixed window size 내의 단어들이 각각 등장할 확률을 구합니다.
이 과정을 계속 반복하고 예측을 잘할 수 있게 word vector를 조정합니다.
쉬워 보,,이네요?

자, 이제 수식입니다. 그중에서도 딥러닝에서 가장 중요한 목적함수에 대한 설명입니다.
T 사이즈의 긴 말뭉치가 있다고 가정합니다.
이런 긴 말뭉치, 그리고 center word wj 가 주어졌을 때 크기가 m 인 고정된 window size 내에
각각의 위치에 어떤 문맥의 단어가 올 지 예측하는 것을 하고 싶습니다.
1~T까지의 중심 단어 * 고정된 창 크기 * 해당 위치에서 wj 가 주어졌을 때 각각 주변 단어가 나올 확률
= 이것이 우도 = 모델 가능성 = likelihood입니다.
likelihood는 θ(세타)라는 다양한 매개변수에 의해 정해집니다.
지금 이 모형에서 유일한 매개변수는 우리가 단어를 나타내는 vector representation 일 것입니다.
그리고 모델은 일종의 목적함수를 정한 다음,
목적함수를 최소화하는 방향으로 word vector를 정하고 싶습니다.
목적함수 = cost = loss function입니다.
목적함수에 모델 가능성을 높이는 것에 - 를 취했습니다. 그러니 목적함수는 최소화할수록 모델이 좋다고 할 수 있습니다.
그 앞에 1/T를 넣어 일종의 평균을 취해줍니다. 말뭉치의 크기에 의존하기 때문은 아니고, scale을 줄여주기 위함이라고 보면 됩니다.
그보다 아주 중요한 것은 likelihood 값 앞에 log를 취하는 것입니다.
최적화를 할 때 로그를 취하면 항상(?) 훨씬 더 좋은 결과를 낸다고 합니다.
이제 L(θ)를 원래 수식으로 변환해주고 로그를 씌우면 중심 단어의 합, 윈도우 고정 크기의 합으로 수식을 표현할 수 있습니다.
' J(θ)를 최소화한다 = 다른 단어들의 context에서 중심 단어를 잘 예측할 수 있도록 한다 '라고 보면 됩니다.

앞서 말했듯, 우리는 목적함수를 최소화하고자 합니다. 그리고 이제 식도 알고 있습니다.
이제 문제는 다양한 매개변수를 조정하여 '중심 단어가 나왔을 때 주변 단어가 나올 확률' 은 어떻게 계산하는가?입니다.
답이 아래에 바로 있네요.
답: 단어 w의 역할에 따라 두 개의 벡터를 사용한다.
중심 단어일 때 벡터 값 v
문맥(주변) 단어일 때 벡터 값 u
아래 prediction function 은 다다음 장표에서 더 자세히 설명합니다.

P(u_problems|v_into) = P(problems|into; u_problems, v_into, θ)를 축약하여 표현한 것.


확률 함수에 대해 한국말로 정리해보았습니다.
아래의 예제는 자주 쓰일 softmax 함수를 설명합니다.
softmax 함수는 임의의 수 xi를 확률분포 값 pi로 출력합니다.
exp를 제거하면 확률이긴 하지만 결과가 평평하고, 특히나 최대를 선택하지 않습니다.
하지만 지수를 씌움으로써 아래와 같은 방식으로 동작합니다.
- 큰 확률은 더 크게 만드니까 "max"
- 여전히 작은 확률에 약간의 확률을 할당하니까 "soft"
라고 합니다. 이는 deep learning에서 자주 나올 함수이기도 합니다.

이제 우리는 목적함수, 손실 함수 그리고 확률분포로 표현하는 방식에 대해 배웠습니다.
이 시점에서 우리가 해야 할 것은 optimization, 최적화입니다.
모델을 훈련하면서 손실 함수를 최소화하기 위해 parameters를 조정합니다.
경사를 내려가면서 단어에 대한 좋은 표현을 찾도록 손실 함수를 최소화합니다.

우리는 앞서 theta (θ)는 매우 긴 한 개 vector 안에 있는 모든 parameters를 표현한다고 배웠습니다.
여기서 θ 는 d-dimentaional vectors와 V 개의 words를 가진 긴 벡터 공간이라고 할 수 있습니다.
따라서 사이즈는 입니다.
우리는 word2vec 앞 장에서 배웠듯이
한 개의 단어가 중심 단어일 경우 v 벡터와 문맥(주변) 단어일 때의 u 벡터 표현 두 개를 가지고 있습니다.
그래서 아래에 Remember: every words has two vectors라고 다시 써놓은 것 같습니다.
2V*d=각 단어(V) 별 2 개의 표현(u, v) * 각 단어 별로 d 개 공간의 표현하는 parameters (?)
이 세타 값을, gradient (경사)를 따라 walking down (하강) 하면서 최적화하는 작업이
모델 학습입니다!
이후 강의는 모두 whiteboard와 jupyter notebook 시연으로 대체되었습니다.
그 내용도 (아직 제대로 듣지 않았지만,, 중요한 내용일 테니) 시간이 된다면 수기로 작성해서 정리해보겠습니다 : )






댓글