본문 바로가기

7. ML | DL | NLP

7/3(월) IT K-DT(83일차) / 4. 워드 임베딩(word embedding) (1)

 

 

4. 워드 임베딩(Word Embedding)

 

4-1. 워드 임베딩(Word Embedding)

* 단어를 컴퓨터가 이해하고, 효율적으로 처리할 수 있도록 단어를 벡터화하는 기술.
* 단어를 밀집 벡터(dense vector)의 형태로 표현하는 방법
* 워드 임베딩 과정을 통해 나온 결과를 임베딩 벡터라고 말함.
* 워드 임베딩을 거쳐 잘 표현된 단어 벡터들은 계산이 가능하며, 모델에 입력으로 사용할 수 있음.

 

4-1-1. 인코딩(Encoding)

* 기계는 자연어를 이해할 수 없기 때문에 데이터를 기계가 이해할 수 있도록 숫자 등으로 변환해주는 작업.

 

4-1-2. 희소 표현(Sparse Representation)

* 원핫인코딩을 통해 나온 원핫벡터들은 표현하고자 하는 단어의 인덱스의 값만 1이고 나머지 인덱스에는 전부 0으로 표현되는 벡터표현방법.
* 벡터 또는 행렬의 값이 대부분 0으로 표현되는 방법을 희소 표현이라고 함.
* 원핫인코딩에 의해 만들어지는 벡터를 희소벡터라고 함.

 

4-1-3. 희소벡터의 문제점

* 특징: 단어의 개수가 늘어나면 벡터의 차원이 한없이 커짐.
* 원핫벡터는 벡터표현방식이 매우 단순하여 단순히 단어의 출현여부만을 벡터에 표시할 수 있음.
* 희소벡터를 이용하여 문장/text간 유사도를 계산해보면 원하는 유사도를 얻기 힘듦.

 

4-1-4. 밀집 표현(Dense Representation)

* 벡터의 차원이 조밀해졌다는 의미
* 사용자가 설정한 값으로 모든 단어의 벡터 표현의 차원을 맞추는 표현방식.
* 자연어를 밀집표현으로 변환하는 인코딩과정에서 0과 1의 binary값이 아니라 연속적인 실수값을 가질 수 있음.

 

4-1-5. 밀집표현의 장점

* 적은 차원으로 대상을 표현할 수 있음.
* 더 큰 일반화 능력을 가지고 있음.

 

4-1-6. 원핫벡터와 워드임베딩의 차이

 

4-1-7. 차원축소(Dimensionality Reduction)

* 희소벡터를 밀집벡터의 형태로 변환하는 방법
* 머신러닝에서 많은 feature들로 구성된 고차원의 데이터에서 중요한 feature들만 뽑아 저차원의 데이터(행렬)로 변환하기 위해 사용.
  - PCA(Principal Component Analysis)
  - 잠재의미분석(Latent Semantic Analysis)
  - 잠재디리클레할당(LDA; Latent Dirichlet Allocation)
  - SVD(Singular Value Decomposition)

 

4-2. Word2Vec

 

4-2-1. 분산 표현 (Distributed Representation)

* 분포가설이라는 가정하에 만들어진 표현방법
* 분포가설: 비슷한 문맥에서 등장하는 단어들은 비슷한 의미를 가짐.
* 분포가설의 목표는 단어주변의 단어들, window 크기에 따라 정의되는 문맥의 의미를 이용해 단어를 벡터로 표현(분산표현)하는 것.
* 분산 표현으로 표현된 벡터들은 원핫벡터처럼 차원이 단어집합의 크기일 필요가 없으므로, 벡터의 차원이 상대적으로 저차원으로 줄어듦.
* 밀집 표현을 분산표현이라 부르기도 함
* 희소 표현에서는 각각의 차원이 각각의 독립적인 정보를 갖고있지만 밀집에서는 하나의 차원이 여러 속성들이 버무려진 정보를 갖고있음.
* 밀집표현을 이용한 대표적인 학습방법이 Word2Vec임.

 

