심층 신경망 하이퍼 매개변수 최적화

마크블로그2
Rescale의 DOE(Design-of-Experiments) 프레임워크는 기계 학습 모델의 성능을 최적화하는 쉬운 방법입니다. 이 문서에서는 심층 신경망에서 하이퍼 매개변수 최적화를 수행하는 워크플로에 대해 설명합니다. Rescale의 DOE에 대한 소개는 다음을 참조하세요. 이 웨비나.

심층 신경망(DNN)은 오늘날 로봇 공학, 자율 주행 자동차, 이미지 검색, 얼굴 인식, 음성 인식 등 다양한 응용 분야에서 사용되는 인기 있는 기계 학습 모델입니다. 이 기사에서는 일부 신경망을 훈련하여 이미지 분류를 수행하고 Rescale을 사용하여 DNN 모델의 성능을 최대화하는 방법을 보여줍니다.
분류
Rescale의 이미지 분류 DNN 교육에 대한 소개는 다음을 참조하세요. 이 이전 기사. 이 기사에서는 기본 모델 훈련 예제를 확장하고 하이퍼 매개변수 최적화라는 기술을 통해 네트워크 성능을 향상시키는 방법을 보여줍니다.
하이퍼 매개변수 최적화
DNN을 사용하는 작업의 일반적인 시작점은 문헌에 게시된 모델을 선택하고 이를 선택한 신경망 훈련 프레임워크에 구현하는 것입니다. 또는 더 쉽게는 이미 구현된 모델을 다운로드하는 것입니다. 카페모델동물원. 그런 다음 훈련 데이터 세트로 모델을 훈련하고 성능(분류 정확도, 훈련 시간 등)이 충분하지 않다는 것을 알게 될 수 있습니다. 이 시점에서 다시 돌아가 훈련할 완전히 새로운 모델을 찾거나 현재 모델을 조정하여 원하는 추가 성능을 얻을 수 있습니다. 특정 신경망 아키텍처에 대한 매개변수를 조정하는 프로세스를 하이퍼 매개변수 최적화라고 합니다. 다음은 사람들이 흔히 변경하는 하이퍼 매개변수의 간략한 목록입니다.

  • 학습률
  • 배치 크기
  • 훈련 시대
  • 이미지 처리 매개변수
  • 레이어 수
  • 컨벌루션 필터
  • 컨벌루션 커널 크기
  • 탈락율

네트워크 선택
위의 대규모 하이퍼 매개변수 선택 항목을 고려하면 모델 아키텍처를 설정한 후에도 유사한 신경망 변형이 여전히 많이 있습니다. 우리의 임무는 우리의 요구에 충분히 부합하는 변형을 찾는 것입니다.
무작위 하이퍼 매개변수 검색 DOE
이제 Rescale 플랫폼을 사용하여 하이퍼 매개변수를 샘플링하고 GPU를 사용하여 이러한 다양한 네트워크 변형을 훈련하는 실험 설계 작업을 생성하겠습니다.

첫 번째 예에서는 다음 중 하나부터 시작하겠습니다. 컨벌루션 네트워크의 예 Keras github 저장소에서 MNIST 숫자 분류기를 훈련합니다. 이 네트워크를 사용하여 다음 네트워크 매개변수를 변경합니다.

  • nb_filters: 컨볼루셔널 레이어의 필터 수
  • nb_conv_size: 컨볼루셔널 커널의 크기

위의 템플릿 값을 갖도록 예제를 수정했으며 다음은 템플릿 변수가 있는 스크립트에서 발췌한 내용입니다.

model.add(Convolution2D(${nb_filters}, ${nb_conv_size},
${nb_conv_size}))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2, 2)))
model.add(Dropout(0.25))
model.add(Flatten())
model.add(Dense(128))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(nb_classes))
model.add(Activation('softmax'))

