본문 바로가기
Drawing (AI)/DeepLearning

Word Embedding(1)

by 생각하는 이상훈 2023. 5. 11.
728x90

희소 표현(Sparse Representation)

one-hot 인코딩과 같은 방식으로 인코딩을 한 결과인 one-hot 벡터들은 하나의 인덱스의 값만 1이고 나머지 인덱스는 전부 0으로 표현하는 벡터표현 방법을 희소표현이라고 하고 이때 one-hot 벡터는 희소 벡터이다.

희소 벡터의 문제점은 단어의 개수가 늘어나면 벡터의 차원이 계속 커진다는 점이다. 단어가 10,000개였다면 벡터의 차원은 10,000이어야한다. 심지어 그 중에서 단어의 인덱스에 해당되는 부분만 1이고 나머지는 0의 값을 가져야만 한다. 단어 집합이 클수록 고차원의 벡터가 된다. 예를 들어 단어가 10,000개 있고 인덱스가 0부터 시작하면서 강아지란 단어의 인덱스는 4였다면 one-hot 벡터는 다음과 같이 표현된다.

Ex) 강아지 = [ 0 0 0 0 1 0 0 0 0 0 0 0 ... 중략 ... 0]  # 1뒤에 0은 9995개 즉 10000차원

이러한 벡터 표현은 공간적 낭비를 불러일으킵니다.


밀집 표현(Dense Representation)

희소 표현과 반대되는 표현으로 밀집 표현(dense representation)이 있다. 밀집 표현은 벡터의 차원을 단어 집합의 크기로 상정하지 않는다. 사용자가 설정한 값으로 모든 단어의 벡터 표현의 차원을 맞춘다. 또한, 이 과정에서 더 이상 0과 1만 가진 값이 아니라 실수값을 가지게 된다.  위의 강아지 예시를 밀집 표현으로 표현을 해보자. 이때 밀집 표현의 차원을 128로 설정하면 다음과 같이 바뀐다.

Ex) 강아지 = [0.2 1.8 1.1 -2.1 1.1 2.8 ... 중략 ...]  # 128차원

이 경우 벡터의 차원이 조밀해졌다고 하여 밀집 벡터(dense vector)라고 한다.


워드 임베딩(Word Embedding)

얼핏봐도 밀집 표현이 희소 표현보다 효율적이다. 따라서 단어를 밀집 벡터 형태로 표현하고자 하는데 그 방법을 워드 임베딩이라고 한다. 그리고 이 밀집 벡터를 워드 임베딩 과정을 통해 나온 결과라고 하여 임베딩 벡터(embedding vector)라고도 한다. 워드 임베딩 방법론으로는 LSA, Word2Vec, FastText, Glove 등이 있다. 케라스에서 제공하는 도구인 Embedding()는 앞서 언급한 방법들을 사용하지는 않지만, 단어를 랜덤한 값을 가지는 밀집 벡터로 변환한 뒤에, 인공 신경망의 가중치를 학습하는 것과 같은 방식으로 단어 벡터를 학습하는 방법을 사용한다.


Word2Vec

one-hot 벡터는 단어 벡터 간 유의미한 유사도를 계산할 수 없다는 단점이 있다. 그래서 단어 벡터 간 유의미한 유사도를 반영할 수 있도록 단어의 의미를 수치화 할 수 있는 방법이 필요하다. 이를 위해서 사용되는 대표적인 방법이 워드투벡터(Word2Vec)이다. 워드투벡터로 단어간의 더하기 뺴기 연산을 진행하면 다음과 같은 연산이 가능하다.

 

한국 - 서울 + 도쿄 = 일본
박찬호 - 야구 + 축구 = 호나우두

 

정말 신기하게 단어가 가지고 있는 의미들을 가지고 연산을 하는 것처럼 보이는데 이는 각 단어 벡터가 단어 벡터 간 유사도를 반영한 값을 갖고 있기 때문이다.


분산 표현(Distributed Representation)

분산 표현(distributed representation) 방법은 기본적으로 분포 가설(distributional hypothesis)이라는 가정 하에 만들어진 표현 방법이다. 이 가정은 '비슷한 문맥에서 등장하는 단어들은 비슷한 의미를 가진다' 라는 가정이다. 강아지란 단어는 귀엽다, 예쁘다, 애교 등의 단어가 주로 함께 등장하는데 분포 가설에 따라서 해당 내용을 가진 텍스트의 단어들을 벡터화한다면 해당 단어 벡터들은 유사한 벡터값을 가진다. 분산 표현은 분포 가설을 이용하여 텍스트를 학습하고, 단어의 의미를 벡터의 여러 차원에 분산하여 표현한다.

