Professional Documents
Culture Documents
08 - 1 - RNN 기초
08 - 1 - 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 의 필요성
0]] 1]
RNN 의 활용 분야 [[0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, [1, 0, 0,
0]] 0]
◦ 언어 모델 : “ 나는 오늘 학교에” 다음에 나오는 단어는 ?
[[0, 0, 0, 1], [1, 0, 0, 0], [0, 1, 0, [0, 0, 1,
◦ 언어 번역 : “ 나는 학교에 간다” “ I go to school”
0]] 0]
RNN 의 기본 구조 (1)
RNN 의 기본 구조
◦ x 예제 하나가 한꺼번에 입력 X x y
0]] 0]
출력 출력 출력[[0, 0, 0, 1], [1, 0, 0, 0], [0, 1, 0, 출력
[0, 0, 1,
0]] 0]
입력 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]
1]] 0]
입력 : 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
기존 출력과 유사 , 단 , Ct 반영
◦ Forget Gate
𝑐 𝑡 − 1=𝑐 𝑡 −1 ∗ 𝜎 ( 𝑥𝑡 W 𝑥𝑓 + h𝑡 − 1 W h𝑓 +𝑏 𝑓 )
잊을 건 잊자 !
얼만큼 ? ()
◦ Input Gate
𝑔=𝑡𝑎𝑛h ( 𝑥 𝑡 W 𝑥𝑔 +h𝑡 −1 W h𝑔 +𝑏 𝑔 )
𝑖=𝜎 ( 𝑥 𝑡 W 𝑥𝑖 + h𝑡 − 1 W h𝑖 +𝑏𝑖 )
𝑐 𝑡 =𝑐 𝑡 −1 + 𝑔 ∗𝑖
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 학습 결과 해석하기