[딥러닝] 11장 순환신경망

2024. 12. 8. 02:52·etc

순차 데이터란? 시간적 순서나 공간적인 순서가 있는 데이터

ex) 주식 가격, 오디오 데이터 등등 ..

 

기존 표준 신경망 ->  멀리 떨어진 과거의 데이터를 잘 기억하지 못함

시간의 흐름에 따라 변화하는 데이터를 학습하기 위한 신경망이 순환 신경망 (RNN) 이다.

연속데이터를 처리한다!

 

RNN 기능

- 가변 길이의 입력을 처리 가능해야 함

- 장기 의존성 추적할 수 있어야 함

- 순서에 대한 정보를 유지해야 함

- 시퀀스 전체의 파라미터를 공유할 수 있어야 함

 

순환 신경망 학습을 위해서 순환 데이터가 필요하다.

 

 

데이터를 일정한 길이로 잘라서 여러 개의 훈련 샘플을 만들어야 한다.

 

 

RNN의 구조

출력 벡터가 다시 입력되는 특성을 가지고 있다.

 

활성화 함수는 주로 tanh 함수를 주로 사용한다

입력층, 은닉층, 출력층을 가지며 은닉층이 순환 에지를 가진다는 점에서 MLP와 다르다.

 

 

 

 

기본 순환 신경망 모델 (Vanilla RNN)

 

 

return_sequences(): 계산과정에 있는 hidden state 출력할 것인지에 대한 값

false이면 출력 X

 

 

레이어의 출력을 다시 입력으로 받아서  사용하는 것으로서, 이전의 데이터가 함께 결과에 영향을 미친다.

기본 순환 신경망에는 3가지의 가중치가 있으며, 모든 시간 단계에서 공유된다.

 

 

model= Sequential()
model.add(SimpleRNN(50, return_sequences=False, input_shape=(4,1))) #은닉층 표시 X, 50개의 유닛, 입력 데이터의 형태태
model.add(Dense(1)) #단일 뉴런으로 출력
model.summary()
model.compile(loss='mse', optimizer='adam', metrics=['accuracy'])
model.fit(X,Y, epochs=200, verbose=2)
print(model.predict(X))

 

 

 

RNN의 유형

- One to One : 단일 입력, 단일 출력 (Vanilla Neural Network)

- One to Many : 하나의 입력, 많은 수의 출력

- Many to One :

- Many to Many : 많은 수의 입력, 많은 수의 출력 생성 

 

SimpleRNN의 입력은 [batch, timesteps, feature ] 같은 형사을 가지는 3차원 텐서라고 간주된다.

[32,10,8]이면 32개의 샘플, 각 샘플당 10개의 시계열 데이터,  하나의 데이터는 8개의 실수이다.

 

메모리 셀의 각 시점에서의 모든 은닉 상태 값을 반환받고 싶으면 

 

 

simple_rnn= tf.keras.layers.SimpleRNN(4, return_sequences=True, return_State=True)
whole_sequence_output, final_state= simple_rnn(inputs)

return_sequences 값 True로 설정

 

 

 

Backpropagation Through Time ( 시간에 따른 역전파)

순환 신경망에서는 계층을 따라 오류를 역전파하는 대신, 시간을 거슬러 올라가면서 그래디언트를 역전파 한다.

 

1) 그래디언트 손실 문제

- 근거리의 의존 관계만 중시하게 됨

- 활성화 함수 ReLU 로 바꿔서 해결

- 가중치를 단위 행렬로 초기화

- 복잡한 순환유닛 (LSTM, GRU 사용)

 

 

RNN에서는 그래디언트 소실 현상으로 장기 의존성 문제 발생

-> LSTM 신경망 이용

 

 

LSTM 유닛

 

- 셀, 입력 게이트, 출력 게이트, 삭제 게이트로 구성된다.

- 셀은 임의의 시점에 대한 값을 기억하고 세개의 게이트(입력, 망각, 출력)는 셀로 들어오고 나가는 정보의 흐름을 조절한다.

 

 

삭제 연산

- 예전 상태 중 관련이 없는 정보를 지우는 것

- 시그모이드 함수를 거쳐 0~1 사이의 값이 출력되는데, 셀 상태에서 삭제를 결정하는 값이 된다.

1에 가까울수록 정보가 많이 살아남는다.

 

업데이트 연산

- 선택적으로 셀 상태를 업데이트 하는 것

- 셀상태에 삭제 게이트를 통하여 들어온 값을 곱해서 일부 기억을 삭제한 후, 입력 게이트를 통한 값을 더해준다.

입력 게이트: 현재 시점의 입력을 얼마나 기억할지?

삭제 게이트: 이전 시점의 입력을 얼마나 기억할지?

 

출력 연산

- 현재 시점의 입력값, 이전 시점의 은닉 상태에 시그모이드 함수 적용

- 시그모이드 함수의 결과 값은 다음 은닉 상태 결정

 

셀 상태가 게이트 구조에 의해 제어되며, 직선 경로로 흘러감!

LSTM은 셀 상태와 게이트 구조를 활용하여 중요한 정보를 오랫동안 유지하고 불필요한 정보를 제거함으로써 그래디언트 소실 문제를 해결할 수 있다.

 

 

 

2) 그래디언트 폭증 문제

 

- 일정 크기 이상 커지지 못하게 하는 방법으로 해결

 

 

 

keras에는 SimpleRNN, LSTM, GRU 등 3가지 내장 레이어가 있다.

 

 

from tensorflow.keras.modelsimport Sequential
from tensorflow.keras.layersimport Dense
from tensorflow.keras.layersimport LSTM
model = Sequential()
model.add(LSTM(16, 
input_shape=(X_train.shape[1], 1), 
activation='tanh', 
return_sequences=False))
model.add(Dense(1))
model.compile(optimizer = 'adam', loss = 'mean_squared_error')
model.fit(X_train, y_train, epochs = 100, batch_size= 16)

 

 

 

'etc' 카테고리의 다른 글

[딥러닝] 12장 자연어 처리  (0) 2024.12.08
[딥러닝] 10장 영상인식  (1) 2024.12.07
[딥러닝] 9장 CNN  (2) 2024.12.07
[딥러닝] 8장 심층신경망  (0) 2024.12.06
[딥러닝] 7장 MLP-2  (2) 2024.12.06
'etc' 카테고리의 다른 글
  • [딥러닝] 12장 자연어 처리
  • [딥러닝] 10장 영상인식
  • [딥러닝] 9장 CNN
  • [딥러닝] 8장 심층신경망
zioni
zioni
  • zioni
    jiwon's dev.log
    zioni
  • 전체
    오늘
    어제
    • 분류 전체보기 (76) N
      • spring & java (13)
      • Algorithm (14) N
      • PS (37)
      • project (3)
      • experience (1)
      • etc (6)
      • study (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Github
  • 공지사항

  • 인기 글

  • 태그

    백준
    백준2525
    java
    자바
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
zioni
[딥러닝] 11장 순환신경망
상단으로

티스토리툴바