njs03332 / ml_study

3 stars 0 forks source link

2023/02/03 ~ 2023/02/09 #57

Open njs03332 opened 1 year ago

njs03332 commented 1 year ago
danbi5228 commented 1 year ago

11.4.4 맥스-노름 규제

매 훈련 반복이 끝난 후 모델의 fit() 메서드가 층의 가중치와 함께 max_norm()이 반환한 객체를 호출하고 스케일이 조정된 가중치를 반환

이 값을 사용해서 층의 가중치를 바꿈

keras.layers.Dense(100, activation="elu", kernel_initializer="he_normal", kernel_constraint=keras.constrains.max_norm(1.))

max_norm 함수의 매개변수 중 axis는 기본값이 0

axis = 0 일 때 맥스-노름 규제는 각 뉴런의 가중치 벡터에 독립적으로 적용됨

합성곱 층에 맥스-노름을 사용하려면 axis 매개변수를 적절하게 지정해야 함 (14장 참고. 일반적으로 axis=[0, 1, 2])



## 11.5 요약 및 실용적인 가이드라인
- 11장에서 다룬 여러 기법을 언제 쓰면 좋을지에 대한 명확한 기준은 없지만, 대부분의 경우에 잘 맞는 설정을 정리
- 기본 DNN 설정

| 하이퍼파라미터 | 기본값 | 
|---|---|
| 커널 초기화 | He 초기화 |
| 활성화 함수 | ELU |
| 정규화 | 얕은 신경일 경우 없음. 깊은 신경망이라면 배치 정규화 |
| 규제 | 조기 종료 (필요시 L2규제 추가) |
| 옵티마이저 | 모멘텀 최적화 (또는 RMSProp 이나 Nadam) |
| 학습률 스케줄 | 1 사이클 |

- 자기 정규화를 위한 DNN 설정 : 네트워크가 완전 연결 층을 쌓은 단순한 모델이라면 자기 정규화를 사용할 수 있음

| 하이퍼파라미터 | 기본값 | 
|---|---|
| 커널 초기화 | 르쿤 초기화 |
| 활성화 함수 | SELU |
| 정규화 | 없음 (자기 정규화) |
| 규제 | 필요하다면 알파 드롭아웃 |
| 옵티마이저 | 모멘텀 최적화 (또는 RMSProp 이나 Nadam) |
| 학습률 스케줄 | 1 사이클 |

- 비슷한 문제를 해결한 모델을 찾을 수 있다면 사전 훈련된 신경망의 일부를 재사용해볼 것
- 레이블이 없는 데이터가 많다면 비지도 사전훈련을 사용
- 비슷한 작업을 위한 레이블된 데이터가 많다면 보조 작업에서 사전 훈련을 수행

### 예외 (p.459 상단)
- 희소 모델이 필요하다면 L1규제 사용. 매우 희소한 모델이 필요하면 텐서플로 모델 최적화 툴킷 사용 (기본 DNN 설정 사용)
- 빠른 응답을 하는 모델이 필요하다면 층 개수를 줄이고 배치 정규화 층을 이전 층에 합치기. LeakyReLU나 ReLU 같은 빠른 활성화 함수 사용
- 위험에 민감하고 예측 속도가 매우 중요하지 않은 애플리케이션이라면 MC 드롭아웃 사용 
njs03332 commented 1 year ago

11.4.3 몬테 카를로 드롭아웃

# 드롭아웃을 끄고 패션 MNIST 테스트 세트 첫 번째 샘플 모델 예측 확인
np.round(model.predict(X_test_scaled[:1]), 2)
## 결과: 99%로 이 이미지가 클래스 9(앵클 부츠)에 속한다고 확신

# 드롭아웃을 활성화하여 예측
np.round(y_probas[:, :1], 2)
## 결과: 여전히 클래스 9를 선호하지만 이따금 클래스 5(샌들)이나 7(스니커즈)로 생각 (모두 신발이라는 공통점)

# 첫 번째 차원으로 평균 내기
np.round(y_proba[:1], 2)
## 결과: 여전히 클래스 9에 속한다고 생각하나 62%만 확신함. 모델이 생각하는 다른 클래스에 대해 정확히 알 수 있음

# 확률 추정의 표준 분포 확인
y_std = y_probas.std(axis=0)
np.round(y_std[:1], 2)
## 결과: 이 추정에는 많은 분산이 있음 - 만약 위험에 민감한 시스템 (ex. 의료, 금융) 이런 불확실한 예측을 주의 깊게 다루어야 함

# 정확도 확인
accuracy = np.sum(y_pred == y_test) / len(y_test)
accuracy
## 결과: 조금 향상됨
givitallugot commented 1 year ago

텐서플로를 사용한 사용자 정의 모델과 훈련

12.1 텐서플로 훑어보기