딥 러닝 하이퍼 파라미터 튜닝 | [딥러닝Ii] 10강. 하이퍼파라미터 튜닝 20 개의 가장 정확한 답변

당신은 주제를 찾고 있습니까 “딥 러닝 하이퍼 파라미터 튜닝 – [딥러닝II] 10강. 하이퍼파라미터 튜닝“? 다음 카테고리의 웹사이트 https://you.charoenmotorcycles.com 에서 귀하의 모든 질문에 답변해 드립니다: https://you.charoenmotorcycles.com/blog. 바로 아래에서 답을 찾을 수 있습니다. 작성자 한경훈 이(가) 작성한 기사에는 조회수 2,273회 및 좋아요 29개 개의 좋아요가 있습니다.

Table of Contents

딥 러닝 하이퍼 파라미터 튜닝 주제에 대한 동영상 보기

여기에서 이 주제에 대한 비디오를 시청하십시오. 주의 깊게 살펴보고 읽고 있는 내용에 대한 피드백을 제공하세요!

d여기에서 [딥러닝II] 10강. 하이퍼파라미터 튜닝 – 딥 러닝 하이퍼 파라미터 튜닝 주제에 대한 세부정보를 참조하세요

교재 : 밑바닥부터 시작하는 딥러닝 (저자 : 사이토 고키 / 번역 : 이복연 / 출판사 : 한빛미디어)
https://www.hanbit.co.kr/store/books/look.php?p_code=B8475831198
코드 : https://github.com/WegraLee/deep-learning-from-scratch
강좌 홈페이지 : https://sites.google.com/site/kyunghoonhan/deep-learning-ii
PPT 이미지 출처
p.31 : https://www.brainstobytes.com/test-training-and-validation-sets/
p.32 : https://www.andreaperlato.com/aipost/hyperparameters-tuning-in-ai/

딥 러닝 하이퍼 파라미터 튜닝 주제에 대한 자세한 내용은 여기를 참조하세요.

[Deep Learning] 5. 딥러닝 하이퍼파라미터 튜닝 – 코딩일기

오늘은 딥러닝에서 하이퍼파라미터 튜닝에 대해서 알아보고자 합니다. 본 글을 작성하기 앞에 해당 글은 아래 블로그를 참고하여 작성되었음을 사전에 …

+ 여기에 표시

Source: daje0601.tistory.com

Date Published: 12/26/2021

View: 3766

신경망 : [하이퍼 파라미터 튜닝,ETF, Keras Tuner] – velog

나는 현재 ai 부트캠프를 하고 있고, 현재 딥러닝 부분을 하고 있다 … 하이퍼 파라미터 튜닝은 간단하게 모델에 존재하는 많은 파라미터(사용자 …

+ 여기에 표시

Source: velog.io

Date Published: 6/14/2021

View: 3880

[5주차] 딥러닝 2단계 : 하이퍼파라미터 튜닝 – 다 IT지

이 글은 edwith 딥러닝 2단계 강의 목록 중 ‘하이퍼파라미터 튜닝’을 수강하고 정리하였습니다. 수식, 그래프 이미지의 출처는 강의 필기 캡처본 …

+ 여기에 더 보기

Source: sy-programmingstudy.tistory.com

Date Published: 6/1/2022

View: 9232

하이퍼파라미터 튜닝, 배치 정규화 및 프로그래밍 프레임워크

딥 러닝 전문화 두 번째 과정에서는 딥 러닝 블랙박스를 열어 성과를 이끌어내고 체계적으로 좋은 결과를 만들어내는 과정을 이해하게 됩니다.

+ 자세한 내용은 여기를 클릭하십시오

Source: ko.coursera.org

Date Published: 4/24/2022

View: 671

Tensorflow-1.4. 기초(5)-하이퍼 파라미터 튜닝 – 만년필잉크

제대로 된 하이퍼 파라미터 튜닝은 추후 자세히 다루도록 하겠다. 하이퍼 파라미터 튜닝(HyperParameter Tuning). 머신러닝을 공부하다 보면 하이퍼 …

+ 여기에 보기

Source: gooopy.tistory.com

Date Published: 10/21/2022

View: 6477

하이퍼파라미터 (Hyperparameter) – 도리의 디지털라이프

이 외에도 다양한 하이퍼파라미터가 존재하고 최적의 딥러닝 모델 생성을 위해 하이퍼파라미터 튜닝 … 하이퍼파라미터 튜닝 기법 적용 시 주요 활동 …

+ 여기에 보기

Source: blog.skby.net

Date Published: 6/4/2021

View: 1551

모델 성능 향상을 위한 하이퍼 파라미터 튜닝 – GIL’s LAB

머신러닝에서 하이퍼 파라미터란 쉽게 생각해서 사용자의 입력값, 혹은 설정 가능한 옵션이라고 볼 수 있다. 모든 데이터와 문제에 대해 가장 좋은 하이퍼 …

+ 여기를 클릭

Source: gils-lab.tistory.com

Date Published: 7/29/2022

View: 6101

[ML] 4-1. 머신러닝에서의 하이퍼파라미터란 무엇일까 …

또한 하이퍼파라미터 튜닝 기법을 적용하여 훈련 모델의 최적값들을 찾을 수 있습니다. 하이퍼파라미터의 특징. 모델의 매개 변수를 추정하는 데 도움이 …

+ 더 읽기

Source: ittrue.tistory.com

Date Published: 2/13/2021

View: 5877

주제와 관련된 이미지 딥 러닝 하이퍼 파라미터 튜닝

주제와 관련된 더 많은 사진을 참조하십시오 [딥러닝II] 10강. 하이퍼파라미터 튜닝. 댓글에서 더 많은 관련 이미지를 보거나 필요한 경우 더 많은 관련 기사를 볼 수 있습니다.

[딥러닝II] 10강. 하이퍼파라미터 튜닝
[딥러닝II] 10강. 하이퍼파라미터 튜닝

주제에 대한 기사 평가 딥 러닝 하이퍼 파라미터 튜닝

  • Author: 한경훈
  • Views: 조회수 2,273회
  • Likes: 좋아요 29개
  • Date Published: 2020. 10. 22.
  • Video Url link: https://www.youtube.com/watch?v=iVI51L0h3LQ

[Deep Learning] 5. 딥러닝 하이퍼파라미터 튜닝

안녕하십니까 다제입니다.

오늘은 딥러닝에서 하이퍼파라미터 튜닝에 대해서 알아보고자 합니다.

본 글을 작성하기 앞에 해당 글은 아래 블로그를 참고하여 작성되었음을 사전에 안내드립니다. ( 참조블로그 )

1. 하이퍼파라미터 튜닝기법

종류 설명 적용 시 고려사항 학습률

(Learning Rate) gradient의 방향으로 얼마나 빠르게 이동할 것인지 결정하는 변수 – 너무 작으면 학습의 속도가 늦고, 너무 크면 학습 불가 손실 함수

(Cost Function) 입력에 따른 기대 값과 실제 값의 차이를 계산하는 함수 – 평균 제곱 오차

– 교차 엔트로피 오차 정규화 파라미터

(Regularization parameter) L1 또는 L2 정규화 방법 사용 – 사용하는 일반화 변수도 하이퍼 파라미터로 분류 미니 배치 크기

(Mini-batch Size) 배치셋 수행을 위해 전체 학습 데이터를 등분하는(나누는) 크기 – 가용 메모리 크기와 epoch 수행 성능을 고려

– 최소 사이즈 : 32 /

* 참조논문( arxiv.org/abs/1804.07612)

– 배치 크기는 GPU의 물리적인 구조로 인해 항상 2의 제곱으로 설정 훈련 조기 종료

(Early Stopping) 학습의 조기 종료를 결정하는 변수 – 학습 효율이 떨어지는 시점을 적절히 판단 은닉층의 뉴런 개수

(Hidden Unit) 훈련 데이터에 대한 학습 최적화 결정 변수 – 첫 Hidden Layer의 뉴런 수가 Input Layer 보다 큰 것이 효과적 가중치 초기화

(Weight Initialization) 학습 성능에 대한 결정 변수 – 모든 초기값이 0일 경우 모든 뉴런이 동일한 결과

이 외에도 momentum, activation functions, dropout regularization 등이 있음

그러나, 중요한 것은 각각의 특성을 알지못한다면 튜닝을 할 수 없으니 꼭 개별 개념에 대한 학습 필요

2. 하이퍼파라미터 튜닝 기법 적용 시 주요 활동

튜닝 기법주요 활동적용 방안 Manual

Search 휴리스틱 조합 – 사용자의 직관과 경험 기반 탐색 탐색의 단순성 적용 – 사용자 도출 조합 중 최적 조합 적용 Grid

Search 모든 조합 탐색 – 하이퍼파라미터 적용값 전체 탐색 시행 횟수 한계 파악 – 하이퍼파라미터 증가로 인해 전수 탐색 한계 Random

Search 랜덤 샘플링 – 범위 내 무작위 값 반복 추출 탐색 범위 부여 – 하이퍼파라미터 최소/최대값부여 Bayesian

Optimization 관측 데이터 기반 F(x) 추정 – 베이즈 정리 확용, 가우시안 프로세스 함수 생성 – 확률 추정 결과 기반 입력값 후보 추천 함수

3. 실습코드

def model_builder(hp): model = keras.Sequential() model.add(Flatten(input_shape=(28, 28))) # 첫 번째 Dense layer에서 노드 수를 조정(32-512)합니다. hp_units = hp.Int(‘units’, min_value = 32, max_value = 512, step = 32) model.add(Dense(units = hp_units, activation = ‘relu’)) model.add(Dense(10)) # Optimizer의 학습률(learning rate)을 조정[0.01, 0.001, 0.0001]합니다. hp_learning_rate = hp.Choice(‘learning_rate’, values = [1e-2, 1e-3, 1e-4]) model.compile(optimizer = keras.optimizers.Adam(learning_rate = hp_learning_rate), loss = keras.losses.SparseCategoricalCrossentropy(from_logits = True), metrics = [‘accuracy’]) return model

tuner = kt.Hyperband(model_builder, objective = ‘val_accuracy’, max_epochs = 10, factor = 3, directory = ‘my_dir’, project_name = ‘intro_to_kt’)

지금까지 하이퍼파라미터 튜닝에 대해서 학습해 보았습니다.

정말 하나하나 코드를 실행해보지 않으며, 와닿지 않더라구요

꼭 여러분께서도 하나하나 실행해보면서 어떤 역할을 하는지 언제 사용해야할지 생각해보시면 성능을 올리실 때 훨씬 도움이 되실거라 생각합니다.

도움이 되셨다면 좋아요! 버튼 부탁드립니다.

오늘도 글을 읽어주셔서 너무나도 감사드립니다.

728×90

신경망 : [하이퍼 파라미터 튜닝,ETF, Keras Tuner]

첫 게시글 🎉

비공개로 노션에다가 기록을 남기다가 이렇게 공유를 하는 블로그는 처음인 것 같다

노션에서 벨로그로 오게된 이유는..

노션은 블로그의 내용이 길어지면 렉이 너무 심했다 ㅠㅠ

색깔도 넣고 이쁘게 블록도 마음대로 옮길 수 있어서

꾸미기에 참 좋은 노트이자 블로그였으나

포트폴리오 만드는 용도로 써야할 것 같다 😂

나는 현재 ai 부트캠프를 하고 있고, 현재 딥러닝 부분을 하고 있다

그래서 강의 내용에 대해 기록을 해볼 것이고,

여태껏 notion에 적은 기록들도 앞으로 천천히 복습차 옮겨올 생각이다.

교육을 받는 입장이므로 틀린 내용이 있을 수 있으니 검색해서 들어왔다면, 이 글 이 외에도 여러 글을 서치해보길 ..

(혹시 보다가 틀린게 있다면, 댓글로 부탁해요 😎)

👩🏻 신경망과 하이퍼파라미터 튜닝

하이퍼 파라미터 튜닝은 간단하게 모델에 존재하는 많은 파라미터(사용자 지정 변수)에 대해 최적의 값을 찾아 모델의 성능을 높이는 과정이다

더 자세한 뜻을 알고 싶으면 검색이 답!(개념 설명 목적이 아니므로 총총.. )

하이퍼파라미터가 신경망에서 중요한 이유? 다른 모델의 경우 몇몇 파라미터만 손보면 되지만, 신경망에는 다른 모델에 비해 매우 많은 파라미터가 있다.(은닉층의 수, 노드의 수, optimizer, loss 등)

하이퍼 파라미터 튜닝이 모델의 정확도에 엄청난 영향을 주므로 시간이 많이 소요되더라도 최적의 파라미터 값을 찾아야 한다.

하이퍼파라미터를 튜닝한 모델의 실제 예측정확도(성능)를 아는 방법은?

답변) cv(교차검증)을 통해 정확도를 구해 최종 정확도가 실제 정확도와 비슷하도록 만들 수 있음

