참조
https://mambo-coding-note.tistory.com/284 - 개념참조
베이즈 정리 간단히
- 사전확률과 사후 확률사이의 관계를 나타내는정리
**사전확률/사후확률 : 어떤 일(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 종류>
- EI (Expected Improvement / MEI 라고도함 )는 Exploration 과 Exploitation 방법을 모두 일정 수준 포함하도록 설계된 것이고, 제일 많이 쓰는 Acquistion Function이다.
- MPI
- 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 |
=================================================
'<개념> > Deep learning' 카테고리의 다른 글
opencv로 동영상 자르기+ YOLO 적용 (0) | 2021.06.25 |
---|---|
[Hierarchical Clustering] 계층적 클러스터링 개념정리 (0) | 2021.05.09 |
Coursera Andrew NG - 1 (0) | 2021.02.23 |
Tensorflow function (0) | 2021.02.15 |
차원축소 개념 총정리 (0) | 2021.01.15 |
Uploaded by Notion2Tistory v1.1.0