[python] 일괄 정규화 및 드롭 아웃 순서?

원래 질문은 특히 TensorFlow 구현에 관한 것이 었습니다. 그러나 대답은 일반적인 구현에 대한 것입니다. 이 일반적인 답변은 TensorFlow에 대한 정답이기도합니다.

TensorFlow에서 일괄 정규화 및 드롭 아웃 (특히 contrib.layers 사용)을 사용할 때 순서에 대해 걱정해야합니까?

드롭 아웃을 사용하고 즉시 일괄 정규화를 사용하면 문제가있을 수 있습니다. 예를 들어, 배치 정규화의 이동이 더 큰 규모의 학습 출력으로 학습되지만 동일한 이동이 테스트 중에 드롭 아웃없이 더 작은 (더 많은 출력을 갖는 것에 대한 보상으로 인해) 척도 수에 적용되는 경우 교대가 꺼져있을 수 있습니다. TensorFlow 일괄 정규화 레이어가이를 자동으로 보상합니까? 아니면 내가 놓친 어떤 이유로 이런 일이 발생하지 않습니까?

또한이 두 가지를 함께 사용할 때주의해야 할 다른 함정이 있습니까? 예를 들어 위와 관련하여 올바른 순서로 사용한다고 가정하면 ( 올바른 순서 있다고 가정 ) 여러 연속 레이어에서 일괄 정규화와 드롭 아웃을 모두 사용하는 데 문제가있을 수 있습니까? 즉시 문제가 보이지는 않지만 뭔가 빠졌을 수 있습니다.

감사합니다!

최신 정보:

실험 테스트 순서 중요 하다는 것을 암시하는 것 같습니다 . 배치 표준과 드롭 아웃을 반대로 사용하여 동일한 네트워크를 두 번 실행했습니다. 드롭 아웃이 배치 표준보다 앞선 경우 학습 손실이 감소함에 따라 검증 손실이 증가하는 것 같습니다. 다른 경우에는 둘 다 내려갑니다. 하지만 제 경우에는 움직임이 느리기 때문에 더 많은 훈련 후에 상황이 바뀔 수 있으며 단일 테스트 일뿐입니다. 더 명확하고 정보에 입각 한 답변을 주시면 감사하겠습니다.



답변

에서 Ioffe 및 Szegedy 2015 , 저자는 “우리는 어떤 매개 변수 값, 네트워크가 항상 원하는 배포 활성화를 생산하도록 싶습니다”상태. 따라서 Batch Normalization Layer는 실제로 Conv Layer / Fully Connected Layer 바로 뒤에 삽입되지만 ReLu (또는 다른 종류의) 활성화에 공급되기 전에 삽입됩니다. 자세한 내용 은 약 53 분 에이 비디오 를 참조하십시오.

드롭 아웃에 관해서는 활성화 레이어 이후에 드롭 아웃이 적용된다고 생각합니다. 에서 강하 종이 도 3b, 숨겨진 레이어 (L)에 대한 전압 강하 인자 / 확률 행렬 R (L)이 Y (L)를 활성화 함수 f를 적용 후에 결과 Y (L)에인가된다.

요약하면 일괄 정규화 및 드롭 아웃을 사용하는 순서는 다음과 같습니다.

-> CONV / FC-> BatchNorm-> ReLu (또는 기타 활성화)-> 드롭 아웃-> CONV / FC->


답변

댓글에서 언급했듯이 레이어 순서를 읽을 수있는 놀라운 리소스가 여기 있습니다 . 나는 댓글을 봤고 인터넷에서 찾은 주제에 대한 최고의 리소스입니다.

내 2 센트 :

드롭 아웃은 특정 뉴런의 정보를 완전히 차단하여 뉴런이 공동 적응하지 않도록합니다. 따라서 일괄 정규화는 드롭 아웃 이후 여야합니다. 그렇지 않으면 정규화 통계를 통해 정보를 전달합니다.

생각해 보면 일반적인 ML 문제에서 이것이 전체 데이터에 대한 평균 및 표준 편차를 계산하지 않고 학습, 테스트 및 검증 세트로 분할하지 않는 이유입니다. 훈련 세트에 대한 통계를 분할 한 다음 계산하고이를 사용하여 검증 및 테스트 데이터 세트를 정규화하고 중앙에 배치합니다.

