본문 바로가기

부스트캠프 AI Tech 3기/이론 : U-stage

[Day33] Item2Vec and ANN 5-1 Word2Vec & Item2Vec

Item2Vec을 알려면 Word2Vec을 알아야하고, Word2Vec을 알려면 Embedding을 알아야하니까 일단 embedding부터 시작해보자

Embedding 임베딩

: 주어진 데이터를 낮은 차원의 벡터로 만들어서 표현하는 방법

MF에서 latent vector와 같은 개념

  • Sparse Representation
    아이템 전체 가짓수 = 차원의 수
    one-hot encoding, multi-hot encoding와 같은 방법이 있다.
    ex) 사과=[1,0,0,0,0,0], 배=[0,1,0,0,0,0]
    벡터는 모두 0 or 1로 이루어져있다. 해당 아이템에만 1 나머지는 0으로 두기 때문이다.
    아이템 갯수가 많아지면 그에 따라 벡터의 차원도 커지고 공간도 낭비된다.
  • Dense Representation
    아이템 전체 가짓수 <= 차원의 수
    차원의 수가 훨씬 작고 dense하다.
    ex) 사과=[1.2,4.0,6.9], 배=[7.4,.2.1,6.2]
    벡터가 이진값이 아닌 실수로 이루어져 있다.

Word Embedding 

NLP 분야에서 텍스트를 분석하기 위해서 단어를 dense한 embedding vector로 표현하는 기법
sparse representation에서 dense representation으로 바꾸는 방법

 

사람은 단어를 이해할 때 의미를 알고 그 의미적인 유사도를 구할 수 있다. 그래서 단어를 임베딩할 때도 비슷한 의미를 가질수록 embedding vector는 비슷한 위치에 분포할 것이다.

ex) 사과, 청사과는 비슷한 vector를 가질 것이다

 

임베딩으로 표현하기 위해서도 학습 모델이 필요하다. Matrix Factorization도 one hot encoding된 유저-아이템을 latent한 embedding vector로 표현하기 때문에 유저/아이템의 임베딩으로 볼 수 있고, 데이터로부터 학습한 유저-아이템 행렬이 곧 유저/아이템의 임베딩이다.

Matrix Factorization

Word2Vec

워드 임베딩의 대표적인 방법

Neural Net 기반 language model인데 하나의 layer만을 가진다.
이 모델을 학습하기 위해서 대량의 문서 dataset을 vector로 투영하면 각 단어가 압축된 형태로 dense하게 표현되고, 간단한 구조이기 때문에 학습이 빠르고 효율적이다.

Mapping Word Embeddings with Word2vec

단어를 Word2Vec으로 학습하고 각 단어의 임베딩을 3차원 공간에 투영해서 보면, 위의 사진처럼 된다.

king→queen으로 가는 vector방향과 man→woman으로 가는 방향이 거의 동일한 것을 확인할 수 있다. 각 벡터 쌍이 굉장히 유사하다는 것은 단어가 잘 embedding 되어 있음을 알 수 있다.

 

word2vec을 통해서 단어를 예측하게 된다. 물리적으로 문장 안에서 가까이 존재하는 단어들은 연관성이 있다. 그래서 그 단어를 예측하는 task 수행하면서 자연스럽게 각 단어의 embedding이 학습되게 되고 그 embedding은 단어의 고유의 의미를 내포하게 된다. 

이제 word2vec 모델을 학습하는 3가지 학습 방법을 알아보자

CBOW : Continuous Bag of Words

예측하고 싶은 단어 주변 단어를 가지고 예측하는 방법

주변 단어라는 것은 window size n으로 정해지는데  목표 단어 앞의 단어 n개와 뒤의 단어 n개가 주변단어이다.

n=2

총 2n개가 에측하기 위해 참고하게 된다.

 

해당 예시에서 input은 quick, brown, jumps, over이고, output은 fox이다.

