Deep Learning/Natural Language Processing

[W13D5] NLP : 단어 임베딩

makeitworth 2021. 8. 2. 22:28

단어 임베딩 : 단어의 의미를 이해하기 위해 어떻게 표현할 것인가?

  • 글자의 나열?
  • one-hot encoding?
  • 좋은 표현방식: 단어 간의 관계를 잘 표현할 수 있어야 함

단어의 의미

  • 어근(lemma),의미(sense)
  • ex>
    마우스는 쥐라는 뜻과 컴퓨터 주변기기 마우스가 있음.
    복수형(mice)이나 단수형(mouse)이나 word-form은 다르지만, 모두 같은 어근임.

단어들의 관계는 어떤 것들이 있을까? 동의어(Synonyms)

  • 문맥상 같은 의미를 가지는 단어들, 문장 안에서 단어를 교체해도 되는 경우
    • filbert / hazelnet
    • couch / sofa
    • automobile / car
    • vomit / throw up
  • 동의어라고 해서 항상 그 단어로 대체할 수 있는 것은 아니다.

    • H2O / water (문맥에 따라 다르다. 일상생활에서 water를 H2O로 대체해서 쓴다면 이상할 것
    • big / large
    • brave / courageous

 유사성(Similarity)

  • 유사한 의미를 가지는 단어들(동의어는 아닌)
    • car / bicycle
    • cow / horse
  • 얼마나 유사한지 어떻게 평가할 수 있을까?
    • 수작업으로 평가한 단어들의 유사도

연관성(Relatedness)

  • 단어들은 의미의 유사성 외에도 다양한 방식으로 연관될 수 있다.
    • Semantic field
    • Semantic frame

Semantic field

  • 특정한 주제나 영역(domain)을 공유하는 단어들
  • ex> hospitals: surgeon, scalpel, nurse, anaesthetic, hospital
  • ex> restaurants: waiter, menu, plate, food, chef

Semantic frame

  • 특정행위에 참여하는 주체들의 역할에 관한 단어들
    • 상거래라는 행위에 참여하는 주체들:buy,sell,pay 등의 단어는 같은 semantic frame을 공유하고 있고, 그런 면에서 관련된 단어라고 말할 수 있다.

Vector :  분포적 유사성

NLP에서는 거의 벡터로 의미 표현

  • 단어들은 주변의 환경(주변의 단어들의 분포)에 의해 의미가 결정된다.
  • 만약, 두 단어 A와 B가 거의 동일한 주변 단어들의 분포를 가지고 있다면 그 두 단어는 유사어이다.
  • 따라서 단어의 의미를 분포적 유사성(distribution similarity)을 사용해 표현하고자 한다.
  • ex> 다음과 같은 문장들이 있다고 하자.
    • Ong choi is delicious and sauteed with garlic.
    • Ong choi is superb over rice.
    • Ong choi leaves with saulty sauces
  • 그리고 다음 문장들도 있다고 하자.
    • ...spinach sauteed with garlic over rice
    • Chard stems and leaves are delicious
    • Collard greens and other salty leafy greens
  • 따라서 ong choi는 시금치와 같은 채소라는 것을 유추할 수 있다.
    • 벡터를 사용해서 분포적 유사성(distributional similarity)을 표현
  • 벡터공간 내에서 비슷한 단어들은 가까이 있다.

  • 이렇게 벡터로 표현된 단어를 임베딩이라고 부른다. 보통은 밀집벡터인 경우를 임베딩이라고 부른다.
  • 최근 NLP 방법들은 모두 임베딩을 사용해서 단어의 의미를 표현한다.
  • dense(밀집) 하다는 것은 원소의 대부분이 0이 아니라는 의미. sparse 벡터는 반대로 원소 대부분이 0인것

왜 임베딩을 사용하는가?

  • 임베딩을 사용하지 않는다면? one-hot encoding 등을 사용할 것
    • 분류기의 속성은 한 단어의 존재 유무
    • 학습 데이터와 테스트 데이터에 동일한 단어가 나타나지 않으면 예측결과가 좋지 못함.
  • 임베딩을 사용하는 경우
    • 각 속성은 단어 임베딩 벡터
    • 테스트 데이터에 새로운 단어가 나타나도 학습 데이터에 존재하는 유사한 단어를 통해 학습한 내용이 유효하다.
    •  

임베딩의 종류

  • 희소벡터(sparse vector)
    • tf-idf
    • Vector propagation (검색 엔진을 위한 질의어, 문서 표현)
  • 밀집벡터(dense vector) - 대부분의 DL 모델에서는 주로 밀집벡터 사용
    • word2vec
    • Glove

Term-document 행렬

  • 각 문서는 단어들의 벡터로 표현된다(vector space model)
  • As You Like It 과 Twelfth Night / Julius Caesar 와 Henry V가 서로 유사함을 알 수 있음

단어 벡터

  • 문서의 갯수가 제한되어 있어서 단어의 속성을 표현하는데 한계가 있음

Word-word 행렬(term-context 행렬)

  • 주변 단어(window size를 정해서 그 단어의 앞 뒤 단어 포함)들의 빈도를 벡터로 표현

벡터의 유사도 계산하기

두 벡터의 각도를 통해 유사성을 판단할 수 있음
각도가 작으면 작을수록 유사함
cosine을 통해 구함

$similarity=cos(Θ)=\frac{A⋅B}{||A||\ ||B||}=\frac{\sum_{i=1}^{n}{A_{i}×B_{i}}}{\sqrt{\sum_{i=1}^{n}(A_{i})^2}×\sqrt{\sum_{i=1}^{n}(B_{i})^2}}$

 

TF-IDF

  • 단어의 빈도수를 그대로 사용할 때의 문제점
    • 자주나타나는 단어들("the","it","they")은 의미를 구별하는데 도움이 되지 않는다.
    • 어떻게 하면 이런 단어들의 부작용을 최소화할 수 있을까?
  • tf-idf (term-document 행렬의 적용을 받음)
    • tf : term-document 행렬과 동일 idf : 역수에 전체 문서의 갯수를 곱하고 로그를 취한 값   
    • 다음과 같이 문서 d내의 단어t의 새로운 가중치 값을 계산한다.
      $$w_{t,d}=tf_{t,d}\times idf_t$$
    • $tf_{t,d}=count(t,d)$
    • $tf_{t,d}=log_{10}(count(t,d)+ 1)$ (로그를 씌워 값이 급격하게 올라가는 것을 방지)
    • df_t : 단어 t를 포함하는 문서들의 개수
    • idf : inverse document frequency
    • $$idf_t = log_{10}(\frac{N}{df_t})$$
    • df_idf를 곱한다.

모든 문서에 general 하게 등장하는 단어는 빈도수 기반으로 표시하면 값이 크게 나타나지만, 변별력이 없는 단어이므로, tf-idf에서는 매우 작은 값이 나타나게 된다.

 

Dense Vectors

tf-idf vector

  • 길다(|V| = 20000~50000)
  • 희소성(sparse, 대부분의 원소가 0)

Word2vec, Glove

  • 짧다(50~1000)
  • 밀집성 (dense, 대부분의 원소가 0이 아님)

Dense vectors가 선호되는 이유

  • 더 적은 개수의 학습 파라미터를 수반
  • 더 나은 일반화 능력
  • 동의어, 유사어를 더 잘 표현

Dense vectors가 단점을 보일 때: over generalization (유사한 두 단어 사이의 차이점을 무시하게 됨)

-> 두 가지 방식 (sparse / dense)의 벡터를 동시에 사용하여 보완하는 모델을 만들 수 있음 (ex. deep and wide)

 

Word2vec

  • 주어진 단어 w를 인접한 단어들의 빈도수로 나타내는 대신, 주변 단어를 예측하는 분류기를 학습하면 어떨까?
    • 단어w가 주어졌을 때 단어c가 주변에 나타날 확률은?
  • 우리의 관심은 이 예측모델의 최종예측값이 아니라 이 모델 내 단어 w의 가중치 벡터이다.
  • self-supervision
    • 이 모델을 학습하기 위한 목표값은 이미 데이터 내에 존재한다.
    • 사람이 수동으로 레이블을 생성할 필요가없다.

 

Skip-Gram


Word2Vec을 학습하는 방법 중 하나인 Skip-Gram에 대해 살펴보자.

Skip-gram 모델은 한 단어가 주어졌을 때, 그 주변 단어를 예측할 확률을 최대화 하는 것이 목표이다. 즉 단어들의 시퀀스 $w_1, ..., w_r$가 주어졌을 때 다음 확률을 최대화하고자 한다.

파라미터를 명시화해서 우도함수로 표현하면 다음과 같다.


파라미터 $\theta = {W, C}$는 두 개의 임베딩 행렬 $W$와 $C$를 포함한다. $W$를 목표(또는 입력) 임베딩 행렬, $C$를 상황(또는 출력) 임베딩 행렬이라고 부른다.

 

 

 

$W$와 $C$의 shape은 같으며, 만약 사전에 5만개의 단어가 있다면 $W$는 5만개의 $d$차원 벡터로 이루어진다.

하나의 목표 단어 $w$와 상황 단어 $c$가 주어졌을 때 $v_w$와 $u_c$를 각각 임베딩 벡터라고 하면 skip-gram 모델은 다음가 같은 확률 모델을 가정한다. (dot product를 통해 두 단어 사이의 유사성을 포착한다.)


($w$가 주어졌을 때 $c$를 예측하는 문제로, $v_w$가 하나의 입력 속성 벡터. 이것은 굉장이 차원이 큰 multi class classification 문제를 푸는 것으로 생각할 수 있다. 하지만 여기서 우리가 얻으려는 것은 예측값이 아니라 $v_w$임을 기억하자.)

 

(단어를 그대로 넣지 않고 처리해서 넣게 된다.)

여기서 $x_w$를 단어 $w$에 대한 one-hot 벡터라고 하면, $v_w$와 $u_c$는 다음과 같이 정의된다.

 

이 문제에 해당하는 신경망은 다음과 같다.

hidden layer가 하나인 neural network 형태

 

 

  • 이 모델의 문제점은?
  •  
    • 위 식의 분모 계산량이 많다. (|V|d와 비례) (normalization할 때 vocabulary size에 맞게 다 계산해야함)
  • 해결책
    • Noise-constrastive estimation: Normalization constant(분모)를 여러 개의 합이 아닌 하나의 파라미터로 학습한다. 다중클래스 분류 문제를 이진 분류 문제로 변환하여 새로운 목표함수를 최적화시킨다. 이렇게 해서 얻어지는 파라미터들이 원래 likelihood의 최적해를 근사한다는 것이 증명된다.
    • 이것을 조금 더 단순화시키면 negative sampling이 된다.
    • Word2vec은 negative sampling을 사용한다.

Nagative Sampling

Negative sampling을 사용했을 때 목표함수는 다음과 같다.

  • 신경망의 구조는 그대로
  • normalization constant를 계산할 필요가 없다.
  • gradient 계산이 단순화된다.

Word2Vec 학습과정 요약

    • |v|개의 d차원 임베딩을 랜덤하게 초기화
    • 주변 단어들의 쌍을 positive example로 생성
    • 빈도수에 의해 추출된 단어들의 쌍을 negative example로 생성
    • 위 데이터를 사용해 분류기 학습
    • 학습된 임베딩 w가 최종 결과물

워드임베딩, word2vec 참고자료

https://reniew.github.io/22/

https://m.blog.naver.com/jujbob/221155564430

https://wikidocs.net/22644

https://www.sallys.space/blog/2018/04/05/Word2vec,-skip-gram-model/

https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/03/30/word2vec/

https://byeongkijeong.github.io/Word2vec-from-scratch-using-keras/

https://keep-steady.tistory.com/7

https://lsjsj92.tistory.com/600