> For the complete documentation index, see [llms.txt](https://lswkim322.gitbook.io/til/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://lswkim322.gitbook.io/til/til-ml/boostcamp/u-stage-nlp/02-word-embedding.md).

# (02강) Word Embedding

> One-hot Encoding 이외에 단어를 Embedding 할 수 있는 방법 중 Word2Vec과 GloVe에 대해 소개

## 1. Word Embedding

> 단어의 Vector화로 좌표공간에 표현하는 것.\
> 연관성에 따라 유사한 좌표공간에 배치된다.

### 1.1. Sparse Representation (희소 표현)

* One-Hot Encoding 을 사용한 방법
  * vocab : {"Jone", "really", "loves", "this", "movie", "Jane", "likes", "song"}
  * {\[1, 0, 0, 0, 0, 0, 0, 0], \[0, 1, 0, 0, 0, 0, 0, 0], ..., \[0, 0, 0, 0, 0, 0, 0, 1]}

### 1.2. Dense(Distributed) Representations (밀집 표)

각각의 속성이 독립적인 차원(One-Hot)으로 나타내지 않게 된다. 대신 우리가 정한 갯수의 차원으로 대상을 대응 시켜 표현하게 된다. 예를 들어 5차원으로 표현하기로 한다면,

* vocab : {"Jone", "really", "loves", "this", "movie", "Jane", "likes", "song"}
* {\[0.37, -2.11, 2.7, -0.11, 0.65]..., }

위와 같이 표현할 수 있을 것이다. 하지만 위 데이터에서는 여러 속성이 섞여 한 차원을 이루기 때문에 각 차원의 값이 무슨 의미를 가지는 지는 알 수 없다.&#x20;

Sparse Representation 보다 가지는 장점은 아래와 같다.

* 고정된 차원으로 불필요한 메모리를 줄일 수 있다.
* 더 큰 일반화(Generalization)을 가지고 있다. 가령 '강아지'와 '멍멍이'가 서로 비슷한 벡터로 표현되면 '강아지'에 대한 정보가 '멍멍이'에도 일반화 될 수 있다.

위와 같이 단어를 밀집 벡터의 형태로 표현하는 방법을 **워드 임베딩** 이라고 하며, 그 결과를 임베딩벡터라고도 한다. Word2Vec과 GloVe는 워드 임베딩 방법 중 하나이다.

### 1.3. Word2Vec 🎇

> 구글에서 개발한 Word2Vec은 분포 가설(Distributional Hypothesis)을 가정하에 표현한 분산 표현을 따른다. 예를 들어 '강아지'라는 단어가 '귀엽다', '예쁘다' 등의 단어와 자주 발생한다면 분포가설에 맞춰 벡터화 한  해당 단어들은 되면 유사한 값, 근접한 위치에 분포할 것이고 그 단어들은 의미적으로 유사한 단어가 된다는 뜻이다. (인접한 단어들 간에 의미가 비슷할 것이다.)

간단한 인공신경망 모형을 기반으로 학습데이터의 규모가 10억 단어 이상으로 커져도 요구되는 계산량을 낮은 수준으로 유지 할 수 있다는 큰 장점을 가지고 있다. 이는 병렬화(parallelization)를 통해 짧은 시간에 양질의 단어 벡터 표상을 얻을 수 있기 때문이다.

#### 1.3.1. Working Step

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-MjlGzaZpHJfMuPHk_t8%2F-MjlZDTUyQxZc3hvo638%2Fimage.png?alt=media\&token=0e9c4da1-9293-4cbe-a105-2cd19f4d1bf7)

* Sentence : "I study math"
* Vacabulary : {"I", "study", "math"}
* Input : "study" \[0, 1, 0]
* Output : "math" \[0, 0, 1]

1. **CBoW (Continuous Bag of Words)**\
   주변에 있는 단어들로 중간에 있는 단어를 예측하는 방법
   * Window: 묶음 -> window size 3 ("I", "study") / ("study", "I"), ("study", "math") / ("math", "study")
2. **예측 Task를 수행하는 2-Layer의 NN을 가지게 된다.**&#x20;
   * Input과 Output의 size 은 단어의 수와 동일하다 (여기서는 3개)
   * hidden layer의 node 수는 hyperparameter로써 word embedding을 수행하는 차원수와 동일하게 설정한다. (2로 세팅한다 해보자)
   * $$W\_1$$은 3차원의 Input을 받아서 2차원인 hidden layer로 보내기에 (3x2) Matrix가 되고, $$W\_2$$는 2차원의 hidden layer로 부터 3차원의 output을 구해야하므로 (2x3) Matrix가 된다. (실제 x와의 곱은 transpose 하여 곱해짐)
   * Softmax loss를 적용하여 $$W1, W2$$의 학습이 이루어 지게 된다.
   * Ground Truth (정답)에 해당하는 값은 inf, 아닌 값은 -inf 일 때, softmax의 결과가 ground truth의 결과와 가장 유사해 진다.

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-MjlZ_QM2RVueAE31PmK%2F-MjleDEaa-gsDjQc3M1C%2Fimage.png?alt=media\&token=62631b18-1168-4b56-96d1-9c1dffc9c4eb)

