Skip to main content

Keras 에서의 일대다, 다대일 및 다대다 LSTM 예시

다양한 딥 러닝 과제에 LSTM의 사례를 활용합니다.
Created on February 2|Last edited on March 31
이는 여기에서 볼 수 있는 영어 기사를 번역한 것이다.
In this report, I explain long short-term memory (LSTM) and how to build them with Keras. There are principally the four modes to run a recurrent neural network (RNN).


Keras에서 각각의 최소화된 코드 조각이 어떻게 보이는지 알아 보겠습니다.

LSTM은 다양한 모드를 사용하는 다양한 딥러닝 작업에 사용할 수 있습니다. Keras의 사용 사례와 코드 조각 (Code Snippet)으로 각 모드를 살펴보도록 하겠습니다.

일대다 (One-to-Many)

일대다(One-to-Many) 시퀀스 문제들은 입력 데이터는 하나의 시간 단계(Time-step)이고 출력에 여러 값 또는 여러 시간 단계의 벡터가 포함되어 있는 시퀀스 문제입니다. 따라서 단일 입력과 출력 시퀀스가 있습니다. 일반적인 예는 이미지에 대한 설명이 생성되는 이미지 캡션입니다. 라제시 슈레다르 바트와 사라딥 차크라보티 (Rajesh Shredhar Bhat & Soradip Chakraborty)의 놀라운 Generate Meaningful Captions for Images with Attention Models 보고서를 통해 자세히 알아보세요.

예를 들어 보겠습니다.

저희는 아래 이미지와 같은 토이 데이터 세트 (Toy Dataset)를 만들었습니다. 입력 데이터는 숫자의 시퀀스이며, 출력 데이터는 입력 숫자 다음에 오는 두 숫자의 시퀀스입니다.



바닐라 LSTM을 이용해서 여러분을 트레이닝 해드리려고 합니다. 그래프에 표시된 것처럼 트레이닝과 유효성 검사 데이터에 대한 손실 메트릭을 볼 수 있습니다.
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(1, 1)))
model.add(Dense(2))

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

wandb.init(entity='ayush-thakur', project='dl-question-bank')

model.fit(X, Y, epochs=1000, validation_split=0.2, batch_size=3, callbacks=[WandbCallback()])
입력이 10인 테스트 데이터로 예측할 때, 저희는 모델이 시퀀스를 생성할 것으로 예상합니다 [11, 12]. 모델은 예상 값에 가까운 시퀀스 [[11.00657 12.138181]]을 예측했습니다.




다대일 (Many-to-One)

다대일 시퀀스 문제에서, 입력 값으로서 데이터 시퀀스를 가지고, 단일 출력 값을 예측해야만 합니다. 감성 분석 (Sentiment analysis) 또는 텍스트 범주화 (Text classification)가 그러한 사용 사례 중 하나입니다.

예를 들어 보겠습니다.

아래 이미지와 같은 토이 데이터 세트 (Toy Dataset)를 만들었습니다. 입력 값에는 3개의 시간 단계가 있는 15개의 샘플이 있으며 출력 값은 각 단계의 값의 합입니다.


바닐라 LSTM을 이용해서 여러분을 트레이닝 하고자 합니다. 그래프에 표시된 것처럼 트레이닝과 유효성 검사 데이터에 대한 손실 메트릭을 볼 수 있습니다.
tf.keras.backend.clear_session()
model = Sequential()
model.add(LSTM(50, activation='relu', input_shape=(3, 1)))
model.add(Dense(1))

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

wandb.init(entity='ayush-thakur', project='dl-question-bank')

history = model.fit(X, Y, epochs=1000, validation_split=0.2, verbose=1, callbacks=[WandbCallback()])
테스트 데이터로 예측할 때, 입력은 3개의 시간 단계 [50,51,52]의 시퀀스입니다. 예상 출력 값의 합인 153이어야 합니다. 이 모델은 [[152.9253]] 값을 예측 했습니다. 이는 비상식적일 정도로 예상 값에 가깝습니다.




Many-to-Many

다대다 (Many-to-Many) 시퀀스 러닝은 입력 시퀀스가 일부 언어로 되어 있고 출력 시퀀스가 일부 다른 언어로 되어 있는 머신 번역에 사용될 수 있습니다. 입력 시퀀스는 서로 다른 시간 단계에서 비디오의 각 프레임에 대한 특성 표현인 비디오 범주화 (Video Classification)에도 사용할 수 있습니다.
인코더-디코더 네트워크(Encoder-Decoder network)는 일반적으로 다대다 시퀀스 태스크에 사용됩니다. 여기서 인코더-디코더는 두 개의 LSTM 레이어를 가진 신경 아키텍처 (Neural architecture)의 다른 멋진 명칭입니다.

예를 들어 보겠습니다.

해당 토이 실험에서 아래 이미지와 같은 토이 데이터 세트 (Toy Dataset)를 만들었습니다. 입력 값에는 3개의 시간 단계가 있는 20개의 샘플이 있는 반면에 출력 값은 5의 다음 3개 연속 값의 곱입니다.


바닐라 인코더-디코더 (Encoder-Decoder) 아키텍처로 여러분을 트레이닝 하도록 하겠습니다. 그래프에 표시된 것처럼 트레이닝 및 유효성 검사 데이터에 대한 Loss 메트릭을 볼 수 있습니다.

model = Sequential()

# encoder layer
model.add(LSTM(100, activation='relu', input_shape=(3, 1)))

# repeat vector
model.add(RepeatVector(3))

# decoder layer
model.add(LSTM(100, activation='relu', return_sequences=True))

model.add(TimeDistributed(Dense(1)))
model.compile(optimizer='adam', loss='mse')

print(model.summary())

wandb.init(entity='ayush-thakur', project='dl-question-bank')

history = model.fit(X, Y, epochs=1000, validation_split=0.2, verbose=1, batch_size=3, callbacks=[WandbCallback()])
테스트 데이터로 예측할 때, 입력은 3개의 시간 단계 [300, 305, 310]의 시퀀스입니다. 예상 출력 값은 5의 다음 3개 연속 값의 곱인 [315, 320, 325]이어야 합니다. 이 모델은 [[[315.29865], [321.0397 ], [327.0003 ]]]값을 예측 했습니다. 이는 비상식적일 정도로 예상 값에 가깝습니다.





더 읽을 거리

다음 자료들은 제가 이러한 개념들을 이해하는 개인적인 방법과 관련이 있는 소스들 중 일부입니다.
(Usman Malik이 Keras 블로그에 올린 LSTM의 시퀀스 문제 해결은 코드 조각 (Code Snippet)을 만드는 데 사용되었습니다.)
Iterate on AI agents and models faster. Try Weights & Biases today.