본문 바로가기
대학원 수업 요약 정리

비정형데이터분석(강필성교수님)(8)-Word2Vec, Skip-gram, CBOW, Gradient descent algorithm, subsampling, negative sampling, Word2Vec 예시

by 지식광부키우기 2020. 4. 11.

Text Representation 2 : Distributed Representation

 

Word-level : Word2Vec


가장 널리 알려진 Word2Vec 모델

 

 

NNLM과 Word2Vec의 차이?


이 둘 사이의 차이 : NNLM 모델 같은 경우에는 순차적으로 단어들이 주어 졌을때 단어의 다음 단어가 무엇인지를 예측하는 뉴럴 네트워크을 만듦

Word2Vec은 알고 싶은 단어의 주변 단어를 통해서 알고 싶은 단어를 예측하거나 또는 한 단어가 주어졌을 때 이 단어를 가지고 주변에 있는 단어들을 예측하는 두 가지 방식이 존재

전자를 contivuous bag-of-words라고 하고 후자를 Skip-gram 이라고 표현 함

이 두가지 부분 중에서 후자의 중점을 두고 설명

 

 

Word2Vec?


Word2Vec은 두 가지의 아키텍처가 존재함

t번째 단어를 예측하는데 있어서 뉴럴 네트워크의 구조가 t 번째 단어의 앞뒤 두 개씩 쓴다고 하면(윈도우 사이즈는 플러스 마이너스 2) t-2, t-1, t+1, t+2번 째 단어를 가지고 t 번째 단어를 예측하는 게 Continuous bag-of-words(CBOW) 방법론임

반대로 t 번째 단어를 가지고 뉴럴 네트워크 예측 모델 자체가 주변 단어들 t-2번째 t-1번째 t+1번째 t+2번째 단어를 예측하도록 만드는게 Skip-gram

일반적으로 처음 구조를 보면 정보를 더 많이 받아서 하나의 단어를 예측하는 게 더 정확할 것 같으니까 CBOW가 더 퍼퍼먼스가 좋을 것 처럼 보이지만 일반적으로 성능 관점에서 봤을 땐 반대임

그레디언트 플로우 관점에서 보면 CBOW 같은 경우에는 타겟 워드인 w(t)를 가지고 그레디언트가 t-2, t-1, t+1, t+2 각각의 단어에 흘러감

하나의 단어를 가지고 주변 4개의 단어에 그레디언트그를 흘리는 반면에 Skip-gram 같은 경우에는 그레디언트를 받을 때 주변 단어들의 정보들을 모두 하나의 단어를 업데이트 하는데 그레디언트를 받음

그렇기 때문에 둘 중에서 와 Skip-gram이 조금 더 퍼포먼스가 좋은걸로 알려져 있음

 

 

Learning representations: Skip-gram?

 

Skip-gram 구조

Skip-gram은 뉴럴 네트워크이긴 한데 가장 기본적인 구조라서 activation function도 없음

 활성화 함수도 없는 뉴럴 네트워크 구조임

다시 말해서 Input layer에서 Hidden layer도 linear 구조이고 Hidden layer에서 Output layer도 linaer 구조임

상당히 단순
핵심은 'activation function이 존재하지 않음' 
목적 함수(Objective function)는 log probability를 최대화 함

$J(\theta) = \frac{1}{T}\sum_{t=1}^{T} \sum_{-m\leq j \leq m, j\neq0} logp(w_{t+j}|w_{t})$

이 말은 k 번째 단어가 주어 졌을때 이 단어 앞뒤로 주어지는 단어들의 생성 확률을 높이는 것임

$\Theta$를 최적화를 해야되는 파라미터로 봄

목적 함수 자체가 t 번째 단어가 center word로 주어 졌을때 j가 플러스 마이너스 m개씩 보게되면(양쪽 대칭을 m 개씩 보겠다 의미) t + j이니까 t를 기준으로 해서 왼쪽으로 m개(-m)부터 오른쪽으로 m개까지의 단어가 생성될 확률이 center word가 하나 주어졌을때 확률 값임

