Machine Learning/Tensorflow

[순환 신경망] LSTM 레이어

욜스터 2021. 1. 15. 23:04
728x90

SimpleRNN의 문제점

입력 데이터가 길어질수록 (타임스텝이 커질수록) 학습능력이 떨어진다. = 장기의존성 (Long-Term Dependency)문제

입력과 출력사이의 길이가 멀어질수록 연관 관계가 적어진다.

 

LSTM

simpleRNN과 다르게 복잡하다. 

c: 셀 상태를 나타내는 기호

ht와 함께 셀 상태가 전달된다. 

 

[recap] sigmoid함수: 0~1범위의 출력을 낸다

 

시그모이드 함수 => 정보 통과 게이트 역할 (0이면 입력된 정보 통과 X, 1이면 100% 통과)

 

 

 

예제 (SimpleRNN & LSTM 비교)

곱셈 문제: 100개의 실수중 마킹된 두 개의 숫자한다. 

 

-학습 데이터

X=[]
Y=[]
for i in range(3000):
   #0~1 랜덤한 숫자 100개 생성
   lst = np.random.rand(100)
   
   #마킹할 숫자 2개의 인덱스
   idx = np.random.choice(100,2,replace=False)

   #마킹 인덱스가 저장된 원-핫 인코딩 벡터 생성
   zeros=np.zeros(100)
   zeros[idx]=1

   #마킹 인덱스와 랜덤한 숫자를 합쳐서 X에 저장
   X.append(np.array(list(zip(zeros,lst))))

   #마킹 인텍스가 1인 값만 서로 곱해서 Y에 저장
   Y.append(np.prod(lst[idx]))

print(X[0],Y[0])


*원-핫 인코딩 (One-Hot Encoding): 정답에 해당하는 인덱스의 값에는 1을 넣고, 나머지 인덱스에는 모두 0을 넣는 방식

 

-SimpleRNN 학습 모델

model = tf.keras.Sequential([
   tf.keras.layers.SimpleRNN(units=30, return_sequences=True, input_shape=[100,2]),
   tf.keras.layers.SimpleRNN(units=30),
   tf.keras.layers.Dense(1)
])

model.compile(optimizer='adam', loss='mse')
model.summary()

윗첨자: 레이어를 의미.

 

-학습시키기

X = np.array(X)
Y = np.array(Y)

#2560개의 데이터만 학습. 검증 데이터는 20%로 지정
 history = model.fit(X[:2560], Y[:2560], epochs=100, validation_split=0.2) 

-훈련 데이터의 손실은 점차 감소

-검증 데이터의 손실은 오히려 증가

 

*손실(loss): error와 비슷한 개념이다. 딥러닝은 보통 손실을 줄이는 방향으로 학습한다. 

mse는 평균 제곱 오차(Mean Squared Error)의 약자로, 기대출력에서 실제출력을 뺀 뒤 제곱하는 값을 평균하는 것

 

 

-예측의 정확도 체크

model.evaluate(X[2560:], Y[2560:])
prediction = model.predict(X[2560:2560+5])

for i in range(5):
   print(Y[2560+i], '\t', prediction[i][0], '\tdiff:', abs(prediction[i][0] - Y[2560+i]))

prediction = model.predict(X[2560:])
fail=0
for i in range(len(prediction)):
   #오차가 0.04이상이면 오답입니다.
   if abs(prediction[i][0] - Y[2560+i]) > 0.04:
      fail+=1
print('correctness:', (440-fail)/440*100, '%')

 

 

 

-LSTM 학습 모델

model=tf.keras.Sequential([
    tf.keras.layers.LSTM(units=30, return_sequences=True, input_shape=[100,2]),
    tf.keras.layers.LSTM(units=30),
    tf.keras.layers.Dense(1)
])

model.compile(optimizer='adam', loss='mse')
model.summary()

SimpleRNN을 LSTM으로 바꾸기만 함.

 

 

-학습하기

loss와 val_loss가 처음에는 잘 줄어들지 않는 듯하지만 20에포크를 넘어가면서 가파르게 줄어들어 0에 가까워진다.

 

 

-예측의 정확도 체크

lost는 0에 가까운 값이 나오고 샘플에 대한 오차도 작게나온다. 테스트 데이터에 대한 정확도는 92.95%

이 문제를 푸는데는 SimpleRNN 레이어보다 LSTM레이어가 훨씬 적합하다.

728x90
반응형

'Machine Learning > Tensorflow' 카테고리의 다른 글

[순환 신경망] 긍정, 부정 감정 분석  (0) 2021.01.27
[순환신경망]GRU 레이어  (0) 2021.01.25
[순환 신경망] SimpleRNN  (0) 2021.01.15
순환 신경망 (RNN)  (0) 2021.01.15