-
Notifications
You must be signed in to change notification settings - Fork 2
/
atom.xml
3225 lines (2593 loc) · 486 KB
/
atom.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
<title><![CDATA[README]]></title>
<link href="http://SanghyukChun.github.io/atom.xml" rel="self"/>
<link href="http://SanghyukChun.github.io/"/>
<updated>2019-06-22T12:09:02+09:00</updated>
<id>http://SanghyukChun.github.io/</id>
<author>
<name><![CDATA[Sanghyuk Chun]]></name>
</author>
<generator uri="http://octopress.org/">Octopress</generator>
<entry>
<title type="html"><![CDATA[Machine learning 스터디 (10) PAC Learning & Statistical Learning Theory]]></title>
<link href="http://SanghyukChun.github.io/66/"/>
<updated>2016-12-18T16:00:00+09:00</updated>
<id>http://SanghyukChun.github.io/66</id>
<content type="html"><![CDATA[<h3 id="section">들어가며</h3>
<p>어떤 머신러닝 모델이 있을 때 이 모델이 다른 모델에 비해 뛰어나다고 주장하려면 어떤 것들이 필요할까? 알고리즘은 수렴성이나 complexity 등으로 성능을 논하지만, 모델의 성능을 표현하기 위해서는 다른 무언가가 필요하다. 이번 글에서는 <a href="https://en.wikipedia.org/wiki/Probably_approximately_correct_learning">PAC (Probably Approximately Correct)</a> 라는 개념을 설명할 것이다. PAC는 이론적으로 모델의 성능을 측정하는 방법 중 하나로, 비록 practical하게 모델의 성능 측정에 쓰기는 힘들지만 개념적으로 왜 특정 모델이 더 좋은지, 언제 모델의 성능이 좋고 언제 나쁜지에 대해 설명하는 것은 가능하다. 이 글에서는 Computational learning theory 라는 분야를 언급하고, 그 다음 PAC의 기본 개념과 그 intuition을 설명할 것이다. 그리고 VC dimension을 소개하여 일반적인 infinite hypothesis space에서 PAC bound를 어떻게 다시 bound 시킬 수 있는지 등에 대해 설명할 것이다.</p>
<h3 id="motivation">Motivation</h3>
<p>다시 원래 질문으로 되돌아가서 모델이 ‘뛰어나다’ 라고 말하기 위해서는 어떤 요소들이 필요할지 생각해보자. 먼저 다른 모델에 비해 learning하는 데에 필요한 데이터의 수가 적어야할 것이고, learning한 이후에 inference를 했을 때 그 결과가 좋아야할 것이고, 마지막으로 learning이 가능한 상황이 많이 있어야한다. 예를 들어서 어떤 모델을 만들었는데, 이 모델이 너무 복잡해서 100번 learning시켰을 때 (overfitting등의 이슈로 인해) 오직 3번 정도만 제대로 learning이 된다고 하면 이 모델은 쓸모없는 모델일 것이다.
따라서 ‘좋은 모델’ 인지 여부를 판단하기 위해서는 다음과 같은 질문들에 대답을 해야한다.</p>
<ul>
<li>“Seccessful” learning을 할 확률</li>
<li>Learning에 필요한 training example의 개수</li>
<li>ML algorithm에 의해 구해진 approximated target function의 정확도</li>
</ul>
<p>이런 질문들에 답을 하기 위해 등장하게 된 분야가 바로 <a href="https://en.wikipedia.org/wiki/Computational_learning_theory">Computational learning theory</a>으로, machine learning algorithm의 분석을 위한 수학적이고 이론적인 분야라고 생각하면 될 것 같다. 오늘 다루게 될 PAC는 이 computational learning theory의 한 부분으로, 가장 간단한 이론 중 하나이지만, 그 만큼 이론적으로 시사하는 바가 많은 이론이기 때문에 많은 machine learning course에서 한 번은 언급하고 넘어가는 경우가 많다.</p>
<h3 id="revisit-machine-learning-in-function-approximation-view">Revisit: Machine Learning in function approximation view</h3>
<p><a href="http://SanghyukChun.github.io/57">맨 처음 글</a>에서 설명했던 Machine learning의 구성요소에 대해 다시 살펴보도록 하자. 이 글에서는 machine learning의 역할이 특정 데이터의 결과를 예측하는 function을 찾는 것이라고 가정할 것이며, 따라서 error는 함수 값이 정확하게 찾아진 데이터의 수와, 그렇지 않은 수에 의해 0에서 1사이의 값으로 정확하게 정의된다. 이때 Machine learning은 다음 요소들로 구성된다.</p>
<ul>
<li>Instance $X$: 모든 데이터의 공간이라 할 수 있다. 즉, 모든 픽셀이 0 또는 1인 28 by 28 흑백 이미지라고 한다면 $2^{784}$ 크기의 set이 될 것이다.</li>
<li>Target concept $c$: 혹은 우리에게 조금 더 익숙한 용어로 표현하면 ‘target function’이다. Instance space의 subset으로 정의가 되며, 주어진 데이터가 어떤 값을 가지는지 판단하는 함수라고 생각하면 된다. 예를 들어 MNIST classification 문제에서는 주어진 데이터 x가 [0-9] 사이의 데이터 중에서 어디에 속하는지 판단하는 함수가 될 것이다.</li>
<li>Hypothesis space $H$: 주어진 $c$와 최대한 비슷한 approximated function (hypothesis) $h$가 속하는 function space이다. 예를 들어 함수가 linear라 가정한다면 Hypothesis space는 모든 linear function의 function space가 된다.</li>
<li>Training Data $D$: 모든 instance space를 다 볼수는 없으니 그 중 일부의 데이터만이 training data로 주어진다.</li>
</ul>
<p>위의 4가지 요소가 주어졌을 때, Machine learning 모델은 전체 데이터셋 $x \in X$ 에 대해 가장 target concept $c(x)$와 비슷한 hypothesis $h(x)$를 찾아야한다. 하지만 실제로는 training sample $x \in D$ 만 관측할 수 있으므로, training error 관점에서 hypothesis를 찾아야한다. 여기에서 중요한 점은 전체 instance $X$의 subset인 training instance $D$에서 error가 minimize가 된 모델이, 전체 instance에 대해서도 역시 작은 error를 보일 것인지, 만약 그렇지 않다면 training error와 true error가 얼마나 차이날 것인가 하는 점이다. 이 둘의 관계는 아래와 같은 그림으로 이해할 수 있다.</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/66-1.png" width="400" /></p>
<p>위의 그림에서 $h$와 $c$가 정확히 겹쳐지지 않는 것을 볼 수 있다. 여기에서 ‘There is no free lunch’ 라는 머신러닝의 큰 교훈이 나온다. 만약 우리가 어떤 모델을 training data에서 관측하지 못한 데이터에 대해서도 더 generalize하고 싶다면 모델에 대한 더 많은 assumption이 필요하다는 의미이다. 이 assumption은 흔히 regularization으로 표현되기도 한다. Multi-layered perceptron 모델에서 dropout이나 batch normalization, l2-regularization 등과 같은 더 많은 assumption이 있어야 더 generalized된 모델을 얻을 수 있다는 것이다.</p>
<p>여기에서 한 가지 또 중요한 점이 있는데, 심지어 데이터에 noise가 전혀 없어서 우리가 항상 정확한 target value를 알 수 있다고 하더라도, true error와 train error의 차이는 언제나 발생할 수 있다는 것이다. 이해를 돕기 위하여 예를 들어보자. 만약 아래와 같은 데이터가 있어서, 박스 R의 안 쪽은 +, 바깥쪽은 -인 target value를 가진다고 가정해보자. 전체 도메인에서 우리는 uniformly sample된 데이터들의 target value만을 알고 있다고 가정하자. 이 상황에서, 우리가 이 경계 R이 box라는 것을 알고 있을뿐아니라, error가 전혀 없는 데이터를 가지고 있다고 하더라도, R과 “정확하게 같은” 경계를 얻는 것은 거의 불가능하다는 사실을 알 수 있다.</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/66-3.png" width="400" /></p>
<p>물론 엄청나게 많은 데이터가 있으면 “거의 같은” 경계를 얻을 수는 있겠지만, “정확하게 같은” 경계를 얻는 것은 역시 거의 불가능하다.
따라서 우리는 “정확한” 모델을 얻기위해 얼마나 많은 데이터가 필요한가? 라는 질문이 아니라 “이 정도의 아주 작은 error를 높은 확률로 달성하기 위해 어느 정도의 데이터가 필요할까?” 정도로 질문을 바꿔야한다.</p>
<h3 id="overfitting-revisited">Overfitting: revisited</h3>
<p>이제 true error와 train error를 정의해보자. 이 둘은 각각 전체 데이터셋 $X$와 traning data set $D$에서의 learning된 hypothesis $h$의 error로 정의된다. 수식으로 표현하면 다음과 같다.</p>
<script type="math/tex; mode=display"> \mbox{error}_{true}(h) := \mbox{Pr}_{x\in X} [c(x) \neq h(x)] </script>
<script type="math/tex; mode=display"> \mbox{error}_{train}(h) := \mbox{Pr}_{x\in D} [c(x) \neq h(x)] </script>
<p>당연한 얘기지만, 우리가 모든 데이터를 관측할 수 없기 때문에 정확한 true error를 측정하는 것은 불가능하다. 그러나 만약 우리가 test data를 모든 데이터셋에서 uniformly random하게 (i.i.d하게) 뽑는다면 test error는 true error의 unbiased estimator가 된다. 이 글에서는 반드시 test data가 i.i.d하게 뽑혔다고 가정하고 test error를 true error의 unbiased estimation으로 취급할 것이다. 즉, 앞으로 test error라고 언급하는 것들은 전부 true error와 같다고 생각해도 된다.</p>
<p>그러나 test error와는 달리, training error는 true error의 unbiased estimator가 아니다. 왜냐하면 error가 hypothesis $h$에 의해 결정이 되는데, $h$는 다음과 같이 training data $D$에 dependent하기 때문이다.</p>
<script type="math/tex; mode=display">h = \arg\min_h \mbox{error}_{train}(h)</script>
<p>위와 같이 train error를 minimize하는 것을 empirical risk minimization이라고 부르며, $h$는 항상 true error보다 training error가 더 좋을 것이라는 추측 역시 할 수 있다. 여기에서 우리는 overfitting이라는 것을 다음과 같이 정의할 수 있다.</p>
<p>Hypothesis $h \in H$는 다음과 같은 조건을 만족하는 $h^\prime \in H$가 존재할 때 train data에 overfitting 되었다고 정의한다.</p>
<script type="math/tex; mode=display">% <![CDATA[
\mbox{error}_{train}(h) < \mbox{error}_{train}(h^\prime) \mbox{ and } \mbox{error}_{true}(h) > \mbox{error}_{true}(h^\prime). %]]></script>
<p>여기에서 우리는 머신러닝의 또 한가지 큰 교훈인 “Occam’s razor”를 배울 수 있다.
먼저 아래 그림을 살펴보자. 이 그림은 decision tree의 size가 커지면 커질수록 (모델이 더 복잡해지면 복잡해질수록) training error는 감소하지만 true error는 오히려 증가한다는 것을 보여준다.</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/66-2.png" width="400" /></p>
<p>여기에서 우리는 model의 complexity가 커질수록 overfitting의 효과가 더 강력해진다는 것을 알 수 있으며, 이를 Occam’s razor라고 한다. 즉, 할 수 있으면 최대한 간단한 모델이 좋다는 것이다.
또 하나 흥미로운 점은, 만약 training data가 infinite하여 모든 data space를 포함할 경우 더 이상 overfitting 문제는 없을 것이라는 것이다. 그러나 실제로는 무한한 데이터를 전부 학습하는 것이 불가능하고 제한된 숫자의 데이터만을 사용해야하기 때문에 그런 일은 발생하지 않는다. 그 대신, 우리는 ‘얼마나 많은 데이터가 있어야 overfitting 이슈가 줄어들까?’ 라는 유의미한 질문을 할 수 있다.</p>
<h3 id="pac-learning-introduction">PAC Learning: Introduction</h3>
<p>PAC (Probably Approximately Correct) learning이란 수학적으로 머신러닝 모델을 분석하는 framework으로, “높은 확률로 (Probably)” 주어진 모델이 “작은 error를 가진다 (Approximatly Correct)”와 같은 식의 분석을 할 수 있다. 앞으로 진행하는 모든 설명과 증명에서 data에 noise가 없다고 가정하도록 하겠다. 앞에서도 보았듯, 데이터가 전혀 노이즈가 없다고 하더라도 정확하게 true error가 0이 되는 모델을 얻는 것은 거의 불가능하기 때문에 확률적으로, 그리고 error라는 관점에서 모델을 분석하게 되는 것이다.</p>
<p>PAC bound는 다음과 같은 4가지 요소들로 구성된다.</p>
<ul>
<li>Training data의 샘플 수 $m$</li>
<li>Train error와 true error의 gap $\varepsilon$, $\mbox{error}_{true}(h) \leq \mbox{error}_{train}(h) + \varepsilon$</li>
<li>Hypothesis space의 complexity $| H |$, 만약 model parameter가 infinite하다면 다른 표현이 필요하다</li>
<li>Confidence of the relation: at least $(1-\delta)$</li>
</ul>
<p>그리고 finite hypothesis space에 대해, PAC bound는 다음과 같이 주어진다.</p>
<script type="math/tex; mode=display"> Pr[ \mbox{error}_{true} (h) \leq \mbox{error}_{train}(h) + \varepsilon ] \leq \| H \| \exp(-2m\varepsilon^2). </script>
<p>수식에서 볼 수 있듯 PAC bound는 true error와 train error의 gap의 upper bound를 training data의 개수 $m$, model complexity $|H|$, 그리고 error와 그 confidence $\varepsilon$과 $\delta$에 대해 표현하는 bound이다. 이 bound에서부터 우리는 모델의 성능, 정확히 말하면 generalization과 overfitting에 대한 앞에서 살펴본 intuition을 다시 한 번 확인할 수 있다.
왜냐하면 true error와 train error의 gap $\varepsilon$이 generalization, 그리고 overfitting과 관련된 term이기 때문이다. Generalization은 그 정의 자체가 $\varepsilon$과 큰 차이가 없으니 넘어가고, 왜 overfitting과 관련된 term인지만 살펴보자. 앞에서 overfitting을 정의할 때, train error는 더 나쁘지만, true error는 더 좋은 대체 모델 $h^\prime$ 이 존재할 때 $h$가 train data에 overfit되었다 정의했는데, $\varepsilon$이 커지면 커질수록 그런 모델 $h^\prime$이 존재할 확률이 커지므로, $\varepsilon$은 overfitting과 관련된 term이 되는 것이다.
따라서 이로부터 우리는 다음과 같은 intuition들을 얻을 수 있다.</p>
<ul>
<li>Training data의 개수가 많으면 많을수록 ($m$이 클수록) 모델은 더 generalize되고, overfitting의 위험성도 작아진다.</li>
<li>Model complexity가 높을수록 ($|H|$가 클수록) 모델 generalization은 더 어려워지고, overfitting의 위험성 역시 커진다.</li>
<li>Model의 성능을 끌어올리려면 (true error를 줄이려면) train error를 줄이거나, training sample을 늘리거나, 모델 complexity를 줄여야한다.</li>
</ul>
<h3 id="pac-learning-with-finite-hypothesis-space-proof">PAC Learning with Finite Hypothesis Space: Proof</h3>
<p>이제 앞에서 살펴본 hypothesis space가 finite할 때 PAC bound를 증명해보자. 먼저 문제를 단순화하기 위해 $\mbox{error}_{train}(h) = 0$ 라고 가정하자. 이때 우리는 training error는 0이면서, true error는 $\varepsilon$ 보다 큰 hypothesis $h^\prime$가 존재할 확률이 다음과 같음을 보일 수 있다.</p>
<script type="math/tex; mode=display"> Pr(\exists h^\prime) \leq \|H\| \exp(\varepsilon m).</script>
<p>이 수식을 (A)라 하고 증명은 잠시 뒤로 넘기자. 이제 $|H| \exp(\varepsilon m) \leq \delta$를 만족하는 $\delta$를 하나 잡아보자. 이 간단한 수식에서부터 우리는 training sample의 개수와 true error의 upper bound를 $\varepsilon$, $|H|$, $\delta$, $m$에 대한 term으로 표현할 수 있다.</p>
<script type="math/tex; mode=display"> m \geq \frac{1}{\varepsilon} (\ln \|H\| + \ln(1/\delta)). </script>
<script type="math/tex; mode=display"> \mbox{error}_{true}(h) \leq \frac{1}{m} (\ln \|H\| + \ln(1/\delta)) \mbox{ with probability at least } \delta.</script>
<p>즉, 이 bound들을 통해서 모델이 복잡할수록, 그리고 error에 대한 upper bound가 작아질수록 더 많은 데이터가 필요하다는 사실을 알 수 있다.
만약 우리가 어떤 모델의 성능을 더 개선시키고 싶다고 했을 때 (true error를 더 줄이고 싶을 때), 위의 수식에서부터 training error를 줄이거나, training sample의 개수를 늘리거나, 더 간단한 모델을 고르는 등의 (Occam’s razer) action을 취해야한다는 것 역시 알 수 있다.</p>
<p>그러나 위의 intuition들은 전부 traininig error가 0일 때 얻은 값이기 때문에 training error가 0이 아닐 때에 대해서도 bound를 증명해야한다. 다행히 위에서 얻은 결과를 사용하면 traininig error가 0이 아닐 때도 <a href="https://en.wikipedia.org/wiki/Hoeffding's_inequality">Hoeffding bound</a>를 통해 다음과 같은 bound를 얻는 것이 가능하다. (증명은 생략한다.)</p>
<script type="math/tex; mode=display"> Pr[(\exists h \in H) ~\mbox{error}_{true}(h) > \mbox{error}_{train}(h) + \varepsilon] \leq \|H\| \exp(-2m\varepsilon^2). </script>
<p>그리고 위에서 얻은 두 개의 bound 역시 아래와 같이 새롭게 증명할 수 있다.</p>
<script type="math/tex; mode=display"> m \geq \frac{1}{2\varepsilon^2} (\ln \|H\| + \ln(1/\delta)). </script>
<script type="math/tex; mode=display">\mbox{error}_{true}(h) \leq \mbox{error}_{train}(h) + \sqrt{\frac{\ln \|H\| + \ln \frac{1}{\delta}}{m}}.</script>
<p>식의 모양은 살짝 바뀌었지만 근본적인 intuition은 그대로 유지된다.</p>
<h4 id="pac-learning-with-finite-hypothesis-space-proof-of-a">PAC Learning with Finite Hypothesis Space: Proof of (A)</h4>
<p>사실 앞 section에서 증명한 수식은 전부 다음 수식에서부터 시작한다. 이 section에서는 아래 수식을 증명해보겠다.</p>
<script type="math/tex; mode=display"> Pr(\exists h^\prime) \leq \|H\| \exp(\varepsilon m).</script>
<p>수식을 좀 더 간단하게 적기 위해 $\mbox{error}_{true}(h)$를 $err(h)$로 표현하도록 하자. 이제 Hypothesis $h^\prime$이 $err(h^\prime) > \varepsilon$라는 조건을 만족할 때, $h^\prime$이 ‘bad’하다고하고, bad hypothesis들의 set을 $B$라고 부르자. 모든 training sample에 대해 error가 0이고 ($h^\prime(x_i) = c(x_i) ~\forall x_i \in D$, $h^\prime$ is consistent with training samples), 모든 true sample들에 대해서는 $err(h^\prime) > \varepsilon$를 만족하는 hypothesis $h^\prime$이 존재한다고 가정해보자. 이때 $h^\prime$은 $B$에 속하는 element이고, 이런 hypothesis는 하나보다 더 많을 수 있기 때문에, 아래와 같은 수식을 유도할 수 있다.</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/66-4.png" width="600" /></p>
<p>이제 $B$는 $H$의 subset이므로 다음과 같은 수식을 유도할 수 있고, 증명이 끝이 난다.</p>
<script type="math/tex; mode=display"> Pr(err(h) > \varepsilon) \leq \|B\|(1-\varepsilon)^m \leq \|H\|(1-\varepsilon)^m \leq \|H\|\exp(-\varepsilon m). </script>
<h3 id="pac-leanring-with-infinite-hypothesis-space">PAC Leanring with Infinite Hypothesis Space</h3>
<p>위에서 열심히 증명하기는 했으나, 이 bound는 사실 practical하게는 아무런 쓸모가 없는 bound이다. 왜냐하면 $|H|$가 finite한 어떤 값을 가진다고 가정했기 때문인데, 만약 $f(x | a, b) = ax + b$ 라는 함수만 주어지더라고 a와 b이 real number라면 $H$가 infinite set이 되기 때문에 bound가 의미가 없어진다. 이 때문에 새롭게 도입되는 개념이 VC (Vapnik–Chervonenkis) dimension이라는 개념이다.</p>
<p>VC dimension $VC(H)$는 hypothesis space $H$에 대해 정의되며, classification algorithm의 capacity를 측정하기 위해 사용되는 방법이며, Instance space $X$에 대해 Hypothesis space H의 VC(H)는 $H$로 shatter할 수 있는 가장 큰 $X$의 finite subset 크기와 같다. 이때 shatter란 labeling에 상관없이 정확하게 classify하는 것을 의미한다. 이 개념은 실제 예시를 통해 이해하는 것이 제일 빠르므로 몇 가지 예시들을 들어보도록 하자.</p>
<p>먼저 linear model은 $d$-dimensional space에서 VC dimension이 d + 1 이다. 자고로 이런건 말보다 그림인 법이다.</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/66-5.png" width="400" />
<img class="center" src="http://SanghyukChun.github.io/images/post/66-6.png" width="400" /></p>
<p>(출처: <a href="http://www.cs.cmu.edu/~guestrin/Class/15781/slides/learningtheory-bns-annotated.pdf">http://www.cs.cmu.edu/~guestrin/Class/15781/slides/learningtheory-bns-annotated.pdf</a>)</p>
<p>또한 KNN에서 K가 1인, 즉 1-NN의 VC dimension은 무한대이다. 역시 그림으로 확인해보자. (같은 출처)</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/66-7.png" width="400" /></p>
<p>마지막으로 $k$개의 boolean variable을 가지는 decision tree는 총 $2^k$개의 leaf node를 사용해 모든 sample을 분류할 수 있으므로 VC dimension은 $2^k$이다.</p>
<p>이제 $|H|$를 VC(H)로 bound시켜보자. VC(H)의 값이 finite value $k$라고 가정해보자. 이는 곧 hypothesis H를 사용하여 k개의 example을 shatter할 수 있다는 의미이며, 이 경우 (binary class라고 했을 때) 총 $2^k$ 개의 labeling case가 존재한다. 여기에서 hypothesis space가 서로 다른 모든 $2^k$개의 case를 shatter할 수 있으므로 $|H| \geq 2^k$ 라는 것을 알 수 있다. 따라서 이 값에서부터 다음과 같은 매우 loose한 bound를 얻을 수 있다.</p>
<script type="math/tex; mode=display">VC(H) = k \leq \log_2 \|H\|.</script>
<p>실제로 이 bound는 매우 loose하기 때문에 이 값을 그대로 사용하지는 않지만, VC(H)와 $|H|$가 어떤 관계를 가진다는 사실에 주목하자. 자세한 증명은 생략하도록 하겠지만, VC dimension을 도입하면 기존에 얻었던 finite hypothesis space에 대해 구한 PAC bound를 다음과 같이 변형할 수 있다.</p>
<script type="math/tex; mode=display"> m \geq \frac{1}{\varepsilon} (4 \log_2 (2/\delta) + 8 VC(H) \log_2(13/\varepsilon)). </script>
<script type="math/tex; mode=display">% <![CDATA[
\mbox{error}_{true}(h) < \mbox{error}_{train}(h) + \sqrt{\frac{VC(H) (\ln \frac{2m}{VC(H)} + 1) + \ln \frac{4}{\delta} }{m}}. %]]></script>
<p>위 bound에서 얻을 수 있는 intuition은 여전히 유효하다. 아래 bound가 조금 바뀌었는데, 만약 $VC(H) < 2m$ 정도로 충분히 많은 traininig dataset 하에서는 VC dimension이 작을수록, 즉 모델이 더 단순할수록 overfitting의 degree가 작아지는 Occam’s razor가 여전히 유효하다는 사실을 알 수 있다.
여기에서 bound의 우항에 존재하는 다음 term을 structure error 혹은 risk라고 부르며, empirical error 대신 이 값을 바로 optimize하는 방식으로 이론적으로 더 나은 모델을 얻는 것이 가능하다. (<a href="https://en.wikipedia.org/wiki/Structural_risk_minimization">Structural risk minimization</a>이라고 부른다.)</p>
<script type="math/tex; mode=display"> \mbox{error}_{train}(h) + \sqrt{\frac{VC(H) (\ln \frac{2m}{VC(H)} + 1) + \ln \frac{4}{\delta} }{m}}. </script>
<p>문제는 앞에서 살펴본 것처럼 VC dimension을 실제로 구하는 것이 엄청나게 어렵다는 것이다. 그러나 이 minimization을 실제로 할 수만 있다면 매우 강력한 model을 학습할 수 있는데, 실제로 SVM이 이런 방식으로 학습이 되기 때문에 매우 매력적인 model이라고 할 수 있다. 좀 더 자세한건 <a href="http://www.svms.org/srm/">링크</a>를 들어가서 확인해보면 좋을 것 같다.</p>
<h3 id="section-1">정리</h3>
<p>이 글에서는 ‘좋은 모델’이란 무엇인지 논하고, 실제로 그것들에 대한 이론적 bound를 제공하는 PAC bound에 대해 설명하였다. PAC bound는 training error, true error (test error), training data의 개수, 모델의 complexity, confidence level로 표현되는 bound로, 우리가 막연하게 ‘그럴 것이다’ 라고 생각하는 intuition들을 수식적으로 해석할 수 있게 해준다. Finite hypothesis space에 대한 증명에서부터 시작하여 최종적으로는 VC dimension까지 포함된 infinite hypothesis space에서의 PAC bound도 설명하였다.
이것 자체로는 큰 쓸모가 없어보일지는 몰라도, 모델이 얼마나 강력한지 측정하기 위해서도, 그리고 더 강력한 모델을 만들기 위해서라도 PAC라는 개념은 한 번쯤은 살펴봐야할 개념이 아닌가싶다.
참고로 이 글에서는 PAC learnable이 무엇인지 다루지는 않았다. 중요한 개념이기는 하지만, intuition 위주로 설명한 글이라서 제외하였는데, 자세한건 <a href="https://en.wikipedia.org/wiki/Probably_approximately_correct_learning">위키</a>를 참고하면 좋을 것 같다.</p>
<h3 id="references">References</h3>
<ol class="reference">
<li>Kearns, Michael J., and Umesh Virkumar Vazirani. An introduction to computational learning theory. MIT press, 1994.</li>
<li><a href="https://en.wikipedia.org/wiki/Probably_approximately_correct_learning">https://en.wikipedia.org/wiki/Probably_approximately_correct_learning</a></li>
</ol>
<h3 id="section-2">변경 이력</h3>
<ul>
<li>2016년 12월 18일: 글 등록</li>
</ul>
<hr />
<h3 id="machine-learning---">Machine Learning 스터디의 다른 글들</h3>
<ul>
<li><a href="http://SanghyukChun.github.io/57">Machine Learning이란?</a></li>
<li><a href="http://SanghyukChun.github.io/58">Probability Theory</a></li>
<li><a href="http://SanghyukChun.github.io/59">Overfitting</a></li>
<li><a href="http://SanghyukChun.github.io/60">Algorithm</a></li>
<li><a href="http://SanghyukChun.github.io/61">Decision Theory</a></li>
<li><a href="http://SanghyukChun.github.io/62">Information Theory</a></li>
<li><a href="http://SanghyukChun.github.io/63">Convex Optimzation</a></li>
<li><a href="http://SanghyukChun.github.io/64">Classification Introduction (Decision Tree, Naïve Bayes, KNN)</a></li>
<li>Regression and Logistic Regression</li>
<li>PAC Learning & Statistical Learning Theory</li>
<li>Support Vector Machine</li>
<li>Ensemble Learning (Random Forest, Ada Boost)</li>
<li>Graphical Model</li>
<li><a href="http://SanghyukChun.github.io/69">Clustering (K-means, Gaussian Mixture Model)</a></li>
<li><a href="http://SanghyukChun.github.io/70">EM algorithm</a></li>
<li>Hidden Markov Model</li>
<li><a href="http://SanghyukChun.github.io/72">Dimensionality Reduction (LDA, PCA)</a></li>
<li><a href="http://SanghyukChun.github.io/73">Recommendation System (Matrix Completion)</a>
<ul>
<li><a href="http://SanghyukChun.github.io/95">Recommendation System with Implicit Feedback</a></li>
</ul>
</li>
<li><a href="http://SanghyukChun.github.io/74">Neural Network Introduction</a></li>
<li><a href="http://SanghyukChun.github.io/75">Deep Learning 1 - RBM, DNN, CNN</a></li>
<li><a href="http://SanghyukChun.github.io/76">Reinforcement Learning</a>
<ul>
<li><a href="http://SanghyukChun.github.io/96">Multi-armed Bandit</a></li>
</ul>
</li>
</ul>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Game Theory Study (1) Introduction and Overview]]></title>
<link href="http://SanghyukChun.github.io/101/"/>
<updated>2016-08-21T23:47:00+09:00</updated>
<id>http://SanghyukChun.github.io/101</id>
<content type="html"><![CDATA[<h3 id="section">들어가며</h3>
<p>최근 Coursera의 <a href="https://www.coursera.org/learn/game-theory-1">Game Theory</a> Course를 수강 중이다. 꽤 만족도가 높아서, <a href="https://www.coursera.org/learn/game-theory-2">Game Theory 2: Advanced Application</a> course까지 이어서 수강할 계획을 세우고 있다. 두 번째 course가 9월 12일부터 시작하기 때문에 첫 번째 course를 9월 첫주까지 끝낼 생각으로 수강 중이다. 아무래도 공부를 하고 나서 블로그에 정리 글을 올리지 않으면 공부를 끝마친 기분이 들지 않아서, 이번 course도 블로그에 계속 요약글을 올릴까한다.
Geoffrey Hinton 교수가 2012년 Coursera에서 강의 한 <a href="https://class.coursera.org/neuralnets-2012-001/lecture">Neural Networks for Machine Learning</a> 이후로 Coursera에 처음 들어가봤는데, 예전이랑 많이 바뀐 것 같다. 진짜 MOOC에 집중해서 ‘수강’이라는 개념을 좀 더 강화한듯. 예전에 조금 보다 말았던 Probabilistic Graphical Model이나 위에 링크한 Neural Network course도 전부 예전 자료에 access가 되지 않는다. 음.. 다시 듣고 싶었는데 또 enrollment하라고 해서 둘 다 일단 enroll해둔 상태. 이래저래 Coursera는 내 취향에 안맞는다.</p>
<p>다시 본문으로 돌아와서, 이 글은 Coursera의 <a href="https://www.coursera.org/learn/game-theory-1">Game Theory</a> course의 첫 주차 강의를 요약한 글이다.
대부분의 course의 첫 주가 그러하듯, 이 lecture 역시 Game Theory에 대한 introduction과 몇 가지 기본적인 definition에 대해 설명한다.</p>
<h3 id="what-is-game">What is “Game”?</h3>
<p>제목이 ‘Game Theory’ 인 만큼, game이 무엇인지부터 정의하고 넘어갈 필요가 있다. 우리가 게임이라고 부르는 것들에는 무엇이 포함될까?
먼저 대표적인 게임인 가위바위보를 생각해보자. 이 게임을 구성하기 위해서는 먼저 <strong>두 명의 player</strong>가 있으야 하며, 각 player들이 할 수 있는 <strong>action (가위, 바위, 보)</strong>가 있어야하며, 마지막으로 게임이 끝날 때 마다 정해지는 <strong>payoff (승/패)</strong>가 있어야한다.</p>
<p>Game을 나타내는 standard한 방법으로는 크게 두 가지가 있다. 하나는 Normal form (a.k.a. Matrix form, strategic form)이고, 또 하나는 Extensive form이다.
Normal form은 player들의 action에 따른 각각의 player들의 payoff를 표현한 방법으로, player가 두 명이라면 2차원 matrix로 표현이 가능하기 때문에 matrix form이라고도 부른다. Normal form은 player들이 지금 당장 action을 취했을 때 나타나는 payoff를 나타내는데, 예를 들어 체스같은 게임은 sequential한 movement를 포함하기 때문에 normal form으로 나타내기 쉽지 않다. (처음부터 게임이 끝날 때 까지 모든 가능한 경우의 수를 action으로 나타내면 가능할 수도 있지만 space가 너무 넓기 때문에 사실상 표현이 불가능하다.)
Extensive form은 그런 sequential한 movement를 포함하는 form으로, tree형태로 표현이 된다고 한다. 보다 자세한 얘기는 course의 뒷 부분에서 다룬다고 하니, 여기에서는 우선 넘어가자.</p>
<h3 id="definition-of-game-the-normal-form">Definition of Game: The Normal Form</h3>
<p>이제 game을 normal form을 정의해보자. Finite, n-person normal form game: <N, A, u>는 다음과 같이 정의된다.</p>
<ul>
<li>Players: $N = {1, \ldots, n}$ is a finite set of n, indexes by i</li>
<li>Action set for player i $A_i$
<ul>
<li>
<p>$a = (a_1, \ldots, a_n) \in A$, where $A = A_1 \times \ldots \times A_n$ 을 action profile이라 부른다.</p>
</li>
</ul>
</li>
<li>Utility function or Payoff function for player i: $u_i: A \to \mathbb R$
<ul>
<li>$u = (u_1, \ldots, u_n)$을 utility function의 profile이라 부른다.</li>
</ul>
</li>
</ul>
<p>이제 두 명이 진행하는 가위바위보를 normal form, 정확히는 matrix 형태로 적어보자.</p>
<ul>
<li>Player는 1과 2 두 명이 존재한다.</li>
<li>
<p>Row는 player 1의 action $a_1 \in A_1$에 대응하고, column은 player 2의 action $a_2 \in A_2$에 대응한다.</p>
</li>
<li>Matrix의 각각의 cell은 각 player들의 payoff value에 해당한다. (a, b)라고 표현되며, 여기에서 a는 1번의 payoff, b는 2번의 payoff이다.</li>
</ul>
<table class="table table-bordered">
<thead>
<tr>
<th> </th>
<th>Rock</th>
<th>Paper</th>
<th>Scissors</th>
</tr>
</thead>
<tbody>
<tr>
<td>Rock</td>
<td>0, 0</td>
<td>-1, 1</td>
<td>1, -1</td>
</tr>
<tr>
<td>Paper</td>
<td>1, -1</td>
<td>0, 0</td>
<td>-1, 1</td>
</tr>
<tr>
<td>Scissors</td>
<td>-1, 1</td>
<td>1, -1</td>
<td>0, 0</td>
</tr>
</tbody>
</table>
<p>비슷한 방식으로 훨씬 더 큰 게임도 기술할 수 있다.</p>
<h3 id="examples">Examples</h3>
<h4 id="matching-pennies">Matching Pennies</h4>
<p>두 player가 동전의 면을 고르는데, 한 명은 둘이 같은 선택을 해야, 한 명은 둘이 다른 선택을 해야 이기는 게임</p>
<table class="table table-bordered">
<thead>
<tr>
<th> </th>
<th>Head</th>
<th>Tails</th>
</tr>
</thead>
<tbody>
<tr>
<td>Head</td>
<td>1, -1</td>
<td>-1, 1</td>
</tr>
<tr>
<td>Tails</td>
<td>-1, 1</td>
<td>1, -1</td>
</tr>
</tbody>
</table>
<h4 id="rock-paper-scissors">Rock-Paper-Scissors</h4>
<p>우리가 아는 바로 그 가위바위보는 아래와 같이 쓸 수 있다. (위에서 이미 언급했었다)</p>
<table class="table table-bordered">
<thead>
<tr>
<th> </th>
<th>Rock</th>
<th>Paper</th>
<th>Scissors</th>
</tr>
</thead>
<tbody>
<tr>
<td>Rock</td>
<td>0, 0</td>
<td>-1, 1</td>
<td>1, -1</td>
</tr>
<tr>
<td>Paper</td>
<td>1, -1</td>
<td>0, 0</td>
<td>-1, 1</td>
</tr>
<tr>
<td>Scissors</td>
<td>-1, 1</td>
<td>1, -1</td>
<td>0, 0</td>
</tr>
</tbody>
</table>
<p>Matching Pennies와 Rock-Paper-Scissors는 서로 정확히 반대의 payoff를 가지는 게임인데, 이런 게임을 ‘games of pure competition’이라고 부른다.</p>
<h4 id="prisoners-dilemma">Prisoner’s Dilemma</h4>
<p>그 유명한 죄수의 딜레마<sup id="fnref:1"><a href="#fn:1" rel="footnote">1</a></sup>도 아래와 같이 표현할 수 있다.</p>
<table class="table table-bordered">
<thead>
<tr>
<th> </th>
<th>C</th>
<th>D</th>
</tr>
</thead>
<tbody>
<tr>
<td>C</td>
<td>a, a</td>
<td>b, c</td>
</tr>
<tr>
<td>D</td>
<td>c, b</td>
<td>d, d</td>
</tr>
</tbody>
</table>
<p>이때 c > a > d > b 라는 관계가 성립하면 ‘죄수의 딜레마’가 발생한다.</p>
<h4 id="battle-of-the-sexes">Battle of the Sexes</h4>
<p>어느 커플이 영화관에 영화를 보러갔는데, 남자와 여자가 선호하는 영화가 조금씩 달랐다고 가정해보자.
남자는 어벤져스를 (액션을) 더 좋아하고, 여자는 러브 엑츄얼리를 (로맨틱 코미디를) 더 좋아한다고 생각해보자. 하지만 둘 다 서로 떨어져서 영화를 보는건 원하지 않는다.
즉, 둘 다 같은 영화를 봐야지만 payoff가 발생하는데, 이렇게 둘 다 같은 interest를 가진 게임을 cooperation game이라고 한다.
그런데 지금처럼 각자 서로 조금씩 interest가 달라서 경쟁하는 경우에는 cooperation과 competition의 특징을 둘 다 가지게 된다.
Normal form으로는 아래와 같이 표현할 수 있다.</p>
<table class="table table-bordered">
<thead>
<tr>
<th> </th>
<th>B</th>
<th>F</th>
</tr>
</thead>
<tbody>
<tr>
<td>B</td>
<td>2, 1</td>
<td>0, 0</td>
</tr>
<tr>
<td>F</td>
<td>0, 0</td>
<td>1, 2</td>
</tr>
</tbody>
</table>
<h3 id="best-response-and-nash-equilibrium">Best Response and Nash Equilibrium</h3>
<p>이제 게임이 무엇인지 정의하였으니 Game Theory의 핵심이라 할 수 있는 Nash Equilibrium에 대해 알아보자.
Nash Equilibrium (NE)를 한 마디로 정의하자면, 게임에 참여하는 모든 agent들이 현재 선택한 action이 선택할 수 있는 모든 action들보다 더 좋거나 같은 상황이 유지되는 상황이다. 죄수의 딜레마를 예로 들어보자. 위의 게임에서 둘 다 (D, D)를 고르는 경우, 죄수 1은 협조하는 것이 협조하지 않는 것 보다 좋고, 죄수 2역시 마찬가지이므로 둘 다 협조하는 것이 NE에 해당한다. 이를 좀 더 정확한 formula로 정의해보자.</p>
<p>먼저 Best response $a_i^*$를 다음과 같이 정의하자</p>
<script type="math/tex; mode=display"> a_i^* \in \mbox{BR}(a_{-i}) ~\mbox{iff}~ \forall a_i \in A_i, u(a_i^*, a_{-i}) \geq u_i(a_i, a_{-i}), ~\mbox{where}~ a_{-i} = (a_1, \ldots, a_{i-1}, a_{i+1}, \ldots, a_n)</script>
<p>즉, best response란 나를 제외한 모든 player들이 어떻게 행동하는지 알고 있을 때 내가 선택할 수 있는 가장 optimal한 action이 best response(BR)이다. 이때 유의할 점은, BR은 하나만 존재하는 것이 아니라 동시에 여러 개 존재할 수도 있기 때문에 위의 정의에서 $a_i^*$가 set $\mbox{BR}(a_{-i})$에 포함되게 되는 것이다.</p>
<p>이제 BR을 정의했으니 NE를 정의할 차례이다. 앞에서 설명한대로 NE는 모든 agent들이 stable한 action을 가지는 상태를 말하며, 모든 player들이 optimal하다면 항상 BR을 고를 것이다. 즉, NE는 모든 player들이 BR을 선택했을 경우가 NE로 정의되게 된다. 보다 엄밀한 Nash Equilibrium의 정의는 다음과 같다.</p>
<script type="math/tex; mode=display">a = (a_1, \ldots, a_n) ~\mbox{is a "pure strategy" Nash Equilibrium iff}~ \forall i, a_i \in BR(a_{-i}).</script>
<p>이제 실제 예시들에서 (pure strategy) Nash Equilibrium을 찾아보자. 먼저 죄수의 딜레마는 앞에서 설명한 것 처럼, 어떤 상황에서도 둘 다 협조를 하는 것이 더 나은 선택이므로, 둘 다 협조하는 쪽이 NE가 된다. Battle of the Sexes에서는 남자가 액션영화를 골랐을 때, 여자가 로코를 고르면 payoff가 0이므로 반드시 액션을 고르게 된다. 반대로 남자가 로코를 골랐다면 여자는 반드시 로코를 고르게 된다. 남자에게도 같은 방식이 적용되므로, 이 게임의 NE는 둘 다 같은 영화를 고르는 두 점이 된다.</p>
<p>마지막으로 Matching Pennies를 살펴보자. 시작하기 전에 Pure strategy NE는 서로 상대가 고른 전략을 정확하게 알고 있다고 가정한다는 점에 유의하자.
만약 player 2가 head를 골랐다면 player 1은 head를 고르는 것이 optimal solution이다. (1은 서로 같은 면을 골라야, 2는 서로 다른 면을 골라야 이긴다) 그런데 이렇게 되면 player 2가 player 1이 head를 골랐다는 것을 알기 때문에 player 2는 tail을 고르는 것이 optimum이다. 다시 player 1은 tail을 고르게 되고, player 2는 head를 고르게 된다. 이제 player 1은 다시 head를 고르게 되는데, 이 결과는 우리가 가장 먼저 살펴봤던 결과와 같다. 즉, Matching Pennies는 cycle이 생기기 때문에 pure strategy Nash Equilibrium이 존재하지 않는다는 사실을 알 수 있다.</p>
<table class="table table-bordered">
<thead>
<tr>
<th> </th>
<th>Head</th>
<th>Tails</th>
</tr>
</thead>
<tbody>
<tr>
<td>Head</td>
<td>1, -1</td>
<td>-1, 1</td>
</tr>
<tr>
<td>Tails</td>
<td>-1, 1</td>
<td>1, -1</td>
</tr>
</tbody>
</table>
<h3 id="dominant-strategies">Dominant Strategies</h3>
<p>이제 Game Theory에서 중요한 개념 중 하나인 dominant strategy에 대해 살펴보자. Strategy를 아직 엄밀하게 정의한 상태는 아니기 때문에 단순히 ‘어떤 action을 고르는 행위’ 정도로 이해하자. (Reinforcement learning에서 나오는 policy와 동일한 개념이다.) 이때, (strictly/weakly) dominant라는 것은 다음과 같이 정의할 수 있다.</p>
<script type="math/tex; mode=display"> s_i ~\mbox{strictly dominates}~ s_i^\prime ~\mbox{if}~ \forall s_{-i} \in S_{-i}, u_i(s_i, s_{-i}) > u_i(s_i^\prime, s_{-i}). </script>
<script type="math/tex; mode=display"> s_i ~\mbox{weakly dominates}~ s_i^\prime ~\mbox{if}~ \forall s_{-i} \in S_{-i}, u_i(s_i, s_{-i}) \geq u_i(s_i^\prime, s_{-i}). </script>
<p>만약 어떤 strategy가 모든 다른 strategy에 대해 dominate하다면 우리는 그런 strategy를 dominant하다고 부른다.
정의에 따라 dominant strategy가 성립하는 경우, Nash equilibrium이 성립하며, 만약 strictly dominant한 strategy라면, Nash equilibrium은 그 점에서만 unique하다.</p>
<h3 id="pareto-optimality">Pareto Optimality</h3>
<p>마지막으로 Pareto optimality에 대해 다루면 week1은 끝이 난다.
지금까지 우리는 각각의 player의 입장에서 game과 strategy, equilibrium 등을 정의했다. 그런데 만약에 게임에 참여하는 player가 아니라 게임에 참여하지 않는 누군가의 관점에서 게임을 결정하게 된다면 어떻게 될까? 예를 들어 죄수의 딜레마에서 바깥에 있는 우리는 둘 모두가 협조하지 않는 것이 optimal이라는 것을 알고 있는데, 이런 것들을 게임에 반영할 수는 없을까?
즉, 게임을 참여하는 입장이 아닌 상태에서 ‘최종 outcome’이 게임 참여자들에게 어떤 결과를 주는지를 바탕으로 action을 결정하는 것이다. 그렇다면 이것을 어떻게 엄밀하게 정의할 수 있을까?</p>
<p>아이디어는 이렇다. 하나의 outcome $o$가 또 다른 outcome $o^\prime$ 보다 모든 다른 agent들에게 좋고, 만약 $o^\prime$을 $o$보다 strictly prefer하는 agent가 존재한다면, $o^\prime$을 고르는 것이 $o$를 고르는 것 보다 나을 것이라고 생각하는 것이다. 또한 이런 경우 우리는 ‘$o$ Pareto-dominates $o^\prime$’ 라고 정의한다. 이렇게 정의할 경우, Pareto-optimal은 다음과 같이 정의된다.</p>
<blockquote>
<p>An outcome $o^*$ is Pareto-optimal if there is no other outcome that Pareto-dominates it.</p>
</blockquote>
<p>물론 2주차에서 다루듯, Pareto optimal이 존재하는지 확인하는 문제는 NP-complete이기 때문에 풀기 매우 어려운 문제이긴 하지만, 이런 개념을 통해 조금 더 ‘공익적인’ 게임을 설계할 수도 있다.</p>
<h3 id="section-1">정리</h3>
<p>가장 간단한 개념을 다루는 첫 주차인 만큼, 전반적으로 ‘개념’들에 초점이 맞춰져 있다. 가장 기본적이라고 할 수 있는 ‘game’의 정의와 Nash Equilibrium,
dominat strategy와 Pareto optimality까지, 전체적으로 간단한 개념들을 훑어가는 주라고 생각하면 될 것 같다.</p>
<h3 id="references">References</h3>
<ol class="reference">
<li><a href="https://www.coursera.org/learn/game-theory-1">Coursera Game Theory Course</a></li>
</ol>
<h3 id="section-2">변경 이력</h3>
<ul>
<li>2016년 8월 21일: 글 등록</li>
</ul>
<hr />
<h3 id="game-theory-blogcategoriesgame-theory-study--"><a href="http://SanghyukChun.github.io/blog/categories/game-theory-study/">Game Theory 스터디</a>의 다른 글들</h3>
<h4 id="game-theoryhttpswwwcourseraorglearngame-theory-1"><a href="https://www.coursera.org/learn/game-theory-1">Game Theory</a></h4>
<ul>
<li><a href="http://SanghyukChun.github.io/101">Week 1: Introduction and Overview</a></li>
<li><a href="http://SanghyukChun.github.io/102">Week 2: Mixed-Strategy Nash Equilibrium</a></li>
<li>Week 3: Alternate Solution Concepts</li>
<li>Week 4: Extensive-Form Games</li>
<li>Week 5: Repeated Games</li>
<li>Week 6: Bayesian Games</li>
<li>Week 7: Coalitional Games</li>
</ul>
<h4 id="game-theory-2-advanced-applicationhttpswwwcourseraorglearngame-theory-2"><a href="https://www.coursera.org/learn/game-theory-2">Game Theory 2: Advanced Application</a></h4>
<ul>
<li>Week 1: Social Choice</li>
<li>Week 2: Mechanism Design</li>
<li>Week 3: Efficient Mechanisms</li>
<li>Week 4: Auctions</li>
</ul>
<div class="footnotes">
<ol>
<li id="fn:1">
<p>죄수의 딜레마란, 두 명의 죄수가 전부 협조하지 않으면 아주 가벼운 형을 (a) 살고, 둘 중 한 명만 협조할 경우 협조한 죄수는 가장 경미한 형을 (b) 살게 되고, 협조하지 않은 죄수는 엄청나게 무거운 형을 (c) 살게 되며, 마지막으로 둘 다 협조할 경우 둘 다 혐의가 인정되어 협조하지 않았을 때보다는 무겁고, 둘 중 한 명이 배신해서 얻는 형보다는 가벼운 형을 (d) 살게 된다. (c > a > d > b) 당연히 둘 다 협조하지 않는 것이 optimal solution이지만, 죄수 1의 입장에서는 죄수2가 협조 하지 않는다고 생각할 경우 협조하는 것이 유리하고, 반대로 죄수2가 협조할 것으로 되는 경우에도 협조하는 것이 유리하다. 따라서 죄수1는 죄수2가 어떤 선택을 하든지 협조하는 길을 선택하게 되고 죄수2역시 협조를 하게 된다. 따라서 둘 다 협조하지 않는 것이 optimal임에도 불구하고, 이 게임의 균형은 둘 다 협조하고 d만큼의 형을 사는 것으로 결론나게 된다. 더 자세한건 <a href="https://ko.wikipedia.org/wiki/죄수의_딜레마">위키 페이지</a> 참고.<a href="#fnref:1" rel="reference">↩</a></p>
</li>
</ol>
</div>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Practical Bayesian Optimization of Machine Learning Algorithms (NIPS 2012)]]></title>
<link href="http://SanghyukChun.github.io/99/"/>
<updated>2016-08-16T00:58:00+09:00</updated>
<id>http://SanghyukChun.github.io/99</id>
<content type="html"><![CDATA[<ul class="no-float" id="markdown-toc">
<li><a href="#section">들어가며</a></li>
<li><a href="#hyperparameter-tuning-as-optimization-problem">Hyperparameter Tuning as Optimization Problem</a></li>
<li><a href="#bayesian-optimization-for-black-box-function">Bayesian Optimization for “Black-box” function</a> <ul>
<li><a href="#stochastic-process">Stochastic Process</a></li>
<li><a href="#gaussian-process">Gaussian Process</a> <ul>
<li><a href="#gp-with-noisy-data">GP with Noisy data</a></li>
</ul>
</li>
<li><a href="#acquisition-function">Acquisition Function</a> <ul>
<li><a href="#probability-of-improvement">Probability of Improvement</a></li>
<li><a href="#expected-improvement">Expected Improvement</a></li>
<li><a href="#ucb">UCB</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#limitation-of-bayesian-optimization">Limitation of Bayesian Optimization</a></li>
<li><a href="#practical-bayesian-optimization">Practical Bayesian Optimization</a> <ul>
<li><a href="#expected-improvement-and-matern-52-kernel-function">Expected Improvement and Matern 5/2 Kernel function</a></li>
<li><a href="#integrated-acquisition-function-marginalize-hyperparameter">Integrated Acquisition Function (marginalize hyperparameter)</a></li>
<li><a href="#expected-improvement-per-second">Expected Improvement per second</a></li>
<li><a href="#monte-carlo-acquisition-for-parallelizing-bayesian-optimization">Monte Carlo Acquisition for Parallelizing Bayesian Optimization</a></li>
<li><a href="#conclusion">Conclusion</a></li>
</ul>
</li>
<li><a href="#references">References</a></li>
<li><a href="#section-1">변경 이력</a></li>
</ul>
<h3 id="section">들어가며</h3>
<p>Machine Learning 모델을 만들다보면 Hyperparameter 라는 녀석을 다뤄야 하는 일이 종종 발생한다.
예를 들면 Random forest의 forest 개수라거나, Neural network의 layer 개수, learning rate, momentum 값 등등..
문제는 이런 hyperparameter들을 어떻게 설정하느냐에 따라 그 결과가 크게 바뀌기 때문에 소위 말하는 ‘튜닝’에 시간을 매우 많이 쏟아야한다는 점이다.</p>
<p>이 논문은 hyperparameter tuning 문제를 Bayesian optimization을 사용해여 해결하는 방법을 제안한다.
Bayesian optimization은 알려지지 않은 “black-box” function을 optimization할 때 많이 사용되는 방법이다.
그러나 Bayesian optimization은 몇 가지 이유로 practical하게 쓰기 어려운데,
1) (kernel function, acquisition function 등) 모델을 어떤 것을 고르냐에 따라 성능이 크게 바뀐다,
2) Baysian optimization 자체도 hyperparameter가 있어서 이 hyperparameter들을 튜닝해야한다,
3) Sequential update를 해야하기 때문에 parallelization이 되지 않는다
등의 이슈가 있다.</p>
<p>이 논문은
1) empirical하게 좋은 성능을 보이는 적절한 kernel function과 acquisition function을 제안하고,
2) Baysian optimization의 hyperparameter를 (MCMC로 풀 수 있는) fully baysian approach를 통해 전체 optimization에서 한 번에 계산할 수 있는 방법을 제안할 뿐 아니라,
3) MCMC를 사용해 풀 수 있는 theoretically tractable parallelized Bayesian optimization을 제안한다.</p>
<p>사실 이 논문을 제대로 이해하기 위해서는 아래 개념들에 대해 이미 잘 알고 있어야한다.</p>
<ul>
<li>Stochastic process (Random process라고도 부른다)</li>
<li>Gaussian process (GP) & kernel function of GP</li>
<li>Bayesian optimization & acquisition function</li>
<li>Markov chain Monte Carlo (MCMC)</li>
</ul>
<p>마지막 MCMC는 이 글에서는 다루지 않기로 하고, 나머지들에 대해서는 차근차근 정리하면서 내용을 진행해보도록 하겠다.</p>
<h3 id="hyperparameter-tuning-as-optimization-problem">Hyperparameter Tuning as Optimization Problem</h3>
<p>보통 hyperparameter를 찾기 위해 사용되는 방법들로는 Grid search, Random search 등의 방법들이 있다.
Random forest 모델 하나를 예로 들어서 위 방법들에 대해 자세히 살펴보자.</p>
<p>Random forest에서 사용하는 hyperparameter는, tree의 개수 (n_estimators), split criteria (criterion), max depth (max_depth), leaf 당 최소 샘플 개수 (min_samples_leaf), … 등등이 있다. (자세한건 <a href="http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html">Scikit learn의 Random Forest 코드 참고</a>)</p>
<p>우리가 찾고 싶은 hyperparameter는,</p>
<div class="bogus-wrapper"><notextile><figure class="code"><div class="highlight"><table><tr> <td class="code"><pre><code class=""><span class="line">n_estimators = [10, 50, 100, 200]
</span><span class="line">criterion = ['gini', 'entropy']
</span><span class="line">max_depth = [None, 100, 10]
</span><span class="line">min_samples_leaf = [1, 5, 10, 20]</span></code></pre></td></tr></table></div></figure></notextile></div>
<p>의 조합 중에 하나라고 가정해보자.</p>
<p>먼저 Grid search는 모든 parameter의 경우의 수에 대해 cross-validation 결과가 가장 좋은 parameter를 고르는 방법이다.
즉, 위에 나열된 hyperparameter의 모든 가능한 경우의 수는 4 x 2 x 3 x 4 = 96개인데, 모든 96개의 parameter들에 대해서
training data를 80:20으로 나누어 (꼭 80:20일 필요는 없다) 80으로 train을 하고, 20으로 test을 했을 때, test 결과가 제일 좋은 parameter를 고르는 것이다.</p>
<p>이 방법은, 주어진 공간 내에서 가장 좋은 결과를 얻을 수 있다는 장점이 있지만, 시간이 정말 정말 오래걸린다는 단점이 존재한다.
또한, 예시에서도 볼 수 있었듯, parameter의 candidate을 늘릴 때 마다 그 만큼의 시간이 더 필요하기 때문에,
정해진 시간 안에 parameter를 찾기 위해서는 어쩔 수 없이 hyperparameter의 candidate을 더 늘리지 못하고, candidate set이 제한된다는 단점이 존재한다.</p>
<p>이런 단점을 피하기 위해 나온 방법이 바로 random search이다.
Random search는 모든 grid를 전부 search하는 대신, random하게 일부의 parameter들만 관측한 후, 그 중에서 가장 좋은 parameter를 고른다.
Bengio 연구팀이 2012년에 발표한 논문 <a href="http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf">2</a>에 따르면,
high dimensional hyperparameter optimization에서는, grid search를 하는 것 보다, random search를 했을 때 성능이 더 좋을 수 있다고 주장하고 있다.</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/99-1.png" width="600" /></p>
<p>서로 importance가 다른 두 개의 parameter가 있다고 가정해보자. Grid search는 중요하지 않은 parameter와 중요한 parameter를 동일하게 관측해야하기 때문에 정작 중요한 parameter를 다양하게 시도해볼 수 있는 기회가 적지만, random search는 grid로 제한되지 않기 때문에 확률적으로 중요한 parameter를 더 살펴볼 수 있는 기회를 더 받게 된다. 출처: <a href="http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf">[2]</a></p>
<p>Machine Learning에서 hyperparameter search가 어려운 이유 중 하나는, hyperparameter가 바뀔 때 마다 모델이 바뀌게 되므로 다시 모델을 새로 learning해야한다는 점이다.
만약 실험 하나하나가 시간이 엄청 오래걸린다면, full grid search를 시도하기는 어려울 것이다. 그렇기에 random search가 꽤 유용하게 사용될 수 있는 여지가 더 많고,
실제로 나도 hyperparameter를 튜닝해야겠다싶으면 random search를 사용한다. (<a href="http://scikit-learn.org/stable/modules/grid_search.html">Scikit learn에서도 관련 패키지를 제공한다.</a>)</p>
<p>Grid search와 random search의 좋은 점 중 하나는, 모든 trial들이 independent하므로 parallelization이 자연스럽게 이루어진다는 점이다.</p>
<h3 id="bayesian-optimization-for-black-box-function">Bayesian Optimization for “Black-box” function</h3>
<p>Bayesian optimization은 다음과 같은 아주 무난한 optimization을 푸는 방법론 중 하나이다.</p>
<script type="math/tex; mode=display"> x^* = \arg\min_{x \in X} f(x). </script>
<p>이때, $X$는 bounded domain이고, $f(x)$는 그 모양을 모르는, 즉 input을 넣었을 때 output이 무엇인지만 알 수 있는 black box function이라 가정하자.
Optimization에는 여러 form이 있지만, minimization을 다루는 것이 일반적이기 때문에 여기에서도 minimization 꼴을 사용하도록 하겠다.
Bayesian optimization은 $f(x)$가 expensive black-box function일 때, 즉 한 번 input을 넣어서 output을 확인하는 것 자체가 cost가 많이 드는 function일 때 많이 사용하는 optimization method이다.</p>
<p>Bayesian optimization은 다음과 같은 방식으로 작동한다.</p>
<ol>
<li>먼저 지금까지 관측된 데이터들 $D = [(x<em>1, f(x</em>1)), (x<em>2, f(x</em>2)), \ldots]$ 를 통해, 전체 function f(x)를 <strong>어떤 방식을 사용해 estimate한다.</strong></li>
<li>Function f(x)를 더 정밀하게 예측하기 위해 다음으로 관측할 지점 $(x<em>{n+1}, f(x</em>{n+1}))$ 을 <strong>어떤 decision rule을 통해 선택한다.</strong></li>
<li>새로 관측한 $(x<em>{n+1}, f(x</em>{n+1}))$ 을 $D$에 추가하고, 적절한 stopping criteria에 도달할 때 까지 다시 1로 돌아가 반복한다.</li>
</ol>
<p>1에서 언급한 estimation을 할 때에는 $f(x)$가 Gaussian process prior를 가진다고 가정한 다음, posterior를 계산하여 function을 estimate한다.
2에서는 acquisition function $a(x | D)$를 디자인해서 $\arg\max_x a(x | D)$ 를 계산해 다음 지점을 고른다.</p>
<p>간단한 예시를 통해서 이게 무슨 말인지 조금 더 자세히 살펴보자.</p>
<p>아래 그림에서 빨간색 점선은 우리가 찾으려고 하는 unknown black box function $f(x)$ 를 나타내고,
까만색 실선은 지금까지 관측한 데이터를 바탕으로 우리가 예측한 estimated function $\widehat f(x)$ 의 expectation을 의미한다.
까만선 주변에 있는 회색 영역은, function f(x)가 존재할 confidence bound이고 (쉽게 말해서 function의 variance이다),
밑에 있는 $EI(x)$는 위에서 언급한 acquisition function을 의미한다. (어떻게 구하는지는 아직 신경쓰지 말자)
출처: <a href="Practical Bayesian Optimization of Machine Learning Algorithms">[3]</a></p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/99-2.png" width="600" />
지금까지 관측한 데이터를 바탕으로, (acquisition function 값이 제일 큰) 파란색 점이 찍힌 부분을 관측하는 것이 가장 좋다는 것을 알 수 있다.</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/99-3.png" width="600" />
위에서 acquisition function 값이 제일 컸던 지점의 function 값을 관측하고 estimatation을 update한다. 함수의 uncertainty를 의미하는 회색 영역이 크게 감소했음을 알 수 있다. 그러나 여전히 좌측 부분과 우측 부분의 uncertainty가 꽤 큼을 알 수 있다. 다시 한 번 다음 관측할 point를 acquisition function을 통해 고른다.</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/99-4.png" width="600" />
계속 update를 진행한 결과, estimation과 실제 function이 거의 흡사해졌다. 이제 여태까지 관측한 지점 중 best point를 argmin f(x) 로 선택한다.</p>
<p>이것이 Bayesian optimization의 대략적인 procedure이다. 여기까지 설명한 내용은 완전히 새로운 것이 아니라, 오래 전에 이미 제안되었었고, 계속 쓰이던 방법이다.
이 내용을 완전히 이해하고 있어야 이 글에서 다루는 논문을 이해할 수 있다.
앞에서 Bayesian optimization을 위해서는 두 가지가 필요하다는 언급을 했었다. 하나는 function을 estimate하는 방법과, 또 하나는 다음 관측 지점을 고를 acquisition function이다.
이 두 가지 개념들이 대해 다음 두 subsection에서 조금 더 자세히 살펴보도록 하자.</p>
<h4 id="stochastic-process">Stochastic Process</h4>
<p>Stochastic process가 무엇인지 설명하기에 앞서, Random variable이란 무엇인지 알고 있어야한다.
특히 ‘Random variable은 함수이다’ 라는 개념을 이해하고 있어야하는데, 이 개념에 대해 살펴보도록 하자.</p>
<p>Random variable은 probability space에서 어떤 real value R로 가는 function으로 정의가 된다.
이때 이 real value R이 pdf나 cdf를 의미하는 것이 아니라, random variable의 값 그 자체가 된다.
Probability space란, 확률 값이 정의가 되는 공간이고, random variable이란 그 공간에서 실제 real value로 가는 function인 것이다.</p>
<p>주사위를 예로 들어보자. 먼저 주사위의 probability space는 <code>{1, 2, 3, 4, 5, 6}</code> 으로 정의가 되며,
각각의 값이 나올 확률은 동일하게 $Pr(X=1) = Pr(X=2) = \ldots = Pr(X=6) = 1/6$ 으로 정의가 된다.
여기에서 주사위의 random variable X는 다음과 같이 정의된다.</p>
<script type="math/tex; mode=display"> X= \begin{cases} 1 \mbox{ with probability } 1/6,\\ 2 \mbox{ with probability } 1/6,\\ 3 \mbox{ with probability } 1/6, \\ 4 \mbox{ with probability } 1/6, \\ 5 \mbox{ with probability } 1/6, \\ 6 \mbox{ with probability } 1/6\end{cases} </script>
<p>이 개념을 조금 더 확장시킨 것이 stochastic process이다.
Stochastic process는 어떤 ordered set T로 indexed된 random variable들의 collection으로 정의된다.</p>
<script type="math/tex; mode=display"> \{ X_t : t \in T \} </script>
<p>Ordered set T는 보통 시간이나 공간 등의 개념과 대응된다. Stochastic process라는 것 자체가, 시간에 따른 어떤 값의 변화를 추정하기 위해 도입된 개념이다보니,
(자그마치 아인슈타인이 브라운 운동 증명할 때 썼던 개념이라고 한다) 일반적으로는 이 ordered set은 시간으로 생각해도 충분하다.
앞서 설명한 random variable의 collection을 조금 더 간단하게 이야기하면, stochastic process는 probability space와 시간 T에 대한 function이라고 생각할 수 있다.
즉, 똑같은 probability space에서 한 지점을 sample했을 때, random varible은 값이 나오고 (주사위의 눈금이 나오고),
stochastic process는 t에 대한 함수가 (random variable $X_t$가) 나오게 된다. 그림으로 보면 아래와 같다.</p>
<div class="caption">
<img class="center" src="http://SanghyukChun.github.io/images/post/99-5.png" width="400" />
<p>Random variable $X$에서 값을 sample하면 real value R을 가지는 특정 값을 얻게 된다. 즉, X는 probability space에서 R로 가는 함수라고 할 수 있다.</p>
</div>
<div class="caption">
<img class="center" src="http://SanghyukChun.github.io/images/post/99-6.png" width="400" />
<p>Stochastic process $X_t$에서 값을 sample하면 시간 t에 대한 서로 다른 함수를 얻게 된다. 즉, $X_t$는 probability space에서 다른 function space로 가는 함수라고 할 수 있다.</p>
</div>
<p>Random process와 stochastic process에 대한 (그리고 뒤에서 설명할 Gaussian process 역시) 조금 더 자세한 내용은 reference에 추가한 블로그 글 <a href="http://enginius.tistory.com/489">[4]</a>을 참고하면 좋을 것 같다. (위 그림의 출처 역시 같은 블로그이다.)</p>
<h4 id="gaussian-process">Gaussian Process</h4>
<p>Gaussian process, 줄여서 GP는 continuous domain에 대해 정의되는 statistical distribution이다.
이때, input domain에 있는 모든 point들은 normal distribution random variable이 되며,
아무 finite한 GP sample들을 뽑더라도, 그 sample들은 multivariate normal distribution을 가지게 된다.</p>
<p>GP의 개념은 이 정도로만 설명을 마무리하고, formulation에 대해 살펴보자.
GP 하나를 정의하기 위해서는 mean function과 kernel function 두 가지 함수가 먼저 정의되어야 한다.</p>
<p>먼저 mean function $m(x)$는 이름에서도 쉽게 유추할 수 있듯 point x에서의 mean value를 나타내는 x에 대한 함수이다.
보통은 constant value m을 많이 선택하며, 그마저도 선택하지 않고 그냥 zero-mean을 고르는 경우도 많다고 한다.</p>
<p>Kernel function이 상당히 중요한데, kernel function은 주어진 GP sample들이 서로 어떤 relationship을 가지는지, 어떤 covariance matrix를 형성하게 되는지 정의하는 함수이다.
Kernel function $k(x, x^\prime)$은 점 두 개에 대해 정의가 되는데, 일반적으로 점 사이의 거리가 가까우면 relationship이 크고, 멀먼 작을 것이라는 가정을 하게 된다.
가장 간단한 kernel function인 squared-exponential kernel function은 다음과 같다. 이때, $x_d$는 $x$의 d 차원 value이고, $\alpha, \theta_d$는 hyperparameter이다.
($\theta_d$는 1부터 D까지 총 D개 존재한다.)</p>
<script type="math/tex; mode=display"> k_{sqe}(x, x^\prime) = \alpha \exp \left\{ -\frac{1}{2} \sum_{d=1}^D \left( \frac{x_d - x_d^\prime}{\theta_d} \right) \right\}. </script>
<p>Kernel function을 사용해 두 점 사이의 relation을 정의하고 나면, GP sample collection이 주어졌을 때, 해당 sample들의 covariance matrix를 다음과 같이 정의할 수 있다.
이 경우는 sample이 총 n개가 있고, $k_{ij} := k(x_i, x_j)$ 라고 정의하도록 하겠다.</p>
<script type="math/tex; mode=display">% <![CDATA[
K = \begin{pmatrix} k_{1,1} & k_{1,2} & \cdots & k_{1,n} \\ k_{2,1} & k_{2,2} & \cdots & k_{2,n} \\ \vdots & \vdots & \ddots & \vdots \\ k_{n,1} & k_{n,2} & \cdots & k_{n,n} \end{pmatrix}. %]]></script>
<p>Mean function $m(x)$와 kernel function $k(x, x^\prime)$이 정의가 되었으므로, 어떤 point x가 주어졌을 때, (앞에서 모든 GP의 sample은 normal ditribution r.v.라고 했음을 기억하자)
그 점의 mean과 variance를 계산할 수 있으므로, 이 둘만 정의가 된다면 아무 임의의 지점에 대해 Gaussian distribution r.v. 을 얻을 수 있다.</p>
<p>이 글에서는 function f(x)가 GP prior를 가진다고 가정했을 때, likelihood가 주어졌을 때 posterior가 어떻게 update되는지까지는 다루지 않을 것이다.
조금만 찾아보면 잘 정리된 내용들을 찾을 수 있을 것이다.</p>
<h5 id="gp-with-noisy-data">GP with Noisy data</h5>
<p>모든 함수가 항상 deterministic output을 가지지는 않는다. 오히려 거의 대부분의 real world function들은 관측할 때 마다 그 값이 바뀌게 된다.
이를 보통 우리는 noise라는 현상으로 설명하고는 한다. 조금 더 formal하게 적어보자.</p>
<p>다음과 같은 observation pair ${x_i, y_i}$ 가 있다고 가정해보자. 이 값은, input $x_i$와, 그 때 관측된 함수값 $y_i$의 pair로,
만약 noise가 없다면 $y_i = f(x_i)$ 라고 바로 쓸 수 있지만, 대부분의 경우는 noise가 있어서 그렇게 표현할 수 없다.
가장 많이 쓰이는 방법은 white Gaussian noise를 추가하는 방법이다. 따라서 이런 경우에 y는 다음과 같이 표현된다.</p>
<script type="math/tex; mode=display"> y_i \sim \mathcal N(f(x_i), \nu). </script>
<p>이때, $\nu$는 noise의 세기를 나타내는 hyperparameter가 된다.
이렇게 표현할 경우, noise가 없을 때와 있을 때 GP를 fit한 결과는 아래와 같은 차이가 나게 된다.</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/99-12.png" width="600" /></p>
<h4 id="acquisition-function">Acquisition Function</h4>
<p>Function f(x)가 GP prior를 가지는 Bayesian optimization을 진행 중이라고 가정해보자.
f(x)의 모든 point x에 대해, 우리는 mean과 variance를 계산할 수 있다 (위에 언급되었던 그림 중 까만 선과 회색 영역).
이때 다음으로 관측해야할 부분이 어디인지 어떻게 알 수 있을까?</p>
<p>한 가지 방법은 estimated mean의 값이 가장 작은 지점은 관측하여 현재까지 관측된 값들을 기준으로 가장 좋은 점을 찾아보는 것이다.
또 다른 방법은 variance의 값이 가장 큰 지점을 관측하여, 함수의 모양을 더 정교하게 탐색하는 방법이 있다.
즉, 다음에 어떤 점을 탐색하느냐를 결정하는 문제는 explore-exploit 문제가 된다. Explore는 high variance point를 관측하는 것, exploit은 low mean point를 관측하는 것이 되겠다.
Acquisition function이란 explore와 exploit을 적절하게 균형을 잡아주는 역할을 하며, 여러 종류가 있지만, 여기에서는 세 가지만 다루도록 하겠다
(Probability of Improvement, Expected Improvement, UCB).</p>
<p>이 섹션의 남은 부분에서, $f^\prime$ 이란, 지금까지 관측한 function 값 중에서 가장 minimum 값을 지칭하도록 하겠다.</p>
<h5 id="probability-of-improvement">Probability of Improvement</h5>
<p>Probability of improvement (PI)는, 특정 지점의 함수 값이 지금 best 함수 값인 f’ 보다 작을 확률을 사용한다.
즉, PI의 utility function은 다음과 같다.</p>
<script type="math/tex; mode=display">% <![CDATA[
u(x) = \begin{cases} 0 ~ & ~f(x) > f^\prime \\ 1 ~ & f(x) \leq f^\prime \end{cases}. %]]></script>
<p>Estimated function f(x)의 값은 정해진 값이 아니라 확률 값이기 때문에, PI는 x에서의 u(x)의 expectation으로 표현된다.</p>
<script type="math/tex; mode=display"> a_{PI} (x) = \mathbb E [u(x) \| x, D] = \int_{-\infty}^{f^\prime} \mathcal N (f; \mu(x), k(x,x))df = \Phi (f^\prime; \mu(x), k(x,x)). </script>
<p>이때 $\mathcal N(f;\mu(x), k(x,x))$는 mean function $\mu(x)$와 kernel function $k(x, x)$로 표현되는 normal distribution이고, $\Phi(\cdot)$은 cdf를 의미한다.
PI를 그림으로 나타내면 아래와 같다. 아래 그림에서 이미 explore가 많이 된 지점이 PI가 높은 것에 주목하라.
(밑에 나올 그림들의 출처는 모두 <a href="http://www.iro.umontreal.ca/~bengioy/cifar/NCAP2014-summerschool/slides/Ryan_adams_140814_bayesopt_ncap.pdf">[5]</a> 이다.)</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/99-7.png" width="500" /></p>
<h5 id="expected-improvement">Expected Improvement</h5>
<p>PI의 가장 큰 문제점 중 하나는, ‘improvement’ 될 수 있는 확률만 보기 때문에, 확률이 조금 더 낫을지라도, 궁극적으로는 더 큰 improvement가 가능한 point를 고를 수 없다는 점이다.
다시 말하면 exploit에 집중하느라 explore에 취약하다는 단점이 있다.
Expected improvement (EI)는 utility function을 0, 1이 아니라, linear 꼴로 정의하기 때문에 그 차이를 반영할 수 있다. (Step function과 ReLU의 차이라고 보면 된다)
EI의 utility function은 다음과 같다.</p>
<script type="math/tex; mode=display"> u(x) = \max(0, f^\prime - f(x)). </script>
<p>주의할 점은, EI가 PI의 expectation이 아니라는 점이다. 그냥 이름만 비슷한거고 완전히 다른 function이라고 생각하면 된다.
PI와 마찬가지로 EI역시 u(x)의 expectation을 계산해야 한다.</p>
<script type="math/tex; mode=display"> a_{EI} (x) = \mathbb E [u(x) \| x, D] = \int_{-\infty}^{f^\prime} \mathcal N (f; \mu(x), k(x,x))df = (f^\prime - \mu(x))\Phi(f^\prime;\mu(x),k(x,x)) + k(x,x) \mathcal N (f^\prime;\mu(x),k(x,x)). </script>
<p>EI를 그림으로 나타내면 다음과 같다. PI처럼 이미 explore가 많이 된 곳을 또 찾는 실수는 덜 저지른다는 것을 볼 수 있다.</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/99-8.png" width="500" /></p>
<h5 id="ucb">UCB</h5>
<p>UCB는 우리가 이미 잘 알고 있는 그 UCB이며, acquisition function은 다음과 같다.</p>
<script type="math/tex; mode=display"> a_{UCB}(x;\beta) = \mu(x) - \beta\sigma(x). </script>
<p>UCB의 문제점이라면, explore-exploit trade-off parameter인 $\beta$의 존재이다.
Form도 간단하고, 조절하기 쉽기도 하지만, hyperparameter를 또 조정해야한다는 문제 때문에 이 논문에서는 다루지 않는다.
UCB 역시 그림으로 나타내면 다음과 같다.</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/99-9.png" width="500" /></p>
<p>이 이외에도 Entropy search, Thompson sampling 등의 다양한 acquisition function이 있지만 이 글에서는 다루지 않도록 하겠다.</p>
<h3 id="limitation-of-bayesian-optimization">Limitation of Bayesian Optimization</h3>
<p>지금까지 Bayesian optimization (BO)에 대해 ‘간략히’ 알아봤다. 여기까지 글을 읽으면서 느꼈겠지만, Bayesian optimization은 굉장히 impractical하다.
여러가지 이유가 있는데, 크게는 다음과 같은 이유들이 있다.</p>
<ul>
<li>Hyperparameter search를 하기 위해 BO를 사용하는데, BO를 사용하기 위해서는 GP의 hyperparameter들을 튜닝해야한다 (kernel function의 parameter 등)</li>
<li>어떤 stochastic assumption을 하느냐에 따라 (어떤 kernel function을 사용해야할지 등) 결과가 천차만별로 바뀌는데, (model selection에 민감한데) 어떤 선택이 가장 좋은지에 대한 가이드가 전혀 없다.</li>
<li>Acquisition function을 사용해 다음 지점을 찾는 과정 자체가 sequential하기 때문에 grid search나 random search와는 다르게 parallelization이 불가능하다.</li>
<li>위에 대한 문제점들이 전부 해결된다고 하더라도 software implementation이 쉽지 않다.</li>
</ul>
<p>이런 문제점들을 해결하기 위해 이 논문은 (그렇다 이제서야 이 논문이 어떤 일을 했는지 얘기할 수 있게 되었다) 먼저 kernel function을 여러 실험적 결과 등을 통해
Matern 5/2 kernel이 가장 실험적으로 좋은 결과를 낸다는 결론을 내린다 (즉, kernel function은 언제나 Matern 5/2를 쓰면 된다). 또한 acquisition function도 EI로 고정한다.
다음으로 GP의 hyperparameter들을 Bayesian approach를 통해 acquisition function을 hyperparameter에 대해 marginalize한다.
이 marginalized acquisition function은 (integrated acquisition function이라고 한다) MCMC로 풀 수 있는데, 자세한 얘기는 뒤에서 이어서 하도록 하겠다.
마지막으로 이 논문은 이론적으로 tractable한 Bayesian optimization의 parallelized version을 (MCMC estimation이다) 제안한다.</p>
<p>저자들이 작성한 코드 역시 GitHub에 공개가 되어있다. (HIPS repo에 있는 코드가 최신이다. 둘이 라이센스가 다르기 때문에 상황에 맞춰 쓰면 된다.)</p>
<ul>
<li><a href="https://github.com/JasperSnoek/spearmint">https://github.com/JasperSnoek/spearmint</a> (Out-dated, Fully open source)</li>
<li><a href="https://github.com/HIPS/Spearmint">https://github.com/HIPS/Spearmint</a> (Up-to-dated, non-commercial use, academic use only)</li>
</ul>
<p>그 밖에도 최근 다른 곳에서도 이 내용을 implement한 것 같다.</p>
<ul>
<li><a href="https://github.com/fdiehl/apsis">https://github.com/fdiehl/apsis</a></li>
</ul>
<h3 id="practical-bayesian-optimization">Practical Bayesian Optimization</h3>
<h4 id="expected-improvement-and-matern-52-kernel-function">Expected Improvement and Matern 5/2 Kernel function</h4>
<p>앞에서도 설명했듯, 이 논문은 먼저 acquisition function으로는 EI를 사용하고, kernel function으로는 Matern 5/2를 사용한다.
Kernel function을 무엇을 고르냐에 따라 어떤 변화가 나타나는지 보여주는 좋은 그림이 하나 있어 첨부한다. 출처: <a href="http://www.iro.umontreal.ca/~bengioy/cifar/NCAP2014-summerschool/slides/Ryan_adams_140814_bayesopt_ncap.pdf">[5]</a></p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/99-10.png" width="500" /></p>
<p>가장 많이 쓰이는 Squared-exponential function의 가장 큰 문제는 ‘smoothness’로, 복잡한 모델을 표현하기에는 너무 ‘smooth’한 function만 estimate할 수 있다는 단점이 있다.
이를 해결하기 위해 이 논문에서는 Matern kernel function을 사용하며, 특히 그 hyperparameter로 5와 2를 사용하는 Matern 5/2를 사용하고 있다.
이 결과는 아무 값이나 고른건 아니고, 실제로 structured SVM의 hyperparameter를 찾을 때 여러 kernel function 중에서 가장 좋은 kernel이 무엇인지 아래와 같은 실험들 끝에 얻은 결과이다.</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/99-11.png" width="500" /></p>
<p>Matern 5/2 kernel의 구체적인 식은 다음과 같다.</p>
<script type="math/tex; mode=display"> K_{M52}(x, x^\prime) = \theta_0 \left( 1 + \sqrt{5 r^2(x, x^\prime)} + \frac{5}{3} r^2(x, x^\prime) \right) \exp \left\{ -\sqrt{5 r^2 (x, x^\prime)} \right\}. </script>
<script type="math/tex; mode=display"> r^2 (x, x^\prime) = \sum_{d=1}^D (x_d - x_d^\prime)^2 / \theta_d^2. </script>
<p>따라서 이 GP의 hyperparameter는 $\theta_0, \theta_d$로, d가 1부터 D까지 있으니 총 D+1 개의 hyperparameter를 필요로 한다.</p>
<p>앞으로 별 다른 언급이 없다면 kernel function은 Matern 5/2, acquisition function으로는 EI를 사용한다.</p>
<h4 id="integrated-acquisition-function-marginalize-hyperparameter">Integrated Acquisition Function (marginalize hyperparameter)</h4>
<p>이제 covariance의 형태를 결정했으니, GP의 hyperparameter를 없애는 일이 남았다.
우리가 optimize하고 싶은 hyperparameter의 dimension이 D라고 해보자 (위에서 언급했던 random forest의 경우, hyperparameter는 n_estimators, criterion, max_depth, min_samples_leaf로 D=4다). 이때 GP의 hyperparameter의 개수는 D+3개가 된다. 바로 앞에서 언급한 D+1개와, constant mean function의 값 m, 그리고 noise $\nu$가 그것이다.</p>
<p>이 논문에서는 hyperparameter를 완전하게 Bayesian으로 처리하기 위하여 모든 hyperparameter $\theta$ (D+3 dimensional vector)에 대해
acquisition function을 marginalize한 다음에, 다음과 같은 integrated acquisition function을 계산하는 방법을 제안한다.</p>
<script type="math/tex; mode=display"> \widehat a (x; \{x_n, y_n\}) = \int a(x; \{x_n, y_n\}, \theta) p(\theta \| \{x_n, y_n\})_{n=1}^N) d\theta. </script>
<p>PI와 EI에 대해서는 이 integrated acquisition function을 계산하기 위해 다양한 GP hyperparameter에 대한 GP posterior를 계산한 다음,
integrated acquisition function의 Monte Carlo estimatation을 구하는 것이 가능하다. 이 논문에서는 slide sampling을 사용해 구할 수 있다고 언급되어있다.
말이 조금 어려운데, 그냥 쉽게 생각해보면, sampling을 통해 얻은 여러 hyperparameter들에 대해 EI를 전부 구한 다음, 그것들을 사용해 expectation 계산을 하면 integrated EI를 구할 수 있다.
그림으로 표현하면 아래와 같다.</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/99-13.png" width="400" /></p>
<h4 id="expected-improvement-per-second">Expected Improvement per second</h4>
<p>위에서 구한 integrated EI를 사용한다고 하더라도, 아직 몇 가지 문제점들이 남아있다. 그 중 하나는, 모든 hyperparameter에 대해 실험 시간이 똑같지 않다는 점이다.
예를 들어 deep learning layer가 2인 것과 500인 것은 실험 시간의 차이가 어마어마하다.
따라서 실제로는 가장 최소한의 시행을 통해 optimization을 진행한다고 하더라도, 실제 소요 시간은 엄청 클 수도 있는 것이다.
이 논문은 그런 문제를 해결하기 위해, 필요한 경우 EI per second 라는 새로운 acquisition function을 제안한다.</p>
<p>아마도 NIPS 논문이 page limitation이 빡빡해서 그런지 정확한 formulation은 나와있지 않지만, 요점은 objective function f(x) 말고도,
duration function c(x) 라는 것을 따로 정의한 다음, 이 함수를 사용해 ‘cost’를 모델링하는 것이다.
c(x)도 GP라고 assume하는 것 같은데, c(x)와 f(x)가 independent하다고 가정하면 쉽게 acquisition function을 구할 수 있는 모양이다.
아래 실험결과에서도 볼 수 있듯, 오히려 실제 실행 시간의 관점에서는 EI per second가 더 빠른 것을 알 수 있다.</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/99-15.png" width="500" /></p>
<h4 id="monte-carlo-acquisition-for-parallelizing-bayesian-optimization">Monte Carlo Acquisition for Parallelizing Bayesian Optimization</h4>
<p>이제 이 논문의 마지막 하이라이트만 남았다. Acquisition function을 optimize하면서 다음 point를 고르는 방식은 parallelization하기가 쉽지 않다.
매 번 포인트를 고를 때 마다 이 function이 바뀌기 때문인데, 여러 heuristic을 사용할 수는 있지만, theoretically tractable한 결과를 얻기는 쉽지 않다.</p>
<p>다음과 같은 문제 상황을 가정해보자. N개의 데이터의 evaluation이 끝난 상황이고 $(\{x_n, y_n\}_{n=1}^N)$ J개의 point들에서 $(\{x_j\}_{j=1}^J)$ 실험을 진행 중이라고 가정해보자. (아직 결과는 나오지 않았다)
이론상 지금까지 진행한 실험과 $(\{x_n, y_n\}_{n=1}^N)$ 현재 진행 중인 실험 $(\{x_j\}_{j=1}^J)$ 을 모두 고려하여 다음 point를 고르기 위해서는,
acquisition function의 J개의 아직 결과가 나오지 않은 point들에 대한 expectation을 구한 다음, 그 결과를 acquisition function으로 사용하면 된다.</p>
<script type="math/tex; mode=display"> \widehat a (x; \{x_n, y_n\}, \theta, \{x_j\}) = \int a (x; \{x_n, y_n\}, \theta, \{x_j, y_j\}) p(\{y_j\}_{j=1}^J \| \{x_j\}_{j=1}^J, \{x_n, y_n\}_{n=1}^N)dy_1, \ldots, dy_J. </script>
<p>다행스럽게도, y가 Gaussian distribution이기 때문에 이 expectation은 쉽게 계산할 수 있으며,
단순히 동시에 진행하는 실험의 숫자를 늘리는 것으로 parallelization을 할 수 있기 때문에 parallelization 역시 간단하게 할 수 있다.
이 방법론을 GP EI MCMC라고 하며, 그림으로 나타내면 아래와 같다.</p>
<p><img class="center" src="http://SanghyukChun.github.io/images/post/99-14.png" width="400" /></p>
<h4 id="conclusion">Conclusion</h4>
<p>이 논문의 꽃이라 할 수 있는 실험 결과는 스킵하도록 하겠다. 그냥 “압도적으로 좋다” 정도로 이해하고 넘어가자.
사실 또 하나 언급하지 않은 점은, supplimentary material에 있는 구체적인 acquisition function optimization 방법이다.
이 논문은 개념적으로 알고 있어야하는 내용이 안그래도 많은데, 이 얘기를 하려면 여기에서 더 많은 얘기를 해야해서 넘기기로 하였다.
나중에 여유가 있을 때 추가 포스트를 쓰던가 해야겠다.</p>
<p>이 논문은 잘 쓰기만하면 굉장히 outperform한 성능을 낼 수 있는 Bayesian optimization 기반 hyperparameter search 알고리즘을 제안한다.
핵심은 어떻게 다음 point를 고를 것인지 설정하는 acquisition function을 design하느냐인데,
이 논문은 GP의 hyperparameter도 acquisition function에 녹이고, parallelization을 하기 위해 아직 진행 중인 실험의 expectation또한
이 acquisition function에 녹임으로써 원래 Bayesian optimization이 가지고 있었던 한계를 극복한다.
그뿐 아니라 실험적으로 우수한 kernel function인 Matern 5/2를 기본 kernel function제안함으로써 model selection 이슈도 피해간다.</p>
<p>실제 구현해서 사용하기는 어려운 내용이지만, 잘 숙지해두면 분명 도움이 될 수 있는 아이디어라 생각한다.</p>
<h3 id="references">References</h3>
<ol class="reference">
<li><a href="http://papers.nips.cc/paper/4522-practical">[NIPS] Snoek, Jasper, Hugo Larochelle, and Ryan P. Adams. “Practical bayesian optimization of machine learning algorithms.”, 2012.</a></li>
<li><a href="http://www.jmlr.org/papers/volume13/bergstra12a/bergstra12a.pdf">[JMLR] Bergstra, James, and Yoshua Bengio. “Random search for hyper-parameter optimization.”, 2012</a></li>
<li><a href="http://becs.aalto.fi/en/research/bayes/courses/4613/Vik_Kamath_Presentation.pdf">http://becs.aalto.fi/en/research/bayes/courses/4613/Vik_Kamath_Presentation.pdf</a></li>
<li><a href="http://enginius.tistory.com/489">http://enginius.tistory.com/489</a></li>
<li><a href="http://www.iro.umontreal.ca/~bengioy/cifar/NCAP2014-summerschool/slides/Ryan_adams_140814_bayesopt_ncap.pdf">Bayesian Optimization for Machine Learning, Ryan P.Adams, et. al</a></li>
<li><a href="http://www.dmi.usherb.ca/~larocheh/publications/gpopt_nips_appendix.pdf">[NIPS] Snoek, Jasper, Hugo Larochelle, and Ryan P. Adams. “Practical bayesian optimization of machine learning algorithms.” Supplimentary material, 2012.</a></li>
</ol>
<h3 id="section-1">변경 이력</h3>
<ul>
<li>2016년 8월 16일: 글 등록</li>
</ul>
]]></content>
</entry>
<entry>
<title type="html"><![CDATA[Octopress Markdown Kramdown으로 이전하기]]></title>
<link href="http://SanghyukChun.github.io/98/"/>
<updated>2016-03-21T00:45:00+09:00</updated>
<id>http://SanghyukChun.github.io/98</id>
<content type="html"><![CDATA[<ul id="markdown-toc">
<li><a href="#html--markdown-">HTML 코드에서 Markdown 코드로</a></li>
<li><a href="#markdown--mathjax">기존 Markdown 디버그 (MathJax)</a></li>
<li><a href="#kramdown-markdown">Kramdown Markdown</a> <ul>
<li><a href="#table-of-contents-toc">Table of Contents (ToC)</a></li>
<li><a href="#inline-attribute-lists-ial">Inline Attribute Lists (IAL)</a></li>
<li><a href="#section">개인적으로 불편한 점들</a></li>
</ul>
</li>
<li><a href="#todo">TODO</a></li>
</ul>
<h3 id="html--markdown-">HTML 코드에서 Markdown 코드로</h3>
<p>이 블로그를 시작한 이래로, 나는 줄곧 markdown code가 아니라 진짜 pure html code로 블로깅을 해왔다.
별 다른 이유가 있다기보다는, 이 블로그를 맨 처음 시작할 때만 하더라도 markdown에 대한 개념도 많이 없었고,
어느 정도 시간이 흐른 뒤에는 markdown으로 작업하려니 몇 가지 충돌사항들이 발생하는데, 이걸 일일이 처리하기도 귀찮고,