Deep learning/이론(hands on machine learning) 14

16. 규제를 사용해 과대적합 피하기

심픙 신경망은 전형적으로 수만 개, 때로는 수백만 개의 파라미터를 가지고 있다. 이 때문에 네트워크의 자유도가 매우 높다. 즉, 대규모의 복잡한 데이터셋을 학습할 수 있다는 뜻이다. 하지만 이런 높은 자유도는 네트워크를 훈련 세트에 과대적합되기 쉽게 만든다. 규제가 필요하다. 앞에서 이미 최상의 규제 방법 중 하나인 조기 종료를 구현했다. 또한 배치 정규화는 불안정한 그레이디언트 문제를 해결하기 위해 고안되었지만 꽤 괜찮은 규제 방법으로도 사용할 수 있다. 이번에는 신경망에서 널리 사용되는 다른 규제 방법을 알아보겠다. l1과 l2규제, 드롭아웃(dropout), 맥스-노름(max_norm) 규제이다. 일반적으로 네트워크의 모든 은닉층에 동일한 활성화 함수, 동일한 초기화 전략을 사용하거나 모든 층에 동..

15. 학습률 스케줄링

좋은 학습률을 찾는 것이 매우 중요하다. 학습률을 너무 크게 잡으면 훈련이 실제로 발산할 수 있다. 너무 작게 잡으면 최적점에 수렴하겠지만 시간이 매우 오래 걸릴 것이다. 만약 조금 높게 잡으면 처음에는 매우 빠르게 진행하겠지만 최적점 근처에서는 요동이 심해져 수렴하지 못할 것이다. 일정한 학습률보다 더 나은 방법이 있다. 큰 학습률로 시작하고 학습 속도가 느려질 때 학습률을 낮추면 최적의 고정 학습률보다 좋은 솔루션을 더 빨리 발견할 수 있다. 훈련하는 동안 학습률을 감소시키는 전략에는 여러 가지가 있다. 이런 전략을 학습 스케줄이라고 한다. 케라스에서 거듭제곱 기반 스케줄링이 가장 구현하기 쉽다. 옵티마이저를 만들 때 decay 매개변수만 지정하면 된다. decay는 s(학습률을 나누기 위해 수행할 ..

14. 고속 옵티마이저

아주 큰 심층 신경망의 훈련 속도는 심각하게 느릴 수 있다. 지금까지 훈련 속도를 높이는 네 가지 방법을 보았다. 연결 가중치에 좋은 초기화 전략 적용하기, 좋은 활성화 함수 사용하기, 배치 정규화 사용하기, 사전 훈련된 네트워크의 일부 재사용하기이다. 훈련 속도를 크게 높일 수 있는 또 다른 방법으로는 표준적인 경사 하강법 옵티마이저 대신 더 빠른 옵티마이저를 사용할 수 있다. 모멘텀 최적화, 네스테로프 가속 경사, AdaGrad, RMSProp, Adam, Nadam 옵티마이저가 있다. AdaGrad는 너무 빨리 느려져서 전역 최적점에 수렴하지 못하는 위험이 있다. RMSProp 알고리즘은 훈련 시작부터의 모..

13. 사전훈련된 층 재사용 하기

일반적으로 아주 큰 규모의 DNN을 처음부터 새로 훈련하는 것은 좋은 생각이 아니다. 해결 하려는 것과 비슷한 유형의 문제를 처리한 신경망이 이미 있는지 찾아본 다음, 그 신경망의 하위층을 재사용하는 것이 좋다. 이를 전이 학습(transfer learning) 이라고 한다. 이 방법은 훈련 속도를 크게 높일 뿐만 아니라 필요한 데이터도 크게 줄여준다. 동물, 식물, 자동차, 생활용품을 포함해 카테고리 100개로 구분된 이미지를 분류하도록 훈련한 DNN을 가지고 있다고 가정하자. 그리고 이제 구체적인 자동차의 분류를 분류하는DNN을 훈련하려 한다. 이런 작업들은 비슷한 점이 많고 심지어 일부 겹치기도 하므로 첫 번째 신경망의 일부를 재사용해봐야 한다. 보통 원본 모델의 출력층을 바꿔야 한다. 이 층이 새..

12. 배치 정규화

그레이디언트 소실과 폭주 문제를 해결하기 위한 배치 정규화(BN) 기법은 각 층에서 활성화 함수를 통과하기 전이나 후에 모델에 연산을 하나 추가한다. 이 연산은 단순하게 입력을 원점에 맞추고 정규화한 다음, 각 층에서 두 개의 새로운 파라미터로 결괏값의 스케일을 조정하고 이동시킨다. 하나는 스케일 조정에, 다른 하나는 이동에 사용한다. 많은 경우 신경망의 첫 번째 층으로 배치 정규화를 추가하면 훈련 세트를 (예를 들면 StandardScaler를 사용하여) 표준화할 필요가 없다. 배치 정규화 층이 이런 역할을 대신한다. 입력 데이터를 원점에 맞추고 정규화하려면 알고리즘은 평균과 표준편차를 추정해야 한다. 이를 위해 현재 미니배치에서 입력의 평균과 표준편차를 평가한다. 배치 정규화 층마다 네 개의 파라미터..

9. 학습률, 배치 크기

1. 학습률 일반적으로 최적의 학습률은 최대 학습률의 절반 정도이다. 좋은 학습률을 찾는 한 가지 방법은 매우 낮은 학습률(예를 들면 1e-5)에서 시작해서 점진적으로 매우 큰 학습률(10)까지 수백 번 반복하여 모델을 훈련하는 것이다. 반복마다 일정한 값을 학습률에 곱한다. (예를 들면 1e-5 부터 10 까지 exp(log(10^6)/500)를 500번 반복 하여 곱한다). 2. 옵티마이저 고전적인 평범한 미니배치 경사 하강법보다 더 좋은 옵티마이저를 선택하는것(그리고 이 옵티마이저의 하이퍼파라미터를 튜닝하는 것)도 매우 중요하다. 3. 배치크기 배치 크기는 모델 성능과 훈련 시간에 큰 영향을 미칠 수 있다. 큰 배치 크기를 사용하는 것의 주요 장점은 GPU와 같은 하드웨어 가속기를 효율적으로 활용할..

8. 신경망 하이퍼파라미터 튜닝

어떻게 하면 어떤 하이퍼파라미터 조합이 주어진 문제에 최적인지 알 수 있을까? 한 가지 방법은 많은 하이퍼파라미터 조합을 시도해보고 어떤 것이 검증 세트에서 (또는 K-폴드 교차 검증으로) 가장 좋은 점수를 내는지 확인하는 것이다. GrdiSearchCV나 RandomizedSearchCV를 사용해 하이퍼파라미터 공간을 탐색할 수 있다. 이렇게 하려면 케라스 모델을 사이킷런 추정기처럼 보이도록 바꾸어야 한다. def build_model(n_hidden=1,n_neurons=30,learning_rate=3e-3,input_shape=[8]): model=keras.models.Sequential() model.add(keras.layers.InputLayer(input_shape=input_shape)..

6. 케라스로 다층 퍼셉트론 구현(3) - 서브클래싱 API, 모델 저장과 복원, 콜백

시퀀셜 API와 함수형 API는 모두 선언적이다. 이 방식에는 장점이 많다. 모델을 저장하거나 복사, 공유하기 쉽다. 또한 모델의 구조를 출력하거나 분석하기 좋다. 프레임워크가 크기를 짐작하고 타입을 확인하여 에러를 일찍 발견 할 수 있다(즉 모델에 데이터가 주입되기 전에). 전체 모델이 층으로 구성된 정적 그래프이므로 디버깅하기도 쉽다. 하지만 정적이라는 것이 단점도 된다. 어떤 모델은 반복문을 포함하고 다양한 크기를 다루어야 하며 조건물을 가지는 등 여러 가지 동적인 구조를 필요로 한다. 이런 경우에 조금 더 명령형 프로그래밍 스타일이 필요하다면 서브클래싱 API가 정답이다. 간단히 Model 클래스를 생성자 안에서 필요한 층을 만든다. 그다음 call() ..

5. 케라스로 다층 퍼셉트론 구현(2) - 시퀀셜 API 회귀, 함수형 API

캘리포니아 주택 가격 데이터셋으로 바꾸어 회귀 신경망으로 이를 해결해보자. from sklearn.datasets import fetch_california_housing from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler housing=fetch_california_housing() X_train_full,X_test,y_train_full,y_test=train_test_split(housing.data,housing.target) X_train,X_valid,y_train,y_valid=train_test_split(X_train_full,y_train_full) sca..