본문 바로가기
모아 읽은 보따리/cs224n

L2: Word Vectors / Word Senses / NER

by 동석2 2023. 1. 18.

L1에 이어 word vector를 마무리하고, word sense, NER를 간단히 알아본다.

 

Word Vector

L1에서, Word2Vec 및 그 학습 방법을 알아보았다.

학습된 Word2Vec의 parameter들은 각 단어당 outside vector u, center vector v pair로 이루어진다.

실제 predict에는, 예측하고자 하는 중심 단어 *apple(데이터셋 중 4번째 단어라 생각)의

center vector v_4와 

다른 데이터셋의 outside vector들의 matrix U와의

dot product를 사용하여, softmax를 적용해 가장 높은 확률값을 가진 단어들을 추려내어 apple과 가깝게 위치할 확률이 높은 단어들을 찾는다.

특히 이렇게 주어진 중심 단어에 대해 확률이 높은 주변 단어들을 찾는 모델을 'skip-gram'모델이라 하며,

반대로 주어진 주변 단어들에 대해 확률이 높은 중심 단어를 찾는 모델을 'bag of words'모델이라 한다.

 

저번 L1에서 보았을 때, 확률 p(o|c)를 구할 때 분모로 '모든 단어들의 u^Tv계산값 합'을 필요로 하였는데, 이는 굉장한 computational cost를 필요로 한다. 따라서 실용적인 학습에는 negative sampling이란 것을 사용하게 된다.

간단하게는, 학습 데이터로 데이터 pair들을 학습에 이용하는데, 해당 pair들은 정말로 관계가 있는 단어들일 수도 있고, 아예 관계가 없는 단어들일 수도 있다. 이러한 차이를 학습하도록 하는 방법이 negative sampling이다.

이러한 학습법은 기존처럼 모든 단어들의 계산값 합을 필요로 하지 않기에, computational cost를 굉장히 많이 줄일 수 있다.

 

이를 loss function으로 정의하면 아래 사진과 같다.

해당 J_t를 maximize하도록 설정하게 된다. 여기서 k는 negative sample들(관계없는 단어 집합의 수)로, 관계 없는 k개의 sample들에 대한 log likelihood를 최소화하고 (그래서 후자식에 -가 붙어있다.) positive sample의 log likelihood를 최대화하도록 J_t를 만든 것이다.

 

실제 stochastic gradient descent에서는 \theta (=모든 단어들의 u,v 집합체) 전체를 update하려면,

J_t 식에서 보듯 전체 단어들이 아닌 해당 t 시간에 계산에 이용된 단어들 (pos sample/neg sample)에 대한 vector가 아닌 경우

J_t 편미분 값이 모두 0이 된다. 즉 2k+1개 외의 \theta 편미분값은 모두 0이 되기에 굉장히 sparse한 vector가 된다.

 

그래서 실제로 컴퓨터 계산 시에는 hash방식을 통해, appear되는 단어들(2k+1)에 대한 column만 뽑아와 gradient update를 진행한다.

 

Word Co-occurence

그렇다면, 이러한 학습에는 정말 많은 문장들을 전부 저장을 하면 학습이 쉬울 것이다.

그렇다면 같이 나타나는 (co-occur) 단어들의 집합을 어떻게 데이터화할 수 있을까?

 

가장 먼저 떠오르는 것은 행렬 matrix 방식일 것이다. 하지만 세상의 수많은 모든 단어를 행렬로 저장하기엔, NxN의 크기가 필요하기에 다른 방식이 필요하다.

뭐 popular 단어 25~1000개만 저장하는 방식도 있겠지만, 그렇다 해도 dimension을 줄일 필요가 있다.

 

이때 사용하는 것이 SVD, singular value decomposition으로 NxN의 행렬을 k개의 singular value를 통해 3개의 행렬로 나누는 것이다.

물론 단순히 word count에 대해 진행할 경우 수가 너무 큰것도 있고, 단어 간의 빈도 차이가 너무 크기에 log scale등을 활용하여 사용하는 것이 좋다.

 

보다 증진된 모델로는 GloVe가 있다. 위와 같은 word co-occurence를, linear vector difference로 바꿔 학습함으로써 빠르게 meaning을 학습할 수 있도록 했다.

 

Word Evaluation

위와같이 학습된 모델들은, 두 가지의 평가를 받는다. 단순하게

intrinsic evaluation은 비교적 작은 한정된 subtask에 대해 평가하는 것,

extrinsic evaluation은 실제 상황에 대해 평가하는 것이다. 

 

intrinsic 평가는 주로 word vector간 cosine distance를 사용하여, 두 단어가 얼마나 가까운지를 판별하게 된다. 이외에도 correlation, 인위적으로 설정된 유사도를 통해 비교하는 방법이 있다.

 

extrinsic의 경우 named entity recognition이라는, 좋은 기준점이 있다.

 

Word sense / Ambiguity

알다시피 bank라는 영어 단어는 수많은 뜻을 가진다. 은행일 수도, 예금하다, 거래하다 등의 동사로써도 뜻을 가진다.

그렇다면 word vector가 은행일때의 bank와 예금하다일때의 bank가 달라야 하지 않을까?

 

실제로 타파하려는 시도로

2012 : bank_1, bank_2등으로 나누어 clustering하기

2018 : bank의 뜻마다 frequency기준 가중치를 두어 최종 bank의 word vector 구하기

=> 실제로 성공적인 결과를 내었다. 

 

NER : Named Entity Recognition

마지막 주제는 NER이다. 우리의 대화엔 고유명사 (회사명, 이름..등)가 굉장히 많이 쓰이는데, 이를 구별하는 모델을 개발할 수 있을까?

아주 간단하게는, 이것이 고유명사인지 아닌지를 주변 word vector를 받아(input) classify하는 (with softmax) binary classifier 모델을 사용할 수 있다.

(당장 이러한 모델은 고유명사 외에도 감정분석, 문장의미 분석등 사용 데이터/라벨에 따라 다양하게 학습하여 사용할 수 있다.)

 

이는 보통 CrossEntropyLoss를 통해 학습된다. 저번 Lecture에서 보았던 것과 비슷한 형태로, positive label에 대한 negative log prob만 남겨 역전파시키는 것이라 이해할 수 있겠다. (여기선 이정도로 설명 마무리)

 

'모아 읽은 보따리 > cs224n' 카테고리의 다른 글

L6: LSTMs, NMT  (0) 2023.02.03
L5: Language Modeling, RNN  (0) 2023.02.02
L4: Dependency Parsing  (0) 2023.02.01
L3: Neural Nets  (0) 2023.01.31
L1 : Introductions and word vectors  (0) 2023.01.04