교차검증에 대해 잠시 알고 넘어가보자 !

🔥 교차검증(cross validation = CV)

: 데이터가 제한적일 때, 데이터 세트를 train, validation 세트로 바꿔가며 학습과 검증을 하는 방법

교차검증의 장점? 하는이유?

-> 데이터가 제한적일 때 검증할데이터 데이터를 train, validation 데이터로 교차로 써가면서 데이터를 효율적으로 쓸 수 있기 때문이다.

1. K-Fold 교차검증

: k개로 데이터를 나눈 후 k번 만큼 학습과 검증을 세트를 수행하는 것

(위 사진은 그럼 5-fold 교차검증이 된다)

<한계>

레이블이 0,1,2로 존재한다고 가정해보면, 우연히 훈련데이터 레이블에 0,1의 값만 들어가게 될 수 있다. 그럴 때 2라는 답을 도출할 수 없다는 문제가 있다.

<코드 예시>

import numpy as np import pandas as pd import os from sklearn . model_selection import KFold , StratifiedKFold import tensorflow as tf from tensorflow . keras . preprocessing . image import ImageDataGenerator ( x_train , y_train ) , ( x_test , y_test ) = boston_housing . load_data ( ) kf = KFold ( n_splits = 5 ) skf = StratifiedKFold ( n_splits = 5 , random_state = 42 , shuffle = True ) from tensorflow . keras . models import Sequential from tensorflow . keras . layers import Dense x_train = pd . DataFrame ( x_train ) y_train = pd . DataFrame ( y_train ) for train_index , val_index in kf . split ( np . zeros ( x_train . shape [ 0 ] ) , y_train ) : train_data = x_train . iloc [ train_index , : ] val_data = x_train . iloc [ val_index , : ] train_target = y_train . iloc [ train_index ] val_target = y_train . iloc [ val_index ] model = Sequential ( ) model . add ( Dense ( 64 , activation = ‘relu’ ) ) model . add ( Dense ( 64 , activation = ‘relu’ ) ) model . add ( Dense ( 1 ) ) model . compile ( loss = ‘mean_squared_error’ , optimizer = ‘adam’ ) model . fit ( train_data , train_target , epochs = 10 , batch_size = 30 , validation_data = ( val_data , val_target ) ) result = model . evaluate ( x_test , y_test , batch_size = 128 ) print ( “mse or loss:” , result )

from sklearn . model_selection import KFold , StratifiedKFold for train_index , val_index in kf . split ( np . zeros ( x_train . shape [ 0 ] ) , y_train ) : train_data = x_train . iloc [ train_index , : ] val_data = x_train . iloc [ val_index , : ] train_target = y_train . iloc [ train_index ] val_target = y_train . iloc [ val_index ]

🔥 하이퍼파라미터 튜닝 방식

1) Grad Student Descent

: 100 % 수동으로 직접 하나하나 하이퍼파라미터를 구하는 방식

2) Grid Search

: 하이퍼 파라미터 값을 직접 지정해 리스트 형태로 param_grid에 설정해 두면 그 값들의 조합을 적용해 모델의 성능을 평가해주는 방식

여러 조합보다는 하나의 조합을 찾는데 활용하는게 한다

모델을 위한 하이퍼파라미터만 제대로 튜닝한다면 원하는 성능의 90-95%는 채울 수 있다.

3) Random Search

: 탐색하는 수들을 크게크게 건너 띄어 최적의 파라미터를 탐색는 방식

grid search 보다 효율적

상대적으로 중요한 파라미터에 대한 탐색을 더한다

크게 건너띄므로 완벽한 파라미터는 찾을 수 없다

4) bayesian method

: 이전 탐색에서 얻을 결과를 추후 탐색에 반영하는 방식

케라스 튜너로 사용가능

🔥 하이퍼파라미터 튜닝 가능한 옵션

1) batch_size

: 데이터 학습 시 한번 에 몇 개의 데이터를 다루는지 결정하는 파라미터

너무 클 경우 , 가중치업데이트 시 모든 데이터의 loss를 계산해야 하는 문제점과 메모리 문제

, 가중치업데이트 시 모든 데이터의 loss를 계산해야 하는 문제점과 메모리 문제 너무 작은 경우, 데이터가 잘게 쪼개져 학습하는데 오랜시간이 걸리며 노이즈도 많이 생김

데이터가 잘게 쪼개져 학습하는데 오랜시간이 걸리며 노이즈도 많이 생김 보통 batch size는 32-512까지 2의 제곱수로 많이 정함(gpu 관련)

batchnorm(배치정규화)

: re-centering 및 re-scailing 등의 방법으로 레이어 입력의 정규화를 통해 인공신경망을 더 빠르고 안정적으로 만드는데 사용되는 방법

