신경망 학습 최적화 플로우: Word2Vec 모델을 예시로

박수현·2022년 7월 12일
1

CS224n

목록 보기
4/5

1) 모형 학습 목표 및 손실 함수 설정

t=1,...,Tt=1,...,T번째 위치에서 중심 단어 wtw_t가 주어질 때, 크기 mm의 윈도우 내에 있는 문맥 단어들을 예측한다.

Likelihood=L(θ)=t=1Tmjmj0P(wt+jwt;θ)Likelihood = L(\theta)= \prod\limits_{t=1}^{T}\prod\limits_{\substack{-m \leq j \leq m \\ j \neq 0}}P(w_{t+j}|w_t;\theta)

목표 함수 또는 손실 함수는 (average) negative log likelihood이다. 이는 조건부 최대가능도 추정법(conditional maximum likelihood estimation)을 따르는 교차 엔트로피 손실 함수(cross entropy loss function)의 하나이다.곱셈 대신 덧셈이 쉬우므로 로그 계산을 도입하고, 예측 정확도를 최대화하는 것은 손실 함수를 최소화하는 것과 같으므로 음수로 변환한다.

J(θ)=1TlogL(θ)=1Tt=1Tmjmj0logP(wt+jwt;θ)J(\theta)=-\dfrac{1}{T}\log L(\theta)=-\dfrac{1}{T} \sum\limits_{t=1}^T \sum\limits_{\substack{-m \leq j \leq m \\ j \neq 0}} \log P(w_{t+j}|w_t;\theta)

P(wt+jwt;θ)P(w_{t+j}|w_t;\theta)를 구하기 위해서는 단어 ww가 중심 단어(cc)일 때(vwv_w)와 주변 단어(oo)일 때(uwu_w) 두 경우 모두 단어 벡터로 표현한다.

P(wt+jwt;θ)=P(oc)=exp(uoTvc)wVexp(uwTvc)P(w_{t+j}|w_t;\theta) = P(o|c) = \dfrac{\exp(u_o^Tv_c)}{\sum\limits_{w \in V} \exp(u_w^Tv_c)}

  • 유사도를 계산하는 방법은 내적이다. 단어 벡터의 내적값이 커질수록 확률이 더 커진다는 의미가 있다.
  • 내적값이 음이어도 이를 양으로 변환할 수 있도록 지수 함수를 취한다.
  • 모든 단어에 대해 정규화하여 확률 분포를 만들어낸다.

이는 소프트맥스(softmax) 함수의 예시이기도 하다. 소프트맥스 함수는 임의의 실수값을 확률 분포 (0,1)(0,1)로 대응시킨다.

Word2Vec 모델을 훈련한다는 것은 손실 함수를 최소화하기 위해 매개변수를 조정하는 것을 의미한다. 단어 벡터가 dd 차원이고, 각 단어는 중심 단어로서의 표현과 문맥 단어로서의 표현을 가지므로 총 2V2V 개 단어 벡터들이 있다. 즉 d×2Vd \times2V 개 매개변수가 있는 셈이다.

2) 각 매개변수에 대해 편미분하여 gradient 계산

손실 함수 최소화

J(θ)=1TlogL(θ)=1Tt=1Tmjmj0logP(wt+jwt;θ)J(\theta)=-\dfrac{1}{T}\log L(\theta)=-\dfrac{1}{T} \sum\limits_{t=1}^T \sum\limits_{\substack{-m \leq j \leq m \\ j \neq 0}} \log P(w_{t+j}|w_t;\theta)

P(wt+jwt;θ)=P(oc)=exp(uoTvc)wVexp(uwTvc)P(w_{t+j}|w_t;\theta) = P(o|c) = \dfrac{\exp(u_o^Tv_c)}{\sum\limits_{w \in V} \exp(u_w^Tv_c)}인 점 이용하여 vcv_c에 대해 편미분; 분모 편미분 시 연쇄법칙 적용

vclogP(oc)=vclogexp(uoTvc)wVexp(uwTvc)=vclogexp(uoTvc)(1)vclogwVexp(uwTvc)(2)\dfrac{\partial}{\partial{v_c}} \log P(o|c) = \dfrac{\partial}{\partial{v_c}} \log \dfrac{\exp(u_o^Tv_c)}{\sum\limits_{w \in V} \exp(u_w^Tv_c)} = \underbrace{\dfrac{\partial}{\partial{v_c}} \log \exp(u_o^Tv_c)}_{\text{(1)}} - \underbrace{\dfrac{\partial}{\partial{v_c}} \log \sum\limits_{w \in V} \exp(u_w^Tv_c)}_{\text{}(2)}