참고 사항 nb_filtersnb_conv_size 매개변수는 다음으로 둘러싸여 있습니다. ${}. 이제 이 템플릿을 사용하는 Rescale 플랫폼에서 DOE 작업을 생성할 준비가 되었습니다.
계속 진행하려면 예시 작업을 복제하면 됩니다.
케라스 MNIST DOE
입력
먼저 오른쪽 상단에서 DOE 직무 유형을 선택하고 mnist.pkl.gz 데이터세트 Keras github 저장소에서.
매개 변수
다음으로, Monte Carlo DOE(왼쪽 아래)를 실행 중이고 60개의 서로 다른 훈련 실행을 수행하겠다고 지정하고 템플릿 변수를 지정합니다. 우리는 균일 분포에서 샘플링할 두 매개변수를 다소 임의로 선택합니다. 컨벌루션 커널 크기 범위는 1부터 10까지이며(각 이미지 크기는 28×28이므로 28개 이상은 작동하지 않음) 컨벌루션 필터 수는 16부터 256개입니다.

대신 CSV를 사용하여 템플릿 변수 범위를 지정할 수 있습니다. 이 예에서는 변수에 대한 무작위 값을 수동으로 샘플링하며 CSV는 다음과 같습니다.

Nb_filters, nb_conv_size 16, 3 45, 8 32, 4 ...

이 템플릿
다음으로 위에서 생성한 Keras 스크립트 템플릿을 업로드해야 합니다. 이 시점에서 값이 삽입된 스크립트의 새 이름을 지정할 수도 있습니다. 여기서 했던 것처럼 이름을 동일하게 유지하려는 경우에도 괜찮습니다. 구체화된 버전은 템플릿을 덮어쓰지 않습니다.

소프트웨어
사용하려는 교육 라이브러리를 선택할 시간입니다. 검색창에 "Keras"를 검색하여 선택하세요. 그런 다음 K520/Theano 호환 버전을 선택합니다. 마지막으로 훈련 스크립트를 실행하기 위해 명령줄을 입력합니다. 명령의 첫 번째 부분은 MNIST 데이터 세트 아카이브를 Keras가 찾을 수 있는 위치에 복사하는 것입니다. 그런 다음 Python 스크립트를 호출합니다.
하드웨어
K520s와 작동하도록 구성된 Keras 버전을 선택했기 때문에 하드웨어 유형은 이미 Jade로 범위가 좁혀졌습니다. 이제 왼쪽의 각 훈련 클러스터 크기를 조정할 수 있습니다. 여기서 계산되는 것은 CPU 코어 수입니다. Jade 하드웨어 유형의 경우 각 하드웨어에 4개의 CPU 코어가 있습니다. GPU. 오른쪽에서는 프로비저닝할 별도의 교육 클러스터 수를 설정합니다. 이 경우 클러스터당 단일 GPU가 있는 2개의 훈련 클러스터를 사용합니다.
사후 처리
마지막 단계는 사후 처리 스크립트를 지정하는 것입니다. 이 스크립트는 훈련 작업의 출력을 구문 분석하고 나중에 볼 결과 페이지에 표시하기 위해 Rescale에 사용할 수 있는 측정항목을 만드는 데 사용됩니다. 예상되는 출력 형식은 각 값에 대한 라인입니다.

[이름]\t[값]

