일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 비지도학습
- 오차 행렬
- ifnull
- beautifulsoup
- 재현율
- 데이터 분석
- sorted
- CASE WHEN
- NULLIF
- 지도학습
- Normalization
- 백엔드
- 데이터 전처리
- Batch Normalization
- DecisionTree
- 감정은 습관이다
- layer normalization
- LAG
- NVL
- 강화학습
- 빠르게 실패하기
- 평가 지표
- 결정트리
- 웹서비스 기획
- recall
- five lines challenge
- 데이터 프로젝트
- 정밀도
- nvl2
- SQL
- Today
- Total
Day to_day
CBOW & Skip gram 개념 완벽 이해하기!! 본문
❗본 포스팅은 사이토 고키 저자의 '밑바닥부터 시작하는 딥러닝 2' 서적을 기반으로 개인적인 정리 목적 하에 재구성하여 작성된 글입니다.
들어가며
오늘은 word2vec의 두 가지 기법인 CBOW와 Skip-gram에 대해서 개념을 정리해 볼 것이다.
Word2Vec
들어가기전에!
단어를 표현하는 방법 두 가지 개념을 미리 알고 오면 좋다.
1. 희소표현(Sparse Representation)
단어를 원-핫 인코딩을 통해 원-핫 벡터로 표현해 행렬의 대부분 값이 0으로 표현되는 방법이다. 이 방법은 벡터 간 유사성을 표현할 수 없으며 단어가 많아질수록 더 커진다는 단점이 있다.
2. 분산 표현(Distributed Representation)
색을 표현할 때에도 RGB 값으로 모든 색을 표현할 수 있듯이 단어도 그런 식으로 표현하는 것이다.
분산 표현은 단어 간 의미적 유사성을 벡터화하여 표현하는 것이다. 이 표현은 분포가설에 의해 해당 내용을 가진 텍스트의 단어들을 벡터화하였을 때 해당 단어 벡터들은 유사한 벡터값을 갖는 것이 특징이다.
이것은 원-핫 벡터처럼 단어에 비례하여 커질 필요가 없으므로 상대적으로 차원이 줄어든다. 이 분산표현을 하기 위한 대표적인 방법이 Word2Vec이다.
그리고 Word2Vec의 학습 방식에는 CBOW(Continuous Bag of Words)와 Skip-Gram 두 가지 방식이 있다.
CBOW
학습 데이터
문장 “you say goodbye and I say hello”라는 문장이 있다고 하자.
여기서 Target은 중심에 있는 단어. Contexts는 중심의 주변에 있는 단어임을 알고 이해하자.
- Target은 중심에 있는 단어. Context는 중심의 주변에 있는 단어의 예시
- 이렇게 나온 각 행의 맥락은 신경망의 입력이 되고, 타깃의 각 행이 정답 레이블이 된다.
- 이때 target을 중심으로 몇 개의 단어를 볼 것인가는 "window"로 정할 수 있다. 위의 예시의 경우는 window를 1로 두어 target의 양쪽 한 개의 단어를 맥락으로 보는 것이다.
- CBOW는 주변에 있는 단어(context)들을 입력으로 중심에 있는 단어(target)들을 예측하는 방법이다.
CBOW의 모델 신경망 구조
- 입력층 2개, 은닉층, 출력층으로 구성되어 있다. 입력층이 2개인 이유는 맥락(context)으로 고려할 단어로 2개로 정했기 때문에 즉, window크기를 1로 둔 것이라고 할 수 있다.
- CBOW의 특징은 입력층이 여러 개이기 때문에 평균을 내어 은닉층에 전달하는 특징이 있다.
- 출력층의 뉴런은 각 단어에 대응하고 softmax를 적용하여 확률로 변환한다.
그러면 잠시 생각해 보면 입력층은 지금 어떻게 구성되어 있을까?
위키독스에서 좀 더 쉽게 설명되어 있어서 가지고 왔다.
각각의 입력 단어는 원-핫 벡터로 표현이 되었고, 이 벡터가 W_in을 만나게 되면 결국 1이 표현된 해당 행에 대한 가중치 값만 나오게 된다. 그러니까 행 뽑기를 하는 것이다!
그래서 결과적으로 가중치의 각 행이 단어의 분산 표현이라고 할 수 있다.
정리하자면,
- W_in의 각 행에 해당 단어의 분산 표현이 담겨있다고 할 수 있다.
- 그리고 이 가중치가 갱신되면서 얻은 벡터로 ‘단어의 의미’를 추정할 수 있다.
- 학습 후엔 최종적으로 단어의 분산 표현으로 가중치 선택한다. (다른 Weight(W_out)를 사용해도 되지만 input weight를 사용하는 것이 흔하게 사용할 수 있는 방법)
- 이때 은닉층은 입력층보다 뉴런 수를 더 작게 해야 된다. (인코더 기능)
최종 CBOW 모델의 신경망 구조
- Matmul 계층(input weight)이 있고 input(이때 input의 가중치는 서로 공유됨)에서 나온 결과는 평균 취해져 은닉층으로 들어간다.
- 마찬가지로 matmul 계층(output weight)이 들어가 score가 나오게 된다.
- 각 단어의 점수는 softmax를 지나면서 확률을 얻을 수 있고, 이 확률은 context(맥락)가 주어졌을 때 그 중앙에 어떤 단어가 출현할 지를 나타낸다.
CBOW모델과 확률
- P(A | B): B라는 정보가 주어졌을때 A가 일어날 확률
- P(target | context): context가 주어졌을때 target이 발생할 확률
- CBOW의 loss 함수 : 음의 로그 가능도
Skip-gram 모델
- 맥락과 타깃을 역전시킨 모델이다.
- CBOW 모델은 맥락이 여러 개 있고, 그 여러 맥락으로부터 중앙의 단어(타깃)를 추측했지만
- Skip-gram 모델은 중앙의 단어(타깃)로부터 주변의 여러 단어(맥락)를 추측한다.
- 입력이 하나고 출력이 여러 개다.
- CBOW와 다르게 은닉층에서 평균을 내서 나오는 연산이 없다.
- 각각의 출력과 정답 레이블로 개별 손실을 구하고, 그 값을 모두 더한 것이 최종 손실이다.
Skip-gram의 P 확률 & loss 식
- P(w_{t-1},w_{t+1}|w_t): w_t가 주어졌을 때 w_(t-1)과 w_(t+1)이 동시에 일어날 확률
Skip-gram 정리
- 단어 분산 표현의 정밀도 면에서 skip-gram 결과가 좋다.
- 말뭉치가 커질수록 저빈도 단어나 유추 문제 성능 면에서 skip-gram이 높다. 그 말은 skip-gram의 경우 하나의 단어만 떠오르는 게 아니라 여러 후보들이 떠오르기 때문에 좀 더 어려운 문제를 푼다고 볼 수 있다.
- 그러나 cbow가 더 빠르다.
Reference
'Deep Learning' 카테고리의 다른 글
GoogleNet (InceptionNet) 빠르게 핵심만! (0) | 2024.04.22 |
---|---|
VGGNet 아직도 정리 못했다면 빠르게 핵심만! (0) | 2024.04.01 |
Batch Normalization, Layer Normalization 비교 (5) | 2024.03.16 |
1 x 1 convolution이란? 직관적으로 이해해보기 (0) | 2024.02.25 |
Global Average Pooling이 뭐길래? (3) | 2024.02.24 |