Optuna를 사용하여 함수 최적화를 시도합니다.

소개



Optuna는 하이퍼파라미터의 자동 최적화 프레임워크입니다. 주로 기계 학습의 하이퍼 파라미터 튜닝에 사용되는 것 같습니다.
공식 홈페이지

준비



먼저 라이브러리를 설치합시다.
pip install optuna로 설치할 수 있습니다.

실험



이번에는
x^2+y^2+z^2

최소화 문제를 최적화합시다.

목적 함수 정의



소개 목적 함수를 정의합니다.
# 目的関数を設定(今回はx^2+y^2+z^2)
def objective(trial):
    # 最適化するパラメータを設定
    param = {
        'x': trial.suggest_int('x', -100, 100),
        'y': trial.suggest_int('y', -100, 100),
        'z': trial.suggest_int('z', -100, 100)
    }
    # 評価値を返す(デフォルトで最小化するようになっている)
    return param['x'] ** 2 + param['y'] ** 2 + param['z'] ** 2

최적화 실행



시작하기 study 객체를 생성한 후 최적화를 실행합니다.
optimze()의 인수인 n_trials에서 검색 횟수를 설정할 수 있습니다.
# studyオブジェクト生成
study = optuna.create_study()
# 最適化実行
study.optimize(objective, n_trials=500)

실행하면 다음과 같은 표시가 됩니다. (일부 발췌)
[I 2019-12-01 23:01:21,564] Finished trial#381 resulted in value: 121.0. Current best value is 4.0 with parameters: {'x': 0, 'y': 0, 'z': 2}.
[I 2019-12-01 23:01:21,705] Finished trial#382 resulted in value: 56.0. Current best value is 4.0 with parameters: {'x': 0, 'y': 0, 'z': 2}.
[I 2019-12-01 23:01:21,866] Finished trial#383 resulted in value: 88.0. Current best value is 4.0 with parameters: {'x': 0, 'y': 0, 'z': 2}.
[I 2019-12-01 23:01:22,012] Finished trial#384 resulted in value: 104.0. Current best value is 4.0 with parameters: {'x': 0, 'y': 0, 'z': 2}.
[I 2019-12-01 23:01:22,170] Finished trial#385 resulted in value: 426.0. Current best value is 4.0 with parameters: {'x': 0, 'y': 0, 'z': 2}.
[I 2019-12-01 23:01:22,361] Finished trial#386 resulted in value: 5249.0. Current best value is 4.0 with parameters: {'x': 0, 'y': 0, 'z': 2}.
[I 2019-12-01 23:01:22,523] Finished trial#387 resulted in value: 165.0. Current best value is 4.0 with parameters: {'x': 0, 'y': 0, 'z': 2}.
[I 2019-12-01 23:01:22,684] Finished trial#388 resulted in value: 84.0. Current best value is 4.0 with parameters: {'x': 0, 'y': 0, 'z': 2}.

최적화된 매개변수를 확인하려면 다음을 추가합니다.
print(study.best_params)

최적화된 목적 함수 값을 확인하려면 다음을 추가합니다.
print(study.best_value)

또한 각 시도를 확인하려면 study.trials에서 정보를 검색합니다.
for i in study.trials:
    print(i.number, i.params, i.value)

코드



이번에 사용한 코드를 넣으십시오.
# -*- coding: utf-8 -*-
import optuna
import matplotlib.pyplot as plt

# 目的関数を設定(今回はx^2+y^2+z^2)
def objective(trial):
    # 最適化するパラメータを設定
    param = {
        'x': trial.suggest_int('x', -100, 100),
        'y': trial.suggest_int('y', -100, 100),
        'z': trial.suggest_int('z', -100, 100)
    }
    # 評価値を返す(デフォルトで最小化するようになっている)
    return param['x'] ** 2 + param['y'] ** 2 + param['z'] ** 2

if __name__ == '__main__':
    # studyオブジェクト生成
    study = optuna.create_study()
    # 最適化実行
    study.optimize(objective, n_trials=500)

    epoches = []    # 試行回数格納用
    values = []    # best_value格納用
    best = 100000    # 適当に最大値を格納しておく
    # best更新を行う
    for i in study.trials:
        if best > i.value:
            best = i.value
        epoches.append(i.number+1)
        values.append(best)

    # グラフ設定等
    plt.plot(epoches, values, color="red")
    plt.title("optuna")
    plt.xlabel("trial")
    plt.ylabel("value")
    plt.show()

결과



이 실험 결과의 그림은 다음과 같습니다.
best_value의 값은 3.0이었기 때문에 진정한 최적해에는 도달하지 않았지만, 초기 단계에서 수렴해 오고 있는 것을 확인할 수 있었습니다.

좋은 웹페이지 즐겨찾기