[NLP 9] Embedding 4 : word2vec - CBOW(Continuous Bag of Word)

방선생·2025년 1월 15일

밀집 표현(dense representation)

  • 단어나 문장을 0이 아닌 일정한 크기의 실수로 표현하는 방법
    • 0이 아닌 실수로 표현
    • 희소 표현보다 벡터크기가 작아져 메모리 소모가 적음

① 적은 크기의 백터로도 다양한 종류의 문장 / 단어 표현이 가능
② 컴퓨터의 메모리 절약과 효율적 사용이 가능

word2vec

  • 개념 : 주변에 사용된 이웃 단어가 비슷한 / 단어들이 비슷한 숫자를 갖도록 함
    • 문장이 아닌 단어를 임베딩함
    • BoW은 단어의 등장 빈도로만 표현하여 순서나 문맥이 고려되지 않지만, word2vec는 고차원 벡터로 모두 고려하여 벡터를 생성함

  • 분포 가설을 바탕을 함
    • 분포 가설 : 주변에 사용된 단어가 비슷한 단어들이 비슷한 의미를 갖는다
    • 문맥(context) : 단어의 앞뒤 연결
    • 예시
      • 나는 어제 사과를 먹었다
      • 나는 어제 피자를 먹었다
        => Word2Vec 알고리즘은 이러한 단어들의 관계를 학습하여, “사과”와 “피자”가 비슷한 숫자를 갖도록 한다

  • 종류
    • CBOW
    • skip-gram

word2vec : CBOW(Continuous Bag of Word)

  • 주변에 있는 단어들을 입력으로 / 중간에 있는 단어를 예측하는 모델
  • 기본구조는 얕은 신경망(shallow neural network)
    • 깊은 신경망은 은닉층이 굉장히 많음 (얕은 신경망은 1개)

word2vec : skip-gram 모델

  • 중간에 있는 단어들 → 입력 → 주변에 있는 단어들을 예측하는 모델

(skip-gram 모델은 이론을 깊게 다루지 않고 CBOW와의 차이점을 비교하기 위해 코드로만 작성하였습니다)


CBOW 모델 기본 구조 : 얕은 신경망(shallow neural network)

  • 단어들을 고유한 희소표현으로 인덱스를 설정함 (입력층)
    • 문맥 단어 원핫 벡터(One-hot Vector)로 변환하여 입력(Input Layer)
    • 윈도우의 크기(예측을 위한 활용 범위)가n일때, 활용하는 단어의 수 는 2n개

  • 입력된 원핫 벡터는 가중치 행렬과 곱해져 고정된 크기의 임베딩 벡터로 변환 (은닉층)
    • 모든 문맥 단어의 임베딩 벡터를 평균하여 하나의 벡터로 결합함
    • 모델의 예측을 위한 정보로 사용됨 (Projection Layer)

  • 단어 집합(vocabulary) 내에서 타겟 단어의 확률 분포를 계산 (출력층)
    • 출력 레이어는 소프트맥스(softmax) 함수를 사용함
    • 가장 높은 확률을 가진 단어가 예측 결과로 출력

  • 학습 결과 : 가중치 update → 학습이 완료된 가중치 → 임베딩 벡터(단어 사전)
  • 입력층과 은닉층의 관계 : y = X(2,7) ⅹ WinW_{in}(7,3) → 행렬 곱
  • 은닉층과 출력층의 관계 : z = y(1,3) ⅹ WoutW_{out}(3,7) → 행렬 곱

  • CBOW 학습과정 요약
    • 윈도우 크기에 따라 입력노드 개수 결정됨
    • 입력값을 원 핫 벡터로 변경후 랜덤한 가중치가 곱해짐 (행렬 곱 기반)
    • 은닉층에서 평균을 냄 (백터 내적 기반)
    • 은닉층의 출력값을 원 핫 벡터의 크기와 맞추기 위해 랜덤한 출력 가중치를 곱합
    • 정답 행렬과 비교를 통해 가중치를 계산해 나감 == “학습”