4-2-2. Word2Vec의 정의

* 분포 가설 하에 표현한 분산 표현을 따르는 워드 임베딩 모델
* Google이 2013년에 처음 공개
* 중심 단어와 주변의 단어들을 사용하여 단어를 예측하는 방식으로 임베딩을 만듦.
  - CBOW(Continuous Bag of Words)
  - Skip-gram

 

4-2-3. CBOW(Continuous Bag of Words)

* https://wikidocs.net/22660 

 

09-02 워드투벡터(Word2Vec)

앞서 원-핫 벡터는 단어 벡터 간 유의미한 유사도를 계산할 수 없다는 단점이 있음을 언급한 적이 있습니다. 그래서 단어 벡터 간 유의미한 유사도를 반영할 수 있도록 단어의 의미를…

wikidocs.net

 

* 주변에 있는 단어를 보고 중간에 있는 단어를 예측하는 방법
* 주변 단어는 타겟 단어의 직전 n개 단어와 직후 n개 단어를 의미하며, 이 범위를 window라 부르고, n을 window size라고 함.
* 문장 하나에 대해 한번만 학습을 진행하는것은 아깝기 때문에 sliding window방식을 사용하여 하나의 문장을 가지고 여러개의 학습 데이터셋을 만듦.
* Word2Vec은 최초 입력으로 원핫벡터를 받는데, 1 X V 크기의 원핫벡터의 각 요소와 hidden layer N개의 각 노드는 1대1 대응이 이뤄져야 하므로 가중치 행렬 W의 크기는 V X N 이 됨.
* 학습 코퍼스에 단어가 10,000개 있고, hidden layer의 노드를 300개로 지정한다면 가중치행렬 W는 10,000 * 300 행렬 형태가 됨.
* 각각의 가중치 행렬은 랜덤한 값으로 초기화되어있고, 학습 시 target word를 맞추는 과정에서 W가 계속해서 조정됨.
* 예를들어 4개의 단어들이 target word 예측에 사용될 때 각각의 단어들에 해당하는 W의 임베딩 벡터들의 평균을 사용함.
* 평균 벡터는 두번째 가중치 행렬 'W'와 곱해지며 곱해진 결과로는 target word의 원핫벡터와 크기가 동일한 벡터를 얻을 수 있음.
* 최종출력값 벡터는 다중 클래스 분류문제를 위한 일종의 스코어벡터이며 0과 1사이의 값을 가지는데 이는 중심단어일 확률을 나타냄.
* 스코어벡터값은 정답레이블에 해당하는 target word의 원핫벡터 내 1의 값에 가까워져야 함.
* 스코어벡터와 원핫벡터의 오차를 줄이기 위해 손실함수(cross-entropy)함수를 사용함.

 

4-2-4. Skip-gram

* 중심단어에서 주변단어를 예측
* 중심단어를 sliding window 하면서 학습 데이터를 증강
* 중심 단어를 가지고 주변 단어를 예측하는 방법이기 때문에 projection layer에서 벡터들 간의 평균을 구하는과정이 없으며 대신 output layer를 통해 벡터가 2n개 만큼 나옴.

 

4-2-5. CBOW vs Skip-gram

* Skip-gram이 CBOW에 비해 여러 문맥을 고려하기 때문에 Skip-gram의 성능이 일반적으로 더 좋음
* Skip-gram이 단어 당 학습 횟수가 더 많고, 임베딩의 조정기회가 많으므로 더 정교한 임베딩 학습이 가능.

 

예) 작고 귀여운 강아지 문 앞에 앉아있다

 

4-2-6. Word2Vec의 한계점

* 단어의 형태학적 특성을 반영하지 못함
  - 예) teach, teacher, teachers와 같이 세 단어는 의미적으로 유사한 단어지만 각 단어를 개별단어로 처리하여 세 단어 모두 벡터값이 다르게 구성된다.
