시계열 모델 LSTM에 기능 추가


42

LSTM과 시계열에 대한 사용법에 대해 조금 읽었으며 흥미롭지 만 동시에 어려웠습니다. 내가 이해하는 데 어려움을 겪었던 한 가지는 이미 시계열 기능 목록에 추가 기능을 추가하는 방법입니다. 다음과 같이 데이터 세트가 있다고 가정하십시오.

t-3, t-2, t-1, 출력

이제 출력에 영향을주는 기능이 있지만 반드시 시계열 기능은 아니라는 사실을 알고 날씨 외부의 날씨를 말합니다. 이것이 당신이 추가 할 수있는 것입니까? LSTM은 시계열 측면과 무엇이 아닌지를 구별 할 수 있습니까?


나는 당신의 질문을 좋아합니다. 그러나 비 시간 시리즈 기능이 주제 지식을 기반으로 시간 t에서 출력에 어떤 영향을 미치는지 자세히 설명 할 수 있습니다.
horaceT

답변:


39

RNN (예 : LSTM 및 GRU)의 경우 계층 입력 시간 단계 목록이며 각 시간 단계 기능 텐서입니다. 즉, 다음과 같은 입력 텐서를 가질 수 있습니다 (Pythonic 표기법으로).

# Input tensor to RNN
[
    # Timestep 1
    [ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
    # Timestep 2
    [ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
    # Timestep 3
    [ temperature_in_paris, value_of_nasdaq, unemployment_rate ],
    ...
]

따라서 각 단계마다 여러 기능을 가질 수 있습니다. 내 생각에 날씨는 시계열 기능입니다. 내가 사는 곳은 시간의 함수입니다. 따라서 날씨 정보를 각 타임 스텝에서 기능 중 하나로 인코딩하는 것이 합리적입니다 (흐림 = 0, 맑은 = 1 등의 적절한 인코딩 사용).

시계열이 아닌 데이터가있는 경우 LSTM을 통해 전달하는 것은 의미가 없습니다. 어쨌든 LSTM은 작동하지만, 그렇게해도 훈련 시간당 손실이 높고 정확도가 떨어질 수 있습니다.

또는 추가 계층을 통해 이러한 종류의 "추가"정보를 LSTM 외부의 모델에 도입 할 수 있습니다. 다음과 같은 데이터 흐름이있을 수 있습니다.

TIME_SERIES_INPUT ------> LSTM -------\
                                       *---> MERGE ---> [more processing]
AUXILIARY_INPUTS --> [do something] --/

따라서 보조 입력을 LSTM 출력에 병합하고 거기서부터 네트워크를 계속합니다. 이제 모델은 단순히 다중 입력입니다.

예를 들어 특정 응용 프로그램에서 LSTM 출력 시퀀스의 마지막 출력 만 유지한다고 가정 해 봅시다. 길이가 10 인 벡터라고 가정 해 봅시다. 보조 입력은 인코딩 된 날씨 (스칼라) 일 수 있습니다. 병합 계층은 보조 날씨 정보를 LSTM 출력 벡터의 끝에 간단히 추가하여 길이 11의 단일 벡터를 생성 할 수 있습니다. 그러나 마지막 LSTM 출력 타임 스텝을 유지할 필요 는 없습니다 . LSTM이 100 개의 타임 스텝을 각각 출력 한 경우 10 개의 벡터로 구성된 기능을 사용하면 보조 날씨 정보를 계속 확인할 수 있으며 각각 11 개의 데이터 포인트로 구성된 100 개의 타임 스텝이 생성됩니다.

기능적 API 에 대한 Keras 문서 에는 이에 대한 개요가 있습니다.

다른 경우에는 @horaceT가 지적한 것처럼 LSTM을 일시적이지 않은 데이터에 대해 조건을 지정할 수 있습니다. 예를 들어, 주어진 위치에서 내일 날씨를 예측하십시오. 이 경우 다음은 각각 긍정적 / 부정적 세 가지 제안입니다.

  1. RNN의 내부 / 숨겨진 상태를 효과적으로 "설정"하기 때문에 컨디셔닝 데이터가 첫 번째 타임 스텝에 포함되도록하십시오. 솔직히 말해서, 나는 여러 가지 이유로 이렇게 하지 않을 것입니다 : 컨디셔닝 데이터는 나머지 기능과 같은 모양이어야하며 상태 저장 RNN을 생성하는 것을 어렵게 만듭니다 (데이터를 공급하는 방법을 실제로 조심스럽게 추적하는 관점에서) 네트워크로), 네트워크는 충분한 시간 (예를 들어, 긴 트레이닝 시퀀스, 또는 긴 예측 시퀀스) 등으로 컨디셔닝 데이터를 "잊어 버릴"수있다.

  2. 시간 데이터 자체의 일부로 데이터를 포함하십시오. 따라서 특정 시간 단계의 각 특징 벡터에는 "대부분"시계열 데이터가 포함되지만 각 특징 벡터의 끝에 컨디셔닝 데이터가 추가됩니다. 네트워크가이를 인식하는 법을 배우게됩니까? 아마도 그럼에도 불구하고 시퀀스 데이터를 비 순차 정보로 오염시켜 더 어려운 학습 작업을 만들고 있습니다. 그래서 나는 또한 이것을 권장하지 않습니다 .

  3. 아마도 가장 좋은 방법은 0에 RNN의 숨겨진 상태에 직접 영향을 미치는 것입니다. 이것은 Karpathy 와 Fei-FeiVinyals et al . 이것이 작동하는 방식입니다.

    1. x
    2. v=Wx+bWb
    3. v

    이 접근 방식은 비 일시적 입력에 대한 RNN의 조건을 적절하게 조정하고 모양 문제를 자연스럽게 해결하며 추가 비 일시적 정보로 입력 시간 단계를 오염시키지 않기 때문에 "이론적으로"가장 정확합니다. 단점은이 접근 방식에 종종 아키텍처의 그래프 수준 제어가 필요하므로 Keras와 같은 상위 레벨 추상화를 사용하는 경우 고유 한 레이어 유형을 추가하지 않으면 구현하기가 어렵다는 것을 알게됩니다.


1
좋은 제안이지만 LSTM의 출력에 비 시간 계열 예측 변수가 구조적으로 종속되어 있다면 어떨까요?
horaceT

예를 들어 주시겠습니까?
Adam Sypniewski

6
여기 아주 인공적인 예가 있습니다. 마지막 n 시간 단계의 obs를 기반으로 시간 t에서 날씨를 예측하려고한다고 가정 해보십시오. 날씨는 당신이 살고있는 세계의 일부에 달려 있습니다. 북반구의 여름이면 남반구의 겨울입니다. 따라서이 남북 요인을 고려해야합니다. LSTM에 통합 할 수 있습니까?
horaceT

1
좋은 질문입니다! 이 문제를 해결하기 위해 수정 사항을 포함 시켰습니다.
Adam Sypniewski

편집 및 두 참조에 대한 감사합니다. 매우 유용합니다.
horaceT

2

이 스레드의 모든 좋은 대답을 바탕으로 보조 입력을 조건으로하는 라이브러리를 작성했습니다. 모든 복잡성을 추상화하고 가능한 한 사용자 친화적으로 설계되었습니다.

https://github.com/philipperemy/cond_rnn/ (tensorflow)

그것이 도움이되기를 바랍니다!


0

keras LSTM에는 기능이 있습니다 reset_states(states).

그러나 매개 변수 상태는 숨겨진 상태 h와 셀 상태라는 두 상태의 연결입니다.

States = [h, c]

당신이 초기화 할 경우 알고 재미있을 것 h또는 c에 따른 위에서 언급 한 논문에 접근한다.


0

이것은 가장 효율적인 방법은 아니지만 정적 변수는을 사용하여 시계열 길이로 반복 될 수 있습니다 tf.tile().

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.