keras.layers.BatchNormalization()

2) optimizer(최적화도구)

loss함수의 최소값을 찾기 위한 옵션

adam이 보통 제일 좋은 결과를 냄(요즘은 adamW도 많이 사용)

옵티마이저에 따라 learning rate와 momentum도 조절

참고하기 : https://keras.io/ko/optimizers/

3) learnig rate(학습률)

: gradient의 방향으로 얼마나 빠르게 이동할 것인지 결정하는 변수

: 가중치 업데이트 시 한 스텝을 가는 보폭

기본값 .01

너무 높은 경우 , 발산

, 발산 너무 낮은 경우 , 학습속도 느리며 최저점 찾는데 실패할 수 있음

, 학습속도 느리며 최저점 찾는데 실패할 수 있음 optimizer 내부 옵션으로 사용

<코드 예시>

def model_bulider ( hp ) : model = keras . Sequential ( ) model . add ( Flatten ( input_shape = ( 28 , 28 ) ) ) hp_unit = hp . Int ( ‘units’ , min_value = 32 , max_value = 512 , step = 32 ) model . add ( Dense ( units = hp_unit , activation = ‘relu’ ) ) model . add ( Dense ( 10 , activation = ‘softmax’ ) ) hp_learning_rate = hp . Choice ( ‘learning_rate’ , values = [ 1e – 2 , 1e – 3 , 1e – 4 ] ) model . compile ( optimizer = keras . optimizers . Adam ( learning_rate = hp_learning_rate ) , loss = keras . losses . SparseCategoricalCrossentropy ( from_logits = True ) , metrics = [ ‘accuracy’ ] ) return model

4) momentum(모멘텀)

optimizer에서 sgd와 함께 사용하는 옵션 — 밑에 코드 예시 보기

sgd만으로는 최적의 값을 도출하기 어려움(대부분 adam 보다 낮은 성능)

모멘텀의 역할은 경사 하강법에서 옵티마이저가 지역최소값에 빠졌을 때 탈출하도록 도와줌 지역 최소값 : 한 범위 내의 최소값, 손실함수 전체 범위에서 최소값을 찾아야 하므로 한 구역의 최소값이 최소값으로 인식되면 안됨

오목한 밥그릇에서 공을 굴릴 경우 관성으로 최저점을 지나쳐가는 원리

<코드 예시>

sgd = optimizers . SGD ( lr = 0.01 , decay = 1e – 6 , momentum = 0.9 , nesterov = True ) model . compile ( loss = ‘mean_squared_error’ , optimizer = sgd )

또는

model . compile ( loss = ‘categorical_crossentropy’ , optimizer = SGD ( lr = 0.01 , momentum = 0.9 ) , metrics = [ ‘accuracy’ ] )

5) Network weight initailize(네트워크 가중치 초기화)

: 가중치 초기화(시작점 찾기)에 따라 성능에 큰 영향을 줌

초기화 모두는 다양(정규분포, X-vier, He 등.. )

초기 정확도가 적은 epoch를 최적의 값을 찾기도 함

🔑가중치 초기화 별 활성화 값

1) 정규분포 초기화 : 표준편차를 1로 가중치를 초기화했을 때 활성화 값 분포

2) Xavier 초기화 : 가중치들의 편차를 1/sqrt(n)(=제곱근 n) 으로 초기화했을 때 활성화 값의 분포

3) He 초기화 : 가중치 표준편차를 sqrt(2/n)으로 초기화했을 때 활성화 값의 분포 — 고르게 분포

<활성화 함수에 따라 가중치 초기값 추천>

sigmoid 함수 일 때 , Xavier 초기화 — 표준편차 : 1/sqrt(n)

, Xavier 초기화 — 표준편차 : 1/sqrt(n) Relu 함수일 때, He 초기화 — 표준편차 : 1/sqrt(2/n)

6) Activation Fuction(활성화 함수)

보통 은닉층에서 Relu사용, 출력층에는 sigmoid나 softmax를 사용

하지만, 모델에 따라 tahn등 의 다른 활성함수들도 시도해보는 것 추천

6) 드롭아웃, Weight Constraint, weight decay

드롭 아웃 : 학습 중 무작위로 비활성화 하고 싶은 뉴런 비율

: 학습 중 무작위로 비활성화 하고 싶은 뉴런 비율 가중치 규제(wieght constraint) : 물리적으로 Weight의 크기를 제한해서 값이 커지면 다른 값으로 변경해버리는 기술

: 물리적으로 Weight의 크기를 제한해서 값이 커지면 다른 값으로 변경해버리는 기술 가중치 감소(wieght decay) : 과적합 방지를 위해 학습 규제 전략의 하나로 말 그대로 가중치를 감소시키는 기술

: 과적합 방지를 위해 학습 규제 전략의 하나로 말 그대로 가중치를 감소시키는 기술 과적합이나 일반화 문제가 없다면 굳이 쓸 필요 없음

from keras import regularizers model2 = models . Sequential ( ) model2 . add ( layers . Dense ( 16 , kernel_regularizer = regularizers . l2 ( 0.001 ) , activation = ‘relu’ , input_shape = ( 10000 , ) ) ) model_dropout . add ( layers . Dropout ( 0.5 ) ) model2 . add ( layers . Dense ( 16 , kernel_regularizer = regularizers . l2 ( 0.001 ) , activation = ‘relu’ ) ) model2 . add ( layers . Dense ( 1 , activation = ‘sigmoid’ ) )

from tensorflow . keras . constraints import max_norm model . add ( Dense ( 64 , kernel_constraint = max_norm ( 2 . ) ) )

7) 은닉층의 수, 뉴런(노드)의 수

하나의 은닉층으로 이루어진 퍼셉트론일 경우 선형적 분리가 가능한 데이터셋만

학습이 가능

학습이 가능 layer를 추가하여 비선형 데이터도 학습 가능해짐

layer가 너무 많아질 경우 과적합이나, 학습시간의 문제가 있음

신경망이 커질수록 드롭아웃 규제나 다른 규제방법으로 과적합을 해결해아 함

보통 layer의 수가 노드의 수 보다 중요

👩🏻 실험 추적 프레임워크 (ETF)

🔥 Wandb 이용

!pip install wandb from wandb . keras import WandbCallback wandb_project = “review” wandb_group = “” wandb . login !git clone http : // github . com / wandb / tutorial !cd tutorial ; pip install – – upgrade – r requirements . txt ; !wandb login [ key ] !python – c “import keras; print(keras.__version__)” url = “https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv” data = pd . read_csv ( url , header = None ) . values X = data [ : , 0 : 8 ] y = data [ : , 8 ] from tensorflow . keras . models import Sequential wandb . init ( project = wandb_project ) inputs = X . shape [ 1 ] wandb . config . epochs = 50 wandb . config . batch_Size = 20 model = Sequential ( ) model . add ( Dense ( 100 , input_dim = 8 , activation = ‘relu’ ) ) model . add ( Dense ( 1 , activation = ‘sigmoid’ ) ) model . compile ( loss = ‘binary_crossentropy’ , optimizer = ‘adam’ , metrics = [ ‘accuracy’ ] ) model . fit ( X , y , validation_split = 0.3 , epochs = wandb . config . epochs , batch_size = wandb . config . batch_Size , callbacks = [ WandbCallback ( ) ] )

< 출력화면 >

출력된 링크로 들어가보면 세부사항들을 기록들을 볼 수 있다

👩🏻 Keras Tuner

Keras Tuner

: TensorFlow 프로그램의 최적 파라미터 선택에 도움을 주는 라이브러리

🔥 이미지 분류 코드 예시

[5주차] 딥러닝 2단계 : 하이퍼파라미터 튜닝

https://www.edwith.org/deeplearningai2/joinLectures/20015

이 글은 edwith 딥러닝 2단계 강의 목록 중 ‘하이퍼파라미터 튜닝’을 수강하고 정리하였습니다. 수식, 그래프 이미지의 출처는 강의 필기 캡처본입니다.

튜닝 프로세스

지금까지 신경망을 학습시킬 때 여러 하이퍼파라미터들이 관여한다는 걸 배웠다. 그렇다면 좋은 하이퍼파라미터는 어떻게 찾을 수 있을까? 체계적으로 하이퍼파라미터를 튜닝할 수 있는 팁을 알아보자.

Hyperparameters

심층 신경망을 학습시킬 때 가장 어려운 일은 다뤄야 할 하이퍼파라미터가 많다는 것이다. (우선 조정하는 순으로 나열)

학습률 α

Momentum 알고리즘의 β -> 기본값 0.9 설정

은닉 유닛의 수

미니배치의 크기

은닉층의 개수

학습률 감쇠(learning rate decay) 정도

