일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- SQL
- 패스트캠퍼스수강후기
- 노르웨이기준금리
- 파이썬수업
- 중국수출통제
- 파이썬온라인수업
- 파이썬기초
- 파이썬독학하기
- 셀레니움
- 파이썬인강
- 파이썬강의
- 비전공자파이썬
- 파이썬독학
- 패스트캠퍼스후기
- 광교카페
- 파이썬문법
- MBTI성격검사
- 파이썬강의후기
- 파이썬클래스
- swift문법
- 비트코인
- 순천여행
- 스크래핑
- 파이썬배우기
- 스위스기준금리
- MBTI성격유형
- MBTI
- 파이썬 인강
- 암호화폐
- 미국디리스킹
- Today
- Total
이제 데이터 공부 안하는 블로그
분산 표현(Distributed representation) 본문
* 제가 공부하기 위해 만든 자료입니다. 혹시 틀린 부분이 있다면 댓글로 알려주시면 수정하겠습니다.
분포가설
단어의 분산 표현은 '비슷한 위치에 등장하는 단어들은 비슷한 의미를 가진다.' 라는 분포가설을 기반으로 주변 단어 분포를 기준으로 타겟 단어 벡터를 정하는 것을 말한다. 예를 들어 dog 라는 단어 근처에는 lovely, cute 이라는 단어가 자주 등장하므로 dog는 lovely 하고 cute 하다라는 표현도 함께 정의할 수 있다. * 제가 공부하기 위해 만든 자료입니다. 혹시 틀린 부분이 있다면 댓글로 알려주시면 수정하겠습니다.
원 핫 인코딩과 임베딩
컴퓨터는 텍스트를 이해할 수 없기 때문에 컴퓨터가 이해할 수 있는 언어로 벡터화를 해주어야 하는데, 단어를 벡터화하는 가장 쉬운 방법은 원-핫 인코딩(One-hot Encoding) 이다. 원-핫 인코딩은 단어 집합의 크기를 벡터의 차원으로 하고, 표현하고 싶은 단어의 인덱스에는 1의 값을 부여하고, 다른 인덱스에는 0을 부여하여 단어의 벡터를 표현하는 방식이다.
"I am a student"
라는 문장에서 각 단어를 원-핫 인코딩으로 나타내면 다음과 같다.
I : [1 0 0 0]
am : [0 1 0 0]
a : [0 0 1 0]
student : [0 0 0 1]
원-핫 인코딩은 직관적으로 이해할 수 있는 쉬운 방법이지만 단어들간의 유사도를 구할 수 없다는 큰 단점이 있다. 이 단점을 보완하기 위해서 등장한 것이 임베딩(Embedding) 이다. 가장 널리 사용되는 임베딩 방법인 Word2Vec에 대해 알아보자.
Word2Vec
말 그대로 단어를 벡터로 (Word to Vec) 나타내는 방법이다. '비슷한 위치에서 등장하는 단어들은 비슷한 의미를 가진다' 라는 분포가설에 따라 특정 단어 양 옆에 있는 두 단어의 관계를 활용하여 표현하는 방법이다. Word2Vect 에는 CBOW(Continuous Bag of Words)와 Skip-Gram 두 가지 방식이 있다.
1. CBOW(Continuous Bag of Words)
CBOW는 주변에 있는 단어들을 가지고, 중간에 있는 단어들을 예측하는 방법이다.
2. Skip-Gram
중심 단어의 정보를 기반으로 주변 단어의 정보를 예측하는 방법이다.
<별 헤는 밤> 의 일부분에 형태소 분석기를 적용하여 토큰화한 것입니다.
“… 어머님 나 는 별 하나 에 아름다운 말 한마디 씩 불러 봅니다 …”
CBoW 를 사용하면 표시된 단어 정보를 바탕으로 아래의 [ ---- ] 에 들어갈 단어를 예측하는 과정으로 학습이 진행됩니다.
“… 나 는 [ -- ] 하나 에 … “
“… 는 별 [ ---- ] 에 아름다운 …”
“… 별 하나 [ -- ] 아름다운 말 …”
“… 하나 에 [ -------- ] 말 한마디 …”
Skip-gram 을 사용하면 표시된 단어 정보를 바탕으로 다음의 [ ---- ] 에 들어갈 단어를 예측하는 과정으로 학습이 진행됩니다.
“… [ -- ] [ -- ] 별 [ ---- ] [ -- ] …”
“… [ -- ] [ -- ] 하나 [ -- ] [ -------- ] …”
“… [ -- ] [ ---- ] 에 [ -------- ] [ -- ] …”
“… [ ---- ] [ -- ] 아름다운 [ -- ] [ ------ ] …”
Skip-gram에서 훨씬 더 많은 학습이 일어나기 때문에 일반적으로 Skip-gram의 성능이 조금 더 좋게 나타난다.
Word2Vec 모델의 구조
Skip-gram을 기준으로 Word2Vec의 구조를 살펴보면 (총 10,000개의 단어에 대해서 300차원의 임베딩 벡터를 구한 신경망 구조)
- 입력 : Word2Vec의 입력은 원-핫 인코딩된 단어 벡터
- 은닉층 : 임베딩 벡터의 차원수 만큼의 노드로 구성된 은닉층이 1개인 신경망. 은닉층의 노드 개수는 출력 벡터의 차원을 결정한다.
- 출력층 : 단어 개수 만큼의 노드로 이루어져 있으며 활성화 함수로 소프트맥스를 사용
학습이 끝나면 아래의 그림과 같이 10,000개의 단어에 대한 300차원의 임베딩 벡터가 생성된다.
Word2Vec으로 임베딩한 벡터 시각화
위의 사진에서 보는 것과 같이 Word2Vec을 통해 얻은 임베딩 벡터는 단어간의 의미적, 문법적 관계를 잘 나타낸다. 다만, Word2Vec은 말뭉치에 등장하지 않는 단어는 벡터화 할 수 없다는 단점이 있다.
gensim 패키지로 Word2Vec 실습하기
gensim은 word2vec으로 사전 학습된 임베팅 벡터를 쉽게 사용할 수 있는 패키지이다.
gensim 패키지를 최신 버전으로 업그레이드 한 후, 런타임을 다시 시작한다.
.__version__ 으로 최신 버전인지 확인한다.
실습을 위해 구글 뉴스 말뭉치로 학습된 word2vec 벡터를 다운받는다. (시간이 오래 걸림)
gensim 패키지의 .similarity 메서드를 활용하면 단어 간 유사도를 파악할 수 있다. 아래는 'car'와 여러 단어의 유사도 결과를 보여준다. car와 minivan 은 가장 큰 유사도 점수를 보여주고, cereal이나 democracy는 낮은 유사도 점수를 보여준다 (신기함!)
gensim 패키지의 .most_similar 메서드를 활용하면 가장 유사한 단어만 뽑아볼 수 있다. 아래는 'car' 벡터에 'minivan' 벡터를 더한 벡터와 가장 유사한 단어 5개만 뽑은 것이다.
gensim 패키지의 .doesnt_match 메서드를 활용하면 가장 관계 없는 단어를 뽑을 수 있다.
참고자료 : https://wikidocs.net/22660
'딥러닝' 카테고리의 다른 글
순환 신경망 (Recurrent Neural Network, RNN) (0) | 2021.08.19 |
---|---|
Fast Text - 철자 단위 임베딩(Character level Embedding) (0) | 2021.08.18 |
자연어처리(NLP, Natural Language Processing) (0) | 2021.08.17 |
신경망 학습 최적화 방법 Optimization (0) | 2021.08.12 |
과적합을 막기 위한 방법 - Early Stopping, Weight Decay, Weight Constraints, Dropout (0) | 2021.08.11 |