밑바닥부터 시작하는 딥러닝 2 - 4장

Jajuna_99·2022년 9월 26일
0

word2vec 속도 개선

앞에 3장에서 구현한 word2vec CBOW 모델은 몇 가지 병목 현상이 있다.

  • 말뭉치 어휘 수 증가에 따라 계산량 또한 증가한다.
  • 출력층과 활성화함수에 계산량 또한 말뭉치 수에 따라 증가한다.

즉, 대량의 말뭉치를 제어할 수 있는 방법이 필요하다.

word2vec 개선 1 (p.150)

3장에서 구현한 모델로 어휘 수 7개의 벡터들을 처리하는 데는 전혀 문제가 없다.

하지만 어휘 수가 몇 백만개가 넘어가는 현업에서는 3장의 모델로는 무리가 있다.

가장 큰 병목 2개를 본다면 아래와 같다 :

  1. 입력층의 원핫 표현과 가중치 행렬 WinW_{in}의 곱 계산
  2. 은닉층과 가중치 행렬 WoutW_{out}의 곱 및 Softmax 계층의 계산

이번 절에서는 첫 번째 병목을 Embedding 층을 추가함으로 완화시켜본다.
그리고 바로 이어지는 절에서는 네거티브 샘플링이라는 손실 함수로 완화시킨다.

Embedding 계층 (p.152)

원핫 벡터와 가중치 행렬 WinW_{in}의 행렬 곱은 결과적으로는 특정 행을 추출하는 것이기에 사실 행렬 곱 계산이 필요하지 않다.

  • 위에 아이디어를 갖고 가중치 매개변수로부터 '단어 ID에 해당하는 행(벡터)'을, 결과적으로는 같은 결과를 추출하는 층을 구현하고자 한다. -> 이 계층을 Embedding 계층이라 한다.

구현도 그저 특정한 행을 지목해서 호출하기만 하면 되는 지극히 간단한 구현이다. (p.153)

  • 순전파의 경우 위에서 말한 것처럼 특정한 행(뉴런)을 출력 층으로 내보내면 된다.
  • 역전파의 경우 출력 층에서 전달된 기울기를 같은 특정 행에 입력 층 쪽으로 보내면 된다.
    • 다만 역전파 때 원소가 반복 되서 (같은 행으로 전달 해야 될 때) 먼저 있던 값이 덮어써지기 때문에, '할당'으로 덮어쓰는 것이 아닌 원래 있던 값과 '더하기'를 해야 한다.

위에 이론으로 객체를 초기화해서 순전파와 역전파를 구현하면 Embedding 계층 구현이 끝난다.

word2vec 개선 2 (p.157)

다시 말하지만 이번 절에서는 은닉층과 가중치 행렬 WoutW_{out}의 곱 및 소프트맥스 계층 계산 병목을 완화시킬 것이다.

-> 네거티브 샘플링으로!

핵심 아이디어

  • 여태껏 다뤘던 word2vec 문제는 다중 분류(multi-class classification)이었다. 100만개의 벡터가 입력되면 옳은 단어 1개를 선택해야 되는 문제였다는 것이다.
  • 그럼 이것을 이진 분류(binary classification)로 바꿀 수 없을까? 주어진 타깃 단어를 yes | no로 판단해서 추론할 수 없을까? 이것이 핵심 아이디어이다.

위에 문제를 이진 분류 문제로 바꾸어 신경망을 만들게 되면 출력층에서는 단 1개의 뉴런만 있으면 된다. -> 그 뉴런이 맞는지 틀렸는지만 보면 되니까.

  • 은닉층과 가중치 행렬 WoutW_{out} 내적의 해당하는 열(단어 벡터)하나만 추출하고,
  • 추출된 벡터와 은닉층 뉴런과의 내적을 계산하면 끝이다.

다중 분류는 출력층에서 '소프트맥스', 손실 함수는 'CEE'; 이진 분류는 출력층에서 '시그모이드', 손실 함수는 'CEE'를 사용한다.

