본문 바로가기
인공신경망(DL)/NLP

분산표현(Distributed Representation, word2Vec, FastText)

by kiimy 2021. 8. 21.
728x90
  • 단어의 분산 표현(Distributed Representation)
    • 원-핫 인코딩의 개념과 단점에 대해서 이해할 수 있습니다. 
    • 분포 기반의 표현, 임베딩이 무엇인지 설명할 수 있습니다.
  • Word2Vec
    • CBoW와 Skip-gram의 차이에 대해서 설명할 수 있습니다.
    • Word2Vec의 임베딩 벡터를 시각화한 결과가 어떤 특징을 가지는지 설명할 수 있습니다.
  • fastText
    • OOV 문제가 무엇인지에 대해 설명할 수 있습니다.
    • 철자(Character) 단위 임베딩 방법의 장점에 대해 설명할 수 있습니다.

 

정리 : https://github.com/codestates/AIB04_Discussion/discussions/18

분산표현 Distributer Representation

'good  beautiful 은 해당 단어 주변에 분포한 단어가 유사하기 때문에 비슷한 의미를 지닐 것이다'라고

가정하는 것이 분포 가설

 

 이 분포 가설에 기반하여 주변 단어 분포를 기준으로 단어의 Vector표현이 결정

어떻게 유사한 의미를 갖게 할까?
분산 표현(distributed representation) 방법은 기본적으로 분포 가설(distributional hypothesis)이라는
가정 하에 만들어진 표현 방법
==이 가정은 '비슷한 위치에서 등장하는 단어들은 비슷한 의미를 가진다'라는 가정

강아지란 단어는 귀엽다, 예쁘다, 애교 등의 단어가 주로 함께 등장하는데 분포
가설에 따라서 저런 내용을 가진 텍스트를 벡터화한다면 저 단어들은 의미적으로
가까운 단어가 된다.

분산 표현은 분포 가설을 이용하여 단어들의 셋을 학습하고,
벡터에 단어의 의미를 여러 차원에 분산하여 표현

단어의 벡터화

1. 희소 표현, 원-핫 인코딩(One-hot Encoding)

- 표현하고자 하는 단어의 인덱스의 값만 1이고, 나머지 인덱스에는 전부 0으로 표현되는 벡터 표현 방법

- 이렇게 벡터 또는 행렬(matrix)의 값이 대부분이 0으로 표현되는

방법을 희소 표현(sparse representation or 희소벡터 sparse vector)

 

표 형태로 된 데이터를 다룰 때 범주형 변수를 요소마다 [0 0 0 1 ...] 의 형태로 나타냈던 것과 동일한 방법

쉽게 이해할 수 있는 직관적인 방법이지만 유사도를 구할 수 없다.

원-핫 인코딩을 사용한 두 벡터의 내적은 항상 0이므로 어떤 두 단어를 골라 코사인 유사도를

구하더라도 그 값은 0이 되버린다.

또한 희소 벡터의 문제점은 단어의 개수가 늘어나면 벡터의 차원이 한없이 커진다

 

희소 표현의 일종인 DTM과 같은 경우에도 특정 문서에 여러 단어가 다수 등장하였으나,

다른 많은 문서에서는 해당 특정 문서에 등장했던 단어들이 전부 등장하지 않는다면 역시나

행렬의 많은 값이 0이 되면서 공간적 낭비 뿐만 아니라, 원-핫 벡터는 단어의 의미를 담지 못한다

 

원-핫은 여러모로 단점이 많다.

2. 밀집표현

- 희소 표현과 반대되는 표현(Dense Representation)

- 사용자가 설정한 값(해당 단어의 차원을 정함)으로 모든 단어의 벡터 표현의 차원을 맞춘다. 

  (= 0과 1 값을 가지는 것이 아니라 실수 형태로 가지게 된다.) 차원을 줄일 수 있다.

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

희소와 밀집의 차이

희소 표현이 고차원에 각 차원이 분리된 표현 방법이었다면,
분산 표현은 저차원에 단어의 의미를 여러 차원에다가 분산하여 표현
== 단어 간 유사도를 계산 할 수 있다.

