NLP(2) 워드 임베딩 1

gmlwlswldbs·2021년 10월 11일
0

스터디

목록 보기
10/19

📌 워드 임베딩(Word Embedding)

1. 희소 표현(Sparse Representation)

  • 벡터 또는 행렬의 값이 대부분 0으로 표현되는 방법
  • ex. 원핫 벡터 (정답만 1 나머지 0)
  • 한계 : 단어의 개수가 늘어나면 벡터의 차원이 한없이 커진다. (단어가 N개라면 N차원 벡터를 만든다), 공간적 낭비
    • 원핫벡터의 경우 단어가 10000개면 벡터의 차원이 10000이 됨
    • 단어가 10000개, 인덱스 5에 정답 강아지가 있는 원핫벡터 :
      강아지 = [0 0 0 0 1 0 0 0 0 0 0 0 ... 중략 ... 0] 1개의 1 9999개의 0개로 표현

2. 밀집 표현(Dense Representation)

  • 벡터의 차원을 단어 집합의 크기로 상정하지 않고 사용자가 설정한 값으로 맞춘다. 벡터 차원이 조밀해졌다고 표현
  • 속성을 사용자가 정한 차원에 대응시켜 표현 (=임베딩)
  • 0과 1 로 나타내는 것이 아니라 실수값을 가진 벡터로 표현
  • 희소표현은 하나의 차원이 하나의 속성 표현, 밀집 표현은 여러 차원이 조합되어 속성을 표현
  • 하나의 정보가 여러 차원에 흩어져 표현되기 때문에 ditributed representation이라고도 한다
  • ex. 사용자 설정 밀집 표현의 차원 = 128
    강아지 = [0.2 1.8 1.1 -2.1 1.1 2.8 ... 중략 ...]

3. 워드 임베딩(Word Embedding)

  • 단어를 밀집 벡터의 형태로 표현하는 방법

  • 밀집 벡터를 임베딩 벡터(embedding vector) 라고도 함. 워드 임베딩의 결과라는 뜻에서

  • 워드 임베딩 방법론 : LSA Word2Vec FastText Glove

  • Embedding()

    • 케라스에서 제공하는 도구
    • 단어를 랜덤한 값을 가지는 밀집벡터로 변환 -> 인공신경망 가중치를 학습하는 방법으로 단어벡터를 학습

📌 워드투벡터(Word2Vec)

  • 단어의 유사도 반영을 위해 단어의 의미를 벡터화해야하는 필요성
  • 아이디어 : 비슷한 단어들, 주변의 단어를 통해 단어 추론 -> 비슷한 맥락을 갖는 단어에 비슷한 벡터를 주고 싶다
  • Word2Vec : 단어에 대해서 벡터 연산(더하기 빼기 연산) 가능
    • ex. 고양이 + 애교 = 강아지
      한국 - 서울 + 도쿄 = 일본
      박찬호 - 야구 + 축구 = 호나우두

1. 희소 표현(Sparse Representation)

  • 희소표현은 각 단어간 유사성을 표현할 수 없다 -> 단어의 의미를 다차원 공간에 벡터화하는 방법 필요 -> 분산 표현의 등장
  • 분산표현 ⊂ 임베딩 벡터, 밀집 벡터

2. 분산 표현(Distributed Representation)

  • 분포 표현은 분포가설을 이용하여 데이터 셋을 학습하고 벡터에 단어의 의미를 여러 차원에 분산하여 표현하는 것
  • 분포가설 : 비슷한 위치에서 등장하는 단어들은 비슷한 의미를 가진다
    • ex. <강아지>는 <귀엽다, 예쁘다, 애교> 라는 단어와 주로 등장하고
      분포가설에 따라 이 텍스트들을 벡터화한다면 의미적으로 가까운 단어가 된다
  • 벡터의 차원이 원핫벡터와 비교하여 저차원으로 줄어듬 (굳이 차원의 크기가 단어 집합의 크기일 필요가 없음)
  • 분산표현은 저차원에 단어의 의미를 여러 차원에다가 분산하여 표현
  • ex. NNLM, RNNLM, Word2Vec

