분류 전체보기 428

5. 심층 신경망 실습

CIFAR10 이미지 데이터셋에 심층 신경망을 훈련해보자. 먼저 100개의 뉴런을 가진 은닉층 20개로 심층 신경망을 만든다. He 초기화와 ELU 활성화 함수를 사용한다. from tensorflow import keras model=keras.models.Sequential() model.add(keras.layers.Flatten(input_shape=[32,32,3])) for _ in range(20): model.add(keras.layers.Dense(100, activation='elu', kernel_initializer='he_normal')) 그 다음 Nadam 옵티마이저와 조기 종료를 사용하여 CIFAR10 데이터셋에 이 네트워크를 훈련하자. 이 데이터셋은 10개의 클래스와 32x3..

모델 실습 2021.06.07

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를 사용하여) 표준화할 필요가 없다. 배치 정규화 층이 이런 역할을 대신한다. 입력 데이터를 원점에 맞추고 정규화하려면 알고리즘은 평균과 표준편차를 추정해야 한다. 이를 위해 현재 미니배치에서 입력의 평균과 표준편차를 평가한다. 배치 정규화 층마다 네 개의 파라미터..

11. 심층 신경망 훈련 - 그레이디언트 소실과 폭주(활성화 함수)

고해상도 이미지에서 수백 종류에 물체를 감지하는 것처럼 아주 복잡한 문제를 다뤄야 한다면 수백 개의 뉴런으로 구성된 10개 이상의 층을 수십만 개의 가중치로 연결해 훨씬 더 깊은 심층 신경망을 훈련해야 한다. 심층 신경망을 훈련하는 것은 쉬운 일이 아니다. 훈련 중에 다음과 같은 문제를 마주할 수 있다. 알고리즘이 하위층으로 진행될수록 그레이디언트가 점점 작아지는 경우가 많다. 경사 하강법이 하위층의 연결 가중치를 변경되지 않은 채로 둔다면 훈련이 좋은 솔루션으로 수렴되지 않을 것이다. 이 문제를 그레이디언트 소실(vanishing gradient)라고 한다. 어떤 경우엔 반대 현상이 일어날 수 있다. 그레이디언트가 점점 커져서 여러 층이 비정상적으로 큰 가중치로 갱신되면 알고리즘은 발산한다. 이 문제를..

4. 다층 퍼셉트론 실습 (학습률을 바꿔가면서 학습하기)

심층 다층 퍼셉트론을 MNIST 데이터셋에 훈련해보자(keras.datasets.mnist.load_data() 함수를 사용해 데이터를 적재할 수 있다). 또한 최적의 학습률을 찾아보고 체크포인트를 저장하고, 조기종료를 사용하고, 텐서보드를 사용해 학습 곡선을 그려보자. from tensorflow import keras (X_train_full,y_train_full),(X_test,y_test)= keras.datasets.mnist.load_data() X_valid,X_train=X_train_full[:10000]/255.0,X_train_full[10000:]/255.0 y_valid,y_train=y_train_full[:10000],y_train_full[10000:] X_test=X_te..

모델 실습 2021.06.03

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)..