**https://www.youtube.com/watch?v=pC6P-rBrwms**
Word2Vec은 단어의 벡터 표현을 학습함으로써, NLP에서 광범위하게 적용될 수 있는 강력한 도구
one-hot encoding은 단어를 벡터로 표현하는 가장 기본적인 방법 중 하나
예를 들어, I, love, pizza 세 단어가 있을 때, 각 단어를 다음과 같이 표현
I = [1, 0, 0, 0]
love = [0, 1, 0, 0]
pizza = [0, 0, 1, 0]
각 단어는 각각의 고유한 벡터로 표현되며, 해당 단어를 나타내는 인덱스만 1이고 나머지는 0
하지만, 이 방법에는 두 가지 큰 단점이 존재
단어 간의 관계나 유사성을 전혀 표현할 수 없음
I = [1, 0, 0, 0]
love = [0, 1, 0, 0]
pizza = [0, 0, 1, 0]
you = [0, 0, 0, 1]
I는 pizza보다는 you와 의미적으로 더 가깝지만, 그 차이를 수치로 나타낼 수 없음
단어의 집합이 커질수록 벡터의 차원이 매우 커지며, 이는 공간과 계산 효율성 문제를 야기
to = [1, 0, 0, 0, 0, 0, 0, 0, 0, …, 0]
be = [0, 1, 0, 0, 0, 0, 0, 0, 0, …, 0]
or = [0, 0, 1, 0, 0, 0, 0, 0, 0, …, 0]
not = [0, 0, 0, 1, 0, 0, 0, 0, 0, …, 0]
to = [1, 0, 0, 0, 0, 0, 0, 0, 0, …, 0]
be = [0, 1, 0, 0, 0, 0, 0, 0, 0, …, 0]
that = [0, 0, 0, 0, 1, 0, 0, 0, 0, …, 0]
is = [0, 0, 0, 0, 0, 1, 0, 0, 0, …, 0]
the = [0, 0, 0, 0, 0, 0, 1, 0, 0, …, 0]
question = [0, 0, 0, 0, 0, 0, 0, 1, 0, …, 0]
이러한 문제를 해결하기 위해 등장한 개념이 바로 임베딩$^{\text{embedding}}$
임베딩$^{\text{embedding}}$을 한마디로 요약하자면, 단어를 낮은 차원의 실수 벡터로 표현하는 기법
I = [1, 0, 0, 0] → [0.1, 0.2]
you = [0, 0, 0, 1] → [0.1, 0.1]
love = [0, 1, 0, 0] → [0.7, 0.3]
pizza = [0, 0, 1, 0] → [0.5, 0.9]
이렇게 하면, 벡터 공간에서 단어 간의 유사성을 계산할 수 있고, 차원이 낮아져서 계산 효율성도 대폭 향상
단어 임베딩 기법에는 대표적으로 Word2Vec, GloVe, FastText 등이 존재
4개의 단어만 학습한다고 가정
I = [1, 0, 0, 0]
love = [0, 1, 0, 0]
pizza = [0, 0, 1, 0]
like = [0, 0, 0, 1]
그러면 one-hot encoding 벡터의 크기가 4이기 때문에 4개의 입력을 받는 입력층을 생각해 볼 수 있음
차원을 축소하고 중요한 특성들을 보존하기 위해 은닉층 노드를 두 개를 추가
그리고 단어-단어간의 학습을 위해 출력층은 다시 4개의 노드로 구성
이렇게 Word2Vec 모델을 간략하게 구성
실제 Word2Vec 모델은 입력층의 크기는 10,000개, 은닉층의 크기는 300개로 훨씬 복잡
입력값을 넣어주고, 순전파 feedforward를 하고, 출력값을 계산하여 손실 loss를 구하고, 경하하강법과 역전파를 사용하여 모델을 학습
Word2Vec은 다음 두 가지 방법으로 단어 데이터셋을 훈련
Continuous Bag-of-words: CBOW
언어를 공부할 때 빈칸 추론 문제들을 많이 품
빈칸 추론 문제는 전체적인 문맥$^{\text{context}}$을 통해, 빈칸에 들어갈 가장 적절한 단어를 찾는 문제
모델의 가중치들을 다음과 같이 임의 초기화
만약 “I love pizza” 문장을 학습시킨다면,
***“I”***와 ***“pizza”***는 입력값이 되고 ***“love”***는 정답이 되어야 함
***“I”***와 ***“pizza”***를 같이 고려한 입력은 다음과 같음
하지만 입력을 일종의 확률분포로 본다면, 입력 벡터의 합은 1이 되어야 하므로 전체를 2로 나눔
그 다음 입력값과 가중치를 곱하면 은닉층 값 $h_1$과 $h_2$를 다음과 같이 계산할 수 있음
여기서 한 가지 확인해두어야 할 부분은, Word2Vec에서는 은닉층에서 비선형 활성화 함수 (예를 들면 시그모이드함수)를 쓰지 않음
계속해서 출력층 값도 다음과 같이 계산할 수 있음
그 다음 출력값을 softmax 함수에 넣어서 확률로 변환
출력값과 실제값 사이의 차이 즉 손실 loss를 구할 수 있음
손실함수는 cross-entropy 함수를 사용
역전파와 경사하강법을 이용, 새로운 기울기까지 구할 수 있음
은닉층 노드는 4차원의 입력 벡터를 2차원으로 축소된 정보를 처리
2차원 데이터이기 때문에 2차원 평면에 그 값들을 배치해 보면 초기에는 가중치가 임의로 배치되었기 때문에 각 단어의 은닉층 값들은 아마 다음과 같이 무질서할 것
하지만 CBOW 학습이 지속될 경우 같은 패턴인 ***“I”***와 ***”pizza”***에 대하여 ***”love”***와 ***”like”***의 문맥상 용법이 유사하기 때문에 결국 ***”love”***와 ***”like”***는 공간상 유사한 벡터가 되어가고 ***”I”***와 ***”pizza”***로부터는 멀어지는 경향을 보이게 될 것
Skip-Gram은 CBOW와 반대되는 개념의 학습방법
이런 CBOW와 Skip-Gram 학습 방법을 통해, 각 단어의 임베딩 벡터는 해당 단어의 의미와 문맥 context를 반영하게 되고, 벡터 공간에서 서로 가까운 단어 임베딩은 의미적 유사성을 나타내게 됨