Immersion In Data

AI

[AI] LSTM(Long Short Term Memory)

sungjunminn 2022. 8. 16. 15:12

1. 일반적인 신경망 Feed-forward neural networks(FFNets)

데이터를 트레이닝 셋과 테스트 셋으로 나누어서 관리하고, 트레이닝 셋을 통해 신경망의 가중치를 학습시켜 결과를 테스트 셋을 통해 확인하는 방식이다. 

FFNets에서 데이터를 입력하면 입력층에서 은닉층까지 연산이 진행되고 출력되고, 이 과정에서 입력 데이터는 모든 노드를 한 번씩 지나가게 된다. 데이터가 노드를 한 번만 지나가게 된다는 것은 데이터의 순서(시간적인 측면)를 고려하지 않는 구조라는 의미이다. 데이터들의 시간 순서를 무시하고 현재 주어진 데이터를 통해서 독립적으로 학습한다.

 

 

일반 인공네트워크 신경망

 

 

2. 순환 신경망 RNN(Recurrent Neural Networks)

입력과 출력을 시퀀스 단위로 처리하는 Sequence 모델이다. 

시간 경과에 따른 Back Propagation(역전파)을 사용하여 훈련되는 인공신경망 네트워크이다. 

일반적인 신경망과는 달리 RNN은 은닉층의 결과가 다시 같은 은닉층의 입력으로 들어가도록 연결되는 구조로 순서 또는 시간이라는 측면을 고려할 수 있는 특징이 있다. 다시말해, 은닉층의 노드에서 활성화 함수를 통해 나온 결과값을 출력층 방향으로도 보내면서, 다시 은닉층 노드의 다음 계산의 입력으로 보내는 특징을 가지고 있다. 

 

RNN 인공네트워크 신경망

 

시간축으로 표현한 RNN구조

 

2-1. RNN의 장기의존성(Long Term Dependency) 문제점

"하늘에 떠있는 구름" 이라는 문장을 RNN이 학습한다면 "하늘에 떠있는"이라는 문장만 가지고도 "구름"이라는 단어를 유추할 수 있을 것이다. 제공된 데이터와 배워야할 데이터의 차이가 크지 않기 때문에 과거 데이터 기반으로 학습을 할 수 있는 것이다. 그러나 "나는 한국에서 자랐고, 나는 한국어를 유창하게 한다."라는 문장이 있을 때, "나는 한국에서 자랐고, 나는 ~를 유창하게 한다."에서 ~부분을 예측해야 한다면, "나는 한국에서 자랐고,"와 "나는 ~를 유창하게 한다."라는 두 문장은 문장 표현의 순서상 차이가 큰 문장에 속한다. 그래서 RNN은 두 정보의 문맥을 연결하기 힘들어 진다. 

 

3. LSTM(Long Short Term Memory)

순서가 중요한 feature의 요소일 대 흔히 적용하는 RNN의 한 종류이고, 기계학습에서 어려운 문제를 해결하고 최첨단 결과를 달성하는 데에 사용된다. 

RNN이 가진 장기의존성 문제를 해결하기 위해 다양한 RNN이 나왔고, LSTM도 그 중 하나이다.

import tensorflow as tf
from tensorflow import keras
from tensorflow.keras import layers
from sklearn.model_selection import train_test_split

from tensorflow.keras.utils import to_categorical
y = to_categorical(y, num_classes=None)

# model set
model = keras.Sequential()
# Add an Embedding layer expecting input vocab of size 1000, and
# output embedding dimension of size 64.
# model.add(layers.Embedding(input_dim=1000, output_dim=64))

# Add a LSTM layer with 128 internal units.
model.add(layers.LSTM(128, input_shape=(len_seq, dim_block), name='Layer1'))

# Add a Dense layer with 10 units.
model.add(layers.Dense(128, activation='relu', name='Layer2'))
model.add(layers.Dense(128, activation='relu', name='Layer3'))
model.add(layers.Dense(dim_block, activation='softmax', name='Layer4'))

model.summary()

# split train test
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
x_train_val, x_val, y_train_val, y_val = train_test_split(x_train, y_train, test_size=0.25)

# fit
model.compile(loss='categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(x_train_val, y_train_val, epochs=300, batch_size=32, validation_data=(x_val, y_val), verbose=0)

loss, mse = model.evaluate(x_test, y_test, batch_size=1)
print('acc: ', mse)

print(x_test.shape)

data_save = []
for i in range(x_test.shape[0]):
  ttt = []
  for j in range(len_seq):
    t1 = np.argmax( x_test[i, j, :] )
    ttt.append(list_block[t1])
  data_save.append(ttt)

t1 = model.predict(x_test)
t1 = np.argmax(t1, axis=1)
answer = []
for i in range(x_test.shape[0]):
  answer.append(list_block[t1[i]])

t2 = np.argmax(y_test, axis=1)
correct = []
for i in range(x_test.shape[0]):
  correct.append(list_block[t2[i]])

f = open("test_data"+str(len_seq)+".txt", 'a')
for i in range(x_test.shape[0]):
  text = str()
  for j in range(len_seq):
    if j == (len_seq-1):
      text = text + data_save[i][j]
    else:
      text = text + data_save[i][j] + ','
  text = text + '\n'
  f.write(text)
f.close()

f = open("answer_data"+str(len_seq)+".txt", 'a')
for i in range(x_test.shape[0]):
  text = answer[i] + '\n'
  f.write(text)
f.close()

f = open("correct_data"+str(len_seq)+".txt", 'a')
for i in range(x_test.shape[0]):
  text = correct[i] + '\n'
  f.write(text)
f.close()

'AI' 카테고리의 다른 글

[AI] Random Forest  (0) 2022.08.19
[AI] Decision Tree  (0) 2022.08.18
[AI] K-NN(K-Nearest Neighbor)  (0) 2022.08.18
[AI] Logistic Regression  (0) 2022.08.17
[AI] RBM(Restricted Boltzmann Machine)  (0) 2022.08.17