Google ML Bootcamp 2022/Coursera mission

Sequence Models - 2 week

피준 2022. 8. 10. 01:39

Word Representation

NLP에 대해 배워보자

단어를 나타내는 방법 중 하나인 word embedding을 배울 것이다

임베딩은 man-woman, king-queen처럼 무언가 유사성을 알아내는 것이다

지금까지 단어를 집합을 이용해 one-hot으로 표현했다

그렇기에 man-woman, king-queen이 일관적으로 벡터에 위치하지 않을 테니, 무언가 규칙을 학습하기가 쉽지 않다

일반화가 쉽지 않은 느낌?

orange - juice를 학습한 후, apple - ? 에 juice를 넣기가 쉽지 않다

벡터 간 내적이 0이기에 apple이 king보다 orange와 비슷한 느낌의 단어라고 알 수가 없다

one-hot 대신 featurized representation을 이용하다

이런 느낌

단어별로 특징의 수에 따른 벡터가 만들어진다

one-hot에서 5391번 단어를 \(o_{5391}\), 이라 했다면 여기선 \(e_{5391}\)로 표현하자

내적 하여 단어 간의 특징이 비슷한지 알 수 있다

t-SNE 알고리즘 등을 사용하여 아래처럼 시각화할 수 있다

위처럼 연관성 있는 단어가 그룹된걸 알 수 있을 것 같다

Using Word Embeddings

이전에 계속 보던 name entity recognition 예시를 보자

오렌지 농부가 사람이란걸 알면, Sally Johnson이 사람이란 걸 쉽게 알 수 있을 것이다

또한 오렌지 농부가 사람이라면, 비슷한 사과 농부도 사람이며, Rovert Lin도 사람이란 걸 쉽게 알 수 있을 것이다

이를 위해선 기존의 one-hot 방식이 아닌 임베딩을 사용해야 한다

일반화를 한다면 두리안 농부 같은 좀 독특한? 작은 케이스의 문제도 처리할 수 있게 될 것이다

Transfer learning을 하는 것처럼 말이지

 

단어 임베딩을 학습 시키거나, 어디서 가져온다면 작은 training set에서도 학습할 수 있다

물론 새로운 task에 따라 임베딩의 특징을 수정하면, 더 잘 작동한다

 

이전 CNN 얼굴 인식에서 배운 saimese Net의 임베딩 벡터와 유사한 느낌이다

Properties of Word Embeddings

단어 임베딩은 또한 유추(analogy) 문제에 도움이 된다

Man->Woman, king->?

위 관계에서 ? 에는 뭐가 들어가야 할까

queen 일거 같긴 한데, 아이디어를 형식화해보자

남자와 여자 사이의 주된 차이점은 Gender이며, King에 Gender 특성만 다른 걸 찾아주면 될 것 같다

즉 \(e_{man}-e_{woman} \approx e_{king}-e_{}\)을 구하면 된다

시각화 하면 위와 같다

similar(\(e_{w}\),\(e_{king}-e_{man}+e_{woman}\))을 최대화하는 w를 찾으면 된다

사실 실제로는 t-SNE 매핑을 이용하여 매우 비선형적이기에, 평행사변형 관계로 위와 같이 이쁘게 나오지 않는다고 한다

 

유사도는 보통 코사인 유사도를 많이 사용한다고 한다

\(sim(u, v)\) = \(u^Tv\over\|u\|_2\|v\|_2\)

값이 비슷하면 커진다 (dot product니까~)

Embedding Matrix

행렬을 E, one-hot 벡터를 o라 부르면

\(E o_n=e_n\)을 구할 수 있다

 

Learning Word Embeddings

빈칸에 들어갈 단어를 알아내보자

먼저 각 단어의 원-핫 벡터를 E에 곱해,  featurized vector를 구한다

과거의 방법으로는 보통 빈칸 앞의 4개의 단어를 사용하여 빈칸을 예측했다고 한다 (물론 "4개"도 하이퍼 파라미터다)

그 후 NN의 w와 b를 학습시켜 softmax를 적용시킨다고 한다

