이번 포스팅은 임베딩(Embedding)에 대해서
학습하겠습니다.
해당 포스팅을 참고하며 진행하겠습니다.
https://velog.io/@glad415/%EC%9E%84%EB%B2%A0%EB%94%A9Embedding%EC%9D%B4%EB%9E%80
임베딩(Embedding)이란?
임베딩이란 자연어처리에서 사람이 쓰는 자연어를 기계가 이해할 수 있도록 숫자형태인 vector로 바꾸는 과정 혹은 일련의 전체 과정을 의미합니다.단어나 문장 각각을 벡터로 변환해 벡터 공간(
velog.io
09-01 워드 임베딩(Word Embedding)
워드 임베딩(Word Embedding)은 단어를 벡터로 표현하는 방법으로, 단어를 밀집 표현으로 변환합니다. 희소 표현, 밀집 표현, 그리고 워드 임베딩에 대한 개념을 학습합…
wikidocs.net
https://heytech.tistory.com/345
[NLP] Word Embedding의 이해: 희소표현과 밀집표현
📚 목차 1. 희소표현(Sparse Representation) 2. 밀집표현(Dense Representation) 3. 워드임베딩(Word Embedding) 들어가며 워드 임베딩(Word Embedding)은 단어(Word)를 컴퓨터가 이해할 수 있도록 벡터로 표현하는 기법
heytech.tistory.com
1. 텍스트 벡터화
자연어 처리를 할때
컴퓨터는 텍스트가 아닌 숫자를 인지하기 때문에
언어나 텍스트 데이터의 특징을 추출해
수치화 하는 작업이 필요합니다
이 작업을 "텍스트 벡터화"라고 합니다.
텍스트 벡터화의 방식에는
희소표현, 밀집표현이 있습니다.
2. 희소 표현(Sparse Representation)
벡터 또는 행렬의 값이 대부분 0으로 표현되는 방법을
희소표현이라고 합니다.
희소표현의 방식에는 원핫 인코더가 있습니다.
원핫디코더를 텍스트의 벡터화 측면에서 보면
텍스트를 위치 값으로서 0과 1로 표현해줍니다.
방식은 많지만
저는 제가 애정하는 Scikit의 OneHotEncoder()를
사용해서 변환 해서 설명해보겠습니다.
import pandas as pd
import numpy as np
from sklearn.preprocessing import OneHotEncoder
X = np.array(["달","밝은", "밤이면", "창가에", "흐르는", "내", "젊은","연가가", "구슬퍼"])
# 원핫인코딩
ohe = OneHotEncoder(sparse=False)
X = ohe.fit_transform(X.reshape(-1,1))
print(X)
'''
[[0. 0. 1. 0. 0. 0. 0. 0. 0.] "달"
[0. 0. 0. 1. 0. 0. 0. 0. 0.] "밝은"
[0. 0. 0. 0. 1. 0. 0. 0. 0.] "밤이면"
[0. 0. 0. 0. 0. 0. 0. 1. 0.] "창가에"
[0. 0. 0. 0. 0. 0. 0. 0. 1.] "흐르는"
[0. 1. 0. 0. 0. 0. 0. 0. 0.] "내"
[0. 0. 0. 0. 0. 0. 1. 0. 0.] "젊은"
[0. 0. 0. 0. 0. 1. 0. 0. 0.] "연가가"
[1. 0. 0. 0. 0. 0. 0. 0. 0.]] "구슬퍼"
'''
9개의 단어가
9개의 특징으로 나뉘어져 0과 1로 수치화 되었습니다.
여기서 원핫 인코딩의 문제가 있습니다.
수치화를 했는데 데이터도 많아졌을 뿐더러
0의 비율이 너무 많아졌습니다.
이렇게 되면 모델 훈련시 느리고 예측 성능이 떨어질 가능성이 커진다고 합니다!
이렇듯 원핫을 비롯해 희소표현으로 변환된
희소벡터는 단어의 의미를 잘 표현하지 못한다고 합니다.
2. 밀집 표현 (Dence Representation)
밀집 표현은 희소표현과 반대되는 개념입니다.
사용자가 설정한 값으로 벡터의 차원을 맞춘다고 합니다.
데이터는 0~1사이로 표현됩니다.
희소표현과 함께 비교하면서 이해해보겠습니다.
원핫 코드를 보면
"달" 이라는 어절을
[0 0 1 0 0 0 0 0 0]
로 변경해 줬습니다.
밀집표현으로 이 "달"이라는 단어를
64 차원으로 변경해준다면
[0.12 0.77 0.84 0.22 0.54 0.80,,,,]
(뒤에 58개는 생략)
0~1 사이의 값이 64개
밀집표현의 차원(컬럼?)이 생성되어 채워졌습니다.
밀집표현의 기법에는 임베딩(Embedding)이 있습니다.
3. 임베딩(Embedding)
먼저 텐서플로우 문서를 보도록 하겠습니다.
https://www.tensorflow.org/text/guide/word_embeddings?hl=en
단어 임베딩 | Text | TensorFlow
이 페이지는 Cloud Translation API를 통해 번역되었습니다. Switch to English 단어 임베딩 컬렉션을 사용해 정리하기 내 환경설정을 기준으로 콘텐츠를 저장하고 분류하세요. 이 자습서에는 단어 임베딩
www.tensorflow.org
cat, mat, on 이라는 단어가 4차원 임베딩으로
구성되면 아래와 같이 부동소수점의 Dence Vector로
구성된 다이어그램이 됩니다.
임베딩은 조회 테이블이라고 보면 된다고 하네요.
가중치를 학습한 후 테이블에서 단어에
해당하는 밀집 벡터를 찾아서 인코딩을 한다고합니다.
이 인코딩이 즉, 밀집표현의 차원에 0~1 값을 채우는 과정입니다.
keras의 Tokenizer로 문자를 수치화 해주고
Embedding() 레이어를 거친 값을 출력해줬습니다.
직접 확인해보니 Embedding()의 파라미터는
단어의 개수를 input_dim, 밀집표현의 차원의 개수를 output_dim 이라고
보는게 맞는 것 같습니다.
import pandas as pd
import numpy as np
from keras.layers import Embedding
X = np.array(["달","밝은", "밤이면", "창가에", "흐르는", "내", "젊은","연가가", "구슬퍼"])
from keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer()
tokenizer.fit_on_texts(X)
x_sequences = np.array(tokenizer.texts_to_sequences(X))
print(x_sequences.shape) #(9, 1)
embedding_layer = Embedding(input_dim=9, output_dim=2) #input_dim : 단어개수, output_dim: 차원 개수
result = np.array(embedding_layer(x_sequences))
print(result.shape)#(9, 1, 2)
print(result)
'''
[[[ 3.8905766e-02 -9.9718571e-05]]
[[-1.7803203e-02 2.9292885e-02]]
[[-2.2699013e-03 -4.7505736e-02]]
[[-1.1678111e-02 2.6979659e-02]]
[[-7.5961463e-03 2.2079471e-02]]
[[-2.4064351e-02 3.3964466e-02]]
[[ 1.8570069e-02 1.3875153e-02]]
[[ 3.3278737e-02 2.2439685e-02]]
[[ 0.0000000e+00 0.0000000e+00]]]
'''
밀집표현의 차원의 개수를 5개로 늘려보면
9x5의 조회 테이블, 즉 임베딩을 얻을 수 있습니다.
embedding_layer = Embedding(input_dim=9, output_dim=5)
result = np.array(embedding_layer(x_sequences))
print(result.shape)#(9, 1, 5)
print(result)
'''
[[[ 0.00477131 -0.04287178 0.00361929 0.01333213 -0.02192663]]
[[-0.00837155 0.00626709 0.04374525 -0.03213976 0.0266226 ]]
[[ 0.00735215 0.02038765 -0.0424327 -0.0192417 -0.02178895]]
[[ 0.03623239 0.01762425 -0.00429205 0.01020346 0.02606006]]
[[-0.0498311 -0.03270175 -0.00377637 0.03170151 -0.04811602]]
[[-0.03430237 0.03651917 -0.00129032 0.01626677 0.00634655]]
[[-0.00240629 -0.01048706 0.0080834 0.01493727 0.01620818]]
[[ 0.02655579 0.03729847 -0.03375788 0.00081546 0.01415124]]
[[ 0. 0. 0. 0. 0. ]]]
'''
이 4차원 임베딩을 구현해보면 이런 형태가 되겠네요.
모델은 학습을 진행하면서 임베딩 다이어그램에
입력된 단어를 Dense Vector로 인코딩 할 수 있습니다.
import numpy as np
from keras.layers import Embedding
X = np.array(["cat","mat", "on"])
from keras.preprocessing.text import Tokenizer
tokenizer = Tokenizer()
tokenizer.fit_on_texts(X)
x_sequences = np.array(tokenizer.texts_to_sequences(X))
print(x_sequences.shape) #(3, 1)
embedding_layer = Embedding(input_dim=3, output_dim=4)
result = np.array(embedding_layer(x_sequences))
print(result.shape)#(3, 1, 4)
print(result)
'''
[[[-0.0170779 0.03554878 0.03025447 -0.00052363]]
[[ 0.02581792 -0.02460885 -0.03337549 0.00473196]]
[[-0.04555179 -0.01618879 -0.02047335 -0.03256543]]]
'''
임베딩에 대해서 학습을 해봤는데
들여다 볼수록
깊은 개념인 것 같습니다....
그만큼 자연어 처리에서의 핵심 개념이기도 하구요.
학습을 하며 찾아다녔던 Embedding 관련해서
다시 볼 자료를 첨부하고 글 마무리 하겠습니다.
내용 중 잘못된 부분 있으면 지적 부탁드립니다!
1) Embedding projector 임베딩 파일 시각화
https://projector.tensorflow.org/
Embedding projector - visualization of high-dimensional data
Visualize high dimensional data.
projector.tensorflow.org
2) Word2Vec 실습
https://wikidocs.net/50739
09-03 영어/한국어 Word2Vec 실습
gensim 패키지에서 제공하는 이미 구현된 Word2Vec을 사용하여 영어와 한국어 데이터를 학습합니다. ## 1. 영어 Word2Vec 만들기 파이썬의 gensim 패키지…
wikidocs.net
3) embedding 실습
https://colab.research.google.com/drive/1Qu8gKCY1itT_3DZnjLN6VjQsCCMSpClb?usp=sharing
embeddings-101.ipynb
Colaboratory notebook
colab.research.google.com
4) openAI Embedding
https://platform.openai.com/docs/guides/embeddings
'인공지능 개발하기 > Machine Learning' 카테고리의 다른 글
SVM(Support Vector Mchine) (1) | 2024.02.13 |
---|---|
[Tensorflow] 32. 앙상블(Ensemble) (1) | 2024.02.11 |
[Tensorflow] 30. keras RNN 모델 살펴보기 (0) | 2024.02.03 |
[Tensorflow] 29. RNN(Recurrent neural network) (1) | 2024.02.03 |
[Tensorflow] 28. ImageDataGenerator 이미지 데이터 증강(augument) (2) | 2024.01.27 |