Optuna 소개

Optuna는 머신러닝용 하이퍼파라미터 최적화 프레임워크이다.
하이퍼파라미터 최적화의 중요성은 아래 링크를 통해 확인하자.
[Machine Learning] Hyperparameter Tuning on PyTorch (하이퍼파라미터 튜닝) 개념과 방법
[Machine Learning] Hyperparameter Tuning on PyTorch (하이퍼파라미터 튜닝) 개념과 방법
Hyperparameter 머신 러닝에서 Hyperparameter는 모델이나 알고리즘을 제어하는 변수이다. 이러한 변수는 모델의 학습 과정을 제어하며, 모델의 성능에 큰 영향을 미친다. 예를 들어, neural network에서 하
dykm.tistory.com
Optuna는 주어진 모델 아키텍처 및 데이터 세트에 대해 최상의 하이퍼파라미터를 효율적으로 검색하는 방법을 제공한다.
Optuna을 사용할 때 좋은 점을 간단히 정리해보았다.
- Automation (자동화):
Optuna는 사용자가 직접 작업할 때 지루하고 시간이 많이 걸리는 작업인 하이퍼파라미터 튜닝을 자동화해준다.
사용자가 최적화할 하이퍼파라미터의 범위를 지정한 다음 최적화 알고리즘을 사용하여 최적의 하이퍼파라미터를 자동으로 찾아준다. - Efficiency (효율성):
Optuna는 하이퍼파라미터 공간을 효율적으로 찾고 최적의 하이퍼파라미터 값들로 수렴하도록 설계된 TPE(Tree-structured Parzen Estimator) 및 베이지안 최적화와 같은 최신 최적화 알고리즘을 사용한다. - Flexibility (유연성):
Optuna는 연속, 불연속 및 범주형 변수를 포함, 광범위한 하이퍼파라미터를 지원한다.
또한 조건부 하이퍼파라미터와 다중 타겟과 같은 복잡한 하이퍼파라미터 검색을 지원한다. - Integration (통합):
Optuna는 이 글에서 살펴볼 PyTorch뿐 아니라 TensorFlow, Keras 및 Scikit-Learn과 같은 다른 머신러닝 프레임워크와 쉽게 통합할 수 있다.
또한 하이퍼파라미터 검색 진행상황을 모니터링하기 위한 웹 기반 사용자 인터페이스를 제공한다.
전반적으로 Optuna를 사용하면 주어진 아키텍처 및 데이터 세트에 가장 적합한 하이퍼파라미터를 찾아주므로, 하이퍼파라미터 튜닝에 필요한 시간과 노력을 줄여 모델의 성능을 향상시킬 수 있다.
Optuna 설치하기
Optuna를 설치하는 단계는 다음과 같다.
- 시스템에 Python이 설치되어 있는지 확인한다.
- 터미널/명령 프롬프트를 열고 PyTorch가 설치된 가상환경을 실행한다.
- 가상환경에서
pip install optuna
을 쳐서 Optuna을 설치한다. - 터미널/명령 프롬프트에서
python -c "import optuna; print(optuna.__version__)"
을 실행하여 Optuna가 잘 설치되었는지 확인한다.
문제가 없다면 이제 Optuna을 사용할 준비가 된 것이다.
PyTorch 예제를 통해 알아보는 Optuna 사용법
일단 예제부터 보자. (사실 예제만 보면 어떻게 사용하는지 감이 잡힌다.)
import optuna
import torch
import torch.nn as nn
import torch.optim as optim
import torchvision.datasets as datasets
import torchvision.transforms as transforms
# Define the hyperparameters to optimize
def objective(trial):
# Define the range of hyperparameters to search over
learning_rate = trial.suggest_loguniform("learning_rate", 1e-5, 1e-1)
momentum = trial.suggest_uniform("momentum", 0.0, 1.0)
num_hidden = trial.suggest_int("num_hidden", 16, 128)
# Load the data
train_dataset = datasets.MNIST(root="./data", train=True, download=True,
transform=transforms.ToTensor())
test_dataset = datasets.MNIST(root="./data", train=False, download=True,
transform=transforms.ToTensor())
train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True)
test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False)
# Define the model
model = nn.Sequential(
nn.Flatten(),
nn.Linear(784, num_hidden),
nn.ReLU(),
nn.Linear(num_hidden, 10),
)
# Define the loss function and optimizer
criterion = nn.CrossEntropyLoss()
optimizer = optim.SGD(model.parameters(), lr=learning_rate, momentum=momentum)
# Train the model
for epoch in range(10):
for inputs, targets in train_loader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, targets)
loss.backward()
optimizer.step()
# Evaluate the model
with torch.no_grad():
total_loss = 0.0
total_correct = 0
total_samples = 0
for inputs, targets in test_loader:
outputs = model(inputs)
loss = criterion(outputs, targets)
total_loss += loss.item() * inputs.shape[0]
total_correct += (outputs.argmax(dim=1) == targets).sum().item()
total_samples += inputs.shape[0]
accuracy = total_correct / total_samples
return accuracy
# Run the optimization
study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=100)
# Print the best hyperparameters and accuracy
print("Best hyperparameters: ", study.best_params)
print("Best accuracy: ", study.best_value)
먼저 objective
함수는 최적화할 하이퍼파라미터를 제안하는 데 사용되는 trial
객체를 받도록 정의된다.
이 예제에서 최적화되는 하이퍼파라미터는 모델의 학습 속도 learning_rate
, 모멘텀 momentum
및 히든 레이어의 노드 수 num_hidden
이다.
그런 다음 이 함수는 MNIST 데이터 세트를 로드하고 주어진 하이퍼파라미터를 사용하여 신경망 모델을 정의한다.
이 모델은 10 에포크 동안 SGD를 사용하여 훈련되고 테스트 세트에서 accuracy
를 출력한다.
그 다음 optuna.create_study()
을 사용하여 study
객체를 만들고 direction
매개변수를 "maximize"
로 설정하여 함수의 출력인 accuracy
을 최대화할 것을 나타낸다.
그런 다음 study
객체는 objective
함수를 사용하여 최적화 프로세스를 실행한다.
마지막으로 study.best_params
및 study.best_value
를 프린트하여 최적값의 하이퍼파라미터와 그 때의 accuracy
을 출력한다.
참고로 위 코드의 출력은 아래와 같다.
Best hyperparameters: {'learning_rate': 0.05884490117520429, 'momentum': 0.8019661172453942, 'num_hidden': 121}
Best accuracy: 0.9801
텔레그램으로 ChatGPT 봇 만드는 글을 작성한 이후로 어제까지 엄청 바쁜 일이 있어서 오늘이 되어서야 Optuna을 사용하는 코드를 만들고 이를 소개하는 글을 쓸 수 있었다.
아무튼 Optuna는 최적의 하이퍼파라미터 세트를 찾아 머신러닝 모델의 성능을 드라마틱하게 끌어올릴 수 있는 강력한 라이브러리이다.
일일이 하이퍼파라미터를 최적화하는 것은 너무 귀찮으니 Optuna를 적극 사용해보자.
다음 글에서는 Optuna를 돌린 결과를 시각화하는 방법을 살펴보자.
'머신 러닝 > Machine Learning' 카테고리의 다른 글
Optuna 소개

