본문 바로가기

DeepLearning Specialization(Andrew Ng)/Sequence Models

[코세라] [Week 2] 2. Learning word embeddings : Word2vec & GloVe

728x90
Learning word embeddings : Word2vec & GloVe
1. Learning word embeddings
2. Word2vec
3. Negative Sampling
4. GloVe word vectors

1. Learning word embeddings

 초기에 알고리즘들은 매우 복잡한 경향이 있었으나, 단순화된 구조의 알고리즘도 좋은 결과를 낸다는 연구결과들이 나왔다. 
 본 강의는 복잡한 알고리즘을 소개하고 이를 단순화하면서도 좋은 결과를 내는 알고리즘들에 대해 알려줄 것이다.

  • Language model을 만든다고 할 때, 배운 바와 같이 위와 같은 구조가 될 것이며 각각의 단어는 300차원 짜리 word vector로 바뀐다.
  • 그리고 이것을 신경망에 넣고 softmax를 돌려 다음 단어가 무엇일지 예측할 수 있다. 
  • 참고로 신경망에 넣기 전 input vector의 크기는 위의 그림에서 1800차원이 되며 사용자의 판단에 따라 직전 4개의 단어만 본다고 할 경우 1200차원으로 정할 수 있다. 
  • 또한 matrix E는 모든 단어에 적용되는 공통적인 parameter 행렬로서 학습된다. 

  • 앞서 어떤 단어들을 고려할지에 따라 context를 정할 수 있다고 언급했는데, 위와 같이 context를 정하는 여러 방법이 있다.
  • 직전 4개 단어를 선택하는 것은 language model을 만들 때 좋은 성능을 보여주나, 단지 word embedding을 학습하고자 하는 목적이라면 여기있는 모두가 좋은 성능을 발휘한다.
    • Language model은 정의자체가 '다음' 단어를 예측하기 위한 모델이기 때문이다. 
  • 생각해보면 당연하다. 꼭 몇개의 단어를 고려할 필요는 없지. 

2. Word2vec

  • word2vec은 word embedding을 학습하는 알고리즘의 하나로 가장 자주 쓰이는 알고리즘이다.
  • word2vec에도 2가지 방식이 있는데, 강의에서 소개한 skip-gram 모델과 CBOW 모델이다.
  • 전자는 하나의 단어로 주변(사용자가 정하는 범위 : window) 의 단어를 예측하는 것이고, 후자는 주변 단어들을 바탕으로 단어를 예측하는 방식이다. 
  • 강의만 보고는 잘 이해가 안되서 아래에 걸어놓은 링크들을 참조하면 너무너무 좋을 것. word2vec에 대한 전반적인 것을 알려준다. 

1) Skip-grams 모델

  • context word를 orange라고 하고 window size = 5 라고 하면 orange를 기준으로 앞뒤 5개의 단어들이 target이 될 수 있다. 저 각각이 training set으로서 기능하는 것.

  • randomly initialization한 행렬 E와 theta를 바탕으로 word embedding 벡터를 구하고 softmax를 적용하여 y_hat 을 도출한다. 
  • 그리고 cross-entropy 손실함수를 이용하여 E와 theta를 경사하강법을 적용하여 update하면 된다.

2) Softmax 의 문제점

  • 좀 전까지 설명한 방식은 잘 작동하지만 softmax 의 특성상, 그리고 word2vec 알고리즘의 특성상 vocab의 수만큼 연산이 엄청나게 늘어난다.
  • 이를 보완하기 위해 Hierarchical Softmax라는 테크닉을 활용한다. 
  • 제대로 이해되는 것 같지는 않지만, 결론은 cross-entropy는 y=1인 경우만 연산한다는 점과 tree의 구조적 특징을 이용하여 연산량을 대폭 줄인 방식이라는 것. 
  • 그리고 이 tree를 생성할 때 자주 쓰이는 단어를 윗계층에 배치하고 자주 쓰이지 않는 단어를 깊이 묻어둔다. 자주 쓰는걸 빨리 찾으면 좋으니 당연한 것.

 

 

Word2vec가 처음에 잘 이해가 안돼서 찾은 좋은 글이다. 

dreamgonfly.github.io/blog/word2vec-explained/

 

쉽게 씌어진 word2vec | Dreamgonfly's blog

텍스트 기반의 모델 만들기는 텍스트를 숫자로 바꾸려는 노력의 연속이다. 텍스트를 숫자로 바꾸어야만 알고리즘에 넣고 계산을 한 후 결과값을 낼 수 있기 때문이다. 텍스트를 숫자로 바꾸는

dreamgonfly.github.io

word2vec에 관한 전반적인 용어 및 이론들을 체계적으로 정리한 곳.

shuuki4.wordpress.com/2016/01/27/word2vec-%EA%B4%80%EB%A0%A8-%EC%9D%B4%EB%A1%A0-%EC%A0%95%EB%A6%AC/

 

word2vec 관련 이론 정리

예전에 포스팅한 Kaggle ‘What’s Cooking?’ 대회에서 word2vec 기술을 살짝 응용해서 사용해볼 기회가 있었다. 그 이후에도 word2vec이 쓰일만한 토픽들을 접하면서 이쪽에 대해 공부를 해보다가, 기존

shuuki4.wordpress.com

 

word2vec에 대한 직관을 키우기 좋은 시각화 사이트이다.

ronxin.github.io/wevi/

 

wevi

Training data (context|target): Presets: Update and Restart Update Learning Rate Next 20 100 500 PCA

ronxin.github.io

# Cross - entropy

