워드 임베딩(Word Embedding)
ㄴ 단어나 문구를 벡터 공간에 매핑하는 기술
ㄴ 텍스트를 컴퓨터가 이해할 수 있도록 숫자로 변환
ㄴ 단어를 표현하는 방법에 따라서 자연어 처리의 성능이 크게 달라짐
ㄴ 각 단어를 인공 신경망 학습을 통해 벡터(Vector)화하는 방법
ㄴ 케라스에서 제공하는 Embedding() => 단어를 랜덤한 값을 가지는 벡터로 변환한 뒤에, 인공 신경망의 가중치(W)를 학습
인공지능에서 벡터(vector)란
ㄴ 인공지능 분야에서 벡터는 대개 고차원의 숫자 배열(array)을 의미함
ㄴ 이미지 데이터의 벡터는 각 픽셀(pixel)의 색상 값을 숫자로 표현하고, 이러한 숫자들을 배열 형태로 나열한 것
(예를 들어, 28 x 28 픽셀의 흑백 이미지는 784차원의 벡터)
ㄴ 텍스트 데이터의 벡터는 각 단어(word)를 고유한 정수 인덱스(index)로 매핑하여, 이를 순서대로 배열한 것
= > 단어 간의 유사도 계산, 문서 간의 유사도 비교 등 다양하게 활용
케라스의 Embedding()
ㄴ 훈련 데이터의 단어들에 대해 워드 임베딩을 수행
문장의 감성 분류 모델
ㄴ 문장의 긍, 부정을 판단하는 감성 분류 모델
import numpy as np
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
sentences = ['nice great best amazing', 'stop lies', 'pitiful nerd',
'excellent work', 'supreme quality', 'bad', 'highly respectable']
y_train = [1, 0, 0, 1, 1, 0, 1]
= > 긍정인 문장은 1, 부정인 문장은 0
1. keras의 tokenizer를 사용하여 단어 집합을 만들고 크기 확인
from keras.preprocessing.text import Tokenizer # 텍스트 데이터를 단어 단위 또는 문자 단위로 분리해주는 기능
tokenizer = Tokenizer()
tokenizer.fit_on_texts(sentences) # 주어진 텍스트 데이터를 학습하여 각 단어나 문자에 대한 인덱스를 만들고 이를 저장
vocab_size = len(tokenizer.word_index) # 데이터에서 등장한 모든 단어를 인덱스에 매핑하고 vocab_size 변수에 전체 단어의 개수를 저장
2. 각 문장에 대해서 정수 인코딩을 수행
x_encoded = tokenizer.texts_to_sequences(sentences) # 텍스트 데이터를 토큰화된 시퀀스 데이터로 변환
3. 가장 길이가 긴 문장의 길이 계산
max_len = max(len(l) for l in x_encoded) # x_encoded에서 가장 긴 시퀀스의 길이를 저장
ㄴ max() 함수와 리스트 내포를 사용
ㄴ x_encoded 리스트의 각 요소(시퀀스)의 길이를 계산
ㄴ 이렇게 구한 길이들 중 최댓값을 max_len 변수에 저장
4. 최대 길이로 모든 샘플에 대해서 패딩 진행
x_train = pad_sequences(x_encoded, maxlen=max_len, padding='post')
# pad_sequences : x_encoded 데이터를 입력으로 받아, 시퀀스의 길이를 맞추기 위해 패딩을 추가하는 작업을 수행
# maxlen 인자 : 시퀀스의 최대 길이를 지정 -> 이보다 짧은 시퀀스는 0으로 패딩됨
# padding 인자는 패딩 방식을 지정 -> post로 설정할 경우 시퀀스의 뒷부분에 패딩이 추가
y_train = np.array(y_train) # y_train 데이터 : numpy 배열로 변환하여 저장
print('패딩 결과 :')
print(x_train)
ㄴ 정수 인코딩된 시퀀스 데이터를 패딩하여 길이를 맞추는 작업
5. 전형적인 이진 분류 모델을 설계
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Embedding, Flatten
embedding_dim = 4 # 임베딩 벡터의 차원 수
model = Sequential() # 모델 객체 model을 생성
model.add(Embedding(vocab_size, embedding_dim, input_length=max_len)) # embedding 층
# vocab_size : 전체 단어 집합의 크기
# embedding_dim : 임베딩 벡터의 차원을 지정
# input_length : 입력 시퀀스의 길이를 지정
model.add(Flatten()) # 2차원의 임베딩 벡터를 1차원으로 변환
model.add(Dense(1, activation='sigmoid')) # 1차원으로 펼쳐진 데이터는 Dense 층을 통해 분류 작업을 수행
# Dense 층은 입력 데이터에 대한 선형 변환을 수행
# activation 인자에 지정된 활성화 함수를 사용하여 출력값을 계산
ㄴ Dense 층의 첫 번째 인자는 출력 뉴런의 수
ㄴ 이 예제에서는 이진 분류 문제를 다루고 있기 때문에 출력(output)에 뉴런의 수를 1로 지정
ㄴ 만약 다중 클래스 분류 문제를 다룬다면, 출력 뉴런의 수는 클래스의 개수와 동일하게 지정해야 함
ㄴ 이진 분류 문제를 다루는 경우, 출력값이 0과 1 사이의 값이어야 하므로 활성화 함수는 sigmoid 함수를 사용
# 모델 컴파일
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['acc'])
# optimizer : 최적화 알고리즘 -> adam 이 성능 제일 좋음
# loss : 이진 분류 문제에서의 손실함수는 binary_crossentropy
# metrics : 평가 지표 설정 (acc : 정확도)
# 모델 학습
model.fit(X_train, y_train, epochs=100, verbose=2)
# x_train : 입력 데이터
# y_train : 정답 데이터
# epochs : 학습할 에포크 수 설정
# verbose : 학습 진행 상황을 출력할 지 결정하는 인자
# verbose=0은 출력하지 않음
# verbose=1은 진행 상황을 출력
# verbose=2는 간단한 진행 막대를 출력
ㄴ 모델 컴파일 및 학습
ㄴ 이진분류 이므로 손실 함수로 binary_crossentropy 사용
'네이버클라우드 > AI' 카테고리의 다른 글
AI 5일차 (2023-05-12) 인공지능 기초 - Imdb 와 Rueters (0) | 2023.05.12 |
---|---|
AI 5일차 (2023-05-12) 인공지능 기초 - Tokenizer 와 Embedding (0) | 2023.05.12 |
AI 4일차 (2023-05-11) 인공지능 기초 - 이미지 분석 : 데이터 셋 (0) | 2023.05.11 |
AI 4일차 (2023-05-11) 인공지능 기초 - 이미지 분석 : CNN 모델 (0) | 2023.05.11 |
AI 3일차 (2023-05-10) 인공지능 기초 - Save model, Save weight, Model Check Point (0) | 2023.05.10 |