이 모델에서 학습하는 파라미터는 총 2가지이다. 

  • $V$
    단어의 총 갯수
    해당 예시에서는 8이다. 
  • $M$
    임베딩 벡터의 사이즈 = projection layer의 노드 갯수

총 V개의 단어에 대해서 M개로 embedding되기 때문에 학습 파라미터의 갯수는 $V\times M$이 된다. 학습 파라미터는 행렬의 형태로 존재하게 되고 이 파라미터를 학습해야 한다.

  • $W_{V\times M}$
    input layer→projection layer
  • $W'_{V\times M}$
    projection layer→output layer

이렇게 2개의 행렬로 된 파라미터들을 학습한다.

$$X_{brown} \times W_{V\times M} = V_{brown}$$

$X_{brown}$는 brown이라는 단어를 표현한 one-hot vector로 embedding matrix $W_{V\times M}$와 곱해져서 dense한 $V_{brown}$로 표현된다. 1$\times$M차원의 벡터 $V_{brown}$을 lookup table이라고 한다.

 

그래서 각 단어가 고유한 V vector들 4개가 projection layer로 모여서 갯수만큼 더해 평균을 구한 $v$가 최종적으로 projection layer가 된다. $v$를 가지고 최종 단어 fox를 예측하게 된다. 그러려면

$$v \times W'_{M\times V} = z$$

로 계산해서 나온 $1\times V$ 사이즈의 $z$ 벡터가 나온다.

 

최종적으로 $z$가 단어 fox에 대한 발생확률로 표현되어야 하고, 이 확률이 fox를 one-hot encoding한 vector와 최대한 비슷하게 나와야 한다. 그러기 위해서는 $z$를 확률로 표현하기 위해서 softmax함수에 넣는다.

$$\hat{y} = softmax(z)=\hat{y}_{fox}$$

그 다음 $\hat{y}_{fox}$과 $y_{fox}$의 cross-entropy를 구해서 학습에 이용한다.

 

주어진 4개의 단어를 데이터로 사용해서 문장 전체 단어 8개중에 하나의 단어를 맞추는 multi classification task를 수행하게 된다.

 

Skip-Gram

CBOW와 입력층과 출력층이 반대로 구성되어 있다. 수행하는 task는 동일하다.

주어진 fox를 가지고 예측해야하는 주변 단어를 예측하는 multi class classification이다.
성능은 CBOW < Skip-Gram으로 낫다. 여기서 성능은 loss가 아니라 embedding representation을 말한다.

 

 

output은 quick, brown, jumps, over이고, input은 fox이다. 

데이터는 {fox, quick}, {fox,brown},{fox,jumps},{fox,over}으로 이루어지게 된다.

$$\frac{1}{K}\sum_{i=1}^{K}\sum_{\underset{j\ne0}{-n\le j \le n }}\log p(w_{i+j}|w_i)$$

결과적으로 fox(입력 단어)로 주변 단어를 예측하는 문제를 해결하게 된다.

SGNS : Skip-Gram with Negative Sampling

item2vec에서 사용하는 학습 방법과 같은 방법이다. 

주변 단어와 예측하려던 단어의 조합들을 모두 입력으로 바꾸고 주변에 있다면 label을 1 아니면 0 으로 예측하게 하는 binary classification문제이다.

quick brown fox jumps over

에서 {fox, brown}, {fox,over}은 1로 label되고, {fox, pizza}와 같이 주변단어에도 속하지 않으면 0이 된다.

Skip gram에서는 주변 단어만 사용했기 때문에 skip gram의 입력은 SGNS에서 모두 1이 되고 Skip gram에서 사용하지 않은 단어들을 강제로 sampling 하게 되고 무조건 0으로 labeling되기 때문에 negative sampling이라는 이름이 붙게 된다.

그래서 이 negative sampling을 몇 개 넣을 것인지가 SGNS모델의 하이퍼 파라미터가 된다. positive sample 하나 당 몇개의 sampling을 하는지에 대한 파라미터 k가 있고, 학습 데이터가 적으면 k를 5~20, 충분히 큰 경우는 2~5개 정도 한다.