희소 표현 : 공간 낭비, 연산량이 많고 단어 간의 의미적 유사도가 표현되지 않아 일반화가 어려움
-> 임베딩을 통해 분산표현(임베딩벡터)로 단어를 표현

3. CBOW(Continuous Bag of Words)

Word2Vec 의 두가지 방법

  • CBOW(Continuous Bag of Words) : 주변의 단어로 중간에 있는 단어를 예측
  • Skip-Gram : 중간에 있는 단어로 주변의 단어를 예측
  • ex. "The fat cat sat on the mat"
    • CBOW : {"The", "fat", "cat", "on", "the", "mat"} -> sat 예측

      • 중심 단어 (center word) : sat (예측해야 하는 단어)
      • 주변 단어 (context word) : 나머지
      • 윈도우 (window) : 중심 단어 예측을 위해 앞 뒤로 볼 단어의 갯수
        • 윈도우의 크기가 n이면 주변 단어의 크기가 2n
      • ex. 윈도우의 크기가 2일 때 슬라이딩 윈도우

      • 슬라이딩 윈도우 (Sliding Window) : 윈도우를 계속 움직여서 주변단어와 중심단어 선택을 바꿔가며 학습하기 위한 데이터셋을 만드는 것

CBOW의 인공신경망 도식화

  • 입력층 (input layer) : 윈도우 크기의 범위에 있는 주변 단어들의 원핫벡터
  • 출력층 (output layer) : 중간 단어(target)의 원핫벡터

Word2Vec 은 딥러닝(Deep Neural Network)가 아니다.

  • 입력층과 출력층 사이에 하나의 은닉층만 존재 -> 심층신경망(Deep Neural Network)이 아니라 얕은신경망(Shallow Neural Network)
  • 활성화 함수가 존재하지 않음 : 룩업 테이블 연산을 담당하는 층으로 투사층 (projection layer) 이라고 부름

  • CBOW의 인공신경망 자세히
  1. 투사층의 크기가 M이다.
  • 각 단어의 임베딩 벡터의 차원과 같다
  1. 입력층과 투사층 사이의 가중치 W는 V×M 행렬이고 투사층과 출력층 사이의 가중치 W'는 M×V행렬이다.
  • V : 단어 집합의 크기
  • 인공 신경망의 훈련 전에 이 가중치 행렬 W와 W'는 대게 굉장히 작은 랜덤 값을 가지게 되고 정확히 맞추기 위해서 W, W'를 계속해서 학습해나간다.

① 룩업 테이블 (lookup table) : i번째 인덱스만 1이고 나머지가 0인 입력 벡터와 가중치 W의 곱은 W의 i행을 그대로 읽는 것과 같다. lookup한 W의 각 행벡터는 Word2Vec을 수행한 후 각 단어의 M차원의 크기를 갖는 임베딩 벡터

② 평균 구하기 (정답일 확률)

  • (주변단어의 원핫벡터 × W = V) 룩업 테이블의 결과 벡터들이 투사층에서 만나 평균 벡터를 구하게 됨.
  • 평균(v) 구하는 법 : 더해서 입력벡터의 총 개수 (2 × 윈도우) 로 나눔
    • Skip-Gram은 하나의 중심 단어를 입력으로 하기 때문에 벡터의 평균을 구하지 않는다

