적은 양의 데이터에서 큰 LSTM net으로 과적 합 방지
나는 AI.SE 에서 주제를 벗어난 것으로 생각하기 때문에 AI.SE 에서이 질문을 다시 게시 하고 있습니다.
1. 컨텍스트
저는 Health-Monitoring 기술을 연구하고 있으며 C-MAPSS 데이터 세트를 연습합니다 . 목표는 센서 측정 시리즈가 주어진 엔진의 남은 사용 수명 (RUL)을 예측하는 것입니다. C-MAPSS 데이터 세트에 대한 광범위한 자료가 있습니다. 여기에는 클래식 (비 DL) ML 기술과 DL 기반 접근 방식이 모두 포함됩니다. 몇 년 전, LSTM 기반 네트워크는 유망한 결과를 보였으며 ( 잔여 수명 추정을위한 장단기 기억 네트워크, Zheng et al , 2017 참조 ) 이러한 결과를 재현하려고합니다.
C-MAPSS 데이터 세트에는 적은 양의 데이터가 포함되어 있습니다. 예를 들어 FD001 하위 집합에는 100 개의 실행 실패 시리즈 만 있습니다. 고정 길이 시계열을 얻기 위해 사전 처리 할 때 최대 20,000 프레임 시리즈를 얻을 수 있습니다. LSTM을 사용하여 위에서 언급 한 기사에서, 그들은 각각 64 개의 유닛이있는 2 개의 은닉 LSTM 레이어와 각각 8 개의 뉴런이있는 2 개의 완전 연결 레이어 (~ 55,000 개의 매개 변수)를 사용합니다.
2. 문제
LSTM은 많은 수의 매개 변수를 유도하므로 이러한 네트워크를 훈련 할 때 과적 합이 발생할 수 있습니다. L1 또는 L2 정규화, 드롭 아웃을 사용할 수 있지만 데이터 세트와 관련하여 그물은 여전히 큰 크기입니다. 동일한 아키텍처를 유지하면서 유효성 검사 세트의 논문에서 점수와 RMSE에 도달 할 수 없으며 과적 합은 항상 여기에 있습니다.
그러나 작동하는 한 가지는 LSTM 계층의 단위 수를 줄이는 것입니다. 예상대로 레이어 당 64 개가 아닌 24 개 단위 만 있으면 네트는 훨씬 적은 매개 변수 (~ 9000)를 가지며 과적 합을 나타내지 않습니다. 점수와 RMSE는 논문의 점수보다 약간 나쁘지만 지금까지 얻을 수있는 최고입니다. 이 결과는 나에게 좋지만 논문 저자가 LSTM (64,64) net에서 과적 합을 피할 수 있었던 방법에 대해 궁금합니다.
3. 질문
LSTM은 훌륭하지만 작은 데이터 세트에 대한 올바른 학습을 방해하는 많은 매개 변수를 유도합니다.이 특정 문제를 해결할 방법이 있는지 궁금합니다. 작은 데이터 세트에서 LSTM 기반 그물로 과적 합을 방지하는 방법에 대한 조언이 있습니까?
4. 정보
내 인터넷 및 결과에 대한 자세한 정보를 아래에 제공합니다.
네트워크 아키텍처
model = keras.models.Sequential([
keras.layers.LSTM(24, return_sequences=True, kernel_regularizer=keras.regularizers.l1(0.01),
input_shape=input_shape),
keras.layers.Dropout(0.2),
keras.layers.LSTM(24, return_sequences=False, kernel_regularizer=keras.regularizers.l1(0.01)),
keras.layers.Dropout(0.2),
keras.layers.Dense(8, activation='relu', kernel_regularizer=keras.regularizers.l2()),
keras.layers.Dropout(0.2),
keras.layers.Dense(8, activation='relu', kernel_regularizer=keras.regularizers.l2(), bias_regularizer=keras.regularizers.l2()),
keras.layers.Dense(1, activation='relu')
])
점수 (검증 세트)
- 논문 : 점수 = 16.14; RMSE = 338
- 내 LSTM (64, 64) : 점수 = 26.47; RMSE = 3585 (과적 합)
- 내 LSTM (24, 24) : 점수 = 16.82; RMSE = 515
편집 : @ hH1sG0n3이 제안한 솔루션에 대한 결과
- LSTM (64, 64)
recurrent_dropout=0.3
: 점수 = 16.36; RMSE = 545
답변
위 코드에서 테스트하지 않는 것으로 보이는 몇 가지 하이퍼 파라미터를 확인할 수 있습니다.
- 그라디언트 클리핑 : 훈련 중 가중치를 크게 업데이트하면 숫자 오버플로 또는 언더 플로가 종종 "폭발 기울기"라고하는 언더 플로가 발생할 수 있습니다.
# configure your optimizer with gradient norm clipping
opt = SGD(lr=0.01, momentum=0.9, clipnorm=1.0)
- 반복 드롭 아웃 : LSTM 계층 단위의 반복 입력 신호에 적용되는 드롭 아웃입니다.
keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., recurrent_dropout=0.3)
- Stateful : 모델이 각 학습 반복에서 상태를 유지하는지 여부가 문서에서 명확합니까? 이것으로도 실험 할 수 있습니다.
keras.layers.LSTM(24, kernel_regularizer=keras.regularizers.l1(0.01), ..., stateful=True)
따라서 질문은 특히 작은 데이터 세트로 과적 합을 방지하는 방법에 대해 묻습니다.
분명히 내 첫 번째 직관은 레이어 수를 줄이라고 말하지만 (예를 들어 두 번째 LSTM 레이어 제거), 이것은 분명히 모델의 전체 아키텍처를 변경하여 논문에 설명 된 모델보다 더 적은 레이어를 갖도록합니다.
다른 특히 분명한 제안은 현재 보유하고있는 데이터 세트를 사용하여 샘플 수를 인위적으로 늘리기 위해 어떤 형태의 데이터 증대를 수행하는 것입니다.
데이터에 전처리를 적용 했습니까 (예 : 스케일링 된 숫자 값 등)? 그렇지 않은 경우에도 도움이 될 수 있습니다.