Adam 알고리즘의 β ​ 1 ​ ​, β ​ 2 ​ ​,ϵ -> 0.9, 0.999, 10^(-8)

대부분의 학습에서는 일부 파라미터들이 다른 파라미터보다 중요하다. 우선 학습률 α는 튜닝해야 할 가장 중요한 하이퍼파라미터이다. 학습률 α 이외에 주로 튜닝하는 것들로는 모멘텀이 있다. 기본값 0.9정도로 설정할 수 있다. 최적화 알고리즘을 효율적으로 돌리기 위해 미니 배치 크기도 튜닝할 수 있다. 은닉 유닛도 자주 튜닝한다. 오렌지색 글씨는 빨간색 글씨(학습률 α) 다음으로 중요한 것들이다. 보라색 글씨는 다음으로 중요한 것들이다. 그리고 Adam 알고리즘에서는 β​1​​,β​2​​,ϵ는 튜닝하지 않고 0.9, 0.999, 10^(-8)을 항상 사용한다. 물론 원한다면 튜닝을 사용해도 좋다.

Try random values : Don’t use a grid

만약 하이퍼파라미터를 튜닝한다면 어떤 값을 탐색할지 어떻게 정할 수 있을까?

i) 머신러닝이 만들어진지 얼마 되지 않았을 때는 두 개의 하이퍼파라미터가 있을 때 각각 Hyperparameter1, Hyperparameter2라고 부르는데 격자점을 탐색하는 것이 일반적이었다. (아래 그림 참고) 그리고 체계적으로 여기 있는 값들을 탐색하는 것이다. (실제로는 더 크거나 작을 수도 있지만 여기서는 5×5 격자의 25개의 점만 생각함) 그리고 최고의 하이퍼파라미터를 정하는 것이다. 이 예시는 하이퍼파라미터의 수가 적을 때 쓸 수 있다.

[그림1] 머신러닝 초기의 하이퍼파라미터 튜닝

ii) 하지만 딥러닝에서는 다음과 같은 방식을 추천한다. 무작위로 점들을 선택하는 것이다. 위 상황과 동일하게 25개의 점만 생각해보자. 그 점들에 대해서 하이퍼파라미터를 정하는 것이다. 이렇게 하는 이유는 어떤 하이퍼파라미터가 문제 해결에 더 중요한지 미리 알 수 없기 때문이다.

[그림2] 딥러닝의 하이퍼파라미터 튜닝

위에서 설명했던 것처럼 하이퍼파라미터에는 중요도 순위가 있다. 예를 들어 Hyperparameter1이 학습속도 α이고 극단적인 경우로 Hyperparameter2를 ϵ라고 하자. (ϵ: Adam 알고리즘의 분모에 있는 값) 이런 경우 α를 고르는 것이 ϵ를 고르는 것 보다 더 중요하다.

그래서 격자점(i의 상황)으로 다시 돌아가면 5개의 α값을 확인하게 되는데 이때 ϵ값이 달라도 결과는 같은 것을 확인할 수 있을 것이다. 25개의 모델을 학습시켰지만 가장 중요한 하이퍼파라미터인 α 5개에 대해서만 학습시킨 것과 다를게 없다.

[그림3] 격자점의 하이퍼파라미터 중요도 순위에 따른 결과

반대로 무작위로 모델(ii의 상황)을 고르면 어떨까? 그렇게 되면 25개의 서로 다른 학습속도 α값을 이용하여 학습시키게 되고 더 좋은 하이퍼파라미터를 잘 찾게 될 것이다.

[그림4] 무작위의 하이퍼파라미터 중요도 순위에 따른 결과

여기서는 두 개의 하이퍼파라미터만 써서 예를 들었지만 실제로는 훨씬 많은 하이퍼파라미터를 다루게 될 것이다. 예컨대 세 개의 하이퍼파라미터를 다룬다고 하면 정사각형이 아닌 정육면체를 탐색하게 되는 것이다. 그리고 세번째 차원은 Hyperparameter3를 가르키게 된다. 그 3차원 정육면체 안에서 모델을 고른다면 각 하이퍼파라미터에 대해서 훨씬 많은 값을 시험해보게 될 것이다. 실제로는 3보다 더 많은 하이퍼파라미터를 탐색하곤 한다. 그리고 어플리케이션에서 어떤 하이퍼파라미터가 가장 중요한지 미리 알기 어렵다.

=> 격자점보다 무작위로 모델을 정하는 것이 가장 중요한 하이퍼파라미터의 다양한 값을 탐색할 수 있다. 무엇이 중요하든 상관없이 말이다.

Coarse to fine

다른 일반적 방법 중 하나는 정밀화 접근이다. 아래 2차원 예시에서 이 점들을 사용한다고 해보자. 그리고 파란색 동그라미의 점이 최고라는 것을 찾았다. 그렇다면 아마도 그 주변에 있는 점들도 좋은 성능을 보일 것이다.

[그림5] 정밀화 접근

그러면 정밀화 접근에서는 더 작은 영역으로 확대해서 더 조밀하게 점들을 선택한다. 무작위인 것은 그대로지만 최고의 하이퍼파라미터들이 이 영역에 있으리라는 믿음 하에 파란색 사각형(더 작은 범위의 사각형) 안에 초점을 두고 탐색하는 것이다.

[그림6] 정밀화 접근의 과정

즉, 전체 사각형에서 탐색한 뒤에 더 작은 사각형으로 범위를 좁혀 나가는 것이다. 그렇다면 작은 사각형안에서 더 조밀하게 시험해볼 수 있다. 이러한 정밀화 접근도 자주 쓰이는 방식이다. 그리고 이렇게 하이퍼파라미터의 여러 값들을 시험해보며 학습의 목표나 개발 목표 등에 있어서 최고의 파라미터를 고르는 것이다.

이번 강의에서는 하이퍼파라미터를 찾는 방법을 체계적으로 정리했다. 이보다 더 많은 종류의 탐색이 있지만 우리가 반드시 알아야할 두가지는…

첫째, 격자점이 아닌 무작위이다.

둘째, 원한다면 정밀화 접근을 이용할 수 있다.

적절한 척도 선택하기

지난 강의에서 무작위로 하이퍼파라미터를 찾는 것이 더 효율적인 탐색이라는 것을 배웠다. 하지만 여기서 무작위라는 것이 가능한 값들 중 공평하게 뽑는 것이라고 할 수는 없다. 대신 적절한 척도를 정하는 것이 더욱 중요하다. 어떻게 척도를 정하는지 알아보자.

Checking hyperparameters at random

i) 어떤 레이어 l에 대해서 은닉 유닛의 수 n^l을 정한다고 하자. 값의 범위는 50부터 100이다. 이런 경우 50부터 100까지의 수직선에서 무작위하게 값들을 고른다고 하자. 이는 하이퍼파라미터를 고르는 꽤 합리적인 방법이다.

ii) 또는 신경망에서 레이어의 숫자 L을 정한다고 했을 때 층의 숫자가 2에서 4사이라고 생각할 수 있다. 2에서 4까지의 숫자를 선택할 때 무작위하게 뽑는 것을 물론이거니와 격자점을 사용해도 문제가 없다.

다음 i), ii)과 같은 예시들은 가능한 값 중 무작위하게 뽑는 것이 합리적인 경우이다. 하지만 모든 하이퍼파라미터가 그렇지는 않다. 다른 예시들을 살펴보자.

iii) 학습률 α를 탐색하는데 범위로 0.0001부터 1까지를 생각하고 있다고 하자. 0.0001에서 1까지의 수직선 상에서 균일하게 무작위로 값을 고르게 되면, 90%의 값이 1과 0.1사이에 존재할 것이다. 즉, 90%의 자원을 0.1과 1사이를 탐색하는 데 쓰고 단 10%만을 0.0001과 0.1사이를 탐색하는 데 쓰는 것이다. 이는 공평하다고 할 수 없다.

[그림7] 선형척도에서 학습률 α탐색

따라서 선형척도 대신 로그척도에서 하이퍼파라미터를 찾는 것이 더 합리적이다. 수직선위에 0.0001부터 0.001, 0.01, 0.1, 1까지 값들이 있을 것이다. 이런 로그 척도에서 균일하게 무작위로 값을 뽑는 것이다. 그러면 0.0001과 0.001사이, 0.001과 0.01 사이를 탐색할 때 더 많은 자원을 쓸 수 있는 것이다.

[그림8] 로그척도에서 학습률 α탐색

파이썬에서는 어떻게 구현할 수 있을까?

r=-4*np.random.rand() # -4~0사이의 무작위 값 a=10^r # 10^(-4)~10^0 사이의 값

r=-4*np.random.rand()를 쓰면 무작위로 선택된 α값은 10^r이 된다. 첫번째 줄에서 r은 -4와 0사이의 무작위 값이고 α는 10^(-4)와 10^0(== 1)사이가 된다.