이것을 t=1부터 T까지 가지고 있는 코퍼스의 모든 조합에 대해서 다 계산을 해서 최대화를 시키겠다라고 하는게 Word2Vec의 Skip-gram 모형의 목적 함수

 

 

Skip-gram model?

 

원래 구조 자체는 주어진 하나의 center word가 있으면 주변 단어들을 직접 한꺼번에 예측을 해야 됨

앞에 식에서도 보다시피 실질적인 코드나 구현은 하나씩 하나씩 예측을 함

즉, 한꺼번에 예측해서 그레디언트를 흘리나 따로따로 예측을 해서 그래디언트를 흘려서 합치나 같음

따라서 center word가 주어 졌을때 context word인 'The'의 예측을 잘할 수 있도록 학습을 시키고 또 center word가 주어지면 'mighty'가 학습이 잘 되게 주어짐

center word는 똑같은데 여기에 대응하는 context word가 계속 바뀌는 것
그래서 word가 주어졌을 때 그 시점에서의 context word에 해당하는 probability를 최대화 시킴

$p(c|w)=\frac{e^{x_{w}^{T}v_{c}}}{\sum_{k=1}^{K}e^{x_{w}^{T}v_{k}}}$

k=1부터 K같은 part는 normalization을 해서 softmax 함수를 쓰는 part라고 보면 됨

$x_{w}$는 word w에 대한 feature이고 $v_{c}$는 word c에 대한 어떤 classifier 벡터라고 보면 됨

그래서 c번째 단어에 대한 백터와의 내적 연산 값의 exponential 값이 모든 단어에 해당하는 $x_{w}$와 모든 단어에 해당하는 내적의  exponential의  합으로 나눈 것이 probability가 됨 

 

 

CBOW model?


반면에 Continuous bag-of-words모델 같은 경우에는 주변 단어들을 가지고 중심 단어를 예측하는 상황임

그래서 따로 따로 하는게 아니라 전체 단어를 가지고 하는게 됨

여기에서는 c가 아니라 C가 되는데 전체 context가 하나의 조합으로써 나타나기 때문에 이러한 확률을 사용함

$p(w|C)=\frac{e^{h_{c}^{T}v_{w}}}{\sum_{k=1}^{K}e^{h_{c}^{T}v_{k}}}$

 

 

Another architectrue explanation?


 다른 식으로 아키텍처를 살펴봄

어떤 input vector가 주어 졌을 때의 그 단어로부터 hidden layer의 neuron(핵심은 linear neuron, activation function이 없음)의 차원으로 mapping을 함

input vector에서 hidden layer로 갈 때는 단어가 만 개라고 치면 만 개 곱하기 hidden layer neuron 차원의 벡터로 이루어진 matrix가 만들어짐

Lookup table의 경우에 행 단위로 보게 되면 각각의 단어들에 대해서 이 하나하나에 행이 hidden layer neuron 차원의 word vector가 됨

따라서 뉴럴 네트워크 모델에서 만들었던, NNLM에서 봤던 lookup table과 같은 역할을 수행함

뭔가 특정한 단어가 주어 졌을때 one-hot 벡터가 주어지면 특정 단어에 대해 hidden layer neuron 차원 feature가 나타나고 lookup table에서도 마찬가지로 해당하는 word들에 대해서 output마다 lookup table에서 hidden layer neuron 차원의 특정 단어 다음 단어의 가능성이 있는 것을 찾아 와서 내적을 하면 분자의 exponential이 되고 그것들을 전부 다 더한 것이 normalization vector가 되서 다음 단어가 뭐가 될지를 예측을 하는 이 상황에서의 확률 값이 됨

 

 

Word2Vec에 대한 Gradient descent algorithm 유도?