(1) vclogexp(uoTvc)=vcuoTvc=uo\text{(1)} \space \dfrac{\partial}{\partial{v_c}} \log \exp(u_o^Tv_c) = \dfrac{\partial}{\partial{v_c}} u_o^Tv_c = u_o

(2) vclogwVexp(uwTvc)=1wVexp(uwTvc)(vcxVexp(uxTvc))=1wVexp(uwTvc)(xVvcexp(uxTvc))=1wVexp(uwTvc)(xVexp(uxTvc)vcuxTvc)=1wVexp(uwTvc)(xVexp(uxTvc)ux)\begin{aligned} \text{(2)} \space \dfrac{\partial}{\partial{v_c}} \log \sum\limits_{w \in V} \exp(u_w^Tv_c) &= \dfrac{1}{\sum\limits_{w \in V} \exp(u_w^Tv_c)} \biggl(\dfrac{\partial}{\partial{v_c}}\sum\limits_{x \in V} \exp(u_x^Tv_c) \biggr) \\ &= \dfrac{1}{\sum\limits_{w \in V} \exp(u_w^Tv_c)} \biggl( \sum\limits_{x \in V} \dfrac{\partial}{\partial{v_c}} \exp(u_x^Tv_c) \biggr) \\ &= \dfrac{1}{\sum\limits_{w \in V} \exp(u_w^Tv_c)} \biggl( \sum\limits_{x \in V} \exp(u_x^Tv_c) \dfrac{\partial}{\partial{v_c}} u_x^Tv_c\biggr) &= \dfrac{1}{\sum\limits_{w \in V} \exp(u_w^Tv_c)} \biggl( \sum\limits_{x \in V} \exp(u_x^Tv_c) u_x\biggr) \end{aligned}

vclogP(oc)=uo1wVexp(uwTvc)(xVexp(uxTvc)ux)=uoxVexp(uxTvc)wVexp(uwTvc)ux=uoxVP(xc)ux=observedexpected\dfrac{\partial}{\partial{v_c}} \log P(o|c) = u_o - \dfrac{1}{\sum\limits_{w \in V} \exp(u_w^Tv_c)} \biggl( \sum\limits_{x \in V} \exp(u_x^Tv_c) u_x\biggr) = u_o - \sum\limits_{x \in V} \dfrac{\exp(u_x^Tv_c)}{\sum\limits_{w \in V} \exp(u_w^Tv_c)} u_x = u_o - \sum\limits_{x \in V} P(x|c)u_x = observed - expected

uw\dfrac{\partial}{\partial{u_w}} 도 유사한 방식으로 계산

3) 경사 하강법 적용하여 손실 함수의 최솟값 계산

교차 엔트로피 함수의 경우 convexity가 보장되기 때문에 최솟값을 구할 수 있다.
경사 하강법(Gradient Descent)에서는 J(θ)J(\theta)를 최소화하기 위해 현재의 θ\theta 값에 대해 J(θ)J(\theta)의 접선의 기울기(편도감수의 값; gradient)를 구한 뒤, gradient가 감소하는 방향으로 작은 step씩 움직인다.

θnew=θoldαθJ(θ)\theta^{new} = \theta^{old} - \alpha \nabla_\theta J(\theta)

while True:
	theta_grad = evaluate_gradient(J, corpus, theta)
    theta = theta - alpha * theta_grad

α=\alpha= step size or learning rate

그런데 J(θ)J(\theta)는 코퍼스 내 모든 윈도우들을 포함하므로, 한 번 업데이트를 하기 위해 θJ(θ)\nabla_\theta J(\theta) 계산이 매우 오래 걸리는 불상사가 있다. 이에 실제 구현 시에는 몇 개의 윈도우를 샘플링하고 업데이트하는 확률적 경사 하강법(Stochastic gradient descent)을 사용하는 것이 일반적이다.

while True:
	window = sample_window(corpus)
	theta_grad = evaluate_gradient(J, window, theta)
    theta = theta - alpha * theta_grad
profile
SNU AI

0개의 댓글