티스토리 뷰
Skip-gram (2013)
딥러닝을 위해 사용되는 Word Embedding 기법 중 그 유명한 Word2Vec에 대해서 알아보자.
CBOW와 Skip-gram이라는 두 가지 방법이 있는데, 간단히 정리하면 CBOW는 주변 단어를 통해서 원하는 단어를 예측하는 것이고, Skip-gram은 원하는 단어를 통해서 주변 단어들을 예측하는 것이다.
기본적인 개념(구조)은 오토인코더와 매우 비슷하다.

Skip-gram의 구조를 자세히 보면 input 으로 원하는 중심 단어를 one-hot 벡터가 들어가고, hidden layer에서 linear한 계산을 거쳐 주변 단어 들을 softmax로 출력하는 분류(classification) 문제이다.
단어 위치 | W(t-2) | W(t-1) | Wt | W(t+1) | W(t+2) |
단어 | This | is | Skip-gram | model | . |
위의 문장 예시에서 Skip-gram이라는 단어가 입력으로 들어가면, This, is, model, . 네 개의 one-hot vector가 출력이 된다.
처음 나왔을 때는 굉장히 빠르고 혁신적인 방법이었지만 현재는 매우 느리고 정확하지 않은 모델이 되었다. 주변 단어를 예측하는 과정에서 정보를 압축(sparse -> dense)하여 hidden layer(embedding matrix)로 만들어 계산한다.

수식을 쓰기 싫어서 그림으로 표현해봤는데, 실제로 인풋(x)는 one-hot vector이기 때문에 해당 단어의 index를 제외하면 모두 0인 sparse한 벡터이다. 따라서 W와 내적을하면 해당 인덱스를 제외하고는 모두 날아간다(dense해진다).
또한 계산 효율을 위해서 Negative Sampling이라는 기법을 사용하는데, 쉽게 이야기해서 정답이 아닌(negative)인 단어들은 minimize하여 모든 단어에 대해서 계산하는 것이 아닌, 정답(positive)에 대해서만 선택적으로 계산하도록 하는 방법이다.
W는 Embedding Layer라고 부르기도 하며, linear layer이다. 그래도 실제로 딥러닝 학습을 시킬 때에는 계산된 embedding vector를 input으로 쓰는 것이 아닌 one-hot vector를 인풋으로 쓰는 것이다. Embedding layer의 계산 효율면에서의 역할은 매우 크다. input이 모든 계산을 하지 않도록 index를 찾아 그 row만 계산하도록 한다.
Glove (2014)
skip-gram이 주변 단어를 분류 예측하는 문제였다면, Glove는 input이 주어졌을 때 해당 co-occurence matrix 자체를 예측하는 회귀(regression) 문제이다.
- input : Skip-gram
단어 | word1 | word2 | word3 | word4 | ... |
단어 빈도 수 | 5 | 20 | 14 | 6 | ... |
출현 빈도가 적은 단어들은 loss의 기여도를 낮춘다(부정확해지는 단점을 보완함).
Skip-gram에 비해서 빠를 수 밖에 없다. Skip-gram은 모든 문장을 window 크기 만큼 훑어야 하지만, Glove는 시작할 때 한 번만 전체 문장을 훑으면 된다.
FastText (2016)
Facebook에서 발표한 Skip-gram의 업그레이드 버전의 모델이다. 업그레이드된 내용은 저빈도 단어에 대한 적은 학습으로 인한 불확실성, OoV(Out of Vocabulary)에 대한 대처이다.
Skip-gram의 기본 구조이지만 word가 아닌 subword에 대한 임베딩 matrix를 구한다. 단어로 끝나는 것이 아니라 subword를 가지고 문맥을 파악하게 만들기 때문에, Skip-gram보다 정확보다 높을 것이다.
실습
먼저 FastText를 설치한다. 공식 홈페이지에서 facebookresearch github으로 가면 설치 방법은 자세히 나와있다.

설치를 성공적으로 마치면 위와 같이 매뉴얼을 볼 수 있는데, scratch로 코딩했던 것들이 여기서는 nn 명령어 하나로 가능하다.

10만 개의 리뷰 데이터를 skipgram을 통과시켰는데, 20% 진행하는데 약 10분 정도 흐르고 있다. 그래도 Word2Vec 오픈 소스중에선 가장 빠른 편이라고 한다.

학습을 완료하면 .bin과 .vec 파일이 생성된다.
Word2Vec은 실제 end-to-end solution을 위한 실무에서 많이 쓰이지 않는다. 왜냐하면 Word2Vec은 실제 product 차원에서의 결과를 내어주지 않기 때문이다(그 어떤 상용 서비스에서도 벡터를 값으로 내주지 않는다).
하지만 추천시스템처럼 어떤 상품에 대한 sequence를 만들어 낼 수 있다면 충분히 사용자의 히스토리를 embedding하여 사용할 수도 있다.
'Study > NLP' 카테고리의 다른 글
NLP with DeepLearning (9) - PLMs (0) | 2021.12.14 |
---|---|
NLP with DeepLearning (8) - Text Classification (0) | 2021.12.06 |
NLP with DeepLearning (6) - Word Embedding(prev) (0) | 2021.11.25 |
NLP with DeepLearning (5) - Minibatch (0) | 2021.11.24 |
NLP with DeepLearning (4) - Subword Segmentation (0) | 2021.11.23 |
- Total
- Today
- Yesterday
- deeplearning
- torch
- 자연어처리
- nlp
- PM
- mlpipeline
- dl
- productmanager
- productresearch
- 전처리
- 쿠버네티스
- Kubernetes
- Oreilly
- pmpo
- 도커
- Tennis
- Bert
- 머신러닝
- 딥러닝
- docker
- 스타트업
- 인공지능
- MLOps
- 머신러닝파이프라인
- 파이프라인
- productowner
- container
- DDUX
- PO
- ML
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |