참조

https://mambo-coding-note.tistory.com/284 - 개념참조

https://github.com/fmfn/BayesianOptimization - 코드참조

https://www.youtube.com/watch?v=sbbR-XRft9o&t=45s - 개념참조

베이즈 정리 간단히
  • 사전확률과 사후 확률사이의 관계를 나타내는정리

**사전확률/사후확률 : 어떤 일(evidence를 관측해서 갱신하하기 전/후의 내 주장에 관한 신뢰도

  • 새로운 정볼를 토대로 어떤 사건이 발생했다는 주장에 대해 신뢰도를 갱신해나가는 방법이다

**베이지안주의 관점 : 동전앞면이 나올확률은 50%, 100번동전을 던졌을때 앞면이 나왔다는 주장의 신뢰도가 50%라고 본다.

**빈도주의 관점 : 동전앞면이 나올확률은 50%, 100번동전을 던졌을때 50번은 앞면이 나온다고해석 (기존의 통계학)

  • 베이지안 관점의 통계에서는 사전확률과같은 경험에 기반한 선험적인,불확실성을 내포하는 수치를 기반을 하고 거기에 추가정보를 바탕으로 사전확률을 갱신한다.(귀납적 추론)

e.g.

질병 A의 발병률은 0.1%.이 질병이 실제로 있을 때 질병이 있다고 검진할 확률(민감도)은 99%, 질병이 없을 때 없다고 실제로 질병이 없다고 검진할 확률(특이도)는 98%라고 하자.

만약 어떤 사람이 질병에 걸렸다고 검진받았을 때, 이 사람이 정말로 질병에 걸렸을 확률은?

 

 

  • 한마디로 정의하면 : Random Search와 통계적인 기법 (Gaussian Distribution)을 기반으로 실제 data를 이용하여 surrogate model을 이용하여 실제 model을 찾지 않아도 Maximum value를 도출해낼 수 있다는것.

 

 

 

1. 지금까지 관측된 데이터 D = [(x1, f(x1)), (x2, f(x2)) … (xn, f(xn))]을 통해, Gaussian process prior로 function f(x)를 Estimation한다. (= surrogate model)

** Surrogate model(대체 모델, 근사수학모델)

이란 자동차 충돌 실험과 같이 제한된 계산 비용이 많이 드는 시뮬레이션을 기반으로 복잡한 시스템의 수많은 입출력 특성을 실제 모형과 유사하게 만드는 것

  • 여기서 f(x)는 함수이고, x는 하이퍼 파라미터이다!!!!!!!! (x가 여러개일수도 있음)

그러니까 앞에서 함수의 해당 하이퍼파라미터랑 , 탐색대상 함수를 쌍으로 만든다음, 이것을 대상으로 surrogaate model을 만들어서 평가를 순차적으로 업데이트하여 최적의 하이퍼파라미터조합을 탐색하는 과정

 


  • 관측치 수(코드에서 나오는데 n_iter로 몇번 반복할지 조정가능함) 가 증가함에 따라 사후 분포가 개선되고 알고리즘은 아래 그림에서 볼 수 있듯이 매개 변수 공간에서 탐색 할 가치가있는 영역과 그렇지 않은 영역이 더 확실해진다.(한마디로 위에 피피티 그림에서 회색부분 공간이 점점 줄어들고 대충 모양이 잡힌다는 뜻임)

(피피티 4개짜리 그래프 설명) 위 피피티에서 4개짜리 그림을 보면, 1번에서 모양이 살짝 바뀌었다. 두번째로는 제일 값이 높아보이는쪽으로 이동한다. 먼가 모양이 좀더 좁아졌다. 세번째로는 variance가 제일 높아보이는데로 이동했다. 이렇게 계속 반복반복하다보면 4번째 그림처럼 되고, 노란색 부분 즉 maximum값을 구할수있다.

→ 이렇게 Exploitation/Exploration 을 반복해주는 매커니즘이

acquisiton function

인것임 (용어는 뒤에....)

 

2. Function f(x)를 다음으로 관측할 지점 (xn+1, f(xn+1))으로 Acquisition Function(decision rule)으로 선택하여 이동한다.(제일 중요하다)

acquisition functio

n

은 surrogate model이 목적함수(우리가 찾고자하는 함수) 에 대해서 실제 데이터를 기반으로 다음번 조사할 x값을 확률적으로 계산해서 추천해주는 함수

**Exploitation 은 현재까지 조사된 값들의 근방으로 다시 조사를 하는 것이다. 착취를 말한다.

**Exploration 은 현재까지 조사된 값들의 근방으로 조사를 하지 않고, 불확실성이 제일 높은 구간을 조사한다. 탐험을 말한다.

<acquisition function 종류>

  1. EI (Expected Improvement / MEI 라고도함 )는 Exploration 과 Exploitation 방법을 모두 일정 수준 포함하도록 설계된 것이고, 제일 많이 쓰는 Acquistion Function이다.
  1. MPI
  1. UCB

!! acquisiton function 에 따라 성능이 달라진다 !!

 

<베이지안 옵티 코드!>

 

#!pip install Bayesian-Optimization
#https://github.com/fmfn/BayesianOptimization 참조

# underlying function!! , x,y를 하이퍼 파라미터 취급한다.
def black_box_function(x, y):
    return -x ** 2 - (y - 1) ** 2 + 1
from bayes_opt import BayesianOptimization
# Bounded region of parameter space
pbounds = {'x': (2, 4), 'y': (-3, 3)}   #하이퍼 파라미터 정해줌
optimizer = BayesianOptimization(  
    f=black_box_function, #앞에서 지정해준 black_box_funciton을 함수를 f에 넣어준다.
    pbounds=pbounds,  #하이퍼 파라미터 넣어준다.
    verbose=2, #verbose = 1 prints only when a maximum is observed, 0일땐 silent ,versbose=2 항상
    random_state=1,   #seed, 무작위성을 컨트롤 0이면,반복해도 똑같은값 출력함.
)
optimizer.maximize(
    init_points=2,  # init_points : 수행하려는 임의 탐색 단계 수. 무작위 탐사는 탐사 공간을 다양 화하여 도움을 줌.
    n_iter=3,  # n_iter :위에서 임의탐색한거 주위에서 찾아봄 (3.4, 3.5, 3.002, 2.7, 2.95 이렇게)
    acq='ei',  #aacquisition 선택 ( ei / poi / usb )  - 이것에 따라 성능이 갈리기도 한다.
)
# 임의 탐색2번 + 반복3번해서 총 5개 나오는것! 
>>
|   iter    |  target   |     x     |     y     |
-------------------------------------------------
|  1        | -7.135    |  2.834    |  1.322    |
|  2        | -7.78     |  2.0      | -1.186    |
|  3        | -7.11     |  2.218    | -0.7867   |
|  4        | -6.76     |  2.558    | -0.1028   |
|  5        | -17.39    |  4.0      | -0.5455   |
=================================================
print(optimizer.max)  # 가장 최대일때의 x,y값을 출력해준다.

>> 
{'target': -6.760373063273364, 'params': {'x': 2.558177239763734, 'y': -0.10277027219097953}}
for i, res in enumerate(optimizer.res):
    print("Iteration {}: \n\t{}".format(i, res))
    
>> 
Iteration 0: 
	{'target': -7.135455292718879, 'params': {'x': 2.8340440094051482, 'y': 1.3219469606529488}}
Iteration 1: 
	{'target': -7.779531005607566, 'params': {'x': 2.0002287496346898, 'y': -1.1860045642089614}}
Iteration 2: 
	{'target': -7.109925819441113, 'params': {'x': 2.2175526295255183, 'y': -0.7867249801593896}}
Iteration 3: 
	{'target': -6.760373063273364, 'params': {'x': 2.558177239763734, 'y': -0.10277027219097953}}
Iteration 4: 
	{'target': -17.38863150351646, 'params': {'x': 4.0, 'y': -0.5455198166042586}}
optimizer.set_bounds(new_bounds={"x": (-2, 3)})  #범위 수정해줌!!!!

optimizer.maximize(
    init_points=0,
    n_iter=5,
)   

>>
|   iter    |  target   |     x     |     y     |
-------------------------------------------------
|  6        | -1.769    | -1.57     |  1.552    |
|  7        | -1.362    | -1.438    |  1.542    |
|  8        | -1.447    | -1.395    |  1.708    |
|  9        | -0.6024   | -1.143    |  1.543    |
|  10       |  0.1307   | -0.8744   |  1.324    |
=================================================
optimizer.probe(  #probe는 탐색을 의미함
    params={"x": 0.5, "y": 0.7},
    lazy=True,  #기본으로 설정해놓는다.
)
#다음에 maximize를 호출할 때 평가함

optimizer.probe(
    params=[-0.3, 0.1],
    lazy=True,
)

# Will probe only the two points specified above
optimizer.maximize(init_points=0, n_iter=0)

>>
|   iter    |  target   |     x     |     y     |
-------------------------------------------------
|  13       |  0.1      | -0.3      |  0.1      |
|  14       |  0.1      | -0.3      |  0.1      |
=================================================

+ Recent posts