그냥 neural language model에 잘~ 넣어서 softmax를 구하면, juice가 들어가는구나를 알 수 있구나~ 정도로만 이해하자

 

앞의 단어는 문맥을 학습시키는 거싱다

앞 4 단어뿐만 아니라, 좌우 4단 더, 앞 1 단어, 근처 1 단어처럼 학습시킬 수도 있다

근처 1 단어를 학습시키는 건 skip gram 알고리즘이라고 한다 (근처는 인접이 아니다)

그게 뭔지는 아래에서 배워보자

 

 

Word2Vec

임베딩을 학습시키는 Word2Vec 중 skip-gram을 배워보자

아래와 같은 예시 문장을 받았다고 생각하자

I want a glass of orange juice to go along with my ceral.

문맥에 해당하는 단어를 먼저 선택하고, 플마 5~10 정도 위치에서 타깃이 될 단어를 선택한다

예를 들어 orange를 context로 선택한 경우, juice, glass, my 등등 단어가 target이 될 수 있다

 

지도 학습으로, Context c가 입력일 때, Target t를 매핑하도록 학습시키는 모델을 만들어야 한다

원-핫 벡터를 E 곱하는건 넘어가구, 소프트 맥스와 로스 함수를

\(p(t|c)={e^{\theta _t^T e_c}\over\sum_{j=1}^{10,000} e^T_j e_c}\)
\(mathcal{L}(\hat{y},y)=-sum_{i=1}^{10,000} y_i log \hat{y}_i\)

\(\theta _t\)는 해당 아웃풋 t와 연관된 파라미터?라고 하는데 그러려니 하자

\(\hat{y}_i\)는 i 번이 1인 one-hot vector이다

 

좌우로 몇몇 단어를 건너뛰고 타깃을 잡아, 알고리즘에 skip이 붙는다고 한다

 

소프트 맥스에서 sigma를 하는 건 뭔가.. 시간을 되게 잡아먹을 것 같은 느낌이 든다

이를 계층적 소프트맥스(Hierarchical Softmax)를 사용하여 개선할 수 있다

단어를 트리로 표현해서, 이쪽 집합에 가깝다! 를 반복하는 느낌이다

완전 이진트리나, 균형 이진트리는 아니라고 한다

아무튼 줄일 수 있구나!

 

추가적으로 C를 선택하는 과정에 대한 이야기인데

만약 랜덤으로 선택한다면, to the a an 이런 자주 쓰이는 단어가 등장할 것이고

학습에 오랜 시간이 반복하는 데에만 소비될 것이다

orange, apple, durian 같은 단어를 학습시키는 게 더 의미 있기에, 완전 랜덤은 아니라고 한다

마법을 사용한다고 생각하자

Negative Sampling

skip-gram 모델과 비슷한 역할을 하지만, 속도가 더 빠른 negative sampling에 대해 배워보자

context-word 쌍이 같이 나오는 게 적절한지, positive-negative를 target으로 판단한다

orange-juice 가 target = 1이고, orange-king 은 0이다

셋을 구성하며 같이 나오는 단어를 1로 하는 positive인 경우 하나와, 랜덤으로 구성한 negative인 경우의 개수 k를 5 ~ 20 개 정도 두는 걸 권장하신다고 한다

물론 데이터 셋이 크다면 k가 작아도 된다고 한다

이런 느낌의 셋

\(p(y=1|c,y)=\sigma (\theta_t^T e_c)\)

모든 단어에 대해 학습시키는 대신, positive 타깃과 랜덤으로 고른 negative 타깃으로 학습시킨다고 한다

소프트맥스를 이진 분류로 개선했으니 시간이 적게 걸린다

 

negative target을 랜덤으로 선택하는 방법은 많지만, 그냥 랜덤을 하면 위에서 언급한 to, the 같은 문제가 발생한다

단어를 빈도수로 나눠주고 선택하는 게 해결 방법 중 하나라고 한다

어떻게.. 잘 한다고 하는데 모르겠다 (마법!)

휴리스틱을 사용한다고 한다

 

소프트맥스 문제를 이항 분류로 바꾸어 시간을 절약하는구나!

