단어 임베딩 : 단어의 의미를 이해하기 위해 어떻게 표현할 것인가?
- 글자의 나열?
- one-hot encoding?
- 좋은 표현방식: 단어 간의 관계를 잘 표현할 수 있어야 함
단어의 의미
- 어근(lemma),의미(sense)
- ex>
마우스는 쥐라는 뜻과 컴퓨터 주변기기 마우스가 있음.
복수형(mice)이나 단수형(mouse)이나 word-form은 다르지만, 모두 같은 어근임.
단어들의 관계는 어떤 것들이 있을까? 동의어(Synonyms)
- 문맥상 같은 의미를 가지는 단어들, 문장 안에서 단어를 교체해도 되는 경우
- filbert / hazelnet
- couch / sofa
- automobile / car
- vomit / throw up
- 동의어라고 해서 항상 그 단어로 대체할 수 있는 것은 아니다.
- H2O / water (문맥에 따라 다르다. 일상생활에서 water를 H2O로 대체해서 쓴다면 이상할 것
- big / large
- brave / courageous
유사성(Similarity)
- 유사한 의미를 가지는 단어들(동의어는 아닌)
- car / bicycle
- cow / horse
- 얼마나 유사한지 어떻게 평가할 수 있을까?
- 수작업으로 평가한 단어들의 유사도
연관성(Relatedness)
- 단어들은 의미의 유사성 외에도 다양한 방식으로 연관될 수 있다.
- Semantic field
- Semantic frame
Semantic field
- 특정한 주제나 영역(domain)을 공유하는 단어들
- ex> hospitals: surgeon, scalpel, nurse, anaesthetic, hospital
- ex> restaurants: waiter, menu, plate, food, chef
Semantic frame
- 특정행위에 참여하는 주체들의 역할에 관한 단어들
- 상거래라는 행위에 참여하는 주체들:buy,sell,pay 등의 단어는 같은 semantic frame을 공유하고 있고, 그런 면에서 관련된 단어라고 말할 수 있다.
Vector : 분포적 유사성
NLP에서는 거의 벡터로 의미 표현
- 단어들은 주변의 환경(주변의 단어들의 분포)에 의해 의미가 결정된다.
- 만약, 두 단어 A와 B가 거의 동일한 주변 단어들의 분포를 가지고 있다면 그 두 단어는 유사어이다.
- 따라서 단어의 의미를 분포적 유사성(distribution similarity)을 사용해 표현하고자 한다.
- ex> 다음과 같은 문장들이 있다고 하자.
- Ong choi is delicious and sauteed with garlic.
- Ong choi is superb over rice.
- Ong choi leaves with saulty sauces
- 그리고 다음 문장들도 있다고 하자.
- ...spinach sauteed with garlic over rice
- Chard stems and leaves are delicious
- Collard greens and other salty leafy greens
- 따라서 ong choi는 시금치와 같은 채소라는 것을 유추할 수 있다.
- 벡터를 사용해서 분포적 유사성(distributional similarity)을 표현
- 벡터공간 내에서 비슷한 단어들은 가까이 있다.
- 이렇게 벡터로 표현된 단어를 임베딩이라고 부른다. 보통은 밀집벡터인 경우를 임베딩이라고 부른다.
- 최근 NLP 방법들은 모두 임베딩을 사용해서 단어의 의미를 표현한다.
- dense(밀집) 하다는 것은 원소의 대부분이 0이 아니라는 의미. sparse 벡터는 반대로 원소 대부분이 0인것
왜 임베딩을 사용하는가?
- 임베딩을 사용하지 않는다면? one-hot encoding 등을 사용할 것
- 분류기의 속성은 한 단어의 존재 유무
- 학습 데이터와 테스트 데이터에 동일한 단어가 나타나지 않으면 예측결과가 좋지 못함.
- 임베딩을 사용하는 경우
- 각 속성은 단어 임베딩 벡터
- 테스트 데이터에 새로운 단어가 나타나도 학습 데이터에 존재하는 유사한 단어를 통해 학습한 내용이 유효하다.
임베딩의 종류
- 희소벡터(sparse vector)
- tf-idf
- Vector propagation (검색 엔진을 위한 질의어, 문서 표현)
- 밀집벡터(dense vector) - 대부분의 DL 모델에서는 주로 밀집벡터 사용
- word2vec
- Glove
Term-document 행렬
- 각 문서는 단어들의 벡터로 표현된다(vector space model)
- As You Like It 과 Twelfth Night / Julius Caesar 와 Henry V가 서로 유사함을 알 수 있음
단어 벡터
- 문서의 갯수가 제한되어 있어서 단어의 속성을 표현하는데 한계가 있음
Word-word 행렬(term-context 행렬)
- 주변 단어(window size를 정해서 그 단어의 앞 뒤 단어 포함)들의 빈도를 벡터로 표현
벡터의 유사도 계산하기
두 벡터의 각도를 통해 유사성을 판단할 수 있음
각도가 작으면 작을수록 유사함
cosine을 통해 구함
$similarity=cos(Θ)=\frac{A⋅B}{||A||\ ||B||}=\frac{\sum_{i=1}^{n}{A_{i}×B_{i}}}{\sqrt{\sum_{i=1}^{n}(A_{i})^2}×\sqrt{\sum_{i=1}^{n}(B_{i})^2}}$
TF-IDF
- 단어의 빈도수를 그대로 사용할 때의 문제점
- 자주나타나는 단어들("the","it","they")은 의미를 구별하는데 도움이 되지 않는다.
- 어떻게 하면 이런 단어들의 부작용을 최소화할 수 있을까?
- tf-idf (term-document 행렬의 적용을 받음)
- tf : term-document 행렬과 동일 idf : 역수에 전체 문서의 갯수를 곱하고 로그를 취한 값
- 다음과 같이 문서 d내의 단어t의 새로운 가중치 값을 계산한다.
$$w_{t,d}=tf_{t,d}\times idf_t$$ - $tf_{t,d}=count(t,d)$
- $tf_{t,d}=log_{10}(count(t,d)+ 1)$ (로그를 씌워 값이 급격하게 올라가는 것을 방지)
- df_t : 단어 t를 포함하는 문서들의 개수
- idf : inverse document frequency
- $$idf_t = log_{10}(\frac{N}{df_t})$$
- df_idf를 곱한다.
모든 문서에 general 하게 등장하는 단어는 빈도수 기반으로 표시하면 값이 크게 나타나지만, 변별력이 없는 단어이므로, tf-idf에서는 매우 작은 값이 나타나게 된다.
Dense Vectors
tf-idf vector
- 길다(|V| = 20000~50000)
- 희소성(sparse, 대부분의 원소가 0)
Word2vec, Glove
- 짧다(50~1000)
- 밀집성 (dense, 대부분의 원소가 0이 아님)
Dense vectors가 선호되는 이유
- 더 적은 개수의 학습 파라미터를 수반
- 더 나은 일반화 능력
- 동의어, 유사어를 더 잘 표현
Dense vectors가 단점을 보일 때: over generalization (유사한 두 단어 사이의 차이점을 무시하게 됨)
-> 두 가지 방식 (sparse / dense)의 벡터를 동시에 사용하여 보완하는 모델을 만들 수 있음 (ex. deep and wide)
Word2vec
- 주어진 단어 w를 인접한 단어들의 빈도수로 나타내는 대신, 주변 단어를 예측하는 분류기를 학습하면 어떨까?
- 단어w가 주어졌을 때 단어c가 주변에 나타날 확률은?
- 우리의 관심은 이 예측모델의 최종예측값이 아니라 이 모델 내 단어 w의 가중치 벡터이다.
- self-supervision
- 이 모델을 학습하기 위한 목표값은 이미 데이터 내에 존재한다.
- 사람이 수동으로 레이블을 생성할 필요가없다.
Skip-Gram
Word2Vec을 학습하는 방법 중 하나인 Skip-Gram에 대해 살펴보자.
Skip-gram 모델은 한 단어가 주어졌을 때, 그 주변 단어를 예측할 확률을 최대화 하는 것이 목표이다. 즉 단어들의 시퀀스 $w_1, ..., w_r$가 주어졌을 때 다음 확률을 최대화하고자 한다.
파라미터를 명시화해서 우도함수로 표현하면 다음과 같다.
파라미터 $\theta = {W, C}$는 두 개의 임베딩 행렬 $W$와 $C$를 포함한다. $W$를 목표(또는 입력) 임베딩 행렬, $C$를 상황(또는 출력) 임베딩 행렬이라고 부른다.
$W$와 $C$의 shape은 같으며, 만약 사전에 5만개의 단어가 있다면 $W$는 5만개의 $d$차원 벡터로 이루어진다.
하나의 목표 단어 $w$와 상황 단어 $c$가 주어졌을 때 $v_w$와 $u_c$를 각각 임베딩 벡터라고 하면 skip-gram 모델은 다음가 같은 확률 모델을 가정한다. (dot product를 통해 두 단어 사이의 유사성을 포착한다.)
($w$가 주어졌을 때 $c$를 예측하는 문제로, $v_w$가 하나의 입력 속성 벡터. 이것은 굉장이 차원이 큰 multi class classification 문제를 푸는 것으로 생각할 수 있다. 하지만 여기서 우리가 얻으려는 것은 예측값이 아니라 $v_w$임을 기억하자.)
(단어를 그대로 넣지 않고 처리해서 넣게 된다.)
여기서 $x_w$를 단어 $w$에 대한 one-hot 벡터라고 하면, $v_w$와 $u_c$는 다음과 같이 정의된다.
이 문제에 해당하는 신경망은 다음과 같다.
hidden layer가 하나인 neural network 형태
- 이 모델의 문제점은?
-
- 위 식의 분모 계산량이 많다. (|V|d와 비례) (normalization할 때 vocabulary size에 맞게 다 계산해야함)
- 해결책
- Noise-constrastive estimation: Normalization constant(분모)를 여러 개의 합이 아닌 하나의 파라미터로 학습한다. 다중클래스 분류 문제를 이진 분류 문제로 변환하여 새로운 목표함수를 최적화시킨다. 이렇게 해서 얻어지는 파라미터들이 원래 likelihood의 최적해를 근사한다는 것이 증명된다.
- 이것을 조금 더 단순화시키면 negative sampling이 된다.
- Word2vec은 negative sampling을 사용한다.
Nagative Sampling
Negative sampling을 사용했을 때 목표함수는 다음과 같다.
- 신경망의 구조는 그대로
- normalization constant를 계산할 필요가 없다.
- gradient 계산이 단순화된다.
Word2Vec 학습과정 요약
- |v|개의 d차원 임베딩을 랜덤하게 초기화
- 주변 단어들의 쌍을 positive example로 생성
- 빈도수에 의해 추출된 단어들의 쌍을 negative example로 생성
- 위 데이터를 사용해 분류기 학습
- 학습된 임베딩 w가 최종 결과물
워드임베딩, word2vec 참고자료
https://m.blog.naver.com/jujbob/221155564430
https://www.sallys.space/blog/2018/04/05/Word2vec,-skip-gram-model/
https://ratsgo.github.io/from%20frequency%20to%20semantics/2017/03/30/word2vec/
https://byeongkijeong.github.io/Word2vec-from-scratch-using-keras/
https://keep-steady.tistory.com/7
https://lsjsj92.tistory.com/600
'Deep Learning > Natural Language Processing' 카테고리의 다른 글
한국어 오픈소스 말뭉치 활용 라이브러리 코포라 Korpora (0) | 2022.03.14 |
---|---|
자연어 처리 왕초보 가이드 (3) | 2021.12.08 |
[W13D4] NLP : 문서분류 (0) | 2021.07.30 |
[W13D3] NLP : 단어 모델 (0) | 2021.07.29 |
[W13D2] NLP 텍스트 전처리 (0) | 2021.07.29 |