-
[n422] Distributed RepresentationAI 부트캠프 2021. 12. 27. 10:25
Distributed Representation (단어의 분산 표현)
분포 가설(Distribution Hypothesis)에 의해 해당 단어 주변 단어에 의해 타겟 단어(Target word)가 결정된다. 타겟 단어는 사용자가 벡터화 하고자 하는 단어를 뜻한다.
분포 가설이란 '비슷한 위치에서 등장하는 단어들은 비슷한 의미를 가진다'
즉 단어의 분산 표현은 위의 분포 가설을 따르며, 타겟 단어가 주변 단어에 의해 결정 된다.
원-핫 인코딩 (One-hot Encoding)
원-핫 인코딩은 단어를 벡터화의 가장 쉬운 방법이다. [1 0 0 0], [0 1 0 0] 등과 같이 표현한다.
sent = "I am a student" word_lst = sent.split() word_dict = {} for idx, word in enumerate(word_lst): vec = [0 for _ in range(len(word_lst))] vec[idx] = 1 word_dict[word] = vec print(word_dict)
{'I': [1, 0, 0, 0], 'am': [0, 1, 0, 0], 'a': [0, 0, 1, 0], 'student': [0, 0, 0, 1]}
하지만 원-핫 인코딩은 단어간의 유사도를 구할 수 없. 그래서 실무에서 자주 쓰이지 않는다.
단어 간 유사도를 구할 때 코사인 유사도(Cosine Similarity)를 사용하는데, 원-핫 인코딩을 사용한 두 벡터의 내적은 항상 0이므로 코사인 유사도를 구해도 단어 간의 관계를 파악할 수 없다. 이 점이 원-핫 인코딩의 한계이다.
임베딩 (Embedding)
임베딩은 원-핫 인코딩의 단점을 해결하기 위해 등장하였다. 단어를 차원이 일정한 벡터로 나타낸다.
즉, [0.02227, -0.0031, 0.1207, -0.0336, ...]와 같은 형태로 값을 가진다.
임베딩 방법 중에 가장 많이 알려지고 사용되는 것은 Word2Vec이 있다.
Word2Vec
단어를 벡터로 나타내는 임베딩 방법 중 하나 이다.
- Word2Vec으로 생성한 임베딩 벡터는 단어의 의미적, 문법적(구조적) 관계를 잘 보존하고 있다.
- Word2Vec의 기본 구조는 은닉층이 1개인 신경망이다.
- Word2Vec의 기본 구조에서 은닉층의 노드 개수는 임베딩 벡터의 차원을 결정한다.
CBoW 와 Skip-gram
Word2Vec을 사용하는 방법 CBoW 와 Skip-gram가 있다.
- CBoW (Continuous Bag-of-Words) : 주변 단어에 관한 정보를 바탕으로 중심 단어의 정보를 예측하는 모델
- Skip-gram : CBoW와 반대의 개념으로, 중심 단어에 관한 정보를 기반으로 주변 단어의 정보를 예측하는 모델
Word2Vec 모델의 구조
CBoW보다 조금 더 성능이 좋은 Skip-gram을 기준으로 Word2Vec의 구조에 대해 설명하자면 다음과 같다.
- 입력 : 입력값은 원-핫 인코딩된 단어 벡터
- 은닉층 : 은닉층이 1개인 신경망으로, 임베딩 벡터의 차원수만큼의 노드로 구성 되었다.
- 출력층 : 활성화 함수는 Softmax를 사용하며, 단어 수 만큼 노드가 구성 되었다.
Word2Vec으로 임베딩한 벡터 시각화
fastText
word2vec 방식과 character 기반의 임베딩 방식을 융화시킨 임베딩 방식이다. Word2Vec은 등장하지 않는 단어에 대해서는 학습하지 않기 때문에 예측 단계에서 새로운 단어를 만나면 에러가 발생한다. (Out of Vocabulary, OOV 문제). 이 문제를 해결하기 위해 등장한 것이 철자 단위 임베딩이다.
철자 단위 임베딩 (Character Level Embedding)
fastText 는 등장하지 않은 단어를 학습하지 못했어도, 철자 단위로 쪼갠 뒤 유추해서 OOV 문제를 해결한다.
예를 들어, "맞벌이" 단어를 모를 때, "맞선, 맞절, 맞대다, 맞들다", "벌다, 벌어, 벌고", "먹이, 깊이, 넓이" 를 통해 접두사의 의미, 어근의 의미, 접미사의 의미를 유추할 수 있다.
Character n-gram는 fastText가 Character-level(철자 단위) 임베딩을 적용하는 법이다.
3-6gram 단위를 사용하며, 문자 양 옆에 <> 기호를 붙인다. 즉, eating 단어를 3-gram 한 경우 다음과 같다.
eating 이라는 단어가 말뭉치 내에 있다면 skip-gram으로부터 학습한 임베딩 벡터에 위에서 얻은 18개 Character-level n-gram 들의 벡터를 더해준다. 반대로, eating 이라는 단어가 말뭉치에 없다면 18개 Character-level n-gram 들의 벡터만으로 구성한다.
철자 단위 임베딩 (Character Level Embedding) 시각화
붉은색은 관계가 밀접한 것을 나타내고, 파란색은 연관 없음을 나타낸다.
ity>와 ness>은 모두 명사를 나타내는 접미사로 관계가 밀접하게 나왔다.
이 경우에는 link, connect가 서로 연관이 많음을 알 수 있다.
'AI 부트캠프' 카테고리의 다른 글
[n424] Transformer (0) 2021.12.29 [n423] RNN, LSTM (0) 2021.12.28 [n421] Count-based Representation (0) 2021.12.24 [n414] 신경망 기본 개념 요약 (0) 2021.12.22 [n414] 하이퍼 파라미터 튜닝 (0) 2021.12.22