한 문장 안의 모든 단어를 사용해서 input={입력1,입력2}을 만든다.

입력1과 입력2 에 대한 embedding matrix 2개로 이루어진 embedding layer를 갖는다. 입력1과 입력2에 대해서 lookup해서 각 embedding vector를 다음 layer에서 사용하게 된다. 

각 단어에 대한 embedding vector의 차원은 같기 때문에 중심 단어를 기준으로 각각 내적으로 해서 최종 예측값을 구한다.

  1. 중심 단어를 기준으로 내적한다
    ex) $V_{brown}\bigodot V_{quick}= 2.4$
  2. 내적한 값은 실수이므로 sigmoid$\sigma$를 취한다.
    그럼 0~1사이의 값이 나오게 된다.
    ex)$\sigma(2.4)=0.91$
  3. sigmoid한 값을 0이나 1의 레이블로 분류한다.
    ex)0.91 -> 1
  4. 분류된 값과 sigmoid한 값 사이의 loss를  cross-entropy로 계산해서 역전파를 수행한다.
  5. 입력1과 입력2에 해당하는 embedding matrix가 update
  6. 위의 과정을 반복하며 학습, 수렴한다.
  7. 최종적으로 입력1에 대한 word embedding matrix, 입력2에 대한 word embedding matrix이렇게 2개 생긴다.
  8. 2개중 한 개의 행렬만 사용하거나 평균을 내서 downstream task사용한다.
    성능차이는 크지 않다.

word2vec의 학습 결과물은 예측 모델 전체가 아니라 학습된 word embedding matrix이다. CBOW, Skip gram, SGNS의 문제(multi or binary classification)는 다르지만 이 embedding을 downstream task에 사용하기 때문에 문제해결 방법은 달라도 결과물은 같다.

 


Item2Vec

Word2Vec의 SGNS에서 영감을 받아, word가 아니라 아이템을 embedding할 때 사용한다.

  • Word2Vec : 문장안의 단어
  • Item2Vec : 아이템리스트(ex. 세션별로 소비한 아이템 집합, 유저가 소비한 아이템 집합) 안의 아이템
    활용 사례 : 유저의 노래플레이리스트 안의 노래, 쇼핑세션 안의 상품

user id를 사용하지 않아 유저-아이템 관계에 대한 것이 아니라 개별 유저가 소비한 아이템만을 학습데이터로 사용한다. 그래서 때때로 유저식별을 하지 않고 세션 단위로 묶어서 데이터 생성이 가능하다. 목표는 Word2Vec을 사용해서 아이템을 벡터화해서 그 값을 추천할 때 활용한다. 기존의 MF 보다 표현력도 좋고 추천결과도 좋다.

 

word2vec에서 문장은 단어가 나온 순서가 있는 sequence였지만 item2vec에서는 아이템 집합으로 바뀌면서 공간적, 시간적 정보가 사라진다. 대신 이 집합 안에 존재하는 아이템이 서로 유사하다는 가정 아래 이루어진다. 세션과 유저별로 의미가 조금씩 다르기 때문이다.

 

하나의 아이템 집합 내의 아이템 쌍들이 모두 SGNS의 positive sample이 된다. 그래서 skip gram과 달리 중심단어 주변단어처럼  window가 없이 전체 집합에 대해서 처리한다. negative sample을 만들 때에는 그 집합 내에 없는 아이템을 가져와서 만든다.

ex) 아이템 집합 {A,B,C} → {A,B,1}, {A,C,1}, {A,D,0}

 

$$\frac{1}{K}\sum_{i=1}^{K}\sum_{j\ne i}^{K}\log p(w_j|w_i)$$

 

Item2Vec과 Matrix Factorization의 결과를 차원축소해서 비교해보자

Item2Vec:Neural Item Embedding for Collaborative Filtering

사람이 나눈 기준으로 카테고리 별로 색을 부여해서 보았는데, 왼쪽의 Item2vec이 더 잘 모여있는 것을 확인할 수 있다.