③ 예측값을 확률로 바꿔주기

  • 평균벡터 (v) × 가중치 행렬 (W')
    • 출력 벡터는 입력 벡터의 차원과 같다.
  • 곱해서 나온 벡터에 소프트 맥스(0 ~ 1)를 취해줘서 스코어 벡터를 만듬
    • 스코어 벡터 (Score Vector) : 각 인덱스는 그 인덱스번째 단어가 중심 단어일 확률을 나타냄
  • 우리가 실제 알고 있는 중심단어(답)의 원핫벡터와 스코어 벡터의 오차를 줄이기 위해 손실함수로 cross entropy 함수를 사용한다

  • y가 원핫벡터이기 때문에 정답(i인덱스의 값) 빼고 나머지는 0값을 가지므로 위 식을 아래와 같이 간소화 가능

    손실 함수로 적합한 이유

    • c가 중심 단어의 인덱스라고 하면 정확히 예측했을 때 yc햇 = 1, 식에 대입해보면 cross entropy 값은 0 따라서 위의 식을 최소화하는 방향으로 학습해야한다

이제 역전파(Back Propagation)를 수행하면 W와 W'가 학습이 되는데, 학습이 다 되었다면 M차원의 크기를 갖는 W의 행이나 W'의 열로부터 어떤 것을 임베딩 벡터로 사용할지를 결정하면 됩니다. 때로는 W와 W'의 평균치를 가지고 임베딩 벡터를 선택하기도 합니다.

임베딩했다 -> 투사층의 상태(입력 * W)를 의미함

Word2Vec 시각화

처음에는 연관 없어 보이는 단어들의 확률이 별로 다르지 않지만 학습할수록 점점 비슷한 단어끼리 뭉친다.
빨간색 : 숫자 큼 파란색 : 작음

4. Skip-gram

  • 중심 단어에서 주변 단어를 예측
  • 윈도우 크기가 2인 데이터셋

  • 인공신경망 도식화 (평균을 구하는 과정이 없다)
  • Skip-gram이 CBOW보다 성능이 좋다고 알려져 있다 : 왜? (한 단어에 대해 업데이트를 여러번 한다)

5. NNLM Vs. Word2Vec

  • 단어 간 유사도를 구하기 위해 임베딩을 도입한 NNLM(피드 포워드 신경망 언어 모델) 의 학습 속도와 정확도를 개선한 것이 Word2Vec

📌 영어/한국어 Word2Vec 실습

📌 네거티브 샘플링을 이용한 Word2Vec 구현(Skip-Gram with Negative Sampling, SGNS)

1. 네거티브 샘플링(Negative Sampling)

  • Word2Vec은 역전파 과정에서 모든 단어에 대한 임베딩 벡터값을 계산해서 계산량 매우 큼 -> 전체 대상에서 일부 대상으로 바꿈
  • 주변 단어 / 중심 단어 / 별 연관 없는 단어
  • 별 연관 없는 단어 중 무작위로 일부만 가져와서 작은 단어 집합으로 샘플링

2. 네거티브 샘플링 Skip-Gram(Skip-Gram with Negative Sampling, SGNS)

  • Skip-Gram : 중심 단어로부터 주변 단어를 예측 ( cat -> the fat sat on)
  • Skip-Gram 구조화 : 모델을 주황색 박스로 표현

  • SGNS (Skip-gram(Skip-Gram with Negative Sampling) : 주변 단어와 중심 단어가 같이 입력되고 두 입력이 실제 윈도우 크기 내에 존재하는 확률을 출력

  • Skip-Gram : 입력 -> 중심단어, 레이블 -> 주변 단어
  • SGNS : 입력 1 -> 중심 단어, 입력 2 -> 주변 단어, 레이블 -> 두 입력이 이웃일 확률 (이웃이라면 1 아니라면 0)

  • 네거티브 샘플링
  • SGNS 학습 : 윈도우 사이즈 내에 등장하지 않는 단어 중 일부의 집합에서 랜덤으로 선택한 단어들을 레이블 0의 샘플로 추가한다.

  • 두개의 임베딩 테이블 : 각각 입력 1(중심 단어)과 입력 2(주변 단어)의 테이블 룩업을 위한 임베딩 테이블
  • 임베딩 테이블로 테이블 룩업(원핫벡터와 곱해서 행벡터를 가져오는 과정)하여 임베팅 벡터로 변환

  • 예측값 = 중심 단어와 주변 단어의 내적값
  • 오차를 역전파하여 임베딩 벡터값 업데이트 (전체 테이블을 업데이트하는게 아니라 부분집합으로 뽑힌 임베딩 벡터값만 업데이트)
  • 이후에는 선택적으로 두 개의 임베딩 테이블 중 좌측의 테이블을 최종 임베딩 테이블로 사용할 수 있습니다. 실습을 통해 이해해봅시다. (뭔 소리냐?)

0개의 댓글