You are on page 1of 13

Kumoh National Institute of Technology

딥러닝 (Deep Learning)


RNN 기초

컴퓨터공학과 황준하
Contents

1. RNN 의 필요성

2. RNN 의 기본 구조

3. SimpleRNN

4. LSTM

5. 시계열 데이터 학습

2/11
CNN 학습 결과 해석하기
1. RNN 의 필요성

가상의 데이터 준비
 다음과 같은 일련의 숫자가 있다 .
◦ 0, 1, 2, 3, 2, 1, 0, 1, 2, 3, 2, 1, 0, 1, ......
◦ 2 다음의 숫자는 ?
◦ 2, 3, 2 다음의 숫자는 ?
 이 데이터를 다음과 같이 수정하였다 . ( 신경망은 0~1 값을 좋아하니까 )
◦ 0  1000, 1  0100 : one-hot 인코딩
x y
◦ x : 연속된 3 개의 숫자 , y : 그 다음 숫자
[[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, [0, 0, 0,
◦ 데이터의 특징 0]] 1]
 x : 3 차원 데이터 , shape (4, 3, 4)
[[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, [1, 0, 0,
 ( 예제개수 , 시퀀스개수 , 속성개수 )
1]] 0]
 y 를 결정하는 데 x 내에 값들의 순서가
[[0, 0, 1, 0], [0, 0, 0, 1], [1, 0, 0, [0, 1, 0,
중요할 것 같다 !?
0]] 0]
 한 가지 학습 방법 : Fully-connected 다층 인공 신경망
간단한
[[0,문제
0, 0,
1],정확도 0], [0, 1,가능
[1, 0, 0, 100% 0, [0, 0, 1,
◦ Flatten() 적용 0]] 0]

해석하기 가상의
08_1_1_ 데이터 .ipynb 3/11
CNN 학습◦결과
1. RNN 의 필요성

RNN(Recurrent Neural Network) 의 필요성


 하나의 x 예제에서
◦ [1, 0, 0, 0]  [0, 1, 0, 0]  [0, 0, 1, 0] 의 순서 정보 저장 필요
 이전 입력의 결과 ( 상태 ) 가 다음 입력값의 출력에 여향을 미침
 순환 신경망 (RNN) x y

[[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, [0, 0, 0,

0]] 1]
 RNN 의 활용 분야 [[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, [1, 0, 0,

◦ 시계열 데이터 1]] 0]

◦ 언어 분류 : “ 훌륭한 작품이다”  긍정[[0, 0, 1, 0], [0, 0, 0, 1], [1, 0, 0, [0, 1, 0,

0]] 0]
◦ 언어 모델 : “ 나는 오늘 학교에” 다음에 나오는 단어는 ?
[[0, 0, 0, 1], [1, 0, 0, 0], [0, 1, 0, [0, 0, 1,
◦ 언어 번역 : “ 나는 학교에 간다”  “ I go to school”
0]] 0]

◦ image captioning : 이미지 하나  “고양이가 테이블 위에 앉아


있다 .”
4/11
CNN 학습 결과 해석하기
2. RNN 의 기본 구조

RNN 의 기본 구조 (1)
 RNN 의 기본 구조
◦ x 예제 하나가 한꺼번에 입력 X x y

[[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, [0, 0, 0,


◦ 순서대로 입력
0]] 1]
 입력 1 : [1, 0, 0, 0]
[[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, [1, 0, 0,
 입력 2 : [0, 1, 0, 0] 1]] 0]

 ...... [[0, 0, 1, 0], [0, 0, 0, 1], [1, 0, 0, [0, 1, 0,

0]] 0]
출력 출력 출력[[0, 0, 0, 1], [1, 0, 0, 0], [0, 1, 0, 출력
[0, 0, 1,

0]] 0]

RNN RNN  RNN RNN


순환연결

입력 1 입력 2 입력 n 입력

5/11
CNN 학습 결과 해석하기
2. RNN 의 기본 구조

RNN 의 기본 구조 (2)
 Vanilla RNN(Simple RNN) 의 내부 구조
◦ 필요에 따라 출력값에 Dense 층 등을 연결
각 단계마다 출력 ( 벡터 ) 을 예측 ,
활용 여부는 문제마다 다름
y 예 ) 마지막 출력만 사용 time t 에서의 입력값 (x) 과 이전
t-1 에서의 출력값의 함수
h 𝑡= 𝑓 𝑤 ( h𝑡 − 1 , 𝑥𝑡 ) 초기 h 값은 0

h 𝑡= tanh ( W hh h𝑡 − 1+ W 𝑥h 𝑥 𝑡 + 𝑏 )
ht-1 ht
RNN
𝑦 𝑡 =W h 𝑦 h𝑡 필요에 따라 출력값에 Dense 층
등 연결 가능

: FCN 의 뉴런과 유사 기능
x RNN 구조는 위와 같이 () 약간 다름

예제 ( 입력 4 개 , 뉴런 3 개 ) : (3x3), (4x3)
6/11
CNN 학습 결과 해석하기
3. SimpleRNN

keras.layers.SimpleRNN()
 layers.SimpleRNN() 사용법 및 1-step 출력 확인
