자연어, 비전

워드 임베딩

H_erb Salt 2020. 11. 10. 08:11
4.word embedding

단어 임베딩

  • 같은 데이터를 표현할 때 가능한 낮은 차원으로 표현할수록 쉽게 모델링하고 학습할 수 있으므로, 희소벡터보다는 Dense한 벡터로 표현하는게 좋음

1. 차원 축소

  • 더 작은 차원으로 효율적으로 정보를 표현하는 차원 축소의 이유와 방법에 대해 알아보기

PCA(주성분 분석)

pass

매니폴드 가설

  • 높은 차원에 존재하는 데이터들의 경우, 실제로는 해당 데이터들을 아우르는 낮은 차원의 다양체 역시 존재한다는 가설
  • 저차원의 각 공간의 차원 축은 고차원에서 비선형적으로 표현될 것이며, 데이터의 특징을 각각 표현함

딥러닝이 잘 동작한 이유

  • 대부분의 딥러닝이 문제를 풀기 위해 차원 축소를 수행하는 과정은, 데이터가 존재하는 고차원상에서 매니폴드를 찾는 과정
  • PCA 등과 달리 선형적인 방식에 비해 딥러닝은 비선형적인 방식으로 차원 축소를 수행하며, 그 과정에서 문제를 잘 해결하기 위한 매니폴드를 자연스럽게 찾아내므로 딥러닝이 성공적으로 동작하는 이유일 것으로 예상함

오토인코더

  • 인코더에서 고차원의 샘플 벡터를 입력으로 받아 매니폴드를 찾고, 저차원으로 축소하는 인코더를 거쳐 병목 구간에서의 숨겨진 벡터로 표현
  • 디코더는 저차원의 벡터를 받아, 다시 원래 입력 샘플이 존재하던 고차원으로 데이터를 복원하는 작업을 수행. 복원된 데이터는 고차원 상의 매니폴드 위에 위치하게 될 것
  • 고차원의 벡터를 저차원으로 압축한 후 다시 복원하는 과정에서, 오토인코더는 병목의 차원이 매우 낮기 때문에 복원에 필요한 정보만 남기고 필요 없는 정보는 버려야 함
  • 따라서 이 구조의 모델을 훈련할 때는 복원된 데이터와 실제 입력 데이터 사이의 차이를 최소화 할 수 있도록 손실함수를 구성함
  • 하지만 고차원에서 저차원으로 데이터를 표현하면 손실이 따를 수 있으므로, 훈련이 완료된 모델일지라도 복원된 데이터는 실제 입력과 차이가 있을 수 있음
  • 오토인코더를 사용하여 이전 장에서 TF-IDF 등을 활용해 계산된 희소 단어 특징 벡터를 입력으로 넣고 같은 출력값을 갖도록 훈련했을 때, 오토인코더의 병목 계층 결괏값을 Dense Word Embedding 벡터로 사용할 수 있을 것

2. 흔한 오해1

  • skip-gram 또는 GloVe를 사용하여 원핫 인코딩의 Sparse 벡터를 저차원의 Dense 벡터로 표현하는 방법을 다룸
  • 여기서 많이 헷갈리는 부분이, 이렇게 훈련된 단어 임베딩 벡터를 추후 다룰 텍스트 분류, 언어 모델, 번역 등의 딥러닝 모델 입력으로 사용하리라 생각한다는 점
  • 이 임베딩 벡터를 사전 훈련된 임베딩 벡터라고 부름.
  • word2vec를 통해 얻은 단어 임베딩 벡터가 훌륭하게 단어의 특징을 잘 반영하고 있긴 하지만, 텍스트 분류나 언어 모델, 번역의 문제를 해결하는 최적의 벡터 임베딩이라고 볼 수 없음
  • 다시 말하면, 텍스트 분류 또는 기계 번역을 위한 목적함수는 분명히 word2vec와는 다른 형태로 존재함
  • 따라서, 다른 목적함수를 통해 훈련된 임베딩 벡터는 원래의 목적에 맞지 않을 가능성이 높음
  • 예를 들어, 긍정/부정 감성 분류를 위한 텍스트 분류 문제의 경우 '행복'이라는 단어가 매우 중요한 특징이 될 테지만, 기계 번역 문제에서는 '행복'이라는 단어는 일반적인 단어에 지나지 않음. 이 둘의 임베딩 벡터 값은 문제에 따라 크게 달라짐. 따라서 문제 특징을 고려하지 않은 단어 임베딩 벡터는 좋은 방법이 아님

