NLP/밑바닥부터 시작하는 딥러닝2

4장 word2vec 속도 개선

알맹리 2021. 4. 13. 16:31

기존 CBOW

여기서 어휘 수가 100만 개가 된다면 입력으로 들어가는 원핫 벡터에 요소가 100만 개이고,

아래 두부분에서 계산이 병목되어 해결해야 한다!

  • 원핫벡터와 W_in 가중치와의 곱에서 → Embedding 계층 도입
  • 은닉층 이후(은닉층과 W_out 가중치의 곱, Softmax 계산) → 네거티브 샘플링

 

1. Embedding 계층 도입

단어의 분산 표현을 저장

 

2. 네거티브 샘플링

어휘가 많아져도 계산량을 낮은 수준에서 일정하게 억제할 수 있음

100만 개의 단어 중에서 옳은 단어 1개를 고르는 건 다중 분류! 이걸 이진 분류로 근사하는 게 네거티브 샘플링.

 

 

이전까지는 모든 단어에 대한 확률을 계산했지만 이제 "say"라는 단어 하나에만 집중해서 점수 계산하고 sigmoid로 확률로 변환한다.

 

이진 분류를 신경망으로 풀려면 sigmoid(다중은 softmax)로 확률로 바꾸고 교차 엔트로피 오차로 loss를 구한다.

y는 출력한 확률 값이고 t는 정답 레이블이라 둘의 차이값인 역전파의 y-t에서 오차가 크면 크게 학습하고 오차가 작으면 작게 학습하는 것을 알 수 있음.

 

이진 분류 하는 CBOW

you:0, say:1, goodbye:2 이고, 정답 레이블이 1이라고 되어 있는 것은 say를 제대로 맞췄다는 뜻~ 틀렸으면 0

 

바로 위까지는 정답을 맞췄다고 가정했을 때라서, 정답이 틀렸을 경우에 대한 건 학습되지 않았음. 

사진의 아래 칸처럼 틀렸을 경우에는 확률을 0에 가깝게 내주는 가중치도 필요하다! 

 

틀린 경우를 모두 학습하려면 100만개 -1개 만큼 학습시켜야 해서 비효율적이기 때문에 비슷한 방식으로 틀린 단어 개수 예시를 5개, 10개 등으로 선택한다. 

 

=> 네거티브 샘플링은 제대로 맞은 경우에 대한 loss를 구하고, 틀린 예시에 대한 예시를 특정 개수로 샘플링 해서 loss를 구한다. 이렇게 구한 loss들을 모두 합해 최종 loss로 구한다.

사진처럼 원래 정답인 say는 정답 레이블을 1이라고 입력하고, 다른 애들은 정답 레이블에 0이라고 입력한 후에 모든 loss를 더해서 최종 loss를 구한다. 

 

틀린 예시를 샘플링할 때는 랜덤이 아니라 통계 데이터를 기초로 말뭉치에서 각 단어의 출현 횟수를 구하고 확률분포로 나타내 샘플링한다. 전체 말뭉치에서 많이 등장하는 단어를 많이 뽑고 적게 등장하는 단어를 적게 뽑는 방식으로!

 ** 출현 확률이 낮은 단어를 버리지 않기 위해서 확률분포에 0.75 제곱 > 원래 확률이 낮은 애가 확률이 좀 더 높아짐

 

 

+++

더보기

word2vec은 전이학습 측면에서 아주 good입니다.

 

단어의 분산 표현을 이용해 단어나 문장을 고정 길이 벡터로 변환할 수 있다.

자연어를 벡터로 변환할 수 있다는 것은 일반적인 머신러닝 기법을 적용할 수 있다는 의미! 예를 들어 문장을 고정 길이 벡터로 변환해 모델에 입력으로 사용하고 원하는 대답을 출력하는 것이 가능하다

. 이런거도 가능!

 

word2vec을 통해 얻은 단어의 분산 표현이 좋은지 나쁜지 평가는 어떻게 할까?

  1. [유사성 평가] 사람이 작성한 단어 유사도 검증 세트로 매긴 점수와 word2vec에 의한 코사인 유사도 점수를 비교해 상관성을 평가한다.
  2. [유추 문제를 활용한 평가] "king : man = queen : ?" 같은 유추 문제를 내고 정답률로 우수성 평가.  

 

'NLP > 밑바닥부터 시작하는 딥러닝2' 카테고리의 다른 글

5장 RNN  (0) 2021.04.16
3장 word2vec  (0) 2021.04.12
2장 자연어&단어 분산 표현  (0) 2021.02.22
1장 신경망 복습  (0) 2021.02.21