GloVe Word Vectors

또 다른 방법으론 모멘텀이 있는 GloVe 알고리즘이 있다고 한다

많이 사용되지는 않지만, 단순함으로 인해 마니아 층이 있다고 한다

 

아래와 같이 \(X\)를 사용하자

\(X_{ij}\) = # times word \(j\) appears in content of \(i\)

negative sampling에서 사용된 기호로 보면 i=c, j=t이다

\(X\)를 근처 10 단어 인에 나타나는 정도와 같이 정의하면 \(X_{ij}=X_{ji}\)가 될 것이다

맥락 이후 타깃이 등장하는가? 와 같이 정의하면 대칭성이 나타나지 않을 것이다

 

GloVe 목적은 아래 식을 최소화 하는 것이다

minimize \(\sum_{i=1}^{10000}\sum_{j=1}^{10000} f(X_{ij})(\theta_i^Te_j +b_i +b^`_j-log X_{ij})^2\)

\(X_{ij}\)가 0이면 로그가 무한으로 가기에, 이를 막고자 \(f(X_{ij}=0)=0\) 이다

또한 가중치 항은 자주 등장하지만 의미 없는 this, is, the, to, a 이런 단어들에겐 작아 영향을 줄이고

우리의 durian과 같은 경우는 커 학습이 잘 작동하도록 만들어준다

 

e와 \(\theta\)가 완전 대칭이기에 값이 동일하여, 각각을 모든 단어에 대해 계산하고 둘의 평균으로 최종 e를 계산하는 방법도 있다고 한다

 

축이 제대로 잡히지 않아 직접 해석하기 어려운 문제가 발생할 수 있다

선대를 배워서 다행이다

\((\theta_i^T)(e_j)=(\theta_i^T A)(A^T e_j)\)

A가 inversible 하면 축이 달라질 수도 있다

 

 

 

Sentiment Classification

감성 분류는 텍스트 일부를 보고, 그 텍스트가 싫어하는지 좋아하는지 감성을 판단하는 문제이다

데이터 셋이 부족한 경우에 임베딩은 많은 도움이 된다고 한다

단순히 각 단어가 좋고 나쁘고를 판단한다면, "부족한 점들 : 맛있는 밥, 푹신한 침대, 친절한 서비스!"라는 리뷰를 보고

맛있고, 푹신하고, 친절해? 음 긍정적이 고만할 수도 있다

그렇기에 RNN 모델을 만들어야 한다

전에 봤던 many-one 아키텍처

Debiasing Word Embeddings

이런저런 결정에 AI가 사용되는 만큼 인종차별, 성차별 같은 문제가 없는지 확인해야 한다

단어 임베딩에서 이런 편견을 없애는 방법을 알아보자

전에 하던 편향이 아닌 편견인 느낌이다

예를 들어, man:computer_programmer -> womamn:? 과 같은 경우를 생각하면 된다

2016 논문에선?=Homemaker(주부)라고 매칭 했다고 한다

또한 Father:Doctor -> Mother:Nurse 같은 관계도 있었다

 

이 편견을 좀 줄이는 방향을 알아보자

먼저 편견의 방향을 확인해야 한다 (성별, 인종 등등)

이를 해당하는 \(e_{man}-e_{woman}\), \(e_{king}-e_{queen}\) 등을 평균 내어 축을 구할 수 있다

 

그리고 중성화..? Neutralize를 해야 한다

성별을 중성화(뭔가 말이 이상한데..)한다고 하자

할아버지 할머니와 같이 성별 요소가 명확하지 않은 의사, 코끼리 같은 단어를 bias가 없는 축으로 투사시켜 영향을 줄인다

 

마지막으로 Equalize pair, 쌍에 대한 편향을 일치시켜 준다

예를 들어 성 중립적이어야 하는 베이비시터와 같은 단어가, 할머니 할아버지로부터 거리가 같도록 조절해 준다

 

수염은 남자가 더 많이 나지 않나..라는 생각처럼 되게 명확하지는 않다

그렇기에 요새도 연구가 되고 있으며, 그냥 이런 게 있구나 생각하자