자연어 처리 - 딥 러닝을 이용한 자연어 처리 입문(14) _ 딥러닝2
08.딥러닝(Deep Learning) 개요
위키독스
온라인 책을 제작 공유하는 플랫폼 서비스
wikidocs.net
6) 케라스(Keras) 훑어보기
- 손쉽게 딥 러닝을 구현할 수 있도록 도와주는 상위 레벨의 인터페이스
- 참고 : https://keras.io/
1. 전처리(Preprocessing)
- Tokenizer() : 토큰화와 정수인코딩을 위해 사용
- pad_sequence() : 길이가 다른 샘플들의 길이를 동일하게 맞추기(padding)
지정값보다 김 --> 자르기 / 지정값보다 짧음 --> 0으로 채우기
**padding : 'pre' - 앞에서 0 채우기, 'post' - 뒤에서 0채우기
2. 워드 임베딩(Word Embedding)
: 텍스트 내의 단어들을 "밀집 벡터(dense vector)"로 만들기
- 원-핫 벡터 : 대부분 0의 값, 하나의 1의 값(표현하고 싶은 단어) __ 희소 벡터(sparse vector)
**단점 : 고차원, 유사도 동일
- 임베딩 벡터 : 대부분 실수값, 상대적으로 저차원 __ 밀집 벡터(dense vector)
**차원 : 256, 512, 1024 등
**초기값 : 랜덤값 / 인공신경망의 역전파처럼 값이 학습됨
- Embedding() : 단어를 밀집 벡터로 만들기 = 임베딩 층 만들기(인공 신경망 용어)
text=[['Hope', 'to', 'see', 'you', 'soon'],['Nice', 'to', 'see', 'you', 'again']] #토큰화
text=[[0, 1, 2, 3, 4],[5, 1, 2, 3, 6]] #정수 인코딩
Embedding(7, 2, input_length = 5) #Embedding(number of samples_단어 개수, 임베딩 벡터 출력 차원, input_length_입력 시퀀스의 길이)
#예시 결과 정리표
+------------+------------+
| index | embedding |
+------------+------------+
| 0 | [1.2, 3.1] |
| 1 | [0.1, 4.2] |
| 2 | [1.0, 3.1] |
| 3 | [0.3, 2.1] |
| 4 | [2.2, 1.4] |
| 5 | [0.7, 1.7] |
| 6 | [4.1, 2.0] |
+------------+------------+ #각 인덱스가 2의 크기를 가지는 임베딩 벡터로 워드 임베딩
3. 모델링(Modeling)
- Sequential : 인공 신경망의 입력층, 은닉층 , 출력층을 구성하기 위해 사용
from tensorflow.keras.models import Sequential
model = Sequential()
model.add(...) # 층 추가
model.add(...) # 층 추가
model.add(...) # 층 추가
model.add(Embedding(vocabulary, output_dim, input_length)) #워드 임베딩 : 임베딩 층 추가
- Dense() : 전결합층(fully-connected layer / 모든 뉴런이 이전 층의 모든 뉴런과 연결된 층) 추가
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
model = Sequential()
model.add(Dense(8, input_dim=4, activation='relu')) #은닉층(출력 뉴런의 수, input_dim : 입력 뉴런의 수, activation : 활성화 함수)
model.add(Dense(1, activation='sigmoid')) # 출력층 (input_dim은 이미 정해짐)
#활성화 함수 : 'linear', 'sigmoid', 'softmax', 'relu'
cf> LSTM, GRU, Convolution2D, BatchNormalization
- summary() : 모델 정보 요약
4. 컴파일(Compile)과 훈련(Training)
- compile() : 모델을 기계가 이해할 수 있도록 컴파일. 오차함수, 최적화방법, 메트릭 함수 선택
from tensorflow.keras.layers import SimpleRNN, Embedding, Dense
from tensorflow.keras.models import Sequential
max_features = 10000
model = Sequential()
model.add(Embedding(max_features, 32))
model.add(SimpleRNN(32)) #RNN에 대한 설명은 뒤의 챕터에서 합니다.
model.add(Dense(1, activation='sigmoid')) #출력층
model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['acc'])
#optimizer : 옵티마이저 _ adam, sgd(경사하강법) / loss : 손실함수(평균제곱오차, 크로스엔트로피) / metrics : 훈련 모니터링 지표
#cf> 활성화 함수 : 오차 줄이기 위해 이용하는 함수(시그모이드, 렐루, 하이퍼볼릭탄젠트..)
**손실함수(오차 계산), 활성화 함수(오차 줄이기, 가중치 업데이트) 조합
cf> 옵티마이저 : 오차 줄이는 "방법"
- fit() : 모델을 학습(=훈련=적합) _ 오차로부터 매개 변수를 업데이트함.
model.fit(X_train, y_train, epochs = 10, batch_size = 32) #(훈련데이터, 레이블 데이터, epochs, batch_size)
#batch_size : 배치크기, default 32, None(미니 배치 경사하강법 이용X)
model.fit(X_train, y_train, epochs=10, batch_size=32, verbose=0, validation_data(X_val, y_val))
#verbose : 학습 중 출력되는 문구 (0 - 출력없음 / 1 - 훈련의 진행도 막대 / 2 - 미니 배치마다 손실 정보 출력)
#validation_data(x_val, y_val) : 검증 데이터를 사용 --> 훈련이 잘 되고 있는가 / loss가 낮아지다가 높아짐? -> 과적합
model.fit(X_train, y_train, epochs=10, batch_size=32, verbose=0, validation_split=0.2))
#validation_split : validation_data 대신. X_train, y_train에서 일정 비율을 검증 데이터로 사용
5. 평가(Evaluation)와 예측(Prediction)
- evaluate() : 테스트 데이터를 통해 모델의 정확도 평가
model.evaluate(X_test, y_test, batch_size = 32) #(테스트 데이터, 레이블 테스트 데이터, 배치 크기)
- predict() : 임의의 입력에 대한 모델의 출력값 확인
model.predict(X_input, batch_size = 32) #(예측할 데이터, 배치크기)
6. 모델의 저장(Save)와 로드(Load)
- save() : 인공 신경망 모델을 hdf5 파일에 저장
model.save("model_name.h5")
- load_model() : 저장해둔 모델을 불러옴
from tensorflow.keras.models import load_model
model = load_model("model_name.h5")
7. 함수형 API(functional API)
- Sequential API : 책에서 많이 대부분 쓰이는 API
**참고가 필요할 때 다시 6-7문서 확인하자. : https://wikidocs.net/38861
7) 다층 퍼셉트론(MultiLayer Perceptron, MLP)로 텍스트 분류하기
- MLP로 "텍스트 분류하기" 수행
1. 다층 퍼셉트론(MultiLayer Perceptron, MLP)
: 단층 퍼셉트론 + 은닉층이 1개 이상 추가된 신경망. 피드 포워드 신경망(FFNN, 연산방향이 입력층 -> 출력층 뿐)의 기본적 형태
2. 케라스의 texts_to_matrix()
- 토큰화 & 정수 인코딩
- texts_to_matrix : 텍스트 데이터로부터 행렬(matrix) 만들기 (bag of words 기반이므로 단어 순서 정보는 X)
####(8)번 문서 참고하기!!!####
(1) count모드 : 문서 단어 행렬(DTM)을 생성. 위의 word_index 인코딩을 이용하지만 인덱스는 0부터 시작
(2) binary모드 : 단어의 존재 유무로 행렬 표현(개수 고려X)
(3) tfidf 모드 : TF-IDF 행렬 만든다.
TF : 각 문서에서의 각 단어의 빈도의 자연로그 + 1
IDF : 기존 식 로그 안의 분수에 + 1 (단, df : 특정 단어가 등장한 문서의 수)
(4) freq 모드 : 분자 - 각 문서에서의 각 단어 등장 횟수 / 분모 - 각 문서의 크기(단어 개수 총 합)
3. 20개 뉴스 그룹(Twenty Newsgroups) 데이터에 대한 이해 _ 주제 맞추기(다중 클래스 분류)
####(10)LSA(토픽모델링)####
- 데이터 받아오기 & 샘플 수, 토픽 수 확인
- 데이터 프레임 생성
- 데이터 프레임 결측치 확인
- 레이블별 분포 확인
- 훈련 데이터, 테스트 데이터 만들기
- 전처리, 빈도수 확인
4. 다층 퍼셉트론(Multilayer Perceptron, MLP)사용하여 텍스트 분류하기
- 다층 퍼셉트론 설계
**활성화 함수 : 소프트 맥스(다중 클래스 분류 문제이므로)
**손실함수 : 크로스 엔트로피 함수
**옵티마이저 : adam
- 모델 훈련
**binary 모드의 테스트 정확도 : 0.83364314
**count 모드의 테스트 정확도 : 0.8137281
**tfidf 모드의 테스트 정확도 : 0.83191717
**freq 모드의 테스트 정확도 : 0.6830855
8) 피드 포워드 신경망 언어 모델(Neural Network Language Model, NNLM)
- 규칙 기반 접근이 아닌 기계가 주어진 자연어 데이터를 학습!!
- 통계적 접근 --> 인공신경망 사용
- 피드 포워드 신경망 언어 모델(NNLM) : 신경망 언어 모델의 시초
1. 기존 N-gram 언어 모델의 한계(통계적 언어 모델)
- 이전 단어들 중 n-1개의 단어로부터 다음 단어를 예측하는 언어 모델
- 조건부 확률을 이용
- 문제 : 희소 문제(sparsity problem) - 단어 시퀀스가 존재하지 않으면 확률자체가 0이 되버림
2. 단어의 의미적 유사성
- 희소 문제는 해결 가능 : 단어 간 유사도 --> 유사한 단어를 대신 선택
BUT n-gram 언어 모델을 유사도를 학습한 적이 없음
- NNLM : 유사한 단어가 사용된 시퀀스를 함께 이용.(워드 임베딩의 아이디어)
3. 피드 포워드 신경망 언어 모델(NNLM)
- 훈련 코퍼스 : 예문 - "what will the fat cat sit on"
- 훈련 예제 : 'what will the fat cat'을 입력 받아 'sit'을 예측
- 원-핫 인코딩
what = [1, 0, 0, 0, 0, 0, 0]
will = [0, 1, 0, 0, 0, 0, 0]
the = [0, 0, 1, 0, 0, 0, 0]
fat = [0, 0, 0, 1, 0, 0, 0]
cat = [0, 0, 0, 0, 1, 0, 0]
sit = [0, 0, 0, 0, 0, 1, 0]
on = [0, 0, 0, 0, 0, 0, 1]
- 예측 방식 : n-gram 모델 처럼 정해진 n개의 단어만을 참고
ex> n(윈도우) = 4
- 구조
**입력층 : will, the, fat, cat(원-핫 벡터)
**출력층 : sit의 원-핫 벡터 --> 모델이 예측한 값의 오차 구함
**투사층(projection layer) : 가중치 행렬과의 연산은 이루어지지만 활성화 함수가 존재X
**은닉층 : 입력층과 출력층 사이의 층. 활성화 함수가 존재
- 과정 :
(1) lookup 과정
(용어)
M : 투사층의 크기
V : 단어 집합의 크기(원-핫 벡터의 차원)
lookup table : W행렬의 i번째 행을 그대로 읽어오는 것과 동일
(결과)
V차원의 원-핫 벡터 --> M차원 단어 벡터로 맵핑
**임베딩 벡터(embedding vector) : 초기에 랜덤 값이지만 학습과정에서 값이 계속 변경되는 벡터
(2) 투사층 통과
(수식) ;를 통해 concatenate 연결.
활성화 함수가 존재하지 않는 선형층(linear layer)이다.
(3) h 크기를 가지는 은닉층 통과(nonlinear, 활성화 함수O)
(수식) 하이퍼볼릭 탄젠트 함수인 경우
(4) 출력층 통과 : V의 크기를 가지는 출력층 통과, 임베딩 벡터와 같은 크기의 벡터가 나옴!
(수식) 소프트 맥스 함수의 경우
출력 벡터의 각 차원 값 : 0과 1 사이의 실수값을 가짐. 각 원소의 총 합은 1.
출력 벡터의 목표 : 정답 단어의 원-핫 벡터의 값과 가까워야 함
--> 손실함수 : cross-entropy함수 & 역전파 --> 임베딩 벡터값들도 함께 학습됨.
- 장점 : 수많은 문장에서 유사한 목적으로 사용되는 단어들 --> 유사한 임베딩 벡터값 가짐!!
**즉, 훈련 코퍼스에 없던 단어시퀀스라도 선택이 가능함!!
cf> 발전 : Word2Vec, FastText, GloVe
4. NNLM의 이점과 한계
(1) 이점 : 기존 모델에서의 개선점
- 희소 문제 해결(단어의 유사도 표현이 가능) : 저장공간 절약(저차원), 유사도 표현 가능
(2) 고정된 길이의 입력(Fixed-length input)
- 정해진 n개의 단어만 참고 --> 버려지는 단어들이 가진 문맥정보 참고 불가
- 훈련 코퍼스의 문장 길이의 다양성 --> 매번 다른 길이에 대한 대응력 필요