혼자 공부하는 머신러닝 + 딥러닝의 Chapter 9을 공부하면서 정리한 내용을 기반으로 작성하였다.
9-3 미완
09-1. 순차 데이터와 순환 신경망
- 순환 신경망을 사용해서 글을 분석할 수 있다.
순차 데이터
- 순차 데이터는 텍스트나 시계열 데이터(time series data)와 같이 순서에 의미가 있는 데이터를 말한다.
- 이전에 입력한 데이터를 기억하는 기능이 필요하다.
- 토큰 (token) : 분리된 단어
- 샘플 하나에 토큰이 여러 개가 있다.
- 1개의 토큰이 하나의 타임스텝에 해당한다.
- 토큰에 할당하는 정수 중 예약어 : 0(패딩), 1(문장의 시작), 2(어휘사전에 없는 토큰)
순환 신경망(recurrent neural network, RNN)
- 일반적인 완결 연결 신경망과 거의 비슷하지만, 이전 데이터의 처리 흐름을 순환하는 고리가 추가되어야 한다.
- 이전 샘플에 대한 기억을 가지고 있다!
특성
- 활성화 함수
- 활성화 함수는 반드시 필요하고, 순환신경망에서는 tanh 함수를 많이 사용한다
- 가중치
- 이전 타임스텝의 은닉상태를 재사용하기 때문에, 여기에 곱해지는 가중치가 필요하다.
- 즉, 입력과 곱해지는 가중치와 은닉상태와 곱해지는 가중치가 있다.
- 절편
- 각 뉴런마다 하나의 절편을 가진다.
- 셀에 필요한 가중치 크기
- 입력으로 주어지는 특성이 4개이고, 순환층의 뉴런이 3개라고 가정하자.
- 입력층과 순환층은 완전 연결되므로 가중치의 크기는 12(4 × 3)이다.
- 다음 타임스텝에 재사용될 은닉상태를 위한 가중치의 크기는 9(3 x 3)이다. 다음 타임스텝의 뉴런과 이전 은닉상태 또한 완전 연결되기 때문이다.
- 모델 파라미터
- 모델 파라미터 = 가중치 개수 + 절편의 개수
- 예를 들어,
- 모델 파라미터 = 순환층의 가중치 + 은닉층의 가중치 + 절편일 때, 모델 파라미터 = 입력토큰 차원 x 뉴런 개수 + 은닉상태 크기 x 뉴런 + 뉴런마다의 절편
- 입력으로 주어지는 특성이 4개이고, 순환층의 뉴런이 3개일 때는, (4 x 3) + (3 x 3) + 3 = 12 + 9 + 3 = 24로 계산할 수 있다.
- 순환층
- 순환층을 통과하면 1차원 배열로 바뀌고, 순환층의 뉴런의 개수에 따라 1차원 배열의 크기가 달라진다. 그렇기에, 순환 신경망에서 마지막 셀의 출력(in 출력층)은 1차원으로 합성곱 신경망과 달리 Flatten 클래스로 펼질 필요가 없다.
- 순환층에서는 마지막 타임스텝의 은닉 상태만 출력으로 내보낸다. 마치 입력받은 시퀀스에 대해 처리한 정보를 압축해서 전달한다고 이해할 수 있다. 단, 순환층을 여러 개 쌓았다면, 마지막 순환층만 마지막 타임스탭의 은닉 상태를 출력하고, 그 이전의 순환층에서는 모든 타임스탭의 은닉 상태를 출력한다.
- 순환층을 여러 개 쌓았다면, 셀의 입력은 샘플마다 타임스텝과 단어 표현으로 이뤄진 2차원 배열이어야 한다.
용어
- 타임스텝 (timestamp)
- 샘플을 처리하는 단계 하나
- 타임스텝이 오래될수록 순환되는 정보는 희미해진다.
- 셀 (cell) :순환 신경망에서의 층
- 은닉상태 (hidden state) : 층의 출력
- 합성곱 신경망처럼 입력에 가중치를 곱하고 활성화 함수를 통과시켜 다음 층으로 보내는 구조는 같다.
- 다만, 다음 타임스텝에 은닉상태를 재사용한다는 점이 다르다.
- 맨 처음 타임스텝에서는 이전 은닉 상태가 없기 때문에, 은닉 상태를 0으로 초기화 한다
- 시퀀스 (sequence) : 순환 신경망에서의 샘플
- 시퀀스의 길이가 타임스텝의 길이이다.
- "i like brachiosaurus"라는 문장이 하나의 샘플로 들어 왔고, 각 단어를 3개의 숫자로 바꾼다고 하자. "i like brachiosaurus"가 sequence가 되고, 각 단어는 아이템으로 부를 수 있다. 시퀀스의 길이는 3으로 타임스텝의 크기가 3임을 알 수 있다.
09-2. 순환 신경망으로 IMDB 리뷰 분류하기
- 데이터 전처리 함수와 매개변수
- 순환층 클래스와 매개변수
- pad_sequences(): 시퀀스 데이터 길이 맞추기 (tensorflow.keras.preprocessing.sequencd 패키지 아래)
- maxlen : 원하는 길이를 지정한다.
- truncating :
- maxlen보다 시퀀스가 클 때 시퀀스의 어느 부분(앞 혹은 뒤)을 잘라낼지를 지정한다.
- 'pre' 혹은 'post' (default : 'pre')
- padding :
- maxlen보다 시퀀스가 작을 때 시퀀스의 어느 부분(앞 혹은 뒤)에 패딩 토큰을 추가할지
- 'pre' 혹은 'post' (default : 'pre')
- to_categorical() : 정수배열 입력 받아 원-핫 인코딩 배열 반환(keras.utils 아래)
- SimpleRNN 클래스 : 순환층 만들기
- activation : 활성화 함수 지정 (default : 'tanh')
- Embedding 클래스 : 단어 임베딩(word embedding)
- 정수 데이터를 입력받아, 각 단어를 고정된 크기의 실수 벡터로 바꿔준다. (원-핫 인코딩할 필요X)
- 처음에는 랜덤한 백터로 초기화되지만, 훈련을 통해 좋은 단어 임베딩을 학습한다.
from tensorflow.keras.preprocessing.sequence import pad_sequences
from tensorflow import keras
'''
pad_sequences()
'''
train_seq = pad_sequences(train_input, maxlen= 100)
val_seq = pad_sequences(val_input, maxlen= 100)
'''
to_categorical()
'''
train_oh = keras.utils.to_categorical(train_seq)
val_oh = keras.utils.to_categorical(train_seq)
dense_layer = keras.layers.Dense(1, activation = 'sigmoid')
model = keras.Sequential()
model.add(keras.layers.SimpleRNN(8, input_shape=(100,500)))
model.add(dense_layer)
'''
Embedding(어휘사전 크기, 임베딩 벡터 크기, input_length = 입력 시퀀스 길이)
'''
model2 = keras.Sequential()
model2.add(keras.layers.Embedding(500, 16, input_length= 100))
model2.add(keras.layers.SimpleRNN(8))
model2.add(dense_layer)
'''
순환 신경망 훈련
- 콜백함수 생략
'''
rmsprop = keras.optimizers.RMSprop(learning_rate = 13-4)
model2.compile(optimizer=rmsprop, loss= 'binary_crossentropy', metrics = ['accuracy'])
history = mode2.fit(train_seq, train_target, epochs= 100, batch_size= 64,
validation_data(val_seq, val_target))
'''
손실그래프 비교 (훈련 vs 검증)
'''
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.xlabel('epoch')
plt.xlabel('loss')
plt.legend(['train', 'val'])
plt.show()
09-3. LSTM 과 GRU 셀
- 고급 순환층 LSTM과 GRU를 배운다.
LSTM(Long Short-Term Memory)
GRU(Gated Recurrent Unit)
[[ 참고1 ]] 피드 포워드 신경망(feedforward neural network;FFNN)
→ 순환신경망과 달리, 하나의 샘플이나 배치를 사용하여 정방향 계산을 수행한다.
→ 데이터 흐름이 앞으로만 전달되어, 다음 샘플을 처리할 때 재사용하지 않는다.
[[ 참고2 ]] 자연어 처리(natural language processing;NLP)
→ 자연어 처리 분야에서는 훈련 데이터를 말뭉치(corpus)라고 부른다.
→ 분리된 단어를 토큰(token)이라고 부르고, 한 개의 토큰이 하나의 타임 스텝에 해당한다.
→ 어휘 사전 : 훈련 세트에서 고유한 단어를 뽑아 만든 목록
[[참고3]] Sequential 클래스
- 순환 신경망뿐만 아니라, 합성곱 신경망이나 일반적인 인공 신경망 모델을 모두 만들 수 있다.
- 층을 순서대로 쌓는 클래스이다.
'딥러닝 > 혼공머신' 카테고리의 다른 글
[혼공머신] chapter 8. 이미지를 위한 인공 신경망 (0) | 2023.03.13 |
---|---|
[혼공머신] chapter 7. 딥러닝 시작 (신경망 모델) (0) | 2023.03.07 |