**🎇 Skip-gram**\
CBoW와 반대로 중심단어를 보고 어떤 주변 단어가 존재하는지 예측하는 모델이다. 모델의 구성 또한 CBoW의 input과 output이 반대로 된 구성을 가지고 있다.

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-MjlfczN9H8JSzDUZpI2%2F-Mjm658PwnhuLeo_JmOY%2Fimage.png?alt=media\&token=16b7c19f-b837-420b-b549-287306458e37)

#### 1.3.2. Word2Vec 시각

wevi: word embedding visual inspector

{% embed url="<https://ronxin.github.io/wevi/>" %}

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-MjlfczN9H8JSzDUZpI2%2F-Mjm321a3B3aqvN5ixhy%2Fimage.png?alt=media\&token=faf53ed1-7fd8-43ee-8a79-42fb9906450e)

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-MjlfczN9H8JSzDUZpI2%2F-Mjm3Lr5pJP3lurOj4aV%2Fimage.png?alt=media\&token=90cca3da-0ad5-4f25-aa58-15034fe8bd7e)

* 학습을 진행한 후에 보게 되면 Input의 juice가 drink의 output과 유사하게 나타남을 알 수 있고, 마찬가지로 drink에 속하는 milk의 input 또한 juice의 input과 유사함을 알 수 있다. 따라서 juice와 drink의 내적값이 최대가 될 것이다.
* input vector와 output vector 중 어느것을 embedding vector로 사용해도 무관하나 보통 input vector를 embedding vector로 사용한다.

![](https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-MjlfczN9H8JSzDUZpI2%2F-Mjm4BHzYZMiKOKbNERr%2Fimage.png?alt=media\&token=f2b2356f-ae0a-4c16-bacb-c322a112ac6c)

* 유사한 값끼리 뭉쳐있음을 확인할 수 있다.

<div align="left"><img src="https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-MjlfczN9H8JSzDUZpI2%2F-Mjm4KM1_rInxxIWB9NR%2Fimage.png?alt=media&amp;token=bcb6f534-d870-485b-b06c-b2925b8efd87" alt=""></div>

<div align="left"><img src="https://3944465397-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MjcKlzGhHYe2bvmxTwS%2F-MjlfczN9H8JSzDUZpI2%2F-Mjm4QfIypTarR_hlMck%2Fimage.png?alt=media&amp;token=3b093b3f-1767-46d3-987f-fdf4f5b970c3" alt=""></div>

* 한국-서울 을 통해 도쿄가 입력되었을때, 일본을 출력할 수 있는 것을 확인할 수 있다.

#### 1.3.3. Application of Word2Vec

* Word Similarity
* Machine Translation
* Part-of-speech tagging
* Named entity recognition
* Sentiment analysis
* Clustering
* Semantic lexicon building

등 다양한 Task에서 성능향상에 주된 역할을 하였다.&#x20;

### 1.4. GloVe (Global Vectors for Word Representation)

* 각 입력, 출력 단어 쌍들에 대해서 학습데이터에서 한 윈도우 내에서 몇 번 동시에 출현하였는지를 사전에 먼저 계산을 한다.
* input word의 embedding vector $$u\_i$$와 output word의 embedding vector $$v\_j$$의 내적값에서 한 윈도우내에서 두단어가 동시에 몇번 등장했는지에 대한 값에 log를 취한 값을 뺀 값을 Loss Function으로 사용한다.
  * $$J(\theta) = \frac{1}{2} \sum\_{i, j = 1}^{W}{f(P\_{ij})(u\_i^Tv\_j-log{P\_{ij}})^2}$$
* 중복되는 계산을 줄여줄 수 있다는 장점을 가지고 있고, 보다 적은 데이터에 대해 나은 성능을 가질 수 있다.&#x20;

## 참고코드 Link

{% embed url="<https://drive.google.com/file/d/15hCE-wMG-YdWdDhWewbaG_NWnz9spBR8/view?usp=sharing>" %}

## Reference

{% embed url="<http://www.goldenplanet.co.kr/blog/2021/05/10/%EB%B9%85%EB%8D%B0%EC%9D%B4%ED%84%B0-%EA%B3%B5%EB%B6%80-%ED%95%9C-%EA%B1%B8%EC%9D%8C-word2vec-%EC%9D%B4%EB%9E%80/>" %}