더 일반적인 경우를 살펴보자. 10^a에서 10^b까지 로그 척도로 탐색한다면 수직선이 시작값이 10^a가 될 것이다. 따라서 a는 10을 밑으로 하는 log를 0.0001에 대해 취하면 얻을 수 있다. 그 결과 a는 -4가 될 것이다. 마찬가지로 수직선의 끝 값은 10^b이다. 여기서 b는 10이 밑인 log를 1에 취하면 0이라는 것을 알 수 있다. 그리고 어떻게 할까? r은 a와 b사이서 균일하게 무작위로 뽑힌다. 이 경우 r은 -4와 0사이다. 그리고 무작위 하이퍼파라미터 α는 10^r이 된다.

[그림9] 로그척도의 일반화

다시 살펴보면 낮은 값에서 log를 취해서 a를 찾고 높은 값에서 log를 취해 b를 찾는다. 이렇게 10^a에서 10^b까지를 로그 척도로 탐색하는 것이다. r은 a와 b사이에서 균일하게 무작위로 뽑으면 하이퍼파라미터가 10^r이 되는 것이다. 이렇게 로그 척도에서 샘플링 하는 법을 배워보았다.

Hyperparameters for exponentially weighted averages

또 다른 예시는 지수가중평균을 계산할 때 사용되는 하이퍼파라미터 β에 관한 것이다. β​를 0.9와 0​dp r를 를 0.9와 0.999 범위에서 찾는다고 하자. (바로 직전 포스팅 참고하길 바람)

0.9의 경우에는 지수가중평균이 최근 10일의 평균기온처럼 마지막 10개 값의 평균과 비슷하고 0.999의 경우에는 마지막 1000개 값의 평균과 비슷했던 것을 기억하는가? 바로 위에서 설명했던 것처럼 만약 0.9와 0.999 사이를 탐색한다면 그 사이를 무작위 탐색하는 것은 합리적이지 않다.

[그림10] 지수가중평균에서 하이퍼파라미터 β

더 나은 방법은 1-β​dp eogotj dp 에 대해서 값을 탐색하는 것이다. 그러면 0.1부터 0.0001이 된다. 그러면 β​fmf 를 0.1에서 0.01을 거쳐 0.001사이에서 탐색하는 것이다. 그렇다면 10^(-1)에서 10^(-3)이다. (위의 설명에서는 작은 값이 왼쪽에 큰 값이 오른쪽에 있었지만 여기서는 반대임) 즉, 여기서 해야할 일은 -3과 -1사이에서 균일하게 무작위로 값을 뽑는 것이다. 1-β를 10^r로 생각하면 되니 β가 1-10^r이 되는 것이다.

[그림11] 1-β에 대해서 값을 탐색하는 과정

이렇게 적절한 척도 위에서 무작위로 하이퍼파라미터 샘플은 추출한다. 이 방법을 이용하면 0.9부터 0.99를 탐색할 때와 0.99부터 0.999를 탐색할 때 동일한 양의 자원을 사용할 수 있다.

