복습하기 위해 학부 수업 내용을 필기한 내용입니다.
이해를 제대로 하지 못하고 정리한 경우 틀린 내용이 있을 수 있습니다.
그러한 부분에 대해서는 알려주시면 정말 감사하겠습니다.
Time-Series Data and Recurrent Neural Networks
▶8.5 자연어 처리
Natural Language Processing(NLP)
- 인간이 구사하는 언어를 자동으로 처리하는 인공지능 분야
(언어 번역, 댓글 분석 → 흥행 추정, 고객 응대 챗본 등)
8.5.1 텍스트 데이터에 대한 이해
텍스트 데이터의 특성
- 시계열 데이터로서 시간 정보가 있고 샘플마다 길이가 다르다는 기본 성질
- 그 외의 독특한 특성
- 심한 잡음
- 형태소 분석 필요
- 구문론과 의미론
- 다양한 언어 특성
- 신경망에 입력하려면 기호를 수치로 변환해야 한다.
원핫 코드 표현으로 변환하는 절차
Freshman loves python.
We teach python to freshman.
How popular is Python?
- 단어 수집(괄호 속은 빈도수)
- Python(3), freshman(2), loves(1), we(1), teach(1), to(1), how(1), popular(1), is(1)
- 파이썬의 자료구조인 딕셔너리를 이용한 표현(빈도수에 따른 순위 부여)
- {‘python’:1, ‘freshman’:2, ‘loves’:1, ‘we’:1, ‘teach’:1, ‘to’:1, ‘how’:1, ‘popular’:1, ‘is’:1}
- 텍스트를 숫자 코드로 변환
Freshman loves python. → [2 3 1]
We teach python to freshman. → [4 5 1 6 2]
How popular is Python? → [7 8 9 1]
원핫 코드 표현
[2 3 1] → [[010000000] [001000000] [100000000]]
...
원핫 코드의 문제점과 해결책
- 사전 크기가 크면 원핫 코드는 희소(sparse) 벡터가 되어 메모리가 낭비된다.
- 단어 사이의 연관 관계를 반영하지 못한다.
- ex. king과 queen, bridegroom과 bride의 관계 표현이 불가능하다.
8.5.2 텍스트 데이터 사례 : 영화평 데이터셋 IMDB
텐서플로가 제공하는 텍스트 데이터
- 영화를 평가한 댓글을 모아둔 IMDB 데이터셋
- 50000개의 댓글을 긍정 평가와 부정 평가로 레이블링
- 감정 분류(sentiment classification) 문제에 주로 사용한다.
- 다양한 토픽의 뉴스를 모아둔 Reuters 데이터셋
- 로이터 통신의 뉴스 11228개를 46개 토픽으로 레이블링
- 토픽 분류 문제에 주로 사용한다.
IMDB로 실습
- http://mng.bz/0tIo에 접속하여 원본 데이터 다운로드한다.
- 소스 프로그램이 있는 폴더에 data라는 폴더 만들어 거기에 저장한다.
import os
# 원본 IMDB 데이터 읽기
directory='./data/aclImdb/aclImdb/test'
x=[];y=[]
for c in ['neg','pos']:
curr=os.path.join(directory,c)
for fname in os.listdir(curr):
if fname[-4:]=='.txt':
f=open(os.path.join(curr,fname),encoding='utf8')
x.append(f.read())
y.append(c)
print("첫 번째 댓글:",x[0]); print("첫 번째 평가:",y[0])
print("마지막 댓글:",x[-1]); print("마지막 평가:",y[-1])
텐서플로가 제공하는 IMBD
- 텐서플로는 쓰기 좋게 가공한 IMDB 데이터셋을 제공한다.
from tensorflow.keras.datasets import imdb
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,Flatten,Embedding
from tensorflow.keras import preprocessing
dic_siz=10000 # 사전의 크기(사전에 있는 단어 개수)
sample_siz=512 # 샘플의 크기
# tensorflow가 제공하는 간소한 버전의 IMDB 읽기
(x_train,y_train),(x_test,y_test)=imdb.load_data(num_words=dic_siz)
print(x_train.shape,x_test.shape)
print(x_train[0])
# 단어를 숫자, 숫자를 단어로 변환하는데 쓰는 표(표는 딕셔너리로 구현)
word2id=imdb.get_word_index()
id2word={word:id for id,word in word2id.items()}
for i in range(1,21):
print(id2word[i],end='/')
8.5.3 단어 임베딩
텍스트 데이터를 신경망에 입력하고 표현하는 방법
- 원핫 코드
- 사전 크기가 크면 원핫 코드는 희소(sparse) 벡터가 되어 메모리 낭비된다.
- 단어 사이의 연관 관계를 반영하지 못한다.
- 예, king과 queen, bridegroom과 bride의 관계 표현 불가능하다.
- 대안은 단어 임베딩(word embedding)이다.
단어 임베딩이란?
- 단어를 저차원 공간의 벡터로 표현하는 기법
- 보통 수백 차원을 사용한다.
- 밀집 벡터이다.
- 단어의 의미를 표현한다.
- 신경망 학습을 통해 알아낸다.
단어 임베딩 공간에서 다층 퍼셉트론으로 IMDB 인식
- 단어 임베딩 기술을 이용하여 IMDB의 샘플을 긍정과 부정으로 분류
embed_space_dim=16 # 16차원의 임베딩 공간
x_train=preprocessing.sequence.pad_sequences(x_train,maxlen=sample_siz)
x_test=preprocessing.sequence.pad_sequences(x_test,maxlen=sample_siz)
# 신경망 모델 설계와 학습
embed=Sequential()
embed.add(Embedding(input_dim=dic_siz,output_dim=embed_space_dim,input_length=sample_siz))
embed.add(Flatten())
embed.add(Dense(32,activation='relu'))
embed.add(Dense(1,activation='sigmoid'))
embed.compile(loss='binary_crossentropy',optimizer='Adam',metrics=['accuracy'])
hist=embed.fit(x_train,y_train,epochs=20,batch_size=64,validation_data=(x_test,y_test),verbose=2)
embed.summary()
# 모델 평가
res=embed.evaluate(x_test,y_test,verbose=0)
print("정확률은",res[1]*100)
import matplotlib.pyplot as plt
# 학습 곡선
plt.plot(hist.history['accuracy'])
plt.plot(hist.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train','Validation'], loc='best')
plt.grid()
plt.show()
8.5.4 LSTM으로 인식 : 조기 멈춤 적용
LSTM을 사용하는 코
- 시계열 정보를 반영
(위 코드는 단지 단어 임베딩에 다층 퍼셉트론을 적용하여 시계열 정보를 이용하지 못한다.)
- 조기 멈춤 적용
(위 코드의 실행 결과를 보면 세대 1에서 최고 성능을 이룬 후 개선이 없다.).
- 훈련 집합에 대해 덜 수렴했더라도 검증 집합에 대해 성능 개선이 없으면 학습을 마치는 전략이다.
from tensorflow.keras.datasets import imdb
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense,LSTM,Embedding
from tensorflow.keras import preprocessing
from tensorflow.keras.callbacks import EarlyStopping
dic_siz=10000 # 사전의 크기(사전에 있는 단어 개수)
sample_siz=512 # 샘플의 크기
# tensorflow가 제공하는 간소한 버전의 IMDB 읽기
(x_train,y_train),(x_test,y_test)=imdb.load_data(num_words=dic_siz)
embed_space_dim=16 # 16차원의 임베딩 공간
x_train=preprocessing.sequence.pad_sequences(x_train,maxlen=sample_siz)
x_test=preprocessing.sequence.pad_sequences(x_test,maxlen=sample_siz)
early=EarlyStopping(monitor='val_accuracy',patience=5,restore_best_weights=True)
# 신경망 모델의 설계와 학습(LSTM 층 포함)
embed=Sequential()
embed.add(Embedding(input_dim=dic_siz,output_dim=embed_space_dim,input_length=sample_siz))
embed.add(LSTM(units=32))
embed.add(Dense(1,activation='sigmoid'))
embed.compile(loss='binary_crossentropy',optimizer='Adam',metrics=['accuracy'])
hist=embed.fit(x_train,y_train,epochs=20,batch_size=64,validation_split=0.2,verbose=2,callbacks=[early])
# 모델 평가
res=embed.evaluate(x_test,y_test,verbose=0)
print("정확률은",res[1]*100)
import matplotlib.pyplot as plt
# 학습 곡선
plt.plot(hist.history['accuracy'])
plt.plot(hist.history['val_accuracy'])
plt.title('Model accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train','Validation'], loc='best')
plt.grid()
plt.show()
LSTM(조기 멈춤 적용)과 MLP의 성능 분석
- LSTM을 사용한 코드는 시계열 특성을 반영하고 조기 멈춤을 적용해 더 유리한 상황인데 MLP보다 열등하다. 왜?
- 두 프로그램 모두 단어의 빈도수에 따라 분류하는 듯
- boring, terrible, bad 등이 많으면 부정, wonderful, good 등이 자주 나타나면 긍정으로 분류한다.
- 문장의 의미를 파악하지 못한 채 분류
- ex. "To me all of the movies are terrible, but this one is not."
- terrible이 있다는 이유로 두 프로그램 모두 부정으로 분류한다.
문장의 의미 이해하려면 발전된 자연어 처리 알고리즘 필요하다.
- word2vec과 GloVe가 있다.
8.5.5 word2vec과 GloVe
단어를 벡터 공간에 표현하는 단어 임베딩 기술
- 오래전부터 연구되어 온 아이디어
- 영국의 언어학자 퍼스 "You shall know a word by the company it keeps."
- 단어 간의 상호작용이 매우 중요하다는 통찰
- ex. "영화”라는 단어는 “아카데미", "흥행" 등의 단어와 함께 등장할 가능성 높다.
- 고전적인 기법들: TF(term frequency), LSA, 신경망 기법들
- 2010년대에는 딥러닝을 활용한 단어 임베딩 기술이 주류
- Word2vec(구글)
- 1000억 개가량의 뉴스를 모아둔 데이터셋으로 학습.
- 300만 개가량의 단어를 300차원 공간에 표현.
- GloVe(스탠퍼드 대학)
- 위키피디아 문서 데이터를 사용하여 학습.
- 40만 개가량의 단어를 50, 100, 200, 300차원 공간에 표현.
'컴퓨터공학 > 인공지능' 카테고리의 다른 글
[인공지능] 9장. 강화 학습(Reinforcement Learning) 2 (0) | 2023.05.30 |
---|---|
[인공지능] 9장. 강화 학습(Reinforcement Learning) 1 (0) | 2023.05.30 |
[인공지능] 8장. 시계열 데이터와 순환 신경망3 - LSTM 편곡 (1) | 2023.05.14 |
[인공지능] 8장. 시계열 데이터와 순환 신경망2 - 비트코인 가격 예측 (3) | 2023.05.10 |
[인공지능] 8장. 시계열 데이터와 순환 신경망1 (1) | 2023.05.09 |