(보충) 퍼셉트론(perceptron)

  • 퍼셉트론(perceptron) - 인공뉴런, 논리회로
    1) perceive → perception
    2) 신경세포 → neuron
    3) perception + neuron → perceptron(인공 뉴런, 논리 회로)
    4) perceptron(인공 뉴런) 정의 : 다수의 입력 신호를 받아서 하나의 신호를 출력하는 인공 뉴런 (인공 신경망의 기초)
    5) 가중치(weight) : 뉴런의 출력 신호를 낼 지 말지를 결정하기 위해 입력 신호에 곱하는 계수 → 신경세포체에서 합쳐진 신호가 특정 임계 값을 넘을 지 말지를 결정

  • 입력 레이어 (Input Layer)
    • 데이터를 수집하는 역할, 각 입력은 특정 값을 가짐

  • 가중치 (Weights)
    • 입력 데이터에 대해 가중치를 곱하여 가중 합계를 계산함. 입력의 중요도를 조절하는 파라미터이며, 학습 과정에서 조정이 가능함

  • 활성화 함수 (Activation Function)
    • 가중 합계에 대해 활성화 함수를 적용하여 최종 출력을 결정함. 주로 계단 함수(Step Function)를 활용하여 특정 임계값(threshold)을 넘으면 1을 출력하고, 그렇지 않으면 0을 출력함

  • 출력 (Output)
    • 최종적으로 활성화 함수의 결과를 출력. 퍼셉트론은 이진 분류 문제를 해결하는 데 사용됨

(보충) 행렬 곱 / 벡터 내적

  • 행렬 곱 - 결과도 행렬. 두 행렬의 크기에 따라 결과 행렬의 크기가 결정됨
    • (m, k) X (k, n) = (m, n) (일반화) - k가 같아야만 함

  • 백터 내적 - 결과는 스칼라(단일 숫자)임

+ CBOW 연산 과정 분석


+ CBOW 신경망 구조 (심화)

  • 입력층의 개수 - 윈도우의 크기에 따라 정해짐
  • 은닉층의 개수 - 모델에 따라 직접 정함

  • CBOW 신경망 구조
    • 입력층
      • 예측하려는 단어의 주변 단어들이 문맥단어로 사용됨
      • 각 문맥 단어들은 원 핫 인코딩 방식으로 벡터표시됨 => xix_i
      • 입력층의 노드의 개수는 윈도우 크기에 따라 달라짐
    • 은닉층 (1개일때)
      • 원 핫 벡터(xix_i)와 가중치 행렬(WinW_{in})이 곱해져 임베딩 벡터가 생성됨 =>
        hi=Wtxih_i = W^tx_i
      • 각 은닉층의 노드의 임베딩 벡터들을 평균하여 하나의 벡터로 결합함 =>
        h=1Ci=1Chih = {1\over C}\displaystyle\sum_{i=1}^{C}{h_i}
      • 벡터 hh가 은닉층의 최종 결과로 출력됨
    • 출력층 (1개일때)
      • 벡터 hh를 바탕으로 타겟 단어를 예측함
      • 출력 벡터 hh를 소프트 맥스 함수를 통해 변환하여 중심 단어일 확률을 계산함
      • 출력층에서 단어 집합(VV)에 있는 모든 단어에 대해 확률 분포를 계산하여 가장 높은 확률을 가진 단어를 중심 단어로 예측함

  • 출력가중치(WoutW_{out})가 있어야 하는 이유
    • 결과값으로 확률계산하여 정답 레이블을 추측하기 위해선 원 핫 벡터와 모양이 같아야 하기 때문

  • 은닉층의 노드가 많아질수록 모델의 표현력(복잡한 데이터 패턴을 학습할 수 있는 능력)이 증가하지만, 과적합의 위협도가 증가하여 적절한 기법을 활용하여 방지해야함

(수학적인 표현들은 추후 RNN에서 더 자세하게 다루겠습니다)








참고자료

word2vec의 코드는 [NLP10]을 참고하세요

profile
AI & Robotics

0개의 댓글