3. 임베딩(Embedding)

- 단어를 고정 길이의 벡터, 즉 차원이 일정한 벡터로 나타내기 때문에 임베딩이라고 부름

 

원-핫 인코딩의 단점을 해결하기 위해 등장한 것이 임베딩(Embedding)

[0.04227, -0.0033, 0.1607, -0.0236, ...] 형태로 나오게 되는데

이는 단어를 밀집 벡터(dense vector)의 형태로 표현하는 방법으로 Word-Embedding이라고 부른다.

== 단어간 유사도를 반영한 값( 연산이 가능하다 )

* cos similarity 유사도

두 벡터(Vector)의 사잇각을 구해서 유사도(Similarity)로 사용하는 것

 

 

 

 

 

 

Word2Vec / deep learning이 아님

단어마다 차례대로 인덱싱을 하여 벡터화 하지 않고, 유사한 단어들을 비슷한 방향과 힘의

벡터를 갖도록 단어를 벡터화 시켜주는 방법 중 하나이다. gensim word2vec
출처: https://ebbnflow.tistory.com/153?category=850456 [Dev Log : 삶은 확률의 구름]

실제값과 예측값에 대한 오차를 손실 함수를 통해 줄여나가며 학습하는 예측 기반의 방법론

NNLM은 단어 간 유사도를 구할 수 있도록 워드 임베딩의 개념을 도입하였고,
NNLM의 느린 학습 속도와 정확도를 개선하여 탄생한 것이 Word2Vec

NNLM이 예측 단어의 이전 단어들만을 참고하였던 것과는 달리,
Word2Vec은 예측 단어의 전, 후 단어들을 모두 참고 (중심 단어를 예측하게 하므로서 )

- 말 그대로 단어를 벡터로(Word to Vector) 나타내는 방법

- 특정 단어 양 옆에 있는 두 단어(window size = 2)의 관계를 활용하기 때문에 분포 가설을 잘 반영

- CBoW Skip-gram의 2가지 방법

 

* 주변 단어에 대한 정보를 기반으로 중심 단어의 정보를 예측하는 모델

=> CBoW(Continuous Bag-of-Words) 

결과벡터들의 평균을 구함 => 중심단어가 여러개이기 때문에 softmax함수 사용

 

* 중심 단어의 정보를 기반으로 주변 단어의 정보를 예측하는 모델

=> Skip-gram 계산량이 많다

중심단어가 하나이기 때문에 평균을 구하지 않는다.

Skip-gram 에서는 중심단어를 입력으로, 문맥단어를 레이블로 하는 분류(Classification)를 통해 학습

Skip gram

총 10,000개의 단어에 대해서 300차원의 임베딩 벡터

Word2Vec을 통해 얻은 임베딩 벡터는 단어간의 의미적, 문법적 관계를 잘 나타낸다.

from gensim.models import Word2Vec

model = Word2Vec(sentences=result, size=100, window=5, min_count=5, workers=4, sg=0)

size = 워드 벡터의 특징 값. 즉, 임베딩 된 벡터의 차원.
window = 컨텍스트 윈도우 크기
min_count = 단어 최소 빈도 수 제한 (빈도가 적은 단어들은 학습하지 않는다.)
workers = 학습을 위한 프로세스 수
sg = 0은 CBOW, 1은 Skip-gram.


######################Embedding########
model = tf.keras.Sequential([ tf.keras.layers.Embedding(2000, 
							128, input_length=X.shape[1]),
                            tf.keras.model.GlobalAveragePooling1D(), # 입력되는 단어 벡터의 평균을 구한다.
                            tf.keras.layers.SpatialDropout1D(0.4),
                            tf.keras.layers.LSTM(196, dropout=0.2, recurrent_dropout=0.2), 
                            tf.keras.layers.Dense(2, activation='softmax') ])
                            
 model.compile(loss = 'categorical_crossentropy', 
 				optimizer='adam',
                metrics = ['accuracy']) model.summary()