* 단어 빈도수의 영향을 많이 받아 희소한 단어를 임베딩하기가 어려움.
* OOV의 처리가 어려움
  - 새로운 단어가 등장하면 데이터 전체를 다시 학습시켜야 함.
* 단어 사전의 크기가 클수록 학습에 오래걸림
  - 단어 사전의 크기가 수만 개 이상인 경우, Word2Vec은 학습하기에 무거운 모델임.

 

4-2-7. Word2Vec의 학습트릭

* Subsampling Frequent Words
  - 자연어 코퍼스에서 자주 등장하는 단어의 학습량을 확률적인 방법으로 줄이는 것
  - 등장빈도가 높을수록 단어가 업데이트 될 기회가 많지 않기 때문  


  - f(Wi)는 해당 단어가 말뭉치에 등장할 비율(해당 단어 빈도/전체 단어수)
  - t는 사용자가 지정해주는 값으로, 연구팀에서는 0.00001을 권장
  - 예) 만약 f(Wi)가 0.01로 나타나는 빈도 높은 단어는 위 식으로 계산한 P(Wi) 가
  0.9684이므로, 100번의 학습기회 가운데 96번 정도는 학습에서 제외하게 됨.
  - 등장 비율이 적어 P(Wi)에 가깝다면 해당 단어가 나올때마다 빼놓지않고 학습
  - 학습량을 효과적으로 줄여 계산량을 감소시키는 전략

* Negative Sampling
  - 가중치 행렬이(W) 있을 때, 등장하는 단어수가 십만 개면, 임베딩 차원 수가 100개만 되어도, 100X100,000이 되어 굉장히 무겁게 됨
      - 이 때, 위의 두 가지 방법을 사용하면 계산을 덜 하게 됨
  - 학습하는 중심단어와 주변단어들 외에, 이 단어들과 별 연관없는 수많은 단어의 임베딩까지 업데이트하는 것은 비효율적임.
  - 무작위로 네거티브 샘플들을 선택하여 하나의 중심단어에 대해 [주변단어+네거티브 샘플들]로만 구성된 작은 단어 집합을 만들어서 학습하면 훨씬 효율적으로 학습할 수 있을 것.


  - positive sample은 1로, negative sample은 0으로 간주하는 binary classification 형식의 학습방법을 사용.
  - 모델을 학습할 때 기존의 Skip-gram과 다르게, target words에 대해서 단어사전의 subset에 대해서만 학습을 진행할 수 있으므로 효율적으로 학습.

 

4-3. FastText

* 분포 가설하에 표현한 분산표현을 따르는 또다른 임베딩 모델
* 2017년 페이스북에서 공개한

 

4-3-1. FastText 동작원리

* <, >는 단어의 경계를 나타내기 위한 특수기호
* 단어를 먼저 <, >로 감싼 후, 설정한 n-gram의 값에 따라 앞에서부터 단어를 쪼갬
* 마지막에 본 단어를 설명하기 위해 <, >로 감싸진 전체 단어를 하나 추가함
* n-gram 설정은 최소값과 최대값을 설정할 수 있음.

 

4-3-2. FastText의 장점

* 오타나 모르는 단어에 대한 대응이 좋음
* 단어 집합 내 빈도 수가 적었던 단어에 대한 대응이 좋음
* 자연어 코퍼스 내 노이즈에 대한 대응이 좋음

 

과제

아래 내용 공부해보기

 

1) 차원축소(Dimensionality Reduction)

- PCA(Principal Component Analysis) << 프로젝트에 적용해보기

- 잠재의미분석(Latent Semantic Analysis)
- 잠재디리클레할당(LDA; Latent Dirichlet Allocation)
- SVD(Singular Value Decomposition)

 

 2) Word2Vec의 학습트릭

- Subsampling Frequent Words
- Negative Sampling

3) 임베딩 방법론인 GloVe의 작동원리