훈련 스크립트는 이미 출력의 마지막 줄에 올바른 형식의 정확도를 인쇄하고 있으므로, 결과.출력, 우리의 후처리 스크립트는 마지막 줄을 구문 분석하면 됩니다.
이제 오른쪽 상단에서 작업을 제출할 수 있으며 실시간 클러스터 상태 페이지로 이동합니다.
선택 상태
클러스터가 프로비저닝되고 작업이 시작되면 훈련 작업의 진행 상황을 볼 수 있습니다. 라이브 테일링 창에서 실행을 선택하고 process_output.log. 훈련이 이미 시작된 경우 훈련 진행 상황과 현재 훈련 정확도를 볼 수 있습니다. 선택한 실행 번호 옆에 있는 "x"를 선택하여 개별 실행을 수동으로 종료할 수 있습니다. 이를 통해 매개변수의 정확도가 확실히 떨어지는 경우 사용자가 실행을 조기에 중지할 수 있습니다.
결과 테이블
작업이 완료되면 결과 페이지에 각 실행에 사용된 하이퍼 매개변수와 정확도 결과가 요약됩니다. 위의 경우 Keras 예제에서 가져온 초기 모델의 정확도는 99.1%였으며 우리가 얻은 최상의 결과는 약 99.4%의 정확도로 약간 개선되었습니다. 가장 정확한 모델에 대한 가중치를 다운로드하려면 정확도별로 정렬한 다음 실행 세부 정보를 선택하면 됩니다.
결과-상세
다른 결과 파일 중에는 mnist_model.jsonmnist_model.h5, 이는 모델을 Keras로 다시 로드하는 데 필요한 모델 아키텍처 및 모델 가중치 파일입니다. 또한 모든 실행의 모든 ​​데이터를 하나의 큰 아카이브로 다운로드하거나 결과 테이블을 CSV로 다운로드할 수 있습니다.
결과 플롯
정확도 결과는 차트 탭에서도 시각화할 수 있습니다.
나만의 하이퍼 매개변수 최적화 도구 가져오기
Rescale은 세부 사항에 따라 타사 최적화 소프트웨어의 사용을 지원합니다. 여기에서 지금 확인해 보세요.. 이제 머신러닝 문헌에서 블랙박스 최적화 프로그램을 실행하기 위한 Rescale 최적화 작업 생성에 대해 논의하겠습니다.

Rescale 최적화 SDK를 사용하여 우리는
SMAC(순차 모델 기반 알고리즘 구성) 최적화 프로그램 브리티시 컬럼비아 대학교 출신. SMAC 최적화 프로그램은 하이퍼 매개변수 선택을 기반으로 신경망 성능의 랜덤 포레스트 모델을 구축합니다. 우리는 버전 2.10.03을 사용합니다. 여기에서 지금 확인해 보세요..

최적화 프로그램은 다음 구성을 사용하는 Java 애플리케이션입니다.

  • "시나리오" 파일: 실행할 최적화 프로그램의 명령줄을 지정합니다. 이 경우 이는 네트워크 훈련 스크립트입니다.
  • 매개변수 파일: 하이퍼 매개변수의 이름과 값 범위를 지정합니다.

SMAC는 훈련 스크립트를 실행할 때 현재 하이퍼 매개변수 선택 사항을 전달하여 명령줄 플래그로 평가합니다. 다음과 같은 문자열 형식으로 stdout에서 실행 결과를 수신할 것으로 예상됩니다.

이 알고리즘 실행 결과: , , , , ,
시작하려면 이 실험에서 변경할 하이퍼 매개변수에 대한 매개변수 파일을 만듭니다.

nb_filters 정수 [4, 256] [32] nb_conv 정수 [1, 20] [3] nb_pool 정수 [1, 20] [2] dropout1 실수 [0, 1] [0.25] dropout2 실수 [0, 1] [0.5]

이제 컨벌루션 필터 수와 컨벌루션 커널 크기를 변경하는 것 외에도 드롭아웃 비율과 풀링 레이어의 크기도 변경하고 있습니다.
이제 SMAC 입력 및 결과를 수용하기 위해 이전 교육 스크립트를 수정한 내용을 살펴보겠습니다.

파서 = argparse.ArgumentParser() 파서.add_argument('-nb_filters', dest='nb_filters', type=int) 파서.add_argument('-nb_pool', dest='nb_pool', type=int) 파서.add_argument(' -nb_conv', dest='nb_conv', 유형=int)parser.add_argument('-dropout1', dest='dropout1', type=float)parser.add_argument('-dropout2',dest='dropout2', type= float) parser.add_argument('other', nargs='+')

하이퍼 매개변수 값을 템플릿으로 주입하는 대신 이제 argparse를 사용하여 SMAC에서 제공하는 플래그를 구문 분석합니다.

(X_train_orig, y_train_orig), (X_test, y_test) = mnist.load_data() X_train = X_train_orig[:50000] y_train = y_train_orig[:50000] X_val = X_train_orig[50000:] y_val = y_train_orig[50000:]