Word2Vec에 대한 Gradient descent algorithm 알고리즘을 유도하기 위해서 조금 수식을 단순화시킬 수 있음

$p(w_{t+j} | w_{t})$에서 center word($w_{t}$)가 있고 context word($w_{t+j}$)가 있을 때 다음과 같이 표현할 수 있음

$p(o | c) = \frac{exp(u_{o}^{T}v_{c})}{\sum_{w=1}^{W}exp(u_{w}^{T}v_{c})}$

o는 output이 되어서 예측이 되는 대상임

c는 center word임
 center word가 주어 졌을때 하나씩 하나씩 그레디언트를 흘리는 방향이니까 o가 하나만 들어가 있음

W는 V x N matrix고 $W^{T}$는 N x V matrix임

$v_{c}$는 context center word이기 때문에 v는 특정한 하나의 행에 들어가게 되고(W의, 입력에서 히든 노드 row )
$u_{o}$ 같은 경우에는 하나의 열임 (W'의, $W^{T}$하고 같지 않음) 
히든 노드의 개수가 우리가 원하고자 하는 word embedding의 dimention이 됨
W'와 $W^{T}$가 사실 같지는 않은데 계산의 편의상 원하는 것이 예를 들어 i번째 embedding이 W에 존재한다면 이 embedding과 W' embedding은 사실 같아야됨

편의상 계산을 쉽게 하고 또 빠르게 하려면 W'을 그냥 $W^{T}$로 정의 해서 계산을 하는 상황도 발생함

 

 

Word2Vec 파라미터를 학습하는 과정?


최대화를 시켜야 되는 목적 함수 : $J(\Theta) = \frac{1}{T}\sum_{t=1}^{T}\sum_{-m \leq j \leq m,j\neq0} logp(w_{t+j}|w_{t})$ 

$w_{t+j} | w_{t}$만 떼고 봤을 때 $p(o | c) = \frac{exp(u_{o}^{T}v_{c})}{\sum_{w=1}^{W}exp(u_{w}^{T}v_{c})}$
center word가 주어 졌을때 output을 예측하는 part를 이렇게 정리를 함

v는 W의 row이고 $u_{o}$는 W'의 column입니다. $u_{o}^{T}v_{c}$는 row벡터와 row벡터가 되어 row를 꺼내 온다라는 뜻임
벡터 연산에서는 기본적으로 columnizing 연산을 하기 때문에 row를 꺼내 와서 column처럼 표현하는 것 $u_{o}^{T}v_{c}$는 결국 row x column이 되가지고 스칼라 값이 나오게 됨

 


그레디언트 계산?

$u_{o}$와 $v_{c}$에 대해서 모두 가능 $v_{c}$에서만 진행하겠음

즉, W 해당하는 matrix(V x N)가 있을 때 $v_{c}$는 특정한 context에 해당하는(row) part를 업데이트 함
목적 함수를 center word에 해당하는 embedding을 미분을 함. 목적 함수를 편미분 함
$\frac{\partial}{\partial v_{c}} p(o | c)$

$= \frac{\partial}{\partial v_{c}} \frac{exp(u_{o}^{T}v_{c})}{\sum_{w=1}^{W}exp(u_{w}^{T}v_{c})}$

$= \frac{\partial}{\partial v_{c}} u_{o}^{T}v_{c} - \frac{\partial}{\partial v_{c}}log\sum_{w=1}^{W}exp(u_{w}^{T}v_{c})$

 


$\frac{\partial}{\partial v_{c}} u_{o}^{T}v_{c}$?

 

굉장히 단순

$u_{o}^{T}v_{c}$를 $v_{c}$에 대해 미분하면 $u_{o}$만 남음

 

 

$-\frac{\partial}{\partial v_{c}}log\sum_{w=1}^{W}exp(u_{w}^{T}v_{c}) $?

 

$-\frac{\partial}{\partial v_{c}}log\sum_{w=1}^{W}exp(u_{w}^{T}v_{c})$ 
$= -\frac{1}{\sum_{w=1}^{W}exp(u_{w}^{T}v_{c})} \cdot(\sum_{w=1}^{W}exp(u_{w}^{T}v_{c}) \cdot u_{w})$ 
$= -\sum_{w=1}^{W} \frac{exp(u_{w}^{T}v_{c})}{\sum_{w=1}^{W}exp(u_{w}^{T}v_{c})} \cdot u_{w}$ 
$= - \sum_{w=1}^{W} P(w|c) \cdot u_{w}$

※ $\frac{\partial}{\partial x}logf(x)=\frac{f'(x)}{f(x)}$

 

 

위 두개 결합?

 

최종적으로 나와야 되는 건

Learning parameters with Gradient Ascent : $\frac{\partial}{\partial v_{c}}logp(o|c)=u_{0}-\sum_{w=1}^{W}P(w|c)\cdot u_{w}$

 W는 1부터 전체 단어 사이즈까지 해당하는 파트가 지금 다 계산이 되는 부분임

최대치를 구하는 것이기 때문에 Gradient Ascent

Updata the weight vector : $v_{c}(t+1)=v_{c}(t)+\alpha(u_{0}-\sum_{w=1}^{W}P(w|c)\cdot u_{w})$

이전 시점의 $v_{c}$에다가 gradient를 더해주게 됨

 

 

Learning strategy?

 

practical한 전략
첫 번째 : 모든 nearby words를 쓰는게 아니라 하나씩 트레이닝

 

모든 nearby words를 쓰는게 아니라 하나씩 트레이닝 예시?

The quick brown fox jumps over the lazy dog

window size는 2

(fox, quick) quick이 output이고 fox가 center가 되는 모형 학습

(fox, brown) brown이 output이고 fox가 center가 되는 모형 학습 등

하나씩 하나씩 pairwise해도 원래 가지고 있는 스킵 gram의 의미랑 똑같음

즉, 한꺼번에 gradient를 흘려서 더하나 개별적으로 output 여러 개가 있을 때 gradient를 따로따로 하나 같음

 


Learning strategy?


두 번째 : 학습을 해야되는 weights matrix 사이즈는 2 x V x N과 같음
V : 단어 사이즈

N : 임배딩 차원의 수 
굉장히 큰 규모의 네트워크가 됨 -> 심플하게 계산할 필요성

굉장히 빈번하게 나타나는 word paris나 phrases같은 경우에는 하나의 단어로 취급
너무 많이 나타나는 단어들은 subsampling 함

 

 

너무 많이 나타나는 단어들은 subsampling?

 

멱함수를 생각해보면 어떤 단어들은 굉장히 조금씩 빈도가 낮게 학습이 되는 반면에

특정 단어들은 빈도가 너무 높게 학습이 되면 밸런스를 맞춰보는 것

word $w_{i}$가 학습과정에서 제거가 되는 확률 값을 계산을 해주게 됨

$P(w_{i}) = 1 - \sqrt{\frac{t}{f(w_{i})}}$
f(w)는 코퍼스에서 해당하는 빈도가 됨
t는 파라미터가 됨

예를 들어 만약에 특정 단어가 코퍼스에서 등장하는 빈도가 $10^{-4}$이면 학습의 누락 될 확률이 0.6838 정도 됨

다른 어떤 단어는 코퍼스에서 등장할 확률이 $10^{-2}$인데 이 경우(0.96) 거의 대부분 사실 누락을 시켜 버림 
관사들이나 매우 빈번하게 등장하는 단어들의 학습을 조금 적게, 덜 시켜 학습이 조금 더 빠르게 되도록 가이드라인을 줌

$t=10^{-5}$

$if\ f(w_{i}) = 10^{-4}, P(w_{i})=1-\sqrt{\frac{1}{10}}=0.6838$

$if\ f(w_{i}) = 10^{-2}, P(w_{i})=1-\sqrt{\frac{1}{1000}}=0.9684$

 


Learning strategy?

 

세 번째 : Negative Sampling 
output 단어의 확률 계산 위해서 코퍼스에 존재하는 모든 단어들에 대한 소프트맥스를 계산해야 함

원래 내가 가지고 있는 정답 단어가 있고 이 단어에 대한 소프트맥스 값을 계산하기 위해서($u_{0}^{T}v_{c}$)
$u_{i}^{T}v_{c}$, $1 \leq i \leq |V|$ 나머지 모든 것들에 대해서 계산을 다 해야 됨
너무 비효율적임

$J(\theta) = \frac{1}{T}\sum_{t=1}^{T}\sum_{-m\leq j \leq m, j\neq0} logp(w_{t+j}|w_{t} ) = \frac{1}{T}\sum_{t=1}^{T}J_{t}(\theta)$

$J_{t}(\theta) = log\sigma(u_{o}^{T}v_{c})+\sum_{i=1}^{k}E_{i \sim  P(w)}[log\sigma(-u_{i}^{T}v_{c})]$
네거티브 샘플링을 통해서 몇 개만 함 즉, 위에서 i=1부터 k로 바뀜(중요)

전체 모든 단어들에 대해서 다 하는게 아니라 몇 개의 example에 대해서만 소프트맥스 계산을 하는데  비교대상으로 삼음

$P(w_{i})=\frac{f(w_{i})^{3/4}}{\sum_{j=0}^{n}(f(w_{i})^{3/4})}$ 역시 negative sampling이 되는 빈도는 해당하는 단어가 코퍼스에서 나오는 빈도에 비례를 해서 잡음

 

$\sum_{i=1}^{k}E_{i \sim  P(w)}[log\sigma(-u_{i}^{T}v_{c})]$?

 

어떤 i 번째 단어가 현재 주어짐

context word vector, output도 존재함

i번째 단어에 대해서 lookup table 통해서 context word vector 찾음

찾은 context vector 가지고 target 단어가 존재한다면

이 단어가 발생할 확률 계산을 해야 함
그 단어를 target word vector라고 함
target word vector 대한 확률 값을, 조건부 확률 값(context word or center word)가 주어 졌을때 

target word가 나타날 확률 값 $P(T|C)$를 정확하게 계산하기 위해서는 target word에 대한 내적값뿐만이 아니라
나머지 모든 단어들에 대해서도 내적 값을 다 구한 다음에 소프트맥스를 계산 해야된다는 뜻
이 계산이 너무 지루하고 시간적으로 너무 오래 걸림

따라서 이 중에 일부분의 단어들에 대해서만 샘플링을 해서 분모를 계산함

$\frac{u_{0}^{T}v_{c}}{\sum e^{u_{i}^{T}v_{c}}}$

negative sampling이 없는 경우 : $\frac{u_{0}^{T}v_{c}}{\sum_{i=1}^{|V|} e^{u_{i}^{T}v_{c}}}$

있는 경우 : $\frac{u_{0}^{T}v_{c}}{\sum_{i=1}^{k} e^{u_{i}^{T}v_{c}}}$
k는 |V|보다는 작음
계산의 효율성 추구



Word2Vec 예시?

 

영화 리뷰 데이터

처음에는 데이터 학습이 좀 덜 되면 인물들이 막 아무렇게나 분포가 되어 있음

점점 의미 벡터가 모여 지는 것이 학습이 되면서
각각의 단어들이 구성되는 영역이 뭔가 의미를 갖는다는 걸 볼 수 있음
3만 8000여 개의 리뷰에 대해서 학습이 끝나고 나면 
유아인과 황정민과 오달수란 배우가 굉장히 가까운 영역의 벡터에 위치함

 베테랑이라는 영화에 같이 나옴

전지현 이정재 하정우(암살) 또는 조진웅 유해진이 가깝게 나옴

비슷비슷한 배우들이 나타났다는 것을 볼 수 있음

댓글