그래서 나는 Scheme 1을 제안합니다 (이것은 수용 된 답변에 대한 pseudomarvin의 의견을 고려합니다)

-> CONV / FC-> ReLu (또는 기타 활성화)-> Dropout-> BatchNorm-> CONV / FC

도식 2와 반대로

-> CONV / FC-> BatchNorm-> ReLu (또는 기타 활성화)-> 드롭 아웃-> CONV / FC-> 수락 된 답변에서

이는 Scheme 2의 네트워크가 Scheme 1의 네트워크에 비해 과적 합을 보여야하지만 OP는 문제에서 언급 한대로 몇 가지 테스트를 실행했으며 Scheme 2를 지원함을 의미합니다.


답변

일반적으로 Dropout(있는 경우 BN) :

  • “BN Dropout은 어떤 경우에 BN이 Dropout과 유사한 정규화 이점을 직관적으로 제공 할 필요가 없습니다. “
  • “ResNet, DenseNet 등과 같은 아키텍처는 Dropout

자세한 내용 은 @Haramoz 가 주석에서 이미 언급 한대로 [ Dropout과 Batch Normalization by Variance Shift 간의 불일치 이해] 문서를 참조하십시오 .


답변

Dropout과 Batch Norm (BN)의 부조화를 설명하는 논문을 찾았습니다. 핵심 아이디어는 “분산 이동” 이라고 부르는 것 입니다. 이는 탈락이 훈련 단계와 테스트 단계 사이에 다른 동작을 가지기 때문에 BN이 학습하는 입력 통계를 이동시키기 때문입니다. 주요 아이디어는이 문서 에서 가져온이 그림에서 찾을 수 있습니다 .
여기에 이미지 설명 입력

이 효과에 대한 작은 데모는이 노트북 에서 찾을 수 있습니다 .


답변

더 나은 성능을위한 연구 논문 을 기반으로 Dropout을 적용하기 전에 BN을 사용해야합니다.


답변

올바른 순서는 전환> 정규화> 활성화> 드롭 아웃> 풀링입니다.


답변

전환-활성화-중퇴-BatchNorm-풀-> 테스트 손실 : 0.04261355847120285

전환-활성화-중퇴-풀-BatchNorm-> 테스트 손실 : 0.050065308809280396

전환-활성화-BatchNorm-풀-드롭 아웃-> 테스트 손실 : 0.04911309853196144

전환-활성화-BatchNorm-탈락-풀-> 테스트 손실 : 0.06809622049331665

전환-BatchNorm-활성화-탈락-풀-> 테스트 손실 : 0.038886815309524536

전환-BatchNorm-활성화-풀-드롭 아웃-> 테스트 손실 : 0.04126095026731491

전환-BatchNorm-드롭 아웃-활성화-풀-> 테스트 손실 : 0.05142546817660332

전환-탈락-활성화-BatchNorm-풀-> 테스트 손실 : 0.04827788099646568

전환-탈락-활성화-풀-BatchNorm-> 테스트 손실 : 0.04722036048769951

전환-탈락-BatchNorm-활성화-풀-> 테스트 손실 : 0.03238215297460556


2 개의 컨볼 루션 모듈 (아래 참조)을 사용하여 MNIST 데이터 세트 (20 epochs)에서 훈련되었으며, 매번

model.add(Flatten())
model.add(layers.Dense(512, activation="elu"))
model.add(layers.Dense(10, activation="softmax"))

컨벌루션 계층의 커널 크기는 (3,3)기본 패딩이며 활성화는 elu입니다. 풀링은 풀 사이드의 MaxPooling입니다 (2,2). 손실은 categorical_crossentropy이고 최적화 프로그램은 adam입니다.

해당하는 탈락 확률은 각각 0.2또는 0.3입니다. 기능 맵의 양은 32또는64 각각 입니다.

편집 :
일부 답변에서 권장하는대로 Dropout을 떨어 뜨렸을 때 BatchNorm Dropout을 사용할 때보 다 더 빨리 수렴되었지만 일반화 능력이 떨어졌습니다 .