Optuna는 머신러닝용 하이퍼파라미터 최적화 프레임워크이다.
하이퍼파라미터 최적화의 중요성은 아래 링크를 통해 확인하자.
[Machine Learning] Hyperparameter Tuning on PyTorch (하이퍼파라미터 튜닝) 개념과 방법
[Machine Learning] Hyperparameter Tuning on PyTorch (하이퍼파라미터 튜닝) 개념과 방법
Hyperparameter 머신 러닝에서 Hyperparameter는 모델이나 알고리즘을 제어하는 변수이다. 이러한 변수는 모델의 학습 과정을 제어하며, 모델의 성능에 큰 영향을 미친다. 예를 들어, neural network에서 하
dykm.tistory.com
Optuna는 주어진 모델 아키텍처 및 데이터 세트에 대해 최상의 하이퍼파라미터를 효율적으로 검색하는 방법을 제공한다.
Optuna을 사용할 때 좋은 점을 간단히 정리해보았다.
- Automation (자동화):
Optuna는 사용자가 직접 작업할 때 지루하고 시간이 많이 걸리는 작업인 하이퍼파라미터 튜닝을 자동화해준다.
사용자가 최적화할 하이퍼파라미터의 범위를 지정한 다음 최적화 알고리즘을 사용하여 최적의 하이퍼파라미터를 자동으로 찾아준다. - Efficiency (효율성):
Optuna는 하이퍼파라미터 공간을 효율적으로 찾고 최적의 하이퍼파라미터 값들로 수렴하도록 설계된 TPE(Tree-structured Parzen Estimator) 및 베이지안 최적화와 같은 최신 최적화 알고리즘을 사용한다. - Flexibility (유연성):
Optuna는 연속, 불연속 및 범주형 변수를 포함, 광범위한 하이퍼파라미터를 지원한다.
또한 조건부 하이퍼파라미터와 다중 타겟과 같은 복잡한 하이퍼파라미터 검색을 지원한다. - Integration (통합):
Optuna는 이 글에서 살펴볼 PyTorch뿐 아니라 TensorFlow, Keras 및 Scikit-Learn과 같은 다른 머신러닝 프레임워크와 쉽게 통합할 수 있다.
또한 하이퍼파라미터 검색 진행상황을 모니터링하기 위한 웹 기반 사용자 인터페이스를 제공한다.
전반적으로 Optuna를 사용하면 주어진 아키텍처 및 데이터 세트에 가장 적합한 하이퍼파라미터를 찾아주므로, 하이퍼파라미터 튜닝에 필요한 시간과 노력을 줄여 모델의 성능을 향상시킬 수 있다.
Optuna 설치하기
Optuna를 설치하는 단계는 다음과 같다.
- 시스템에 Python이 설치되어 있는지 확인한다.
- 터미널/명령 프롬프트를 열고 PyTorch가 설치된 가상환경을 실행한다.
- 가상환경에서
pip install optuna
을 쳐서 Optuna을 설치한다. - 터미널/명령 프롬프트에서
python -c "import optuna; print(optuna.__version__)"
을 실행하여 Optuna가 잘 설치되었는지 확인한다.
문제가 없다면 이제 Optuna을 사용할 준비가 된 것이다.
PyTorch 예제를 통해 알아보는 Optuna 사용법
일단 예제부터 보자. (사실 예제만 보면 어떻게 사용하는지 감이 잡힌다.)
import optuna import torch import torch.nn as nn import torch.optim as optim import torchvision.datasets as datasets import torchvision.transforms as transforms # Define the hyperparameters to optimize def objective(trial): # Define the range of hyperparameters to search over learning_rate = trial.suggest_loguniform("learning_rate", 1e-5, 1e-1) momentum = trial.suggest_uniform("momentum", 0.0, 1.0) num_hidden = trial.suggest_int("num_hidden", 16, 128) # Load the data train_dataset = datasets.MNIST(root="./data", train=True, download=True, transform=transforms.ToTensor()) test_dataset = datasets.MNIST(root="./data", train=False, download=True, transform=transforms.ToTensor()) train_loader = torch.utils.data.DataLoader(train_dataset, batch_size=64, shuffle=True) test_loader = torch.utils.data.DataLoader(test_dataset, batch_size=64, shuffle=False) # Define the model model = nn.Sequential( nn.Flatten(), nn.Linear(784, num_hidden), nn.ReLU(), nn.Linear(num_hidden, 10), ) # Define the loss function and optimizer criterion = nn.CrossEntropyLoss() optimizer = optim.SGD(model.parameters(), lr=learning_rate, momentum=momentum) # Train the model for epoch in range(10): for inputs, targets in train_loader: optimizer.zero_grad() outputs = model(inputs) loss = criterion(outputs, targets) loss.backward() optimizer.step() # Evaluate the model with torch.no_grad(): total_loss = 0.0 total_correct = 0 total_samples = 0 for inputs, targets in test_loader: outputs = model(inputs) loss = criterion(outputs, targets) total_loss += loss.item() * inputs.shape[0] total_correct += (outputs.argmax(dim=1) == targets).sum().item() total_samples += inputs.shape[0] accuracy = total_correct / total_samples return accuracy # Run the optimization study = optuna.create_study(direction="maximize") study.optimize(objective, n_trials=100) # Print the best hyperparameters and accuracy print("Best hyperparameters: ", study.best_params) print("Best accuracy: ", study.best_value)
먼저 objective
함수는 최적화할 하이퍼파라미터를 제안하는 데 사용되는 trial
객체를 받도록 정의된다.
이 예제에서 최적화되는 하이퍼파라미터는 모델의 학습 속도 learning_rate
, 모멘텀 momentum
및 히든 레이어의 노드 수 num_hidden
이다.
그런 다음 이 함수는 MNIST 데이터 세트를 로드하고 주어진 하이퍼파라미터를 사용하여 신경망 모델을 정의한다.
이 모델은 10 에포크 동안 SGD를 사용하여 훈련되고 테스트 세트에서 accuracy
를 출력한다.
그 다음 optuna.create_study()
을 사용하여 study
객체를 만들고 direction
매개변수를 "maximize"
로 설정하여 함수의 출력인 accuracy
을 최대화할 것을 나타낸다.
그런 다음 study
객체는 objective
함수를 사용하여 최적화 프로세스를 실행한다.
마지막으로 study.best_params
및 study.best_value
를 프린트하여 최적값의 하이퍼파라미터와 그 때의 accuracy
을 출력한다.
참고로 위 코드의 출력은 아래와 같다.
Best hyperparameters: {'learning_rate': 0.05884490117520429, 'momentum': 0.8019661172453942, 'num_hidden': 121} Best accuracy: 0.9801
텔레그램으로 ChatGPT 봇 만드는 글을 작성한 이후로 어제까지 엄청 바쁜 일이 있어서 오늘이 되어서야 Optuna을 사용하는 코드를 만들고 이를 소개하는 글을 쓸 수 있었다.
아무튼 Optuna는 최적의 하이퍼파라미터 세트를 찾아 머신러닝 모델의 성능을 드라마틱하게 끌어올릴 수 있는 강력한 라이브러리이다.
일일이 하이퍼파라미터를 최적화하는 것은 너무 귀찮으니 Optuna를 적극 사용해보자.
다음 글에서는 Optuna를 돌린 결과를 시각화하는 방법을 살펴보자.