이렇게 표현된 벡터들은 one-hot 벡터처럼 벡터의 차원이 단어 집합의 크기일 필요가 없으므로, 벡터의 차원이 상대적으로 저차원으로 줄어든다. Word2Vec으로 임베딩 된 벡터는 굳이 벡터 차원이 단어 집합의 크기가 될 필요가 없다. 강아지란 단어를 표현하기 위해 사용자가 설정한 차원의 수를 가지는 벡터가 되며 각 차원의 값은 실수값을 가진다. 따라서 밀집 표현으로 표현할 수 있는 것이다.

분산 표현은 저차원에 단어의 의미를 여러 차원에다가 분산하여 표현한다. 이런 표현 방법을 사용하면 단어 벡터 간 유의미한 유사도를 계산할 수 있다. 이를 위한 대표적인 학습 방법이 Word2Vec이다.


CBOW(Continuous Bag of Words) & Skip-Gram

Word2Vec의 학습 방식에는 CBOW(Continuous Bag of Words)와 Skip-Gram 두 가지 방식이 있다. CBOW는 주변에 있는 단어들을 입력으로 중간에 있는 단어들을 예측하는 방법이고 Skip-Gram은 중간에 있는 단어들을 입력으로 주변 단어들을 예측하는 방법이다.

"The fat cat sat on the mat"이라는 예문을 이용하여 하나씩 살펴보자.

갖고 있는 코퍼스에 위와 같은 예문이 있다고 합시다. ['The', 'fat', 'cat', 'on', 'the', 'mat']으로부터 sat을 예측하는 것은 CBOW가 하는 일이다. 이때 예측해야하는 단어 sat을 중심 단어(center word)라고 하고, 예측에 사용되는 단어들을 주변 단어(context word)라고 한다. 중심 단어를 예측하기 위해서 앞, 뒤로 몇 개의 단어를 볼지를 결정해야 하는데 이 범위를 윈도우(window)라고 한다. 예를 들어 윈도우 크기가 2이고, 예측하고자 하는 중심 단어가 sat이라고 한다면 앞의 두 단어인 fat와 cat, 그리고 뒤의 두 단어인 on, the를 입력으로 사용한다. 윈도우 크기가 n이라고 한다면, 실제 중심 단어를 예측하기 위해 참고하려고 하는 주변 단어의 개수는 2n이다.

윈도우 크기가 정해지면 윈도우를 옆으로 움직여서 주변 단어와 중심 단어의 선택을 변경해가며 학습을 위한 데이터 셋을 만드는데 이 방법을 슬라이딩 윈도우(sliding window)라고 한다.

Word2Vec은 은닉층이 다수인 딥 러닝(deep learning) 모델이 아니라 은닉층이 1개인 얕은 신경망이다. 또한 Word2Vec의 은닉층은 일반적인 은닉층과는 달리 활성화 함수가 존재하지 않으며 룩업 테이블이라는 연산을 담당하는 층으로 투사층(projection layer)이라고 부르기도 한다.

입력층과 투사층 사이의 가중치 W는 V × M 행렬이며, 투사층에서 출력층사이의 가중치 W'는 M × V 행렬일때의 모습이다.

다음과 같이  주변 단어의 원-핫 벡터에 대해서 가중치 W가 곱해서 생겨진 결과 벡터들은 투사층에서 만나 이 벡터들의 평균인 벡터를 구하게 된다. 만약 윈도우 크기 n=2라면, 입력 벡터의 총 개수는 2n이므로 중간 단어를 예측하기 위해서는 총 4개가 입력 벡터로 사용된다. 그렇기 때문에 평균을 구할 때는 4개의 결과 벡터에 대해서 평균을 구하게 된다. 투사층에서 벡터의 평균을 구하는 부분은 CBOW가 Skip-Gram과 다른 차이점이기도 하다.

이렇게 구해진 평균 벡터는 두번째 가중치 행렬 W'와 곱해진다. 이 벡터에 CBOW는 소프트맥스(softmax) 함수를 지나면서 벡터의 각 원소들의 값은 0과 1사이의 실수로, 총 합은 1이 된다. 다중 클래스 분류 문제를 위한 일종의 스코어 벡터(score vector)이다. 스코어 벡터의 j번째 인덱스가 가진 0과 1사이의 값은 j번째 단어가 중심 단어일 확률을 나타낸다. 그리고 이 스코어 벡터의 값은 레이블에 해당하는 벡터인 중심 단어 one-hot 벡터의 값에 가까워져야 한다.

이전에 공부했던 cross-entropy가 손실함수(loss function)으로 쓰인다.

이때 V는 단어 집합의 크기이다.

 

다음은 Skip-Gram이다.

CBOW에서는 주변 단어를 통해 중심 단어를 예측했다면, Skip-gram은 중심 단어에서 주변 단어를 예측한다. 앞의 예시를 이어서 보면 데이터셋은 다음과 같이 구성된다.

신경망의 구조는 위와 같다. 이때 중심 단어에 대해서 주변 단어를 예측해서 평균을 구하는 과정이 없다. 또한 여러 논문에서 성능비교를 통해 Skip-gram이 CBOW보다 성능이 좋다는 것을 찾아냈다.


 

728x90