본문 바로가기
딥러닝/혼공머신

[혼공머신] chapter 9. 텍스트를 위한 인공 신경망

by 다이노소어 2023. 3. 27.

혼자 공부하는 머신러닝 + 딥러닝의 Chapter 9을 공부하면서 정리한 내용을 기반으로 작성하였다.
9-3 미완

 

09-1. 순차 데이터와 순환 신경망

- 순환 신경망을 사용해서 글을 분석할 수 있다.


순차 데이터

  • 순차 데이터는 텍스트나 시계열 데이터(time series data)와 같이 순서에 의미가 있는 데이터를 말한다.
  • 이전에 입력한 데이터를 기억하는 기능이 필요하다.
  • 토큰 (token) : 분리된 단어
    • 샘플 하나에 토큰이 여러 개가 있다.
    • 1개의 토큰이 하나의 타임스텝에 해당한다.
    • 토큰에 할당하는 정수 중 예약어 : 0(패딩), 1(문장의 시작), 2(어휘사전에 없는 토큰)

 

순환 신경망(recurrent neural network, RNN)

  • 일반적인 완결 연결 신경망과 거의 비슷하지만, 이전 데이터의 처리 흐름을 순환하는 고리가 추가되어야 한다.
  • 이전 샘플에 대한 기억을 가지고 있다!

특성

  1. 활성화 함수
    • 활성화 함수는 반드시 필요하고, 순환신경망에서는 tanh 함수를 많이 사용한다
  2. 가중치
    • 이전 타임스텝의 은닉상태를 재사용하기 때문에, 여기에 곱해지는 가중치가 필요하다.
    • 즉, 입력과 곱해지는 가중치와 은닉상태와 곱해지는 가중치가 있다.
  3. 절편
    • 각 뉴런마다 하나의 절편을 가진다.
  4. 셀에 필요한 가중치 크기
    • 입력으로 주어지는 특성이 4개이고, 순환층의 뉴런이 3개라고 가정하자.
    • 입력층과 순환층은 완전 연결되므로 가중치의 크기는 12(4 × 3)이다.
    • 다음 타임스텝에 재사용될 은닉상태를 위한 가중치의 크기는 9(3 x 3)이다. 다음 타임스텝의 뉴런과 이전 은닉상태 또한 완전 연결되기 때문이다.
  5. 모델 파라미터
    • 모델 파라미터 = 가중치 개수 + 절편의 개수
    • 예를 들어,
      • 모델 파라미터 = 순환층의 가중치 + 은닉층의 가중치 + 절편일 때, 모델 파라미터 = 입력토큰 차원 x 뉴런 개수  +  은닉상태 크기 x 뉴런  +  뉴런마다의 절편
      • 입력으로 주어지는 특성이 4개이고, 순환층의 뉴런이 3개일 때는, (4 x 3) + (3 x 3) + 3 = 12 + 9 + 3 = 24로 계산할 수 있다.
  6. 순환층
    • 순환층을 통과하면 1차원 배열로 바뀌고, 순환층의 뉴런의 개수에 따라 1차원 배열의 크기가 달라진다. 그렇기에, 순환 신경망에서 마지막 셀의 출력(in 출력층)은 1차원으로 합성곱 신경망과 달리 Flatten 클래스로 펼질 필요가 없다.
    • 순환층에서는 마지막 타임스텝의 은닉 상태만 출력으로 내보낸다. 마치 입력받은 시퀀스에 대해 처리한 정보를 압축해서 전달한다고 이해할 수 있다. 단, 순환층을 여러 개 쌓았다면, 마지막 순환층만 마지막 타임스탭의 은닉 상태를 출력하고, 그 이전의 순환층에서는 모든 타임스탭의 은닉 상태를 출력한다.
    • 순환층을 여러 개 쌓았다면, 셀의 입력은 샘플마다 타임스텝과 단어 표현으로 이뤄진 2차원 배열이어야 한다.

 

용어

  1. 타임스텝 (timestamp)
    • 샘플을 처리하는 단계 하나
    • 타임스텝이 오래될수록 순환되는 정보는 희미해진다.
  2. 셀 (cell) :순환 신경망에서의 층
  3. 은닉상태 (hidden state) : 층의 출력
    • 합성곱 신경망처럼 입력에 가중치를 곱하고 활성화 함수를 통과시켜 다음 층으로 보내는 구조는 같다.
    • 다만, 다음 타임스텝에 은닉상태를 재사용한다는 점이 다르다.
    • 맨 처음 타임스텝에서는 이전 은닉 상태가 없기 때문에, 은닉 상태를 0으로 초기화 한다
  4. 시퀀스 (sequence) : 순환 신경망에서의 샘플
    • 시퀀스의 길이가 타임스텝의 길이이다.
    • "i like brachiosaurus"라는 문장이 하나의 샘플로 들어 왔고, 각 단어를 3개의 숫자로 바꾼다고 하자. "i like brachiosaurus"가 sequence가 되고, 각 단어는 아이템으로 부를 수 있다. 시퀀스의 길이는 3으로 타임스텝의 크기가 3임을 알 수 있다.

 

 

09-2. 순환 신경망으로 IMDB 리뷰 분류하기

- 데이터 전처리 함수와 매개변수

- 순환층 클래스와 매개변수


  1. pad_sequences(): 시퀀스 데이터 길이 맞추기 (tensorflow.keras.preprocessing.sequencd 패키지 아래)
    • maxlen : 원하는 길이를 지정한다.
    • truncating :
      • maxlen보다 시퀀스가 클 때 시퀀스의 어느 부분(앞 혹은 뒤)을 잘라낼지를 지정한다.
      • 'pre' 혹은 'post' (default : 'pre')
    • padding :
      • maxlen보다 시퀀스가 작을 때 시퀀스의 어느 부분(앞 혹은 뒤)에 패딩 토큰을 추가할지
      • 'pre' 혹은 'post' (default : 'pre')
  2. to_categorical() : 정수배열 입력 받아 원-핫 인코딩 배열 반환(keras.utils 아래)
  3. 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 클래스

  • 순환 신경망뿐만 아니라, 합성곱 신경망이나 일반적인 인공 신경망 모델을 모두 만들 수 있다.
  • 층을 순서대로 쌓는 클래스이다.