Cross-entropy에 대한 심오한 고민에 빠진 와중 좋은 글을 읽었다.

theeluwin.postype.com/post/6080524

 

왜 크로스 엔트로피를 쓸까?

(본 글은 유투브 영상을 글로 재구성 한 것입니다.) 머신러닝/딥러닝을 하다보면 크로스 엔트로피(cross entropy)가 자주 등장합니다. 정확히는, 분류(classification) 문제를 풀 때 크로스 엔트로피를 이

theeluwin.postype.com

이건 좀 더 간략하게 설명한 것.

melonicedlatte.com/machinelearning/2019/12/20/204900.html

 

엔트로피(Entropy)와 크로스 엔트로피(Cross-Entropy)의 쉬운 개념 설명 - Easy is Perfect

엔트로피는 머신러닝을 할 때, loss function(손실 함수) or cost function으로써 많이 사용됩니다. 용어에 대하여는 많이 들어보았지만 직관적으로 다가오지가 않아서 한 번 정리해보았습니다. 1. Entropy

melonicedlatte.com

  • 요약하자면, 두 변수의 분포(실제값 분포, 예측값 분포)가 얼마나 유사하느냐를 측정할 때 크로스엔트로피를 사용하는 것. 
  • RMSE, Logistic Loss 등 여러 방법이 있지만 크로스엔트로피를 사용하면 두 확률변수의 분포(실제값, 예측값)가 같을 을 확률의 하한선을 알 수 있고 이를 손실함수로 활용하는 것.
  • 다른 손실함수에 비해 softmax의 특성을 더 잘 반영한다고 이해하면 될 것 같다.

3. Negative Sampling

  • Hierarchical softmax의 대체제로서 Negatice Sampling이 활용될 수 있다.
    • 헷갈릴까봐 말하지만 위 두 방식은 기본적으로 word2vec 를 조금 수정한 것들임. 

  • Negative Sampling에서는 이름그대로 negatice sample을 이용하여 새로운 training set을 정의한다. 내용은 다음과 같다. 
  • 앞서 살펴보았듯이 우리는 skip-grams방식을 취하므로 context word를 하나 정하고 window 상에서 하나의 단어를 선택해 positive example을 만든다. 
  • 마찬가지로 같은 context word를 정하고 vocab에서 랜덤하게 단어를 하나 골라 negative example을 만든다.
  • 참고로 랜덤하게 고른 단어가 설령 window 안에 포함되는 positive의 예라고 하더라도 그냥 진행한다.
    • 아마 vocab의 수가 엄청시레 많으면 성능에 큰 영향이 없어석 그런듯.

  • 이렇게 만든 5개의 훈련셋으로 Multivariate Logistic Classification 문제를 만들고  parameter 행렬을 업데이트함.
  • 이 방식의 장점은 적은 연산량에 있다. 기존 softmax 방식은 output이 원핫벡터 방식이었기에 vocab의 수만큼 연산을 했어야했지만, Negative Sampling 방식은 (k+1)만큼만 하면 된다.
    • 참고로 small data set일때는 k = 5~20, big data set에서는 k = 2~5 를 추천한다.

  • 그런데 어떤 기준으로 negatice example을 만들어야 하나? 즉, vocab에서 어떤 단어를 뽑아야하는가!
  • 2가지 방법이 있다.
    • 아예 전체 vocab에서 1/v 확률로 동등하게 뽑거나,
    • 실생활 혹은 내가 가진 word corpus(단어뭉치)에서 단어들이 쓰이는 빈도수를 기준으로 뽑는 것.
  • 뭐가 좋은지는 모르지만 경험적으로 둘을 절충하여 위와 같은 분포를 만들고 뽑는게 성능이 좋단다.
    • 저건 그냥 확률분포라고 이해하면 될 듯하다. p(w1) = ... , p(w2) = ..., 이렇게 정의해놓고 확률적으로 뽑는 것.

4. GloVe word vectors

이전 모델만큼 자주 쓰지는 않지만 단순해서 매니아층이 있다.

  • GloVe에서는 위와 같이 X 행렬을 정의하는데, 만약 context를 정할 때,  target을 기준으로 양옆의 n개의 단어를 선택하는 방법을 선택한다면 대칭행렬이 될 것이다. 
  • 그러나 만약 직전단어를 context로 한다면 대칭적이지 않겠지. 당연한 얘기이다. 
  • 그런데 GloVe 알고리즘을 정의하기 위해 전자의 방법으로 context를 선택하기로 한다.

  • 최소화하고자 목적함수는 위와 같다.
  • 나는 개인적으로 이해안되었던 부분이 i 와 j에 관한 부분이었다. 원래는 문장에서 context와 target word를 선택하는 것이 아니었나~ 생각했지만,
  • GloVe에서 thetha_i * e_j 는 theta_t * e_j 와 다른 의미로서 두 벡터의 내적이 logXij 에 가까워 지도록 목적함수를 설정한 것.

GloVe에 대한 자세한 내용은 다음 블로그를 참조바란다.

ratsgo.github.io/from%20frequency%20to%20semantics/2017/04/09/glove/

 

GloVe를 이해해보자! · ratsgo's blog

이번 포스팅에서는 미국 스탠포드대학에서 2014년 개발한 워드 임베딩 방법론인 GloVe에 대해 알아보도록 하겠습니다. 이번 글은 고려대 강필성 교수님 강의를 참고로 했는데요. 저도 완벽히 이해

ratsgo.github.io

질문과 비판은 언제나 환영입니다. 많이 꾸짖어주세요.

728x90