베이즈 최적화 시리즈 (5) - 리얼한 실험으로 사용하고 싶다 -

베이즈 최적화 시리즈 5번째.
이번에는 현실적인 실험에서 베이즈 최적화를 사용하는 방법을 소개합니다.

베이즈 최적화 시리즈(1)-베이즈 최적화의 가시화-
베이즈 최적화 시리즈 (2) - 앙상블 학습 (Voting) 최적화 -
베이즈 최적화 시리즈(3) -XGBoost의 하이퍼파라미터 탐색-
베이즈 최적화 시리즈(4)-게임의 공략-



현실적인 실험으로 베이즈 최적화



베이즈 최적화는 기계 학습의 파라미터 설정뿐만 아니라 화학 실험이나 물리 실험 등의 현실적인 실험에서도 위력을 발휘합니다.

이번에는 GPyOpt를 사용해, 리얼한 실험을 상정한 코드를 써 보았습니다.

실험 흐름



이번 상정하고 있는 실험의 흐름을 아래에 나타냅니다.
  • 예비 실험 데이터가 2개 있다. (예비 실험 데이터가없는 경우에도 대응할 수 있습니다.)
  • 예비 실험 데이터를 GPyOpt에 던져 첫 번째 실험 조건을 제시합니다.
  • ①제시된 조건으로 실험을 실시하고 실험 결과를 입력한다.
  • ② 실험 결과를 GPyOpt에 던져 다음 실험 조건을 제시한다.
  • ①과 ②를 반복하여 규정 횟수까지 실시하면 실험 종료.
  • 마지막으로 최적의 실험 조건을 제시한다.

  • 우선 코드를 복사해서 움직여 주시면 무엇을 하고 있는지 알 수 있을 것 같아요.

    문제 설정



    사실은, 피타고라 스위치적인 실험장치를 준비하고 싶었습니다만, 시간의 편리함에, 수치 계산으로 대체했습니다.

    다음 y의 최소값을 찾는 문제를 고려하십시오.
    y = x^2
    

    GPyOpt에서 x가 제시되므로 y를 계산 후 입력하는 것입니다.

    여러분이 실험할 때, 위의 식은 미지라고 생각하므로, x를 실험 조건, y를 실험 결과로 바꾸어 사용해 보세요.

    코드


    import GPy
    import GPyOpt
    import numpy as np
    
    #予備実験のデータ
    initial_x = np.array([-1, 0.5])
    initial_y = np.array([1, 0.25])
    
    initial_x = initial_x.reshape((-1,1))
    initial_y = initial_y.reshape((-1,1))
    
    #実験回数
    exp_num = 5
    
    try_ = 1
    
    def f(x):
        global try_
    
        print("Try : " , try_ , " / {0} , next x is ".format(exp_num) , x)
        score = float(input("Input y : "))
    
        try_ += 1
    
        return score
    
    bounds = [{'name': 'a', 'type': 'continuous', 'domain': (-2,2)}]#実験条件の範囲
    
    print("Bayesian Optimization")
    
    #予備実験のデータを持っていない場合はinitial_design_numdataの値を変更
    myBopt = GPyOpt.methods.BayesianOptimization(f=f,
                                                 domain=bounds,
                                                 X = initial_x,
                                                 Y = initial_y,
                                                 initial_design_numdata=0)
    myBopt.run_optimization(max_iter=exp_num)
    
    #最適なパラメータ
    print("Best x is ",myBopt.x_opt)
    

    베이즈 최적화 중에 전달할 변수는 여기 을 보면 알 수 있습니다.

    결과



    위의 코드를 실행하면 다음과 같은 결과가 됩니다.
    덧붙여 Input y의 부분은 내가 손 계산해, 입력하고 있습니다.
    Bayesian Optimization
    Try :  1  / 5 , next x is  [[0.60906033]]
    Input y : 0.36
    Try :  2  / 5 , next x is  [[0.21945366]]
    Input y : 0.0479
    Try :  3  / 5 , next x is  [[2.]]
    Input y : 4
    Try :  4  / 5 , next x is  [[-0.087055]]
    Input y : 0.0064
    Try :  5  / 5 , next x is  [[0.01745743]]
    Input y : 0.000289
    Best x is  [0.01745743]
    

    그래서 최적의 x는 "0.01745"로 요구되었습니다.
    해석적으로는 「0」이 최적치이므로, 거의 도달할 수 있었을까 생각합니다.

    일단 애니메이션으로 해 보았습니다.



    파란 점은 예비 실험의 데이터이며, 빨간 점은 베이즈 최적화로 실험한 것입니다.

    좋은 웹페이지 즐겨찾기