이쯤 되면 왜 이러한 방법이 필요한지 수학적 증명이 궁금할 것이다. 왜 선형 척도에서 샘플을 뽑는 것은 좋지 않을까? 만약 β가 1에 가깝다면 β가 아주 조금만 바뀌어도 결과가 아주 많이 바뀌게 된다. 예를들어 β가 0.9에서 0.9005로 바뀌었다면 결과에 거의 영향을 주지 않는다.(1번 상황) 하지만 β가 0.999에서 0.9995로 바뀌었다면 알고리즘 결과에 큰 영향을 줄 것이다.(2번 상황) 1번의 경우, 대략 10개의 값을 평균내는 것이지만 2번의 경우에는 마지막 1000개의 값의 지수가중평균을 내는 것에서 마지막 2000개 값의 평균을 내는 것으로 바뀌었기 때문이다. 왜냐하면 1/(1-β)라는 식이 β가 1에 가까워질수록 작은 변화에도 민감하게 반응하기 때문이다. 따라서 β가 1보다 가까운 곳에서 더 조밀하게 샘플을 뽑는다. 반대로 1-β는 0이 가까운 곳이 된다. 따라서 가능한 결과 공간을 탐색할 때 더 효율적으로 샘플을 추출할 수 있는 것이다. ​dp eogotj dp ​dp eogotj dp ​dp eogotj dp 가 ​dp eogotj dp 가 ​dp eogotj dp rk 2ㅓ(왜

[그림12] 선형 척도의 단점에 대한 필기

이 강의를 통해 하이퍼파라미터 샘플을 고를 때 적절한 척도를 고를 수 있게 되길 바란다. 만약 하이퍼파라미터를 고를 때 적절한 척도를 사용하지 않더라도 크게 걱정하지 않아도 된다. 다른 척도가 우선하는 상황에서 균일한 척도에서 샘플링을 하더라도 정밀화 접근을 사용하면 괜찮을 결과를 얻을 수 있다. 그래서 반복할수록 더 유의미한 하이퍼파라미터 범위를 탐색하게 되는 것이다.

하이퍼파라미터 튜닝 실전

이전까지는 하이퍼파라미터를 탐색하는 방법을 설명하지 않았다. 하이퍼파라미터 탐색을 마무리하기에 앞서 탐색을 어떻게 할 수 있는지 몇 가지 팁을 알려드리고자 한다.

Re-test hyperparameters occasionally

오늘날 딥러닝은 여러 분야에 적용되고 있다. 한 어플리케이션에서 얻은 하이퍼파라미터에 대한 직관이 다른 영역에서 쓰일 수도, 아닐 수도 있다. 서로 다른 어플리케이션 영역 간에 공유되는 것들이 있다. 예를 들면 컴퓨터 비전 커뮤니티에서 발전된 컨브넷이나 레스넷 등이 있다. (이는 강의 뒷부분에서 다시 다룰 것임) 이것들은 음성에 잘 적용되고 있다. 그리고 이 음성에서 발전된 아이디어 들이 자연어 처리에서도 잘 적용되고 있는 것을 보았다.

[그림 13] 여러 분야에 적용되고 있는 딥러닝

즉, 딥러닝 분야의 사람들이 다른 영역에서 영감을 얻기 위해 그 분야의 논문을 점점 많이 찾아 읽고 있다. 하지만 하이퍼파라미터를 찾는 과정은 그렇지 못하다는 직관을 얻었다.

로지스틱 문제 하나만 보더라도 여러분이 좋은 하이퍼파라미터를 찾았다고 할 때 알고리즘을 계속 발전시키거나 몇 달에 걸쳐 데이터가 바뀔 수도 있다. 데이터 센터의 서버를 업그레이드 시킬 수도 있다. 이러한 변화들 때문에 여러분이 찾았던 하이퍼파라미터가 녹스는 것이다. 그래서 다시 시험해보고나 하이퍼파라미터들이 아직도 만족할만한 결과를 내는지 몇 달마다 재평가하기를 권한다.

결국 사람들이 하이퍼파라미터를 찾을 때 크게 두 가지 서로 다른 방법을 사용한다.

Babysitting one model

첫번째 방법은 모델 돌보기이다. 데이터는 방대하지만 CPU나 GPU 등 컴퓨터 자원이 많이 필요하지 않아서 적은 숫자의 모델을 한번에 학습시킬 수 있을 때 사용한다. 이런 경우에 학습과정에서 모델 돌보기를 사용한다.

예를 들어 0일차에 무작위하게 매개변수를 설정하고 학습을 시작했다. 그러면 학습곡선에서 비용함수 J나 개발 세트의 오차가 하루가 다르게 점진적으로 감소할 것이다. 1일차 끝 무렵에 학습이 꽤나 잘 된다. 그러고 나면 학습 속도를 조금 올려서 조금 더 나은지 보자고 말할 수 있다. (이런 식으로 성능을 올려나가는 것임) 그리고 2일차에도 꽤 좋은 성과를 내고 있는 것을 볼 수 있다. 여기서도 모멘텀을 약간 올리거나 학습속도를 약간 낮출 수 있다. 그리고 3일차에 들어선다… 그렇게 하이퍼파라미터를 계속 조절하다보면 어떤 날엔 학습속도가 너무 커서 몇 일 전으로 돌아가기도 한다. 이렇게 며칠, 몇 주에 걸쳐 매일 모델을 돌보며 학습시키는 것이다.

[그림 14] 모델 돌보기 방식

이와 같이 모델 돌보기는 성능을 잘 지켜보다가 학습 속도를 조금씩 바꾸는 방식이다. 이 방식은 여러 모델을 동시에 학습 시킬 컴퓨터의 자원이 충분치 않을 때 사용한다.

Training many models in parallel

또 다른 접근은 여러 모델을 함께 학습시키는 것이다. 여러분이 갖고 있는 하이퍼파라미터를 며칠에 걸쳐 스스로 학습하게 한다. 그럼 아래와 같은 함수(파란색)를 그리게 된다. 비용함수 J를 그린 것 일수도 있다. 학습 오차나 개발 세트의 오차 등 어떤 수치를 나타내고 있을 것이다. 그리고 동시에 다른 모델의 다른 하이퍼파라미터 설정을 다루기 시작한다. 두번째 모델(보라색)은 다른 학습 곡선을 그리게 된다. 아래 보이는 것처럼 말이다. (두번째 모델이 더 나은 그래프를 그리고 있음) 그리고 동시에 세번째 모델(빨간색)도 학습시킨다. 학습 곡선이 아래와 같이 그려진다. 또 다른 것들(주황색, 초록색)은 발산하는 그래프 모양을 그린다. 아래아 같이 서로 다른 모델을 동시에 학습시키는 것이다. 아래 주황색 선들도 서로 다른 모델을 나타낸다.

[그림 15] 동시에 여러 모델 훈련

이 방법을 쓰면 여러 하이퍼파라미터 설정을 시험해볼 수 있다. 그리고 마지막에 최고 성능을 보이는 것을 고르는 것이다. 이 예시에서는 아마 다음 곡선이 최고의 곡선일 것이다.

[그림 16] 최고의 성능 곡선

Babysittine one model Training many models in parallel 팬더와 같다. (팬더는 한 번에 한 마리씩만 아이를 갖는다) 그리고 아기 팬더가 살아남을 수 있도록 정말 많은 노력을 기울인다. 말 그대로 모델이나 아기 팬더를 ‘돌보기’하는 것이다. – 포유류의 번식 과정 캐비어 전략이라고도 한다. (물고기랑 비슷하기 때문) 한 철에 1억개의 알을 품는 물고기가 있다. 물고기가 번식하는 과정은 하나에 많은 집중을 쏟기보다 하나 또는 그 이상이 더 잘 살아남기를 그지 지켜본다. – 어류, 파충류의 번식 과정

이 두 접근중에 무엇을 선택할지는 컴퓨터 자원의 양과 함수에 관계가 있다. 만약 여러 모델을 동시에 학습시키기에 충분한 컴퓨터를 갖고 있다면 물론 캐비어 접근을 사용해서 서로 다른 하이퍼파라미터를 시험해 볼 수 있다. 하지만 온라인 광고나 컴퓨터 비전 어플리케이션 등 많은 데이터가 쓰이는 곳에서는 학습시키고자 하는 모델이 너무 커서 한 번에 여러 모델을 학습시키기 어렵다. 물론 어플리케이션에 따라 큰 차이가 있지만 주로 팬더 접근을 사용한다. 하나의 모델에 집중해 매개변수를 조금씩 조절하며 그 모델이 잘 작동하게끔 만드는 것이다. 하지만 팬더 접근에서도 한 모델이 잘 작동하는지 확인한 뒤에 2-3주 뒤에 다른 모델을 초기화해서 다시 돌보기를 할 수 있다. 팬더가 일생에 여러 마리의 새끼를 돌보는 것처럼 말이다. 한 번에는 하나 혹은 아주 적은 숫자의 새끼만 돌보지만 말이다.

이 강의를 통해 하이퍼파라미터 탐색에 대한 좋은 감을 얻으셨길 바란다. 그리고 하이퍼파라미터에 상관 없이 튼튼한 신경망을 만드는 방법이 있다. 모든 신경망에 적용되는 것은 아니지만 적용이 가능하다면 하이퍼파라미터 탐색이 훨씬 쉽고 빨라진다. 이는 다음 포스팅에서 자세히 설명하겠다.

Tensorflow-1.4. 기초(5)-하이퍼 파라미터 튜닝

728×90

반응형

이전 포스트에서 데이터 셋을 표준 정규분포로 만들어 더 쉽게 데이터셋을 모델에 학습시켜보았다. 그러나, 패턴의 단순함에 비해 여전히 정확도(Accuracy)가 원하는 수준까지 나오질 않는다. 대체 왜 그럴까?

이번 포스트에서는 경험적 하이퍼 파라미터 튜닝 방법을 사용하여, 하이퍼 파라미터를 튜닝해보도록 하겠다. 제대로 된 하이퍼 파라미터 튜닝은 추후 자세히 다루도록 하겠다.

하이퍼 파라미터 튜닝 (HyperParameter Tuning)

머신러닝을 공부하다 보면 하이퍼 파라미터라는 단어와 파라미터라는 단어가 반복해서 등장하는 것을 볼 수 있다.

파라미터(Parmeter)라는 단어는 코딩을 하다 보면 자주 보이는, 수정할 수 있는 값인데, 갑자기 왜 하이퍼 파라미터라는 값이 등장할까? 또, 왜 파라미터는 수정할 수 없는 값이라고 할까?

머신러닝에서의 파라미터는 가중치(Weight), 편향(Bias) 같은 학습 과정에서 모델이 자동으로 업그레이드하며 갱신하는 값을 가리킨다.

파라미터는 학습 도중 머신이 알아서 바꿔가는 것이므로, 연구자가 손 델 수 있는 값이 아니다.

머신러닝에서 하이퍼 파라미터는 그 외 연구자가 수정할 수 있는 값으로, 학습률, Optimizer, 활성화 함수, 손실 함수 등 다양한 인자들을 가리킨다.

이 값들을 손보는 이유는 모델이 학습에 사용한 데이터 셋의 형태를 정확히 알지 못하고, 데이터 셋의 형태에 따라 이들을 사용하는 방법이 바뀌기 때문이다.

1. 하이퍼 파라미터 튜닝을 해보자.

우리는 이미 우리가 만들어낸 데이터 셋의 형태를 알고 있다.

우리가 만들어낸 데이터셋은 선형 데이터셋인데, 우리는 활성화 함수로 은닉층에서 ReLU를 사용하였다.

이번엔 모든 활성화 함수를 linear로 만들어 학습시켜보자.

# Import Module import pandas as pd import numpy as np from tensorflow import keras from tensorflow.keras.layers import Dense # Dataset Setting def f(x): return x + 10 # Data set 생성 np.random.seed(1234) # 동일한 난수가 나오도록 Seed를 고정한다. X_train = np.random.randint(0, 100, (100, 1)) X_test = np.random.randint(100, 200, (20, 1)) # Label 생성 y_train = f(X_train) y_test = f(X_test) # Model Setting model = keras.Sequential() model.add(Dense(16, activation=’linear’)) model.add(Dense(1, activation=’linear’)) # Compile: 학습 셋팅 opt = keras.optimizers.Adam(learning_rate=0.01) model.compile(optimizer=opt, loss = ‘mse’) # 특성 스케일 조정 mean_key = np.mean(X_train) std_key = np.std(X_train) X_train_std = (X_train – mean_key)/std_key y_train_std = (y_train – mean_key)/std_key X_test_std = (X_test – mean_key)/std_key

# 학습 >>> model.fit(X_train_std, y_train_std, epochs = 100) Epoch 1/100 4/4 [==============================] – 0s 2ms/step – loss: 2.5920 Epoch 2/100 4/4 [==============================] – 0s 997us/step – loss: 1.5766 Epoch 3/100 4/4 [==============================] – 0s 2ms/step – loss: 0.7499 Epoch 4/100 4/4 [==============================] – 0s 2ms/step – loss: 0.3371 Epoch 5/100 4/4 [==============================] – 0s 2ms/step – loss: 0.0817 Epoch 6/100 4/4 [==============================] – 0s 2ms/step – loss: 0.0059 … Epoch 95/100 4/4 [==============================] – 0s 1ms/step – loss: 6.0676e-15 Epoch 96/100 4/4 [==============================] – 0s 1ms/step – loss: 6.2039e-15 Epoch 97/100 4/4 [==============================] – 0s 2ms/step – loss: 6.4773e-15 Epoch 98/100 4/4 [==============================] – 0s 2ms/step – loss: 5.6185e-15 Epoch 99/100 4/4 [==============================] – 0s 1ms/step – loss: 6.5939e-15 Epoch 100/100 4/4 [==============================] – 0s 1ms/step – loss: 6.7939e-15

# label과 test set을 비교해보자. pred = model.predict(X_test_std.reshape(X_test_std.shape[0])) pred_restore = pred * std_key + mean_key predict_DF = pd.DataFrame({“predict”:pred_restore.reshape(pred_restore.shape[0]), “label”:y_test.reshape(y_test.shape[0])}) predict_DF[“gap”] = predict_DF[“predict”] – predict_DF[“label”] predict_DF

# 정확도(Accuracy)를 보자 >>> print(“Accuracy:”, np.sqrt(np.mean((pred_restore – y_test)**2))) Accuracy: 1.0789593218788873e-05

고작, 은닉층의 활성화 함수만 바꿨을 뿐인데, 이전보다 훨씬 좋은 결과가 나왔다.

패턴을 거의 완벽하게 찾아내었으며, 정확도(Accuracy) 역시 0.000010789(e-05는 $10^{-5}$을 하라는 소리다.)로 거의 0에 근사하게 나왔다.

2. 정리

위 결과를 보면, 아무리 단순한 패턴이라 할지라도, 그 데이터 셋의 형태를 반영하지 못한다면, 정확히 그 결과를 찾아내지 못할 수 있다는 것을 알 수 있다.

인공지능은 흔히들 생각하는 빅데이터를 넣으면, 그 안에 숨어 있는 패턴이 자동으로 나오는 마법의 상자가 아니라, 연구자가 그 데이터에 대한 이해를 가지고 여러 시도를 해, 제대로 된 설계를 해야만 내가 원하는 제대로 된 패턴을 찾아낼 수 있는 도구다.

그러나, 실전에서는 지금처럼 우리가 이미 패턴을 알고 있는 경우는 없기 때문에 다양한 도구를 이용해서, 데이터를 파악하고, 적절한 하이퍼 파라미터를 찾아낸다.

넣을 수 있는 모든 하이퍼 파라미터를 다 넣어보는 “그리드 서치(Greed search)” 나 랜덤 한 값을 넣어보고 지정한 횟수만큼 평가하는 “랜덤 서치(Random Search)” , 순차적으로 값을 넣어보고, 더 좋은 해들의 조합에 대해서 찾아가는 “베이지안 옵티마이제이션(Bayesian Optimization)” 등 다양한 방법이 있다.

나 랜덤 한 값을 넣어보고 지정한 횟수만큼 평가하는 , 순차적으로 값을 넣어보고, 더 좋은 해들의 조합에 대해서 찾아가는 등 다양한 방법이 있다. 같은 알고리즘이라 할지라도, 데이터를 어떻게 전처리하느냐, 어떤 활성화 함수를 쓰느냐, 손실 함수를 무엇을 쓰느냐 등과 같은 다양한 요인으로 인해 다른 결과가 나올 수 있으므로, 경험을 많이 쌓아보자.

728×90

반응형

모델 성능 향상을 위한 하이퍼 파라미터 튜닝

728×90

이번 포스팅에서는 지도 학습 모델을 만들때 필수적인 단계인 하이퍼 파라미터 튜닝에 대해 소개한다.

하이퍼 파라미터와 하이퍼 파라미터 튜닝이란?

머신러닝에서 하이퍼 파라미터란 쉽게 생각해서 사용자의 입력값, 혹은 설정 가능한 옵션이라고 볼 수 있다. 모든 데이터와 문제에 대해 가장 좋은 하이퍼 파라미터 값이 있으면 좋겠지만, 아래 그림과 같이 데이터에 따라 좋은 하이퍼 파라미터라는 것이 다르다.

데이터에 따라 좋은 모델과 하이퍼파라미터가 다르다.

그래서 데이터마다 좋은 입력값을 설정해주는 노가다 작업이 필요한데, 이를 하이퍼 파라미터 튜닝이라고 한다. 예를 들어서, k-최근접 이웃에서 k를 3으로도 해보고, 5로도 해보고, 10으로도 해 본 다음 그 가운데 가장 좋은 k를 찾는 과정이다. 하이퍼 파라미터 튜닝을 노가다라고 표현한 이유는 해보기 전까진 3이 좋을지, 5가 좋을지, 10이 좋을지 알 수 없기 때문이다 (실제로 2000년대 초반에는 최적의 k를 찾는 연구가 수행되었지만, 결론은 data by data라고 났다).

그리드 서치(grid search)

하이퍼 파라미터 그리드는 한 모델의 하이퍼 파라미터 조합을 나타내며, 그리드 서치란 하이퍼 파라미터 그리드에 속한 모든 파라미터 조합을 비교 평가하는 방법을 의미한다.

예를 들어, 아래 그림에서는 k-최근접 이웃의 하이퍼파라미터인 이웃수(n_neighbors)와 거리 척도 (metric)에 대한 하이퍼 파라미터 그리드를 보여준다. 이 그리드에서 이웃 수는 {3, 5, 7}의 범위에서, 거리 척도는 {Manhattan, Euclidean}의 범위에서 튜닝되며, 그 결과로 총 3 x 2 = 6개의 파라미터 조합이 생성되었다. 이제 이 모든 조합을 비교하여 최적의 파라미터를 찾으면 된다. 물론 전역 최적이 아니라, 지역 최적일 가능성이 매우매우 높겠지만 말이다.

그리드 서치 구현

sklearn에는 GridSearchCV라는 함수가 있지만, 전처리 과정 등을 효과적으로 반영하기 어렵기에 필자는 잘 사용하지 않는다 (물론 사용은 매우 간편하긴 하다). 그 대신에 여기에서는 sklearn.model_selection.ParameterGrid이라는 함수를 소개한다.

이 함수는 이름 그대로 파라미터 그리드를 만들어주는 함수이며, 입력으로는 아래 구조와 같은 사전을 받는다.

위 예시에서는 n_neighbors라는 파라미터는 {3, 5, 7}이라는 범위에서, metric이라는 파라미터는 {“Manhattan”, “Euclidean”}이라는 범위에서 튜닝할 것이라는 뜻을 내포한 파라미터 그리드를 정의한 것이다. 물론, n_neighbors와 metric은 어떤 함수의 키워드이며, {3, 5, 7}과 {“Manhattan”, “Euclidean”}는 해당 키워드에 대해 입력 가능한 값이다. 그렇지 않다면 당연히 정상적으로 작동할 수 없다.

이제 파라미터 그리드 함수가 어떻게 작동하는지 보자. 아래 사진에서 보듯이, 사전을 파라미터 그리드 함수의 입력으로 넣게 되면, 파라미터 그리드에 있는 각 셀 (하나의 파라미터 조합)을 리턴하는 제너레이터를 반환한다.

이 함수의 출력값을 효과적으로 사용하기 위해서는 아래 두 가지 개념을 알고 있어야 한다.

먼저 어떤 함수의 입력으로 사전을 사용하고 싶다면, 사전 앞에 **를 붙여야 한다.

그렇게 되면, 사전의 key와 일치하는 함수의 키워드에 value가 아래 그림과 같이 입력되게 된다.

두 번째 필요한 개념은 최소값 혹은 최대값 찾기 알고리즘이다. 알고리즘이라고 해서 거창해보이지만, 사실 누구나 이해할 수 있는 매우 간단한 개념이다. 물론 max 함수를 사용하면 손쉽겠지만, 각 값을 순회하면서 최대값을 업데이트해야 하는 상황에서는 max 함수를 사용하기 어렵다 (빈 리스트에 값들을 추가해서 max 함수를 쓰면 되지 않느냐라고 반문할 수 있겠지만, 하이퍼 파리미터 튜닝에서는 메모리 낭비로 이어질 가능성이 매우 높다).

[10, 20, 30, 10, 20]이라는 리스트 L이 있고, 이 리스트에서 최대값을 찾는다고 하자.

그러면 아래와 같은 절차로 탐색할 수 있다.

(0번째 이터레이션) 우리가 찾을 최대값인 Max_value를 매우 작은 값으로 설정

(1번째 이터레이션) 0번째 요소와 Max_value를 비교 ==> 0번째 요소가 더 크므로 Max_value를 0번째 요소로 업데이트

(2번째 이터레이션) 1번째 요소와 Max_value를 비교 ==> 1번째 요소가 더 크므로 1번째 요소로 Max_value를 업데이트

(3번째 이터레이션) 2번째 요소와 Max_value를 비교 ==> 2번째 요소가 더 크므로 2번째 요소로 Max_value를 업데이트

2번째 요소와 Max_value를 비교 ==> 2번째 요소가 더 크므로 2번째 요소로 Max_value를 업데이트 (4번째 이터레이션) 3번째 요소와 Max_value를 비교 ==> Max_value가 더 크므로 pass~

3번째 요소와 Max_value를 비교 ==> Max_value가 더 크므로 pass~ (5번째 이터레이션) 2번째 요소와 Max_value를 비교 ==> Max_value가 더 크므로 pass~

실습 코드

이제 실제 코드를 가지고 어떻게 튜닝을 할 수 있는지 더 자세히 살펴보자.

먼저, sklearn.datasets에 있는 iris 데이터를 가져온다.

# 예제 데이터 불러오기 from sklearn.datasets import load_iris X = load_iris()[‘data’] # feature Y = load_iris()[‘target’] # label

그리고 학습 데이터와 평가 데이터로 분리한다.

# 학습 데이터와 평가 데이터 분할 from sklearn.model_selection import train_test_split Train_X, Test_X, Train_Y, Test_Y = train_test_split(X, Y)

모델은 KNN과 SVM을 사용하자.

# 모델 불러오기 from sklearn.neighbors import KNeighborsClassifier as KNN from sklearn.svm import SVC

이제 모델별 파라미터 그리드를 설계한다.

param_grid_for_knn에는 KNN의 파라미터 그리드를, param_grid_for_svm에는 SVM의 파라미터 그리드를 정의한다.

그리고 이 값들을 param_grid라는 사전에 추가한다. 이는 모델이 여러 개 있을 때 파라미터 튜닝을 쉽게 하는 팁이다.

# 파라미터 그리드 생성 param_grid = dict() # 입력: 모델 함수, 출력: 모델의 하이퍼 파라미터 그리드 # 모델별 파라미터 그리드 생성 param_grid_for_knn = ParameterGrid({“n_neighbors”: [3, 5, 7], “metric”:[‘euclidean’, ‘manhattan’]}) param_grid_for_svm = ParameterGrid({“C”: [0.1, 1, 10], “kernel”:[‘rbf’, ‘linear’]}) # 모델 – 하이퍼 파라미터 그리드를 param_grid에 추가 param_grid[KNN] = param_grid_for_knn param_grid[SVC] = param_grid_for_svm

이제 튜닝을 시작하자.

먼저, 현재까지 찾은 가장 높은 f1_score를 초기화한다.

f1_score가 가장 큰 모델과 파라미터를 찾는 것이기에, 매우 작은 값으로 설정해야 하지만, 이 값은 0보다 작을 수 없기에 0이하로 설정해도 무방하다.

그리고 model_func으로 KNN과 SVC 함수를 순회하고, 앞서 정의한 param_grid 사전을 이용하여 각 모델의 파라미터를 param으로 받는다. 모델별 파라미터 그리드를 포함하는 param_grid를 정의한 것이 이렇게 라인 수를 줄여주는데 효과적이다. 이제 param으로 각 파라미터를 돌면서, model_func에 param을 입력하여 모델을 학습하고 f1_score를 계산한다. 이 score가 best_score보다 크다면, 최고 점수와 모델, 파라미터를 업데이트한다. 이 과정에서 best_score를 업데이트하지않게 되면, 튜닝하는 효과가 전혀 없으므로 주의해야 한다.

# 하이퍼 파라미터 튜닝 best_score = -1 # 현재까지 찾은 가장 높은 f1_score (f1 score는 절대 0보다 작을수 없기에, -1로 설정해도 무방) from sklearn.metrics import f1_score for model_func in [KNN, SVC]: for param in param_grid[model_func]: model = model_func(**param).fit(Train_X, Train_Y) pred_Y = model.predict(Test_X) score = f1_score(Test_Y, pred_Y, average = ‘micro’) if score > best_score: # 현재 점수가 지금까지 찾은 최고 점수보다 좋으면, 최고 모델, 파라미터, 점수 업데이트 best_model_func = model_func best_score = score best_param = param # best_model = model

이제 튜닝된 결과를 확인하자.

print(“모델:”, best_model_func) print(“점수:”, best_score) print(“파라미터:”, best_param)

(Tip) 튜닝 코드에서 기껏 모델을 학습해놓고 best_model을 주석 처리한 이유는 최종 모델을 학습할 때는 아래와 같이 전체 데이터를 사용하는 경우가 종종 있기 때문에 그렇다.

# 최종 모델 학습: 전체 X와 전체 Y에 대해. final_model = best_model_func(**best_param).fit(X, Y)

728×90

[ML] 4-1. 머신러닝에서의 하이퍼파라미터란 무엇일까? (파라미터 vs 하이퍼파라미터)

반응형

[이전글] [ML] 3-2. 머신러닝의 훈련 조건 (2) – 과대적합과 과소적합

ittrue.tistory.com/39

머신러닝에서 하이퍼파라미터를 알기 위해서는 파라미터라는 개념을 알아야 합니다. 컴퓨터 프로그래밍에서의 파라미터(Parameter)는 어떤 시스템이나 함수의 특정한 성질을 나타내는 변수를 뜻하며, 매개변수라고도 합니다. 함수에 특정 파라미터를 전달함으로써 출력되는 값이 달라지게 되는데, 원하는 값을 얻기 위해서는 알맞은 파라미터를 입력해 주어야 합니다.

많은 사람들이 머신러닝을 배울 때 파라미터와 하이퍼파라미터의 개념의 차이를 잘 인지하지 못하는 경우가 대다수인데, 명확히 다른 개념인 것을 알아야 합니다. 그렇다면 머신러닝에서 사용하는 파라미터와 하이퍼파라미터는 어떤 것이며, 어떤 차이를 가지고 있을까요?

1. 파라미터(Parameter)

머신러닝에서 사용되는 파라미터는 모델 파라미터라고도 하며, 모델에 적용할 하나 이상의 파라미터를 사용하여 새로운 샘플에 대한 예측을 하기 위해 사용됩니다. 즉, 머신러닝 훈련 모델에 의해 요구되는 변수라 할 수 있습니다.

파라미터의 특징

예측 모델은 새로운 샘플을 주어지면 무엇을 예측할지 결정할 수 있도록 파라미터를 필요로 한다.

머신러닝 훈련 모델의 성능은 파라미터에 의해 결정된다.

파라미터는 데이터로부터 추정 또는 학습된다.

파라미터는 개발자에 의해 수동으로 설정하지 않는다.(임의로 조정이 불가능하다)

학습된 모델의 일부로 저장된다.

모델 파라미터의 예

인공신경망의 가중치

SVM(Support Vector Machine)의 서포트 벡터

선형 회귀 또는 로지스틱 회귀에서의 결정계수

2. 하이퍼파라미터(Hyperparameter)

머신러닝에서 하이퍼파라미터는 최적의 훈련 모델을 구현하기 위해 모델에 설정하는 변수로 학습률(Learning Rate), 에포크 수(훈련 반복 횟수), 가중치 초기화 등을 결정할 수 있습니다. 또한 하이퍼파라미터 튜닝 기법을 적용하여 훈련 모델의 최적값들을 찾을 수 있습니다.

하이퍼파라미터의 특징

모델의 매개 변수를 추정하는 데 도움이 되는 프로세스에서 사용된다.

하이퍼파라미터는 개발자에 의해 수동으로 설정할 수 있다.(임의 조정 가능)

학습 알고리즘의 샘플에 대한 일반화를 위해 조절된다.

하이퍼파라미터의 예

학습률

손실 함수

일반화 파라미터

미니배치 크기

에포크 수

가중치 초기화

은닉층의 개수

k-NN의 k값

하이퍼파라미터의 튜닝 기법

그리드 탐색

랜덤 탐색

베이지안 최적화

휴리스틱 탐색

[정리]

모델 파라미터는 새로운 샘플이 주어지면 무엇을 예측할지 결정하기 위해 사용하는 것이며 학습 모델에 의해 결정

하이퍼파라미터는 학습 알고리즘 자체의 파라미터로 모델이 새로운 샘플에 잘 일반화 되도록 하이퍼파라미터들의 최적값을 찾으나, 데이터 분석 결과로 얻어지는 값이 아니므로 절대적인 최적값은 존재하지 않고, 사용자가 직접 설정

[다음글] [ML] 4-2. 머신러닝의 테스트와 검증 및 데이터 불일치 여부 확인

ittrue.tistory.com/43

반응형

키워드에 대한 정보 딥 러닝 하이퍼 파라미터 튜닝

다음은 Bing에서 딥 러닝 하이퍼 파라미터 튜닝 주제에 대한 검색 결과입니다. 필요한 경우 더 읽을 수 있습니다.

이 기사는 인터넷의 다양한 출처에서 편집되었습니다. 이 기사가 유용했기를 바랍니다. 이 기사가 유용하다고 생각되면 공유하십시오. 매우 감사합니다!

사람들이 주제에 대해 자주 검색하는 키워드 [딥러닝II] 10강. 하이퍼파라미터 튜닝

  • 밑바닥부터 시작하는 딥러닝
  • 딥러닝
  • 인공지능
  • 인공신경망
  • 한경훈
  • 수원대
  • 하이퍼파라미터
  • hyperparameter
[딥러닝II] #10강. #하이퍼파라미터 #튜닝


YouTube에서 딥 러닝 하이퍼 파라미터 튜닝 주제의 다른 동영상 보기

주제에 대한 기사를 시청해 주셔서 감사합니다 [딥러닝II] 10강. 하이퍼파라미터 튜닝 | 딥 러닝 하이퍼 파라미터 튜닝, 이 기사가 유용하다고 생각되면 공유하십시오, 매우 감사합니다.

See also  상세 페이지 스토리 보드 | #04 상세페이지 디자인! 쉽게 하고 싶다면 기획서(스토리보드)를 분석하자! 125 개의 새로운 답변이 업데이트되었습니다.

Leave a Comment