input_dim: int, 단어의 크기를 의미합니다. 위의 예제에서 2000은 총 2000개의 단어 종류가 있다는 의미입니다.
output_dim: int, 임베딩의 출력 차원을 의미합니다. 임베딩 벡터의 차원은 주로 256, 512, 1024등의 차원을 가집니다.
input_length: 일정한 입력 데이터의 크기를 의미합니다. Flatten이전의 임베딩 시, 반드시 필요합니다.

Word2Vec은 여전히 말뭉치에 등장하지 않은 단어에 대해서는 임베딩 벡터를 만들지 못한다는 단점

 

기존 말뭉치에 등장하지 않는 단어가 등장하는 문제를 OOV(Out of Vocabulary)라고 하는데

Word2Vec은 등장하지 않는 단어에 대해서는 학습하지 않기 때문에 예측(혹은 추론)

단계에서 새로운 단어가 등장하면 에러를 발생

 

적게 등장하는 단어(Rare words)에 대해서는 학습이 적게 일어나기 때문에 적절한 임베딩

벡터를 생성해내지 못한다는 것도 Word2Vec 의 단점 ( 단어 빈도수에 편향성이 있다 )

fastText

- Word2Vec 방식에 철자(Character) 기반의 임베딩 방식을 더해준 새로운 임베딩 방식

  • fastText가 Character-level(철자 단위) 임베딩을 적용하는 법 : Character n-gram

모델이 학습하지 못한 단어더라도 잘 쪼개고 보면 말뭉치에서 등장했던 단어를 통해 유추해 볼 수 있다는 아이디어

 

"맞벌이"라는 단어를 모른다고 하더라도 아래 단어를 알면 대략적인 의미를 유추해 볼 수 있습니다.

  1. "맞선, 맞절, 맞대다, 맞들다, 맞바꾸다, 맞서다, 맞잡다, 맞장구치다"
  2. "벌다, 벌어, 벌고"
  3. "먹이, 깊이, 넓이"

첫 번째 줄 단어를 통해서 "맞-"이라는 접두사의 의미를 유추해 보고,
두 번째 줄 단어를 통해서 "-벌-"이라는 어근의 의미를 유추해 보고,
세 번째 줄 단어를 통해서 "-이"라는 접미사의 의미를 유추해 볼 수 있다.

단어의 n-gram이 다른 단어의 n-gram과 겹치는 경우라면, Word2Vec과 비교하여
비교적 높은 임베딩 벡터값을 얻는다.

fastText 는 3-6개로 묶은 Character 정보(3-6 grams) 단위를 사용

from gensim.models import FastText

model = FastText(result, size=100, window=5, min_count=5, workers=4, sg=1)

* OOV 개선

FastText의 인공 신경망을 학습한 후에는 데이터 셋의 모든 단어의 각 n-gram에 대해서

워드 임베딩이 된다. 이렇게 되면 장점은 데이터 셋만 충분한다면 위와 같은 내부 단어(Subword)를

통해 모르는 단어(Out Of Vocabulary, OOV)에 대해서도 다른 단어와의 유사도를 계산할 수 있다는 점이다.

ex) 다른 단어에서 birth와 place라는 내부 단어가 있었다면, FastText는 birthplace의 벡터를 얻을 수 있다.

 

* Raw data 개선

모든 훈련 코퍼스에 오타(Typo)나 맞춤법이 틀린 것이 많고 실제로 비정형데이터에 오타가 많다.

==> 오타가 섞인 단어는 당연히 등장 빈도수가 매우 적으므로 일종의 희귀 단어가 된다.

 

FastText의 경우, 만약 단어가 희귀 단어라도, 그 단어의 n-gram이 다른 단어의 n-gram과 겹치는 경우라면,

Word2Vec과 비교하여 비교적 높은 임베딩 벡터값을 얻을 수 있다.

==> 일정 수준의 성능을 보임

 

 

728x90

'인공신경망(DL) > NLP' 카테고리의 다른 글

Transformer / BERT, GPT  (0) 2021.08.22
Recurrent Neural Network, RNN  (0) 2021.08.22
NLP, Natural Language Processing  (0) 2021.08.21

댓글