딥러닝 (9)

Myeongsu Moon·2025년 1월 17일
0

제로베이스

목록 보기
62/95
post-thumbnail

Chapter 10 순환 신경망

순차 데이터(Sequential data)

  • 순서가 의미가 있으며, 순서가 달라지면 의미가 손상되는 데이터

  • 시간적 순서 데이터(temporal sequence data) – 순차 데이터 중, 특별히 순서가 시간과 연관이 있는 경우

  • 시계열(time series) – 시간적 순서 데이터가 일정한 시간차를 가지고 배열되어 있는 경우

  • 심층신경망으로 음성인식을 하려 할 경우, 입출력 모두 문제가 있음
    -> 입력 길이를 정규화하고 출력 개수를 제한하는 방법 (제한적 해결법)
    -> 입력과 출력을 가변 길이로 변경하는 방법

  • 메모리 시스템(Memory system)
    -> 시스템이 이전에 받은 입력에 영향을 받아, 여러 개의 순차 입력을 처리할 수 있는 시스템
    -> cf) 무기억 시스템 (memoryless system) – 이전에 입력 받은 자료에 영향을 받지 않는 시스템

기본 순환신경망의 구조

  • 얕은 인공신경망(Shallow Neural Network): 대표적인 무기억 시스템으로, 이전 입력에 영향을 받지 않음

  • 기본 순환신경망(Vanilla Recurrent Neural Network): 얕은 신경망 구조에 순환 구조를 추가. 인공신경망에서 사용하는 가장 단순한 메모리 시스템
    -> 수식에서 덧셈으로 표현되어 residual connection으로 혼동되기 쉬우나, 입력을 연결(concatenate)하는 구조

기본 순환신경망의 구현

import tensorflow as tf
from tensorflow.keras.layers import SimpleRNN, Dense

# input shape: (Batch, Input, Timestep)
(X_train, y_train), (X_test, y_test) = tf.keras.datasets.mnist.load_data()

ds = tf.data.Dataset.from_tensor_slices((X_train / 255.0, y_train))
test_ds  = tf.data.Dataset.from_tensor_slices((X_test / 255.0, y_test)).batch(128)

train_ds = ds.take(len(ds) * 70 // 100).shuffle(1024).batch(32)  # train set (70%)
valid_ds = ds.skip(len(ds) * 70 // 100).batch(128)               # valid set (30%)

class Model(tf.keras.Model):
    def __init__(self):
        super().__init__()
        self.rnn = SimpleRNN(128)          # simple RNN (N_h = 128)   # input: N_i = 28  --> W?  ==> (28+128)x128
        self.dense = Dense(10, 'softmax')  # output layer (N_o = 10)

    def call(self, x):
        x = self.rnn(x)
        return self.dense(x)
        
model = Model()
model.compile(optimizer='adam', loss='sparse_categorical_crossentropy', metrics=['accuracy'])
model.fit(train_ds, epochs=20, validation_data=valid_ds)        
results = model.evaluate(test_ds)
print('result loss: {}, result accuracy: {}'.format(*results))

시간을 통한 역전파

  • 순차 데이터로 이루어진 데이터셋은 애플리케이션에 따라 다양한 입출력 구조를 가질 수 있음
    -> 입력 또는 출력 중 하나라도 순차 데이터라면, 순환신경망을 이용해서 학습

  • 시간을 통한 역전파(BPTT: Backpropagation-Through-Time)
    -> 계층간 역전파 뿐 아니라, 시간(time-step)을 통한 역전파가 함께 이루어지는 역전파 방식

  • BPTT는 BP와 동일하게 모든 경로를 연쇄법칙으로 미분하면 되지만, 펼쳐진 학습 매개변수들은 역전파해도 동일한 변수라는 차이가 있음

LSTM의 구조

  • 순환신경망에서의 기울기 소실 문제
    -> 심층신경망에서는 계층이 깊어지면서 기울기 소실 문제가 발생
    -> 순환신경망은 시간적으로 길어지면서 기울기 소실 문제가 발생
    -> 입력과 정보가 사용되는 시점 차이가 많이 날 경우, 학습 능력 저하

  • 기본 순환신경망
    -> 좌측에서 우측으로 time-step이 증가하는 형식으로 표현
    -> 전결합계층은 간단히 활성함수인 tanh만으로 표현

  • Long Short-Term Memory(LSTM): 기본 순환신경망을 개선한 구조로, 기억할 특징은 오래 기억하고, 잊을 특징은 빨리 잊는 능력이 있음

  • LSTM의 States
    -> 셀 상태(cell state) – 기억을 오랫동안 유지할 수 있는 구조로, 새로운 특징을 덧셈으로 받는 특징이 있다. (residual connection)
    -> 은닉 상태(hidden state) – 계층의 출력이자, 다음 time-step으로
    넘기는 정보

  • Forget Gate
    -> Sigmoid 활성 함수로 인해 [0, 1]의 출력을 가지는 상태값
    -> 셀 상태와 곱해서 잊고 싶은 특징을 제거하는 기능

  • Input Gate
    -> Sigmoid 활성 함수로 인해 [0, 1]의 출력을 가지는 상태값
    -> 새로운 특징과 곱해서 새롭게 추출한 특징을 얼만큼 기억할지 결정

  • Output Gate
    -> Sigmoid 활성 함수로 인해 [0, 1]의 출력을 가지는 상태값
    -> 셀 상태 중에서 어떤 특징을 출력(은닉 상태)으로 내보낼지 결정

  • LSTM의 계산: Forget, input, output gate를 이용하여 셀 상태와 은닉 상태를 계산

GRU의 구조

  • Gated Tecurrent Unit(GRU): LSTM을 간소화한 버전이라고 볼 수 있는 순환신경망으로, 셀 상태와 은닉 상태가 통합된 것이 특징

  • GRU의 구조: LSTM과 GRU의 차이점
    -> 셀 상태가 은닉 상태와 통합되어 사라짐
    -> Forget gate와 input gate가 통합
    -> Reset gate가 추가

  • Forget Gate와 Input Gate
    -> LSTM과 동일한 Forget Gate를 사용
    -> Forget Gate를 1에서 빼서 Input Gate로 사용

  • Reset Gate
    -> Sigmoid 활성 함수로 인해 [0, 1]의 출력을 가지는 상태값
    -> 이전 은닉 상태 중 필요 없는 특징을 즉시 제거하는 역할로, 새로운 특징을 추출하기 전에 적용

  • GRU State의 계산: Forget, reset gate를 이용하여 은닉 상태를 계산

이 글은 제로베이스 데이터 취업 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다

0개의 댓글