그럼 시그모이드 함수를 다시 봐 보자.

  • y=y = 11+exp(x)1 \over 1+ \exp (-x)

이 함수의 핵심은 소프트맥스와 마찬가지로 0 부터 1까지의 출력만 갖고 있으니 확률로 봐도 된다는 것이다.

CEE도 다시 한번 보자.

  • L=(tlogy+(1t)log(1y))L = -(t\log y + (1 - t) \log(1-y)), y = 시그모이드 함수 출력, t = 정답 레이블

1장에서 봤던 CEE와 다른 이유는 다중 분류에서 이진 분류 문제 바뀌었기 때문이다. 결과적으로는 완전히 같다.

  • 이에 대한 구현, 다중 분류와의 비교 구체적인 결과는 (p.164)에 있다.

하지만 불행히도 다중 분류에서 이진 분류로 바꾼 것 만으로는 문제가 해소 되지 않는다. -> 위에 구현은 정답일 때에 대해서만 학습했기 때문에 오답도 학습해야 한다. -> 오답 입력 시 어떤 값이 나올지 확실하지 않기 때문이다.

하지만 모든 오답들을 대상을 이진 분류를 학습시키면 다시 제자리로 가기 때문에 새로운 방법이 있어야 한다. -> 이것을 아이디어로 나온 해답이 오답의 몇 가지만 선택해서 학습 시키는 것이다.

네거티브 샘플링(negative sampling) : 적은 수의 부정적 예를 샘플링해서 사용하는 기법. 즉, 부정적인 예를 선별해서 손실을 구하는 것이다.

-> 각각의 데이터 (정답과 오답의 샘플링)의 손실을 더한 값을 최종 손실로 한다.

네거티브 샘플링의 예시를 시각화한 그래프(p.170)

  • 네거티브 샘플링에서 오답을 선별하는 방법은 통계 데이터를 이용하는 것이다. -> 자주는 등장하는 단어를 많이 추출하고, 적게 등장하는 단어를 적게 추출하는 것이다. -> 단어 빈도 기준 샘플링 -> 확률 분포로 나타내어 분포대로 샘플링

  • 확률 분포에 따른 샘플링 구현 (p.172)

  • 여러 빈도의 단어들을 학습시키기 위해 확률분포에 0.75제곱을 하라고 word2vec에서 권고한다. (무조건 높은 빈도의 단어만 학습시키는 것을 방지)

    • P(wi)=P\prime(w_i) = P(Wi)0.75jnP(Wj)0.75\displaystyle P(W_i)^{0.75} \over \displaystyle\sum_j^n P(W_j)^{0.75}
  • 네거티브 샘플링 구현 (p.175)

개선판 word2vec 학습 (p.176)

개선된 word2vec 모델을 PTB 데이터셋으로 학습해보는 절이다. 구현은 깃헙에 올릴것이다.

word2vec 남은 주제 (p.185)

word2vec을 응용할 수 있는 주제들을 살펴보는 절이다.

  • 위에서처럼 단어의 분산 표현을 비슷한 단어를 찾는 용도로 이용할 수 있다.
  • 전이 학습(transfer learning) : 한 분야에서 배운 지식을 다른 분야에도 적용하는 기법
  • 텍스트 분류, 문서 클러스터링, 품사 태그 달기, 감정 분석 등 단어를 벡터로 변환하는 작업이 선행되야 한다.
  • 단어의 분산 표현은 단어를 고정된 길이의 벡터로 변환해주는 장점도 있다.
    - 다른 신경망이나 머신러닝 기법에 적용할 수 있다는 뜻이다.
  • 단어의 분산 표현의 우수성을 평가하는 지표로는 유사성유추 문제를 통해 평가한다.

요약

Embedding과 네거티브 샘플링, 그리고 과학자들의 통찰력을 볼 수 있던 장이었던 것 같습니다.

구현들은 깃헙에 올릴 예정입니다.

profile
Learning bunch, mostly computer and language

0개의 댓글