오류를 기반으로 새 매개변수를 선택하는 최적화 프로그램에 오류를 입력하므로 이제 별도의 검증 및 테스트 데이터 세트를 유지합니다. 위에서는 원본 교육 데이터를 교육 및 검증 세트로 분할합니다. 최적화 프로그램에 의해 과적합될 위험이 없는지 평가할 수 있는 오류 측정항목을 갖도록 별도의 테스트 데이터 세트를 보유하는 것이 중요합니다. 최적화 알고리즘은 유효성 검사 오류만 보게 됩니다.

  model.fit(X_train, Y_train, 배치_크기=batch_size, nb_epoch=nb_epoch, show_accuracy=True, verbose=1, 유효성 검사_data=(X_val, Y_val)) val_score = model.evaluate(X_val, Y_val, show_accuracy=True, verbose=0) test_score = model.evaluate(X_test, Y_test, show_accuracy=True, verbose=0) 제외 e: print(e) print('Error running training') satisfiable = False finally: json = model.to_json() open(' mnist_model.json', 'w').write(json) model.save_weights('mnist_model.h5') print('테스트 오류:', 1 - test_score[1]) print('값 오류:', 1 - val_score [1]) print('알고리즘 실행 결과: {0}, {1}, {2}, {3}, {4},'.format( 만족할 경우 'SAT', 그렇지 않으면 'UNSAT', time.time( ) - t0, 1, 1 - val_score[1], 1337 ))

여기서는 모델을 훈련하고 검증 및 테스트 데이터 세트에서 모델을 평가한 다음 SMAC 관련 형식(“알고리즘 결과…”)으로 결과를 출력합니다. 또한 교육 및 검증에서 오류를 포착하고 SMAC에 "UNSAT"로 실행하여 SMAC가 잘못된 매개변수 조합임을 알 수 있도록 표시합니다.
선택 흐름
SMAC가 Rescale Python SDK를 호출하기 위해 smac_opt.py를 호출할 래퍼 스크립트를 작성하고 시나리오 파일에서 SMAC가 이를 호출하도록 지정합니다. 그런 다음 래퍼는 실행할 학습 스크립트를 제출합니다.
래퍼 스크립트에서 발췌한 몇 가지 중요한 내용은 다음과 같습니다.

if __name__ == '__main__': object_function(sys.argv[1:]) 인쇄

시작하려면 스크립트에 전달된 모든 명령줄 플래그를 가져와 목적 함수에 직접 전달합니다. 이는 각 하이퍼 매개변수 세트에 대해 호출되는 목적 함수입니다.

def object_function(X): iteration = os.getpid() # 각 반복에 자체 파일을 제공 run_dir = 'run-{0}'.format(iteration) output_file = 'output-{0}'.format(iteration) copy_input( 'input', run_dir) # 패키지하자 zip_file = 'run.zip' filezip(run_dir, zip_file) # 최적화 노드에 디렉터리를 유지할 필요가 없습니다.shutil.rmtree(run_dir)

목적 함수를 시작하기 위해 이 훈련 실행을 위한 입력 파일을 .zip 파일로 패키징합니다.

    COMMAND = '파이썬 mnist_cnn_smac.py {0} | python format_results.py > {1}' 명령 = concatenate_shell_commands( 'unzip ' + zip_file, 'rm ' + zip_file, 'cd ' + run_dir, COMMAND.format(' '.join(X), '../' + output_file ), 'cd ..' ) run = rescale.submit( command, input_files=[zip_file], output_files=[output_file], var_values=get_val_dict(X) ) run.wait()

여기에서는 실행할 학습 스크립트 명령의 형식을 지정합니다. SMAC(변수 `X`)의 플래그를 훈련 스크립트로 전달하고 있다는 점에 유의하세요. 그런 다음 입력 파일을 훈련 클러스터로 보내고 훈련을 시작하는 submit 명령을 호출합니다. 이제 우리는 `format_results` 스크립트를 직접 호출합니다.