x_input = np.array([[[1, 0, 0, 0]]], dtype=np.float32)
rnn = layers.SimpleRNN(units=3, return_sequences=False, re-
turn_state=True)
# units : 뉴런 개수
# return_sequences : False – 마지막 입력값에 대한 출력값만 출력
# return_state : 마지막 상태값 출력 여부
outputs, states = rnn(x_input)
#print(" 파라미터 개수 :", rnn.count_params())
#print("weights:", rnn.weights)
print(f"x_input: {x_input}, shape: {x_input.shape}")
print(f"outputs: {outputs}, shape: {outputs.shape}")
print(f"states:
x_input: {states},
[[[1. 0. 0.shape:
0.]]], {states.shape}")
shape: (1, 1, 4)
outputs: [[ 0.30234712 -0.7145597 -0.66596806]],
shape: (1, 3)
states: [[ 0.30234712 -0.7145597 -0.66596806]], shape: 7/11
CNN 학습 결과 해석하기
(1, 3)
3. SimpleRNN

keras.layers.SimpleRNN()
 SimpleRNN 을 가상 데이터에 적용
x y
 프로그램 [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, [0, 0, 0,
◦ 08_1_2_Simple RNN.ipynb 0]] 1]

◦ 마지막 출력 + Dense 레이어 [[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, [1, 0, 0,

1]] 0]

inputs = keras.Input(shape=(3, 4))


[[0, 0, 1, 0], [0, 0, 0, 1], [1, 0, 0, [0, 1, 0,
x = layers.SimpleRNN(16, return_sequences=False)
0]] 0]
(inputs)
[[0, 0, 0, 1], [1, 0, 0, 0], [0, 1, 0, [0, 0, 1,
outputs = layers.Dense(4, activation="softmax")(x)
0]] 0]
model = keras.Model(inputs=inputs, outputs=outputs)
FC 인공 신경망과 loss 비교

입력 : 4 * 16 = 64
상태 : 16 * 16 = 256
bias : 16

8/11
CNN 학습 결과 해석하기
4. LSTM

SimpleRNN 의 문제점
 시퀀스가 길어질 경우 결국 기울기 소실 문제 발생
◦ tanh 의 기울기값 : 0~1 h 𝑡= tanh ( W hh h𝑡 − 1+ W 𝑥h 𝑥 𝑡 + 𝑏 )
◦ SimpleRNN 셀의 구조

은닉층 정보가 마지막까지


충분히 전달되지 못함

 LSTM
◦ Long Short-Term Memory https://sooftware.io/lstm_gru/

◦ 단기 상태 (ht) 외에 장기 상태 (ct) 유지 및 전달

Simple 잔차 연결
개념과 유사

9/11
CNN 학습 결과 해석하기
4. LSTM

LSTM (Long Short-Term Memory)


 LSTM 구조
◦ Output Gate h 𝑡= 𝑡𝑎𝑛h (𝑐 𝑡 ) ∗ 𝜎 ( 𝑥𝑡 W 𝑥𝑜 + h𝑡 −1 W h𝑜 +𝑏𝑂 )

 기존 출력과 유사 , 단 , Ct 반영
◦ Forget Gate
𝑐 𝑡 − 1=𝑐 𝑡 −1 ∗ 𝜎 ( 𝑥𝑡 W 𝑥𝑓 + h𝑡 − 1 W h𝑓 +𝑏 𝑓 )

 잊을 건 잊자 !
 얼만큼 ? ()

◦ Input Gate
𝑔=𝑡𝑎𝑛h ( 𝑥 𝑡 W 𝑥𝑔 +h𝑡 −1 W h𝑔 +𝑏 𝑔 )
𝑖=𝜎 ( 𝑥 𝑡 W 𝑥𝑖 + h𝑡 − 1 W h𝑖 +𝑏𝑖 )

𝑐 𝑡 =𝑐 𝑡 −1 + 𝑔 ∗𝑖

 새로운 입력 정보를 저장하자 !


10/11
 얼만큼 ?
CNN 학습 결과 해석하기 ()
4. LSTM

layers.LSTM()
 SimpleRNN 과 사용 방법 동일
 프로그램
◦ 08_1_2_Simple RNN.ipynb 에서 LSTM 적용
x = layers.LSTM(16, return_sequences=False)
(inputs)

11/11
CNN 학습 결과 해석하기
5. 시계열 데이터 학습

apple 주가 예측
 Data : apple_stock.csv
◦ 2013 년 2 월 1 일 ~ 2017 년 12 월 29 일 , 일별 시작가격 (open)
 date, open
 문제 : 연속되는 50 일 동안의 시작가격 (open) 을 기반으로 다음 날
시작가격을 예측하라 .
◦ 일종의 회귀 분석
 마지막 레이어는 sigmoid 등 활성화 함수 불필요
 데이터 전처리
◦ 0~1 사이로 스케일링 : ary = (ary – ary.min()) / (ary.max() – ary.min())
◦ 51 번째부터 마지막까지 : 이전 50 개 값 x, 현재 값 y
 x : [[10], [20], [30], ..., [40]] 과 같이 2 차원 배열 , y : [50]
 x 전체 shape (?, 50, 1), y 전체 shape (?, 1)

◦ 프로그램
 08_1_3_apple 주가 예측 전처리 .ipynb
12/11
CNN 학습 결과 해석하기
연습 문제

apple 주가 예측 실험
 08_1_3_apple 주가 예측 전처리 .ipynb 파일을
기반으로 RNN 모델을 만들고 실험을 수행하라 .
◦ SimpleRNN 과 LSTM 으로 각각 실험을 수행하고 결과를
비교하라 .
◦ 참고 : 파라미터 설정
 loss=“mse”
 metrics=[“mae”]
 mean absolute error :
abs(h – y) 의 평균
 epochs=500
◦ 최종 예측 결과를 그래프로 그려보라 .

13/11
CNN 학습 결과 해석하기

You might also like