word2vec 없이 신경망 훈련하기

  • word2vec을 사용하여 단어를 저차원의 임베딩 벡터로 변환하지 않아도, 문제에 특징에 맞는 단어 임베딩 벡터를 구성할 수 있음
  • 파이토치를 비롯한 딥러닝 프레임워크는 임베딩 계층(Embedding Layer)라는 레이어 아키텍처를 제공함
  • 이 계층은 bias가 없는 선형 계층과 같은 형태를 지님
  • W는 d X |V| 크기의 2차원 행렬. 따라서 입력으로 원핫벡터가 주어지면, W의 특정 행만 반환함
  • 따라서 최종적으로 모델로부터 구한 손실값에 따라 역전파 및 경사하강법을 시행하면, 자동적으로 임베딩 계층의 가중치인 W의 값을 구할 수 있음
  • 실제 구현에서는 이렇게 큰 임베딩 계층 가중치와 원핫 인코딩 벡터를 곱하는 것은 비효율적이므로, 단순히 테이블에서 검색하는 작업을 수행함.
  • 따라서 단어를 나타낼 때 (임베딩 계층의 입력으로) 원핫 벡터를 굳이 넘겨줄 필요 없이, 1이 존재하는 단어의 인덱스 정숫값만 입력으로 넘겨주면 임베딩 벡터를 얻을 수 있음.
  • 또한 임베딩 게층과의 계산상의 효율성과는 별개로, 원핫인코딩 벡터를 표현할 때 1이 존재하는 단어의 인덱스 정숫값만 있으면 된다는 것이 자명함.
  • 애초에 원핫 인코딩은 n개의 카테고리를 나타내기 위한 방법이기 때문임
  • n차원의 원핫인코딩 벡터에서 1은 한 개이며, n-1개의 0으로 채워짐
  • 추후 다룰 것에서 살펴보면, word2vec을 사용하여 단어를 임베딩 벡터로 변환한 후 신경망에 직접 넣는 대신, 앞서 언급한 것처럼 임베딩 계층을 사용하여 원핫인코딩 벡터를 입력으로 넣도록 구현했음을 알 수 있음

그래도 word2vec 적용하는 경우

  • 준비된 코퍼스 양이 너무 적고, 외부로부터 많은 양의 말뭉치를 통해 미리 훈련한 단어 임베딩 벡터를 구한다는 특수한 경우
  • 기본 정석대로 베이스라인 모델을 만든 후, 성능을 끌어 올리기 위한 여러가지 방법들을 시도 할 때 훈련된 단어 임베딩 벡터의 사용을 고려할 수도 있음
  • 또는 전이학습에서 살펴볼 고도화된 언어 모델을 통해 사전 훈련하여 접근할 수 도 있음

3. word2vec

  • word2vec은 단어를 임베딩하는 두 가지 방법으로 CBOW와 skip-gram을 제시함
  • 두 방법 모두 함께 등장하는 단어가 비슷할수록 비슷한 벡터 값을 가질 것이라는 공통된 가정을 전제로 함
  • 두 방법 모두 윈도우의 크기가 주어지면, 특정 단어를 기준으로 윈도우 내의 주변 단어들을 사용하여 단어 임베딩을 학습함.
  • 다만, 윈도우 내에서의 위치는 고려하지 않음. 그렇다고 단어의 위치 정보를 무시하지는 않음. 윈도우 자체가 위치 정보를 내포하기 때문임

알고리즘 개요: CBOW 방식과 skip-gram 방식

  • CBOW: 주변에 나타나는 단어들을 원핫 인코딩된 벡터로 입력받아 해당 단어를 예측하게 함
  • skip-gram: 대상 단어를 원핫 인코딩된 벡터로 입력받아 주변에 나타나는 단어를 예측하는 네트워크를 구성해 단어 임베딩 벡터를 학습함.
  • sip-gram이 CBOW보다 성능이 뛰어난 것으로 알려져 있으며 널리 쓰임

상세 훈련 방식

  • MLE를 통해 argmax 내의 수식을 최대로 하는 파라미터를 찾음
  • 네트워크 내부에 시그모이드와 같은 비선형 함수가 존재하지 않음

4. GloVE

알고리즘

  • skip-gram이 대상 단어를 통해 주변 단어를 예측하도록 네트워크를 구성하여 단어 임베딩 벡터를 학습했다면, GloVe는 대상 단어에 대해서 코퍼스에 함께 나타난 단어별 출현 빈도를 예측하도록 함
  • skip-gram을 위한 네트워크와 거의 유사함. 다만, 분류문제가 아닌 출현 빈도를 근사하는 회귀 문제가 되었으므로 MSE를 사용함
  • 마찬가지로 원핫 인코딩 벡터 x를 입력으로 받아 한 개의 은닉층 W를 거쳐 출력층 W를 통해 출력베터를 반환함.
  • 이 출력 벡터는 단어 x와 함께 코퍼스에 출현했던 모든 단어의 각 동시 출현 빈도들을 나타낸 벡터인 $C_x$를 근사함. 따라서 이 둘의 차잇값인 손실을 최소화하도록 역전파 및 경사하강법을 통해 학습할 수 있음
  • 이때 단어 x 자체의 출현 빈도 또는 사전확률에 따라 MSE 손실함수의 값이 매우 달라질 것. C_x값 자체가 클수록 손실값은 커지기 때문
  • 따라서, f(x)는 단어의 빈도에 따라 손실함수에 가중치를 부여함
  • GloVe의 논문에서는 실험에 의해 thesis=100, a = 3/4일 때 가장 좋은 결과가 나온다고 언급함

장점

  • 코퍼스 내에서 주변 단어를 예측하는 skip-gram과 달리, GloVe는 처음에 코퍼스를 통해 단어별 동시 출현 빈도를 조사하여 그에 대한 출현 빈도 행렬을 만들고, 이후엔 해당 행렬을 통해 동시 출현 빈도를 근사함
  • 따라서 코퍼스 전체를 훑으며 대상 단어와 주변 단어를 가져와 학습하는 과정을 반복하는 skip-gram과 달리 학습이 훨씬 빠름
  • 또한, 출현 빈도가 적은 단어들에 대해서도 어느정도 보완하여 학습함

5. word2vec 예제

FastText를 활용한 단어 임베딩 벡터 학습

pass

In [ ]: