머신러닝 하이퍼파라미터 튜닝 | [딥러닝Ii] 10강. 하이퍼파라미터 튜닝 169 개의 자세한 답변

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

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

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

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

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/

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

3장. 크로스밸리데이션과 하이퍼파라미터 튜닝

대부분의 머신러닝 알고리즘에는 연구자나 기술자들이 지정해야 할 설정들이 많습니다. 이런 튜닝 옵션을 하이퍼파라미터hyperparameter라고 부르며 성능을 최적화 …

+ 여기에 자세히 보기

Source: tensorflow.blog

Date Published: 9/1/2021

View: 9534

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

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

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

Source: gils-lab.tistory.com

Date Published: 6/26/2021

View: 5112

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

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

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

Source: daje0601.tistory.com

Date Published: 12/21/2022

View: 3195

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

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

+ 여기에 자세히 보기

Source: ittrue.tistory.com

Date Published: 2/27/2021

View: 4616

하이퍼파라미터 튜닝

모델 세부 튜닝 프로젝트 진행 시 EDA와 데이터 전처리를 하고 자신의 목적에 적합한 모델을 선택했다고 … 하이퍼파라미터 튜닝 …

+ 여기에 더 보기

Source: databuzz-team.github.io

Date Published: 10/18/2021

View: 8346

[Hands-on Machine Learning] 하이퍼 파라미터 튜닝, 테스트 …

하이퍼 파라미터 튜닝. 1. GrSearchCV (그리드 탐색). 가장 단순한 방법은 만족할 만한 하이퍼 파라미터 조합을 찾을 때까지 수동으로 …

+ 여기를 클릭

Source: dsbook.tistory.com

Date Published: 7/11/2022

View: 4223

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

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

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

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

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

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

반응형

머신 러닝의 모델 평가와 모델 선택, 알고리즘 선택 – 3장. 크로스밸리데이션과 하이퍼파라미터 튜닝

이 글은 파이썬 머신 러닝의 저자 세바스찬 라쉬카(Setabstian Raschka)가 쓴 ‘Model evaluation, model selection, and algorithm selection in machine learning Part IIII – Cross-validation and hyperparameter tuning‘를 원저자의 동의하에 번역한 것입니다. 이 시리즈 글의 전체 번역은 Model evaluation, selection and algorithm selection에 있습니다.

소개

대부분의 머신러닝 알고리즘에는 연구자나 기술자들이 지정해야 할 설정들이 많습니다. 이런 튜닝 옵션을 하이퍼파라미터hyperparameter라고 부르며 성능을 최적화하거나 편향bias과 분산variance 사이의 균형을 맞출 때 알고리즘을 조절하기 위해 사용됩니다. 성능 최적화를 위해 하이퍼파라미터를 튜닝하는 것은 그 자체로 예술적인 일이며 어떤 데이터셋에서 최고의 성능을 보장하는 쉽고 빠른 길은 없습니다. 1장과 2장에서 모델의 일반화된 성능을 추정하기 위해 홀드아웃holdout과 부트스트랩bootstrap 기법을 보았습니다. 편향-분산의 트레이드오프bias-variance trade-off에 관해 배웠고 추정치의 불확실성을 계산했습니다. 이번 장에서 모델 평가와 모델 선택을 위한 교차 검증cross validation의 다른 방법을 살펴보겠습니다. 여러가지 다른 하이퍼파라미터 설정을 가진 모델의 순위를 매기고 별도의 테스트 데이터셋에 얼마나 잘 일반화되는지 추정하기위해 교차 검증 기법을 사용하겠습니다.

하이퍼파라미터와 모델선택

이전에 우리는 홀드아웃과 부트스트래핑을 사용하여 예측 모델의 일반화 성능을 추정했습니다. 데이터셋을 훈련 세트와 테스트 세트 두 부분으로 나누었습니다. 머신러닝 알고리즘이 훈련 세트로 모델을 학습시킨 후에 학습에 사용되지 않은 별도의 테스트 세트로 모델을 평가했습니다. 편향-분산 트레이드오프 같은 문제들에 관해 이야기할 때 학습 알고리즘에 고정된 하이퍼파라미터 설정을 사용했습니다. k-최근접 이웃k-nearest neighbors 알고리즘의 k 같은 값입니다. 하이퍼파라미터는 모델 학습 전에 미리 지정해야 하는 학습 알고리즘이 자체적으로 가지고 있는 파라미터입니다. 반대로 만들어진 모델의 파라미터를 모델 파라미터라고 합니다.

그렇다면 정확히 하이퍼파라미터가 무엇인가요? k-최근접 이웃 알고리즘에서는 정수값 k 가 하나의 하이퍼파라미터입니다. k=3 으로 지정하면 k-최근접 이웃 알고리즘이 훈련 세트에 있는 세개의 가장 가까운 이웃으로 다수결 투표를 해서 클래스 레이블을 예측합니다. 가장 가까운 이웃을 찾는 거리 측정 방식은 알고리즘에 있는 또 다른 하이퍼파라미터입니다.

k-최근접 이웃 알고리즘이 하이퍼파라미터와 모델 파라미터의 차이를 설명하는데 아주 적합하지 않을지 모릅니다. 이 알고리즘은 게으른 학습기lazy learner이고 비모수적nonparametric 방법이기 때문입니다. 여기에서 게으른 학습(또는 사례 기반instance-based 학습)이란 훈련이나 모델 학습 단계가 없다는 것을 의미합니다. k-최근접 이웃 모델은 말 그대로 훈련 데이터를 저장, 기억하고 예측 시에 사용만합니다. 그러므로 각 훈련 샘플이 k-최근접 이웃 모델에 있는 하나의 파라미터가 됩니다. 요약하면, 비모수적 모델은 훈련 세트에 맞추어 한정된 수의 파라미터로 기술할 수 없는 모델입니다. 비모수적 모델 구조는 사전에 정의되는 것이 아니고 훈련 데이터에 의해 결정됩니다. 비모수적 모델은 모수적parametric 모델과 달리 데이터가 어떤 확률 분포를 따른다고 가정 하지 않습니다(이런 가정의 예외적인 비모수적 방식은 베이지안 비모수 방법Bayesian nonparametric method입니다). 그러므로 비모수적 방식이 모수적 방식보다 데이터에 적은 가정을 한다고 말합니다.

k-최근접 이웃과 반대인 모수적 모델의 간단한 예는 로지스틱 회귀logistric regression입니다. 이 모델은 데이터셋에 있는 특성 변수마다 하나의 가중치 계수weight coefficient와 편향1(또는 절편) 같이 한정된 모델 파라미터를 가진 일반적인 선형 모델입니다. 로지스틱 회귀의 가중치 계수, 즉 모델 파라미터는 로그 가능도 함수log likelihood function를 최대화하거나 로지스틱 비용을 최소화시키는 방향으로 업데이트됩니다. 그래디언트gradient 기반의 최적화로 훈련 데이터에 모델을 학습시키는 경우, 훈련 세트의 반복 횟수 또는 에포크epoch가 로지스틱 회귀 알고리즘의 하이퍼파라미터가 됩니다. 또 다른 하이퍼파라미터는 L2-규제 로지스틱 회귀에서 람다lambda 항2 같은 규제 파라미터입니다:

훈련 세트에 학습 알고리즘을 적용할 때 하이퍼파라미터 값을 바꾸면 다른 모델이 만들어집니다. 서로 다른 하이퍼파라미터 설정으로 만들어진 모델중에서 가장 성능이 높은 모델을 찾는 과정을 모델 선택model selection이라고 합니다. 다음 섹션에서 이런 선택 과정에 도움이 되는 확장된 홀드아웃 방법을 살펴보겠습니다.

하이퍼파라미터 튜닝을 위한 3방향 홀드아웃 방법

1장에서 재치환resubstitution 검증은 일반화 성능을 추정하는데 나쁜 방법이라는 것을 배웠습니다. 새로운 데이터에 모델이 얼마나 잘 일반화 되는지를 알고 싶기 때문에 데이터셋을 훈련 데이터와 테스트 세트로 나누는 홀드아웃 방법을 사용했습니다. 하이퍼파라미터 튜닝을 위해 홀드아웃 방법을 사용할 수 있을까요. 대답은 “네!”입니다. 하지만 이전에 사용한 2방향two-way 분할을 조금 바꿔서 훈련training, 검증validation, 테스트test 세트 3가지로 데이터셋을 나누어야 합니다.

하이퍼파라미터 튜닝과 모델 선택 과정을 메타 최적화meta-optimization 작업으로 볼 수 있습니다. (게으른 학습기를 제외하고는) 학습 알고리즘이 목적 함수를 훈련 세트에서 최적화하는 반면, 하이퍼파라미터 최적화는 그 위에 있는 또 다른 작업입니다. 전형적으로 분류 정확도나 ROCReceiver Operating Charateristic 곡선 아래의 면적을 성능 지표로 하여 최적화합니다. 튜닝 단계 후에 테스트 세트 성능에 기반하여 모델을 선택하는 것이 적절한 방법처럼 보일 수 있습니다. 하지만 테스트 세트를 여러번 재사용하면 편향에 영향을 미치고 과대하게 낙관적으로 일반화 성능을 추정하게 됩니다. 이럴 때 “테스트 세트의 정보가 새어 나갔다”라고 말합니다. 이런 문제를 피하기 위해 데이터셋을 훈련, 검증, 테스트 데이터셋 3가지로 나눕니다. 하이퍼파라미터 튜닝과 모델 선택을 위해 훈련, 검증 세트를 사용하고 테스트 세트는 모델 평가를 위해 별도로 유지합니다. 성능 추정의 세가지 목적을 기억하시나요?

미래 (보지 못한) 데이터에 대한 모델의 예측 성능인 일반화 정확도를 추정하려고 합니다. 학습 알고리즘 튜닝하고 주어진 가설 공간으로부터 가장 성능이 뛰어난 모델을 선택해서 예측 성능을 증가 시키려고 합니다. 문제에 가장 적합한 머신러닝 알고리즘을 찾으려고 합니다. 그러므로 여러가지 알고리즘을 비교하고 알고리즘의 가설 공간에서 가장 성능이 좋은 모델은 물론 가장 가장 성능이 좋은 알고리즘을 선택하려고 합니다.

“3방향three-way 홀드아웃 방법”은 1번과 2번을 다루기 위한 한가지 방법입니다(3번 항목은 다음 글인 4장에서 살펴보겠습니다). 하지만 우리가 가장 성능이 좋은 모델을 고르는 2번에만 관심이 있고 편향되지 않은 일반화 성능을 추정하는데 관심이 없다면, 모델 선택에서 2방향 분할만 사용하면 됩니다. 2장에서 보았던 학습 곡선과 비관적 편향에 대해 얘기했던 것을 떠올려보면, 머신러닝 알고리즘은 레이블 된 데이터가 더 많을 때 효과를 봅니다. 데이터셋이 작을수록 비관적 편향과 분산이 증가됩니다. 즉 데이터를 나누는 방식에 따라 모델이 매우 민감해집니다.

“세상에 공짜 점심은 없습니다.” 하이퍼파라미터 튜닝과 모델 선택을 위한 3방향 홀드아웃 방법이 이 문제를 해결하기 위한 유일한 방법도 아니고 종종 최선의 방법도 아닙니다. 다음 섹션에서 대안적인 방법과 그들의 장점과 트레이드오프에 대해서 배우겠습니다. 아마도 모델 선택에서 가장 인기있는 방법인 k-겹 교차 검증k-fold cross-validation(예전에는 회전 평가rotation estimation라고도 불렀습니다)으로 넘어가기 전에, 3-방향 홀드아웃 방법의 그림을 한번 보겠습니다.

그림이 꽤 길기 때문에 단계별로 살펴보도록 하겠습니다

데이터셋을 먼저 모델 학습을 위한 훈련 세트와 모델 선택을 위한 검증 세트, 최종 선택된 모델을 평가하기 위한 테스트 세트, 3개 부분으로 나눕니다.

두 번째는 하이퍼파라미터 튜닝 단계를 보여줍니다. 학습 알고리즘을 사용하여 여러가지 (여기서는 세가지) 하이퍼파라미터 세팅으로 훈련 데이터에 모델을 학습시킵니다.

다음은 검증 세트로 모델의 성능을 평가합니다. 이 단계는 모델 선택 단계를 보여 줍니다. 성능 추정을 비교한 후에 가장 성능이 좋은 하이퍼파라미터 설정을 선택합니다. 실제로는 두 번째와 세 번째 단계를 함께 사용하는 경우가 많습니다. 학습된 모델을 메모리에 모두 유지하지 않으려고 다음 모델을 만들기 전에 학습시킨 모델의 성능을 계산합니다.

1장과 2장에서 논의한 것처럼 훈련 세트가 너무 작으면 추정값에 비관적 편향에 영향을 받습니다. 그러므로 모델 선택 후에 훈련 세트와 검증 세트를 합쳐 좀 더 큰 데이터셋으로 이전 단계에서 얻은 최선의 하이퍼파라미터 설정을 사용하여 모델을 학습시킵니다.

이제 모델의 일반화된 성능을 조정하기 위해 별도의 테스트 세트를 사용합니다. 테스트 세트의 목적은 모델이 이전에 본 적이 없는 새로운 데이터의 역할을 흉내내는 것입니다. 테스트 세트를 재사용하면 모델의 일반화된 성능 추정에 과하게 낙관적인 편향을 만들게 됩니다.

마지막으로 훈련 세트와 테스트 세트를 합쳐 전체 데이터를 사용해 실제 운영 환경에 사용할 모델을 학습시킵니다.

K-겹 교차 검증

실전 머신 러닝에서 모델 평가와 모델 선택을 위해 가장 널리 사용되는 기법인 k-겹 교차 검증을 소개할 차례입니다. 기술자나 연구자들이 훈련/테스트 홀드아웃 방법도 교차 검증이란 용어로 이따금씩 표현하곤 합니다. 그러나 교차 검증은 연속적으로 훈련과 검증 단계를 교차시키는 것으로 생각하는 것이 더 낫습니다. 교차 검증 이면의 주요 아이디어는 데이터셋에 있는 모든 샘플이 테스트될 기회를 갖도록 하는 것입니다. K-겹 교차 검증은 데이터셋을 k 번 반복하는 교차 검증의 특별한 케이스입니다. 각 반복에서 데이터셋을 k 개의 부분으로 나눕니다. 모델 평가를 위해 한 부분은 검증으로 사용되고 나머지 k-1 부분은 훈련용 서브셋으로 합쳐져서 사용됩니다. 아래 그림은 5-겹 교차 검증의 과정을 나타냅니다.

2방향 홀드아웃 방법처럼 모델 평가를 위해 k-겹 교차 검증을 사용한다면, 학습 알고리즘이 매 반복에서 고정된 하이퍼파라미터 설정으로 훈련 폴드를 사용해 모델을 학습시킵니다. 5-겹 교차 검증에서 이 과정은 학습된 5개의 다른 모델을 만듭니다. 이 모델을 학습할 때 사용한 훈련 세트는 부분적으로 겹쳐져 있으며, 평가는 중복되지 않은 검증 세트를 사용 합니다. 결국 검증 세트로부터 구한 k 개의 성능 추정을 산술 평균하여 교차 검증 성능을 계산합니다.

2방향 홀드아웃 방식과 k-겹 교차 검증 간의 주요한 차이점을 보았습니다. k-겹 교차 검증은 훈련과 테스트를 위해 모든 데이터를 사용합니다. 이 방식 이면에 있는 아이디어는 테스트 데이터를 위해 데이터셋에서 비교적 큰 부분을 따로 떼어 놓지 않고 많은 훈련 데이터를 사용하여 비관적 편향을 감소시키려는 것입니다. 2장에서 보았던 반복적인 홀드아웃 방법과 다른 점은 k-겹 교차 검증의 테스트 폴더는 중첩되지 않는다는 것입니다. 반복적인 홀드아웃 방법에서 테스트를 위해 샘플 데이터를 재사용하는 것은 반복 과정 사이의 독립적인 성능 추정을 만들어내지 못합니다. 이런 의존성은 4장에서 논의할 통계적인 비교에 문제가 될 수 있습니다. 또한 k-겹 교차 검증은 모든 샘플이 검증에 활용된다는 것을 보장하지만 반복적인 홀드아웃 방법은 일부 샘플이 테스트 세트에 포함되지 않을 수 있습니다.

이번 섹션에서 모델 평가를 위한 k-겹 교차 검증을 소개했습니다. 하지만 실제로는 k-겹 교차 검증이 모델 선택과 알고리즘 선택에 더 많이 사용되고 있습니다. 모델 선택을 위한 k-겹 교차 검증은 이 글의 후반부에 다루겠습니다. 알고리즘 선택에 관해서는 다음 글인 4장에서 더 자세히 다루겠습니다.

특별 사례: 2-겹 교차 검증과 Leave-One-Out 교차 검증

이 시점에서 이젠 섹션에 있는 k-겹 교차 검증 예시에서 왜 k=5 를 선택했는지 궁금해 할 수 있습니다. 한가지 이유는 k-겹 교차 검증을 간단하게 설명하기 쉽기 때문입니다. 더군다나 k=5 는 큰 k 값에 비해 연산 비용이 크지 않기 때문에 실제로 자주 사용되는 값입니다. k가 너무 작으면 추정값의 비관적 편향이 증가되고(모델 학습에 더 적은 훈련 데이터가 사용되기 때문에), 데이터를 어떻게 분할하느냐에 모델이 더 민감해지기 때문에 추정의 분산도 증가될 것입니다(나중에 k=10 이 좋은 선택임을 알려주는 연구에 대해 알아보겠습니다).

사실 두 개의 유명한, 그리고 특별한 k-겹 교차 검증의 사례가 있습니다. k=2 와 k=n 입니다. 대부분의 글에서는 2-겹 교차 검증을 홀드아웃 방법과 같은 것으로 이야기합니다. 하지만 이 말은 홀드아웃 방법이 훈련과 검증 세트를 바꾸어 2번 반복될 경우에만 맞습니다(예를 들어 정확히 50% 데이터를 훈련용으로 사용하고 50%를 검증용으로 사용하고, 이 두 세트를 바꾼 다음 훈련과 검증 과정을 반복합니다. 결국 검증 세트에 대한 두 성능 추정의 산술평균으로 성능 추정을 계산합니다). 홀드아웃 방법이 대부분 보편적으로 널리 사용되지만 저는 홀드아웃 방법과 2-겹 교차 검증을 아래 그림과 같이 다른 프로세스로 나타내는 것을 선호합니다:

이제 k=n 일 때, 즉 폴드의 수를 훈련 샘플의 수와가 같게 했을 때 k-겹 교차 검증 과정을 LOOCVLeave-One-Out cross-validation라고 합니다. LOOCV의 각 반복에서는 데이터셋에 있는 n-1 개의 샘플로 모델을 학습 시키고 남아 있는 하나의 데이터 포인트로 모델을 평가합니다. 이런 프로세스는 n 번 반복 해야 하기 때문에 계산 비용이 많이 들지만, 훈련 세트에서 데이터를 떼어내는 것이 너무 큰 손실이 되는 작은 데이터셋에는 유용합니다.

몇가지 연구에서 k-겹 교차 검증의 k 값이 바뀔 때 추정값의 편향과 분산에 어떻게 영향을 미치는지 분석하여 비교하였습니다. 아쉽게도 요슈아 벤지오Yohsua Bengio 와 이브 그랜드발렛Yves Grandvalet이 “No unbiased estimator of the variance of k-fold cross-validation”에서 공짜 점심은 없다는 것을 보여 주었습니다.

핵심 정리theorem는 k-겹 교차 검증의 분산을 (모든 분포에서 통용되는) 편향없이 추정하는 보편적인 방법은 없습니다. (Bengio and Grandvalet, 2004)

그러나 대부분의 경우에 우리는 분산과 편향 사이에 적절한 절충점으로 보이는 최선의 지점을 찾는 것에 관심이 있습니다. 다음 섹션에서 편향-분산 트레이드오프에 대해 논의를 이어나가겠습니다. 여기서는 호킨스Hawkins와 다른 사람들이 LOOCV와 홀드아웃 방법을 사용해 성능 추정을 비교하고 연산 비용이 타당하다면 후자보다 LOOCV를 추천한 흥미로운 연구를 살펴보는 것으로 마치겠습니다.

[…] 샘플 사이즈가 중간 정도 규모일 때 모델 테스트를 위해 데이터를 떼어놓는 것은 권장되지 않습니다. 샘플을 이렇게 쪼개는 것은 모델 학습에 좋지 않으며 신뢰할만한 평가를 만들지 못합니다. 학습 단계에서 모든 데이터를 사용하고 올바르게 수행되는 교차 검증으로 체크하는 것이 맞습니다. […] 교차 검증보다 홀드아웃 샘플에 의존하는 유일한 경우는 교차 검증이 신뢰하지 못하다고 생각되는 이유가 있을 때-편향되어 있거나 변동이 클 때-입니다. 하지만 이론적인 결과나 경험적인 결과에서도 교차 검증 결과를 믿을 수 없다는 이유를 찾지 못했습니다. (Hawkins and others, 2003)

이 결론은 연구에서 469개의 샘플 데이터셋을 사용해 수행한 실험을 근거로 하고 있습니다. 다음 테이블은 각기 다른 릿지Ridge 회귀모델 비교해서 얻은 것을 요약한 것입니다.

실험 평균 표준편차 true R2—q2 0.010 0.149 true R2—hold 50 0.028 0.184 true R2—hold 20 0.055 0.305 true R2—hold 10 0.123 0.504

첫 번째와 네 번째까지 행에서 호킨스는 여러가지 모델 평가 방법을 비교하려고 백 개 샘플의 훈련 세트를 사용했습니다. 첫 번째 행은 연구자들이 LOOCV를 사용해서 회귀 모델을 100개 샘플의 훈련 서브세트로 학습시킨 실험의 결과입니다. 평균이 나타내는 것은 다른 100개 샘플의 훈련 세트로 이 과정을 반복한 후에 실제 결정 계수coefficiant of determination와 LOOCV를 통해서 얻은 결정 계수(여기서는 라고 합니다) 사이의 평균 차이를 말합니다. 두 번째와 네 번째까지 행에서 연구자들은 홀드아웃 방법을 사용해 모델을 100개 샘플의 훈련 세트로 학습시키고 10개, 20개, 50개 샘플의 홀드아웃 세트로 성능을 평가 했습니다. 각 실험은 75번 반복되었고 평균 컬럼은 추정된 과 실제 간의 평균적인 차이를 나타냅니다. 여기서 볼 수 있듯이, LOOCV( )를 통해 얻은 추정이 실제 과 가깝습니다. 50개 테스트 샘플의 홀드아웃 방법에서 얻은 추정은 그런대로 쓸만합니다. 이 실험의 결과가 연구자들의 결론을 뒷받침합니다:

이 데이터 포인트의 3분의 1을 취하면 150개 정도의 데이터셋을 얻을 수 있습니다. 이를 랜덤하게 학습용으로 100개, 테스트용으로 50개 조금 넘게 분할할 수 있습니다. 그러나 이런 방법을 왜 써야 하는지 모르겠습니다.

홀드아웃 방법이 선호되는 한가지 이유는 데이터 셋이 충분히 클 경우 계산의 효율성 때문일 것입니다. 경험적으로 봤을 때 큰 용량의 데이터셋에서는 비관적 편향과 큰 분산을 걱정하지 않아도 됩니다. 더군다나 더 안정적인 추정을 얻으려고 랜덤 시드seed를 달리해서 k-겹 교차 검증 과정을 반복하는 것은 일반적이지 않습니다. 예를 들면 우리가 5-겹 교차 검증을 100번 반복한다면 500번 테스트 폴더의 성능 추정을 계산하고 500개 폴드의 산술 평균을 교차 검증 성능으로 리포트하게 됩니다(실제 일반적으로 사용되지만 여기서는 테스트 폴드가 겹쳐집니다). 그러나 LOOCV는 항상 같은 분할을 만들기 때문에3, LOOCV 반복에는 이런 점이 없습니다.

K와 편향-분산 트레이드오프

이전 섹션에서 보았던 실험 결과를 바탕으로 작거나 중간 규모의 데이터셋에서 홀드아웃 방법을 통한 하나의 훈련/테스트 분할 보다 LOOCV 방식이 나을 것 같습니다. 더군다나 LOOCV 추정은 거의 편향되지 않았다고 생각할 수 있습니다. 거의 모든(예를 들어, n-1) 훈련 샘플이 모델 학습에 사용되기 때문에 LOOCV(k=n)의 비관적 편향은 k

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

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

[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

[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

반응형

[Hands-on Machine Learning] 하이퍼 파라미터 튜닝, 테스트세트로 모델 평가 – housing data

가능성 있는 모델들을 모두 추렸다고 가정한 후, 이제 이 모델들을 세부 튜닝하기 위한 방법을 몇 가지 살펴보자.

하이퍼 파라미터 튜닝

1. GridSearchCV (그리드 탐색)

가장 단순한 방법은 만족할 만한 하이퍼 파라미터 조합을 찾을 때까지 수동으로 하이퍼 파라미터를 조정하는 것이다. 이는 매우 지루한 작업이고 또 많은 경우의 수를 탐색하기에는 시간이 부족할 수도 있다. 따라서 이를 대신하기 위해 사이킷런에서는 GridSearchCV 클래스를 제공한다. 탐색하고자 하는 하이퍼 파라미터와 시도해볼 값을 지정한 후 가능한 모든 하이퍼 파라미터 조합에 대해 교차 검증을 진행하여 평가하게 된다.

서포트 벡터 머신 회귀(sklearn.svm.SVR)를 모델로 선택했다고 가정하자. kernel=”linear”일 때는 하이퍼 파라미터 “C”를 바꿔가면서, kernel=”rbf”일 때는 하이퍼 파라미터 “C”와 “gamma”를 바꿔가면서 최상의 SVR 모델을 찾아보자. 지금 이 커널과 하이퍼 파라미터가 무엇을 뜻하는지는 너무 신경 쓰지 말자.

from sklearn.svm import SVR from sklearn.model_selection import GridSearchCV param_grid = [ {‘kernel’: [‘linear’], ‘C’: [10., 30., 100., 300., 1000., 3000., 10000., 30000.0]}, {‘kernel’: [‘rbf’], ‘C’: [1.0, 3.0, 10., 30., 100., 300., 1000.0], ‘gamma’: [0.01, 0.03, 0.1, 0.3, 1.0, 3.0]}, ] svm_reg = SVR() # GridSearchCV(모델명, 하이퍼 파라미터 값(dict), cv=폴드 수, scoring=평가 방법, verbose=진행 상황 표시 grid_search = GridSearchCV(svm_reg, param_grid, cv=5, scoring=”neg_mean_squared_error”, verbose=2) grid_search.fit(housing_prepared, housing_label)

실제로 kernel = “linear”일 경우 가능한 하이퍼 파라미터 조합은 8개, kernel = “rbf”일 경우 가능한 하이퍼 파라미터 조합은 42개, 총 50개의 하이퍼 파라미터 조합을 5번의 교차검증으로, 즉 250번 평가한다는 뜻이다. 각각의 파라미터에 대한 세부적인 결과는 GridSearchCV객체인 grid_search의 cv_results_ 속성을 통해 확인해볼 수 있으며 best_params_를 통해 최적의 파라미터 조합을 찾을 수 있다.

grid_search.best_params_

negative_mse = grid_search.best_score_ rmse = np.sqrt(-negative_mse) rmse

2. RandomizedSearchCV (랜덤 탐색)

그리드 탐색 방법은 이전 예제에서처럼 비교적 적은 수의 조합을 탐구할 때 괜찮다. 하지만 하이퍼 파라미터 탐색 공간이 커지면 RandomizedSearchCV를 사용하는 편이 더 좋다. 그리드 탐색과 거의 같은 방식으로 가능한 모든 조합을 시도하지만 각 반복마다 하이퍼 파라미터에 임의의 수를 대신 대입하여 지정한 횟수만큼 평가를 한다. 이 방법을 사용하여 내가 원하는 횟수만큼 최적의 하이퍼 파라미터 값을 찾을 수 있고, 이 반복 횟수를 조절하는 것만으로도 하이퍼 파라미터 탐색에 투입할 컴퓨팅 자원을 제어할 수 있다.

앞서 사용한 서포트 백터 머신 회귀 모델에서 그리드 탐색 방법 대신 랜덤 탐색 방법으로 하이퍼 파라미터를 튜닝해보자.

from sklearn.model_selection import RandomizedSearchCV from scipy.stats import expon, reciprocal # 이때 ‘kernel’이 ‘linear’일 경우 gamma값은 무시된다. param_distribs = { ‘kernel’ : [‘linear’, ‘rbf’], ‘C’ : reciprocal(20, 200000), ‘gamma’ : expon(scale=1.0), } svm_reg = SVR() # RandomizedSearchCV(모델명, param_distributions=하이퍼 파라미터 조정 범위, # n_iter=”탐색 횟수”, cv=”폴드 수”, scoring”=평가방법”, # verbose=”진행 상황 표시”, random_state=”시드”) rnd_search = RandomizedSearchCV(svm_reg, param_distributions=param_distribs, n_iter=50, cv=5, scoring=”neg_mean_squared_error”, verbose=3, random_state=42) rnd_search.fit(housing_prepared, housing_label)

rnd_search.best_params_

negative_mse = rnd_search.best_score_ rmse = np.sqrt(-negative_mse) rmse

실제로 탐색 횟수 50번, 그리고 각각의 탐색마다 5번씩 교차검증으로 평가하므로 총 250번 반복하게 된다.

테스트 세트로 시스템 평가하기

final_model = rnd_search.best_estimators_ X_test = strat_test_set.drop(“median_house_value”, axis=1) y_test = strat_test_set[“median_house_value”].copy() X_test_prepared = full_pipeline.transform(X_test) final_predictions = final_model.predict(X_test_prepared) final_mse = mean_squared_error(y_test, final_predictions) final_rmse = np.sqrt(final_mse) final_rmse

앞서 그리드 탐색 방법과 랜덤 탐색 방법으로 하이퍼 파라미터를 튜닝하는 과정에서 랜덤 탐색의 결과가 더 좋게 나왔으므로 랜덤 탐색에서 가장 좋은 성과를 낸 estiamtor를 통해 최종 모델을 결정지었다. 앞서 계층적 샘플링을 통해 나눈 테스트 세트에서 모델에 들어갈 데이터와 데이터 레이블을 다시 나눈다. 그 후 훈련 데이터 세트를 전 처리하기 위해 만들었던 파이프라인을 통해 테스트 세트가 모델에 들어가기에 알맞도록 변환시켜준다. 그렇게 준비한 최종 테스트 데이터 세트를 모델에 넣어 “중앙 주택 가격”을 예측하고, 준비된 레이블을 통해 모델을 평가한다.

테스트 세트로 최종 모델 평가

이 추정값이 얼마나 정확한지 알아보고 싶다면 scipy.stats.t.interval()을 통해 일반화 오차의 95% 신뢰구간(confidence interval)을 계산할 수 있다.

from scipy import stats confidence = 0.95 squared_errors = (final_predictions – y_test) ** 2 np.sqrt(stats.t.interval(confidence, len(squared_errors) – 1, loc=squared_errors.mean(), scale=stats.sem(squared_errors)))

Scipy.stats : Statistical function

1. reciprocal 함수

사이파이 모듈에서 통계적 함수를 담당하고 있는 API로 다양한 통계함수가 들어있다. scipy의 가장 최신버전인 1.5.1버전에서는 reciprocal 함수를 찾을 순 없지만 loguniform에서 그 함수를 찾을 수 있었다. (reciprocal = loguniform) reciprocal 함수는 a와 b를 인자로 가져 아래의 표준화된 형태의 확률 밀도 함수를 생성한다.

reciprocal, loguniform의 표준 형태 (standardized form)

이 확률 분포 함수를 이동시키거나 스케일을 조정하려면 loc와 scale 파라미터를 조정해주면 된다. (보통은 loc=0, scale=1로 고정된다.) reciprocal의 다른 이름인 loguniform에서도 말해주 듯이, 이 확률 분포 함수를 로그화하였을 경우 주어진 범위 안에서 확률이 꽤 일정하게 나타난다. 아래에서 그 과정을 확인해 볼 수 있다.

reciprocal_distrib = reciprocal(20, 200000) samples = reciprocal_distrib.rvs(10000, random_state=42) plt.figure(figsize=(10, 4)) plt.subplot(121) plt.title(“Reciprocal distribution (scale=1.0)”) plt.hist(samples, bins=50) plt.subplot(122) plt.title(“Log of this distribution”) plt.hist(np.log(samples), bins=50) plt.show()

2. expon 함수

expon 함수 역시 그 이름에서 알 수 있듯이 exponential, 즉 지수 분포 함수를 생성한다. 특별히 받는 인자는 없으며 아래의 표준화된 형태의 확률 밀도 함수를 생성한다.

이 함수 역시 이동하거나 스케일을 조정하고 싶을 때는 각각 loc과 scale 파라미터를 조정해주면 된다. (보통은 loc=0, scale=1로 고정된다.)

expon_distrib = expon(scale=1.) samples = expon_distrib.rvs(10000, random_state=42) plt.figure(figsize=(10, 4)) plt.subplot(121) plt.title(“Exponential distribution (scale=1.0)”) plt.hist(samples, bins=50) plt.subplot(122) plt.title(“Log of this distribution”) plt.hist(np.log(samples), bins=50) plt.show()

여기서 중요한 것은 reciprocal 분포함수는 우리가 하이퍼 파라미터에 대한 감이 전혀 없을 때, 즉 하이퍼 파라미터 값의 스케일을 어떻게 지정해야 할지 모를때 주로 사용하고, expon 분포함수는 하이퍼 파라미터 값의 스케일을 어느정도 알고있을 때 사용하는 것이 모델을 학습하는데 도움이 된다.

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

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

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

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

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


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

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

Leave a Comment