* Weekly nlp 3, 4에 해당하는 내용
본문 링크: https://jiho-ml.com/weekly-nlp-3/
Week 3 - 지구용사 벡터맨? Vector 기초 잡기!
다양한 사람들을 만나다 보면 어떤 사람은 정말 나와 비슷하다고 (similar) 느낄 때가 있습니다. 반대로 어떤 사람은 정말 거리감 (distance) 이 느껴지지요. 이번주는 사람이 아닌 벡터 (vector)가 무엇
jiho-ml.com
Vector
Scalar (스칼라): 크기만 있는 숫자
Vector (벡터): 크기 & 방향; N차원 공간(a.k.a. Euclidean space)에 사는 존재
1차원 | 2차원 | 3차원 | 4차원 |
한 방향으로 전진 | 동서남북 (degree) | 동서남북 + 고도(위아래) | 위치 + 시간 (각 시간에 내가 어느 공간에 위치하냐를 계속 기록한다고 생각) |
그럼 4차원 이상의 vector는 어떻게 이해해야 하나요?
- 시각적으로 표현하는 것은 불가능
- 하지만 사람의 특징을 벡터로 나열한다고 생각해보기 --> 한 사람이 10차원의 vector로 표현된 거라고 볼 수 있음
본문 링크: https://jiho-ml.com/weekly-nlp-4/
Week 4 - <왕> minus <남자> plus <여자>= ?
<왕> - <남자> + <여자> = ?<마드리드> - <스페인> + <프랑스> = ? 다음 두 문제의 답은 무엇일까요? 이번 주에는 단어 간의 관계를 학습해 vector에 저장하는 word embedding이라는 아주 중요한 모델을
jiho-ml.com
<왕> - <남자> + <여자> = ?
<마드리드> - <스페인> + <프랑스> = ?
- 단어 = vector로 표현 가능
- 이전에 배운 one-hot vector는 단어 간의 관계를 고려하지 않기 때문에 이 문제를 풀기 적합하지 않음
--> 그래서 단어 간의 관계를 학습해 vector에 저장하는 word embedding이 필요
Distributional Hypothesis
--> 단어는 주변 단어들에 의해 정의 됨
The baby is crawling on the mat.
- [baby --> TV] or [mat --> story] or [on --> with]
- 말이 안 되는 문장
- baby, on, mat은 타겟 단어(crawling)에 대해 많은 것을 알려줌
- crawling이 등장하는 문장을 여러 개 찾아서 보면 여러 정보를 알 수 있음 --> unsupervised learning in ML (label not needed)
그럼 Distributional Hypothesis를 어떻게 ML 모델로 만들 수 있을까?
- GloVe (Stanford)
- Word2Vec (Google, NIPS)
Word Embedding
- one-hot vectors는 단어를 Nx1 column vector로 표현함
- 데이터가 클수록 단어의 개수가 몇천, 몇만까지 커질 수 있음
- sparse (대부분이 0으로 채워져있음)
- word2vec과 GloVe
- 하나의 단어를 몇천, 몇만 차원이 아닌 몇십, 몇백 차원으로 낮추려는 게 목표
- embed = 단단하게 박다 라는 뜻
- 더 적은 숫자들로 하나의 단어에 대한 정보를 담으려는 word vector들을 embedding이라고도 표현함 (dense라고도 함)
- word embedding의 모든 row는 0이 아닌 숫자로 채워지기 때문
GloVe: 간단한 counting
- 직관적인 방식을 선택
- 같은 문장에 한 단어가 어떤 근처 단어들과 몇 번 같이 나오는지 세보는 것 --> co-occurrence matrix 라고함
"I enjoy flying."
"I like NLP."
"I like deep learning."
* corpus = text data
- 첫번 째 column에 "I"랑 같이 두번 나오는 "like"가 있는 row = 2
- 반대로 "NLP"나 "flying"은 같이 나오지만 근처가 아니거나 아예 같이 나오지 않기에 = 0
전체 corpus에 4만개의 단어가 있다고 가정.
프로세스:
- 40,000 x 40,000 매트릭스를 만들고 0으로 전부 초기화
- vocabulary를 봤을 때 'crawling'의 index가 200이고 'baby'의 index가 150이라면 200행(column), 150열(row) & 150행, 200열의 숫자를 하나씩 증가시켜줌
- 전체 corpus를 계산
--> 200번째 열은 crawling이라는 단어와 vocabulary에 다른 단어들과의 빈도수 통계가 나옴
하지만 40,000 x 40,000 매트릭스는 너무 크고, 한번도 나오지 않는 단어도 많을 것이기 때문에 sparse matrix이기도 함 --> 비효율
이 비효율은 어떻게 해결할 수 있을까? --> dimensionality reduction 으로 해결 가능
Dimensionality reduction: 40,000 x 40,000를 300 x 40,000으로 압축시켜줄 수 있는 알고리즘 --> 흩어져있는 애들을 단단하게 모아주자는 취지
Dimensionality Reduction(차원 축소): low-dimensional representation(저차원 표현)이 고차원 원본 데이터의 의미 있는 특성을 이상적으로 원래의 차원에 가깝게 유지할 수 있도록 고차원 공간에서 저차원 공간으로 데이터를 변환하는 것을 말함 ( Wikipedia)
차원 축소를 하게 되면 일부 정보 손실 (information loss)이 발생하지만 overfitting을 방지하는데도 효과적임
- GloVe는 Singular Value Decomposition (SVD)라는 알고리즘을 사용함 (SVD는 dimensionality reduction 알고리즘 중 하나, Principle Component Analysis (PCA)라는 알고리즘도 존재)
그렇게 300 x 40,000 행열로 압축 되면 각 열(300 x 1)이 하나의 단어를 대표함 --> 각 단어가 dense한 vector로 압축 된 것
e.g. crawling이라는 단어를 300개의 숫자로 표현 할 수 있게 된 것!
Neural Network를 이용한 word2vec
- word2vec은 continuous bag-of-words (CBOW) 또는 skipgram 알고리즘을 통해 학습시킬 수 있음
- 주변 단어와 타깃 단어의 관계를 classification으로 바꾸어 버림
CBOW: 주변 단어들을 모두 합쳐서 본 후 타깃 단어를 맞추기
skipgram: 타깃 단어를 보고 주변 단어를 맞추기
- "fox"가 타겟이라면
- CBOW: ["the", "quick", "brown", "jumps", "over"]을 가지고 "fox"를 예측 --> 좀 더 직관적
- skipgram: "fox"를 가지고 ["the", "quick", "brown", "jumps", "over"]를 각각 예측 --> 하지만 skipgram으로 학습된 embedding이 효과가 더 좋음
- 예측을 위한 classification model은 NN으로 구현이 되고, stochastic gradient descent (SGD)로 학습이 됨
- input = Nx1 word embedding
- 처음에는 무작위의 숫자로 embedding이 초기화되지만, 학습이 될수록 word embedding은 주변 단어들과의 관계에 대한 정보가 encoding됨
--> GloVe와 궁극적으로 같은 word embedding을 다른 방식으로 학습 시키는 것
<마드리드> - <스페인> + <프랑스> = <파리>!
- word2vec이나 GloVe로 학습된 word embedding들은 단어를 N차원에 사는 vector로 바꿔준 것
- 그래서 서로 더하거나 빼기 가능
--> 이 더하기 빼기를 통해 단어들의 의미적(semantic) 관계 & 문법적(syntatic) 관계를 알아낼 수 있음
위의 예시처럼
- 단어의 성별 관계
- 회사와 CEO 이름의 관계
- 도시와 ZIP code의 관계
- 형용사의 변형까지 (e.g. dark, darker, darkest)
벡터의 방향성에 encoding 되어있다는 걸 알 수 있음
이러한 word embedding들을 다른 NLP task의 input으로 사용했을 때 엄청난 성능 증가를 기대 할 수 있음
word embedding은 엄청난 양의 corpus로 학습돼서 각 단어에 대한 정보를 정확하고 깊게 담아낼 수 있기때문
내가 더 공부해야 할 부분들:
- SVD
- PCA
- SGD