# 출력에서 ​​목적 함수 값을 가져와서 Rescale에 저장합니다. for line in open(output_file): if re.match('Result of .*algorithm run.*', line): results = line m = re.match(' 테스트 오류: ([\de\.-]+).*', line) if m: testerr = float(m.group(1)) quality = results.split(', ')[3] run.report( {'testerr': float(testerr), 'valerr': float(quality)}) 결과 반환

우리는 훈련 스크립트의 출력 파일을 구문 분석하여 예상되는 SMAC 결과 줄(“알고리즘 실행 결과…”)과 테스트 데이터 세트의 오류를 얻습니다.
마지막으로 SMAC에게 래퍼 스크립트를 호출하도록 지시하는 시나리오 파일을 지정해야 합니다.

use-instances = false runObj = QUALITY numberOfRunsLimit = 100 pcs-file = params.pcs algo = ./smac_opt.py check-sat-consistency = false check-sat-consistency-Exception = false

여기서 중요한 부분은 다음과 같습니다.

  • PC 파일: 매개변수를 지정합니다.
  • algo: 실행할 래퍼 스크립트
  • numberOfRunsLimit: 훈련 실행 횟수를 설정합니다.
  • check-sat-consistency: 동일한 훈련 데이터세트에 대해 다른 매개변수 선택으로 인해 모델이 실현 가능하거나 불가능할 수 있음을 최적화 프로그램에 알립니다.
  • 이제 입력 파일이 모두 준비되었으므로 작업을 생성할 준비가 되었습니다.

여기에서 작업을 복제하여 직접 실행할 수 있습니다.
Keras MNIST SMAC 최적화 프로그램
smac 입력
input.tar.gz 아카이브는 mnist_cnn_smac.py 교육 스크립트와 format_results.py 사후 처리 스크립트가 포함된 input/ 디렉터리로 구성됩니다.
이전과 동일한 소프트웨어인 K520에서 Theano용으로 구성된 Keras를 선택합니다.
smac-하드웨어
하드웨어 선택도 거의 동일합니다. 2개의 네트워크를 병렬로 훈련시키기 위해 2개의 작업 슬롯을 다시 선택합니다.
smac-opt설정
최적화 프로그램의 경우 "Custom Optimization"을 선택한 다음 명령줄을 입력하여 SMAC를 실행합니다. 이 명령은 각 SMAC 프로세스가 한 번에 하나의 반복만 실행한다는 사실로 인해 복잡해집니다. 여러 훈련을 병렬로 실행하려면 SMAC의 "공유 모델 모드"를 사용해야 합니다. 이 모드를 켜면 SMAC는 주기적으로 현재 디렉터리에서 다른 SMAC 프로세스의 최적화 결과를 확인하고 해당 결과를 통합합니다. 이 모드에서는 각 SMAC 프로세스에 대해 "-seed"를 다른 값으로 설정해야 합니다.
한 번에 여러 최적화 프로세스를 실행해야 하므로 모든 호출을 백그라운드로 처리한 다음 이 최적화 프로그램을 실행하려는 최대 시간 동안 절전 모드로 전환합니다. 이 경우 우리는 4시간을 기다린다.
이제 이 작업을 제출할 준비가 되었습니다. 실행한 후에는 현재 반복을 실시간으로 추적할 수 있으며 마지막에는 이전 무작위 사례와 마찬가지로 결과를 볼 수 있습니다. 이제 결과에는 각 하이퍼 매개변수 세트에 대한 검증 및 테스트 오류가 모두 표시됩니다.
결론
이 기사에서는 신경망의 하이퍼 매개변수 공간을 검색하는 두 가지 방법을 보여주었습니다. 하나는 무작위 검색을 사용했고 다른 하나는 Rescale 최적화 SDK를 사용하여 보다 정교한 최적화 도구를 사용했습니다.

저자

  • 마크 휘트니

    Mark Whitney는 Rescale의 엔지니어링 이사입니다. 그의 전문 분야에는 고성능 컴퓨팅 아키텍처, 양자 정보 연구, 클라우드 컴퓨팅이 포함됩니다. 그는 캘리포니아 대학교 버클리 캠퍼스에서 컴퓨터 과학 박사 학위를 취득했습니다.

비슷한 게시물