-
Notifications
You must be signed in to change notification settings - Fork 207
/
Lecture 2 Image Classification.ko.srt
2704 lines (2137 loc) · 77.6 KB
/
Lecture 2 Image Classification.ko.srt
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
1
00:00:00,000 --> 00:00:06,000
Translated by visionNoob, KNU
https://github.com/insurgent92/CS231N_17_KOR_SUB
2
00:00:06,971 --> 00:00:10,106
CS231n 두 번째 시간입니다.
3
00:00:10,106 --> 00:00:18,101
화요일의 내용을 복습해보면 컴퓨터비전과, 컴퓨터비전의 역사,
그리고 이 수업의 전반적인 내용에 대해서 다뤘습니다.
4
00:00:18,101 --> 00:00:21,451
그리고 오늘부터 본격적인 수업을 진행하겠습니다.
5
00:00:21,451 --> 00:00:27,864
그리고 앞으로 배우게 될 알고리즘들이 실생활에서
어떻게 적용되는지 심도깊게 살펴 볼 것입니다.
6
00:00:27,864 --> 00:00:35,574
초반 강의들에서는 주로 큰 개념들을 다룰 것이고
나머지 강의들에서는 조금 더 깊은 내용들과
7
00:00:35,574 --> 00:00:39,617
다양한 알고리즘들의 세부 매커니즘을 위주로 다룰 것입니다.
8
00:00:39,617 --> 00:00:43,419
오늘은 이제 첫 학습 알고리즘을 살펴볼 것인데요,
아마도 아주 재밌을 것입니다
9
00:00:43,419 --> 00:00:47,535
일단 진행에 앞서 몇가지 공지사항을 알려드리겠습니다.
10
00:00:47,535 --> 00:00:55,357
첫 번째는 Piazza에 관한 것인데요 어제 확인했을때
Piazza를 가입한 인원이 500명쯤 되었던 것으로 기억합니다.
11
00:00:55,357 --> 00:00:58,493
아직 100여명 가량이 가입을 하지 않았습니다.
12
00:00:58,493 --> 00:01:04,221
Piazza가 학생-조교간의 주요 의사소통 수단이 되었으면 좋겠습니다.
13
00:01:04,221 --> 00:01:12,841
프로젝트 아이디어나, 중간고사, 컨퍼런스와 관련된 질문이
조교들의 메일로 너무 많이 오고 있습니다.
14
00:01:12,841 --> 00:01:16,138
그리고 이런 종류의 질문은 Piazza에서
이루어져야만 합니다.
15
00:01:16,138 --> 00:01:21,568
모든 조교들이 Piazza를 수시로 확인하고 있기 때문에,
Piazza로 질문을 하는것이 훨씬 더 빠를 것입니다.
16
00:01:21,568 --> 00:01:26,234
이메일로 보내면 여러 메일 리스트랑 섞여서
답장을 못 할 수도 있습니다.
17
00:01:26,234 --> 00:01:33,629
또한 SCPD 학생들 중 일부는
Piazza 가입에 어려움을 겪고 있습니다.
18
00:01:33,629 --> 00:01:40,733
SCPD 학생들은 @ stanford.edu 이메일을 부여 받아야 합니다.
이메일 주소를 부여받으면
19
00:01:40,733 --> 00:01:44,276
그때 Stanford 이메일로 Piazaa에
가입할 수 있습니다.
20
00:01:44,276 --> 00:01:50,408
아마 이 문제는 지금 여기 앉아있는 분들은 상관 없겠지만
SCPD로 듣고있는 학생들에게 말씀드리는 것입니다.
21
00:01:52,191 --> 00:01:58,178
다음 사항은 바로 과제에 관한 것입니다.
과제 1이 오늘 늦게 업로드 될 것입니다.
22
00:01:58,178 --> 00:02:03,043
아마 오후가 될 것 같습니다만 오늘 자기전에는
꼭 과제가 올라갈 것임을 약속드립니다.
23
00:02:03,043 --> 00:02:07,304
하지만 여러분이 조금 불안하고
지금 당장 과제를 하고싶다면
24
00:02:07,304 --> 00:02:12,684
과제 1의 작년버전을 찾을 수 있을 것입니다.
작년 버전과 아주 유사합니다.
25
00:02:12,684 --> 00:02:19,082
단지 아주 조금만 손 보고 있습니다. 예를 들어 Python
2.7버전에서 Python3으로 업그레이드하는 등이죠
26
00:02:19,082 --> 00:02:24,742
그리고 아주 작은 외관상의 변화만 있고
내용만 보면 작년과 같습니다.
27
00:02:24,742 --> 00:02:30,686
이번 과제에서 여러분은 여러분만의 k-NN을 구현하게
될 것인데요 우리가 이번 강의에서 다룰 것입니다.
28
00:02:30,686 --> 00:02:37,927
여러분은 또한 몇 가지 선형 분류기를 구현할 것인데 SVM과
Softmax 뿐만 아니라 2-layer 신경망도 구현할 것입니다.
29
00:02:37,927 --> 00:02:46,168
그리고 앞으로 몇 강의동안 그 내용을 모두 다룰 것입니다. 그리고
모든 과제는 Python과 Numpy를 사용하고 있습니다.
30
00:02:46,168 --> 00:02:54,312
Python이나 Numpy에 익숙하지 않다면 관련한 tutorial이
있으며, 여러분은 우리 강의 사이트에서 찾아 볼 수 있습니다.
31
00:02:54,312 --> 00:02:59,211
그리고 이것은 사실 엄청나게 중요합니다. NumPy는 여러분들이
vectorized 연산을 아주 효율적으로 할 수 있게 도와주며
32
00:02:59,211 --> 00:03:03,856
방대한 양의 계산을 코드 몇 줄로
간단히 가능하게 해줍니다.
33
00:03:03,856 --> 00:03:13,424
이건 완전 중요한데, 왜냐하면 대부분의 수치계산, 기계학습과
같은 것들이 vectorized 연산을 수행하기 때문입니다.
34
00:03:13,424 --> 00:03:16,964
그리고 여러분들은 첫 과제를 하면서
많은 연습을 할 수 있을 것입니다.
35
00:03:16,964 --> 00:03:23,449
그러니 Matlab, Numpy와 같은 vectorized
tensor 계산이 익숙하지 않은 분들은
36
00:03:23,449 --> 00:03:32,175
일찌감치 과제를 시작하기를 추천드립니다.
그리고 tutorial도 아주 주의 깊게 읽어보시기 바랍니다.
37
00:03:32,175 --> 00:03:40,198
또 한가지 알려드릴 것은 이 수업에서는
공식적으로 Google Cloud가 지원됩니다.
38
00:03:40,198 --> 00:03:46,694
Google Cloud는 Amazon AWS와 유사합니다
여러분은 cloud에서 가상 머신을 사용할 수 있습니다.
39
00:03:46,694 --> 00:03:50,432
가상머신에는 GPU을 포함 시킬 수도 있습니다.
40
00:03:50,432 --> 00:03:55,386
현재 Googld Cloud 사용법과 이를 사용하여 과제를
수행하는 방법에 관한 Tutorial을 작성중입니다.
41
00:03:55,386 --> 00:04:04,723
여러분들이 이미지만 다운받으면 Google Cloud를 통해
과제를 차질없이 진행할 수 있도록 하겠습니다.
42
00:04:04,723 --> 00:04:08,437
그리고 google에서 우리 수업을
아주 잘 지원하고 있기 때문에
43
00:04:08,437 --> 00:04:15,582
여러분들에게 Google Cloud Credits을 무료로 쓸 수
있는 쿠폰을 나누어 드릴 것입니다.
44
00:04:15,582 --> 00:04:24,015
과제나 프로젝트를 수행할 때 필요한 GPU 같은
고사양 컴퓨터 자원들을 자유롭게 사용할 수 있을 것입니다.
45
00:04:24,015 --> 00:04:29,300
아마도 오늘 Pizzza에 세부사항을 포스팅 하도록 하겠습니다.
46
00:04:29,300 --> 00:04:35,566
본인의 Laptop을 사용해도 되는지와 같은 여러 질문을 받았습니다만
47
00:04:35,566 --> 00:04:41,774
제 답변은, 여러분은 Google Cloud를 사용할 수 있습니다.
조만간 쿠폰을 나눠드릴 예정입니다.
48
00:04:43,923 --> 00:04:53,681
자 그럼 지금까지 몇 가지 공지사항을 전달해 드렸고,
수업을 본격적으로 진행하겠습니다.
49
00:04:53,681 --> 00:04:58,125
지난 강의에서 Image Classification에 대해
간략히 말씀드렸습니다.
50
00:04:58,125 --> 00:05:00,450
Image Classification은 컴퓨터비전 분야에서는
Core Task 에 속합니다.
51
00:05:00,450 --> 00:05:04,964
CS231n 은 주로 Image Classification에
관한 문제를 다룹니다.
52
00:05:04,964 --> 00:05:07,832
Image Classification는 어떻게 할까요?
53
00:05:07,832 --> 00:05:09,750
조금 더 구체적으로 설명해 보겠습니다.
54
00:05:09,750 --> 00:05:14,259
Image Classification을 한다고 하면
우선 입력 이미지를 받습니다.
55
00:05:14,259 --> 00:05:16,457
예시로 여기 귀여운 고양이사진이 한 장 있습니다.
56
00:05:16,457 --> 00:05:22,455
그리고 시스템에는 우리가 미리 정해놓은
카테고리 집합이 있습니다.
57
00:05:22,455 --> 00:05:29,134
카테고리에는 가령 개, 고양이, 트럭, 비행기 등이 있을 수 있습니다.
58
00:05:29,134 --> 00:05:36,444
이제 컴퓨터가 해야 할 일은 이미지을 보고 어떤 카테고리에
속할지 고르는 것입니다. 엄청 쉬워보이죠
59
00:05:36,444 --> 00:05:48,232
왜냐면 여러분의 시각체계는 이와 같은 시각인식 테스크에
고도화 되어 있기 때문입니다. 하지만 기계에계는 정말 어려운 일이죠.
60
00:05:48,232 --> 00:05:53,236
컴퓨터가 이 이미지를 볼때 무엇을 보고 있는지를
조금만 더 깊게 생각해 본다면
61
00:05:53,236 --> 00:05:57,428
우리와는 다르게 컴퓨터는 이미지가
고양이라고 생각하지 못할 것입니다.
62
00:05:57,428 --> 00:06:05,922
컴퓨터에게 이미지는 아주 큰 격자 모양의 숫자집합으로밖에
보이지 않습니다. 가령 800x600 이미지 같이 말입니다.
63
00:06:07,371 --> 00:06:13,176
그리고 각 픽셀은 세 개의 숫자로 표현합니다.
각각은 red, green, blue을 의미합니다.
64
00:06:13,176 --> 00:06:15,769
다시 말하자면, 컴퓨터에게 이미지란
단지 거대한 숫자 집합에 불과합니다.
65
00:06:15,769 --> 00:06:24,841
이 거대한 숫자집합에서 "고양이"를 인식하는
것은 상당히 어려워 보입니다.
66
00:06:26,956 --> 00:06:30,186
이것을 바로 의미적론적인 차이라고 합니다.
(Semantic gap)
67
00:06:30,186 --> 00:06:35,462
"고양이"라는 레이블은 우리가 이 이미지에 붙힌 의미상의 레이블입니다.
68
00:06:35,462 --> 00:06:42,897
이 이미지가 고양이사진이라는 사실과 실제 컴퓨터가 보는
픽셀 값과는 큰 차이가 있습니다.
69
00:06:42,897 --> 00:06:51,916
정말 어려운 테스크입니다. 가령 이 이미지에 아주 미묘한 변화만
주더라도 픽셀 값들은 모조리 변하게 될 것입니다.
70
00:06:51,916 --> 00:06:58,782
우리에게 고양이가 한 마리 있는데 그 고양이가 얌전히
앉아만 있으면 아무 일도 일어나진 않을 것입니다.
71
00:06:58,782 --> 00:07:06,921
하지만 카메라를 아주 조금만 옆으로 옮겨도
모든 픽셀 값들이 모조리 달라질 것입니다.
72
00:07:06,921 --> 00:07:09,431
하지만 이 달라진 픽셀 값도 여전히
고양이라는 사실은 변하지 않습니다.
73
00:07:09,431 --> 00:07:12,754
우리가 만든 알고리즘은
이런 것들에 강인해야 합니다.
74
00:07:12,754 --> 00:07:16,260
바라보는 방향 뿐만 아니라
조명 또한 문제가 될 수 있습니다.
75
00:07:16,260 --> 00:07:19,298
어떤 장면이냐에 따라
조명은 각양각생일 것입니다.
76
00:07:19,298 --> 00:07:28,488
고양이가 어두운 곳에 있던 밝은 곳에 있던 고양이는
고양이죠. 우리 알고리즘은 이것에 또한 강인해야 합니다.
77
00:07:28,488 --> 00:07:30,145
또한 객체 자체에 변형이 있을 수 있습니다.
78
00:07:30,145 --> 00:07:38,940
제 생각엔 고양이만큼 다양한 변형이 가능한 동물은 없을 것
같습니다.고양이는 아주 다양한 자세를 취할 수 있습니다.
79
00:07:38,940 --> 00:07:42,441
우리의 알고리즘은 이런 다양한
변형에도 강인해야 합니다.
80
00:07:43,442 --> 00:07:49,762
가려짐(occlusion)도 문제가 될 수 있습니다.고양이의
일부밖에 볼 수 없는 상황이 있을 수도 있습니다.
81
00:07:49,762 --> 00:07:53,686
고양이의 얼굴밖에 볼 수 없다던가, 극단적인 경우에는
소파에 숨어들어간 고양이의 꼬리밖에 볼 수 없을지도 모릅니다.
82
00:07:53,686 --> 00:08:01,532
사람이라면 고양이라는 사실을 단번에 알아챌 수 있습니다.
여전히 이 이미지는 고양이 이미지라는 것을 알 수 있습니다.
83
00:08:01,532 --> 00:08:08,460
우리 알고리즘도 이것에 강인해야 합니다.
제 생각엔 아주 어려운 문제일 것 같네요.
84
00:08:08,460 --> 00:08:10,792
Background clutter라는 문제도 있습니다.
(배경과 비슷한 경우)
85
00:08:10,792 --> 00:08:20,389
고양이가 배경과 거의 비슷하게 생겼을 수도 있습니다.
이 문제 또한 우리가 다뤄야만 합니다.
86
00:08:20,389 --> 00:08:23,637
또한 하나의 클래스 내에도 다양성이 존재합니다.
87
00:08:23,637 --> 00:08:28,455
"고양이"라는 하나의 개념으로 모든 고양이의 다양한
모습들을 전부 소화해 내야 합니다.
88
00:08:28,455 --> 00:08:32,158
고양이에 따라 생김새, 크기, 색, 나이가 각양 각색일 것입니다.
89
00:08:32,158 --> 00:08:40,033
우리 알고리즘은 이러한 다양성도 다룰 수 있어야 합니다.
사실 문제들은 엄청나게 어렵습니다.
90
00:08:40,033 --> 00:08:47,931
우리 인간의 뇌는 이런 것들을 아주 잘 하기 때문에
컴퓨터가 얼마나 어려워 할지를 망각할 수도 있습니다.
91
00:08:47,931 --> 00:08:54,288
하지만 만일 우리가 앞서 언급한 일련의 문제들을 전부 다룰 수
있는 프로그램을 원한다면, 그리고 그 프로그램이 단연 고양이 뿐만 아니라
92
00:08:54,288 --> 00:08:59,052
우리가 상상할 수 있는 어떤 객체라도 잘 다룰 수 있어야만 한다면,
하지만 이는 아주 어려운 문제입니다.
93
00:08:59,052 --> 00:09:03,078
제 생각에는 그런 일들을 모두 해내는 것은 기적에 가깝다고 봅니다.
94
00:09:03,078 --> 00:09:09,278
하지만 만약 일부 제한된 상황을 가정한다면, 정말 잘 동작 할 뿐만 아니라,
인간의 정확도와도 맞먹는 프로그램이 존재할 수도 있습니다.
95
00:09:09,278 --> 00:09:14,921
수행 시간도 수백ms 밖에 걸리지 않고 말이죠
상당히 놀랍고 대단한 기술이라고 생각합니다.
96
00:09:14,921 --> 00:09:22,241
앞으로의 수업에서 어떤 요소들이 이를
가능하게 만들었는지 살펴 볼 것입니다.
97
00:09:23,492 --> 00:09:27,565
그러면, 만약 여러분이 Image Classifier API 코드를
작성한다고 생각해 봅시다.
98
00:09:27,565 --> 00:09:34,401
아마도 이런식의 Python 메서드를 작성해 보지 않을까 싶습니다.
이미지 입력을 받아서, 어떤 "놀라운 마법"이 일어나고
99
00:09:34,401 --> 00:09:38,180
이 이미지가 "고양이"이다. 혹은 "강아지이다" 라고 말해주는 것이죠.
100
00:09:38,180 --> 00:09:41,695
하지만 이를 구현하기 위한 적절한 묘안이
딱히 없으실 것입니다. . 그렇죠?
101
00:09:41,695 --> 00:09:49,535
가령 여러분이 알고리즘 수업에서 "숫자 정렬",
"convex hull 계산" 또는 "RSA 암호화" 문제를 풀어야 한다면
102
00:09:49,535 --> 00:09:55,773
여러분은 알고리즘을 하나씩 써 내려가면서 알고리즘이
동작하려면 필요한 모든 과정들을 나열할 것입니다.
103
00:09:55,773 --> 00:10:07,909
하지만 사물 인식의 경우, 가령 고양이를 인식해야 하는 상황이라면 객체를
그런런 직관적이고 명시적인 알고리즘은 존재하지 않습니다.
104
00:10:07,909 --> 00:10:09,874
아주 어려운 문제입니다.
105
00:10:09,874 --> 00:10:18,869
가령 여러분이 맨 처음 이 함수를 작성하려
할 때 대부분이 문제에 봉착 할 것입니다.
106
00:10:18,869 --> 00:10:27,004
지금까지는 사람들이 동물들을 인식하기 위해
고오급 coded rules을 만들고자 하는 시도를 해왔습니다.
107
00:10:27,004 --> 00:10:35,596
마지막 강의에서 다루겠지만, 고양이를 인식하고자 할 때 우선
고양이는 두개의 귀와 하나의 코가 있다는 것을 알 고 있습니다.
108
00:10:35,596 --> 00:10:41,641
또한 Hubel과 Wiesel의 연구 덕분에
Eedges가 대단히 중요하다는 것도 알 고 있습니다.
109
00:10:41,641 --> 00:10:50,983
시도해볼만한 것은 우선 이미지에서 edges를 계산합니다.
그리고 다양한 Corners와 Edges를 각 카테고리로 분류합니다.
110
00:10:50,983 --> 00:10:53,146
가령 세 개의 선이 만나는 지점이면 corner라고 했을 때
111
00:10:53,146 --> 00:10:56,483
귀는 "여기에 corner 하나" "저기에도 corner 하나"
또 "저기에도 코나 하나" 가 있고
112
00:10:56,483 --> 00:11:01,608
이런 방식으로 고양이 인식을 위해
"명시적인 규칙 집합" 을 써내려 가는 방법입니다.
113
00:11:01,608 --> 00:11:06,127
하지만 이런 방식은 잘 동작하지 않는 것으로 알려져 있습니다.
한가지 문제는, 이런 알고리즘은 강인하지 못합니다.
114
00:11:06,127 --> 00:11:17,081
두번째는, 또 다른 객체를 인식해야 한다면, 트럭에 대해서도, 개에
대해서도 별도로 만들어야 할 것입니다. 처음부터 다시 시작해야 하죠
115
00:11:17,081 --> 00:11:19,853
다시 말해, 이런 방법들은 확장성 전혀 없는 방법입니다.
116
00:11:19,853 --> 00:11:29,360
이 세상에 존재하는 다양한 객체들에게 유연하게 적용 가능한
확장성 있는 알고리즘을 만들어야 합니다.
117
00:11:31,311 --> 00:11:38,092
이런 일들을 가능한 하나의 Insight는 바로
데이터 중심 접근방법(Data-Driven Approcach) 입니다.
118
00:11:38,092 --> 00:11:45,766
고양이는 무엇이다, 물고기는 무엇이다 하면서 손으로
직접 어떤 규칙을 써내려 하는 것 대신에
119
00:11:45,766 --> 00:11:55,402
인터넷에 접속해서 엄청 많은
고양이/비행기/사슴 데이터를 수집합니다.
120
00:11:55,402 --> 00:12:03,866
각 카테고리에서 다양한 많은 데이터들을 모으기 위해
Google Image Search와 같은 도구를 이용하면 됩니다.
121
00:12:03,866 --> 00:12:08,338
사실상 방대한 데이터를 수집하려면
상당히 많은 시간과 노력이 필요합니다.
122
00:12:08,338 --> 00:12:14,105
다행이도 우리가 손쉽게 이용할 수 있는
고퀄의 데이터셋들이 있습니다.
123
00:12:14,105 --> 00:12:20,869
이 데이터셋들을 이용해서 Machine Learning Clssifier
를 학습시킬 수 있습니다.
124
00:12:20,869 --> 00:12:28,446
ML 알고리즘은 어떤 식으로든 데이터를 잘 요약해서는
다양한 객체들을 인식할 수 있는 모델을 만들어냅니다.
125
00:12:28,446 --> 00:12:35,930
그리고 학습 모델로 새로운 이미지를 테스트해 보면
고양이나 개를 잘 인식해 낼 것입니다.
126
00:12:35,930 --> 00:12:38,428
이제 우리의 API 가 조금 변경되었습니다.
127
00:12:38,428 --> 00:12:43,621
입력 이미지를 고양이로 인식하려면 이제는
함수 하나가 아니라 두 개 필요합니다.
128
00:12:43,621 --> 00:12:49,115
하나는 Train함수입니다.
입력은 이미지와 레이블이고, 출력은 우리의 모델입니다.
129
00:12:49,115 --> 00:12:55,276
다른 하나는 Predict 함수입니다.
입력이 모델이고, 출력은 이미지의 예측값이죠
130
00:12:55,276 --> 00:13:01,928
Machine Learning의 key insight입니다.
이 key insight은 지난 10-20년간 아주 잘 동작했습니다.
131
00:13:05,784 --> 00:13:11,111
이 수업에서는 주로 Neural Network, CNN,
Deep Learning을 주로 다룰 것입니다.
132
00:13:11,111 --> 00:13:15,819
하지만 Data-driven approach는 Deep Learning
뿐만 아니라 아주 일반적인 개념입니다.
133
00:13:15,819 --> 00:13:23,058
더 복잡한 알고리즘을 배우기 전에 조금 더
심플한 Classifier를 한번 살펴보고 가는 것이 좋을 것 같습니다.
134
00:13:23,058 --> 00:13:28,907
Nearest neighbor 라는
아주 단순한 Classifier가 있습니다.
135
00:13:28,907 --> 00:13:31,243
NN 알고리즘은 상당히 단순합니다.
136
00:13:31,243 --> 00:13:39,108
Train Step에서는 아무 일도 하지 않습니다.
단지 모든 학습 데이터를 기억합니다.
137
00:13:39,108 --> 00:13:47,964
그리고 Pridict Step에서는 새로운 이미지가 들어오면
새로운 이미지와 기존의 학습 데이터를 비교해서
138
00:13:47,964 --> 00:13:53,169
가장 유사한 이미지로 레이블링을 예측합니다.
아주 간단합니다.
139
00:13:53,169 --> 00:13:58,771
하지만 Data-driven Approach 로서
아주 좋은 알고리즘입니다.
140
00:13:59,977 --> 00:14:04,951
좀 더 구체적으로 살펴봅시다.
앞으로 CIFAR-10 데이터셋을 다뤄야 합니다.
141
00:14:04,951 --> 00:14:09,259
Cifar-10은 Machine Learning에서 자주 쓰는
연습용(테스트용) 데이터셋입니다.
142
00:14:09,259 --> 00:14:11,579
여러분의 과제에서도
Cifar-10을 사용합니다.
143
00:14:11,579 --> 00:14:19,920
CIFAR-10에는 10가지 클래스가 있습니다.
비행기, 자동차, 새, 고양이 등이죠
144
00:14:19,920 --> 00:14:24,990
10가지 각 카테고리가 있고
총 50,000여개의 학습용 이미지가 있습니다.
145
00:14:27,173 --> 00:14:30,250
50,000여개의 데이터는 각 카테고리에
균일하게 분포하고 있죠
146
00:14:30,250 --> 00:14:37,565
그리고 알고리즘 테스트용
10,000여개의 테스트 이미지가 있습니다.
147
00:14:38,707 --> 00:14:45,741
자 그러면 CIFAR-10 데이터셋을 이용한
NN예제를 살펴보겠습니다.
148
00:14:45,741 --> 00:14:53,693
오른쪽 칸의 맨 왼쪽 열은
CIFAR-10 테스트 이미지입니다.
149
00:14:53,693 --> 00:15:03,571
그리고 오른쪽 방향으로는 학습 이미지 중
테스트 이미지와 유사한 순으로 정렬했습니다.
150
00:15:03,571 --> 00:15:10,974
테스트 이미지와 학습 이미지를 비교해 보면, 눈으로 보기에는 상당히
비슷해 보입니다. 항상 맞는것은 아니지만 말입니다. 맞죠?
151
00:15:10,974 --> 00:15:21,224
이 이미지들을 너무 작아서 잘 안보이실 수도 있습니다.
32 x 32 이미지들이라 조금 더 유심히 보고 짐작해 보시기 바랍니다.
152
00:15:21,224 --> 00:15:23,850
어찌됐든, 두 번째 행의 이미지는 개 입니다.
그리고 가장 가까운 이미지(1등)도 개 입니다.
153
00:15:23,850 --> 00:15:30,006
하지만 2등, 3등을 살펴보면 "사슴"이나
"말"같아 보이는 이미지들도 보이는군요
154
00:15:30,006 --> 00:15:36,370
개는 아니지만 눈로 보기에는 아주 비슷해 보입니다.
중간이 흰색 물체가 있는 등 말입니다.
155
00:15:36,370 --> 00:15:42,707
이 이미지에 NN 알고리즘을 적용하면
트레이닝 셋에서 "가장 가까운 샘플"을 찾게 됩니다.
156
00:15:42,707 --> 00:15:47,135
그렇게 찾은 "가장 가까운 샘플"의 레이블을 알 수 있겠죠.
이 샘플들은 "학습 데이터" 이니깐요
157
00:15:47,135 --> 00:15:50,875
그리고 두 번째 행의 테스트 이미지도 "개" 입니다.
158
00:15:50,875 --> 00:16:00,018
NN 알고리즘이 잘 동작하지 않을 것 같아 보이지만
그럼에도 해 볼만한 아주 좋은 예제입니다.
159
00:16:00,939 --> 00:16:06,908
여기에서 중요한 점은 이미지 쌍이 있을 때
어떻게 비교를 할 것인지가 관건입니다.
160
00:16:06,908 --> 00:16:12,165
테스트 이미지 하나를 모든 학습 이미지들과 비교할 때
여러가지 비교 방법들이 있습니다.
161
00:16:12,165 --> 00:16:15,640
정확이 말하자면
"어떤 비교 함수를 사용할지"에 달렸습니다.
162
00:16:15,640 --> 00:16:27,448
앞선 예제에서는 L1 Distance를 사용했습니다. Manhattan
distance라고도 합니다. L1 Dist는 아주 간단한 방법입니다.
163
00:16:27,448 --> 00:16:39,346
이미지를 Pixel-wise로 비교합니다.
가령 4x4 테스트 이미지가 있다고 생각해 봅시다.
164
00:16:39,346 --> 00:16:46,242
테스트/트레이닝 이미지의 같은 자리의 픽셀을
서로 빼고 절댓값을 취합니다.
165
00:16:46,242 --> 00:16:51,950
이렇게 픽셀 간의 차이 값을 계산하고 모든 픽셀의 수행 결과를 모두 더합니다.
166
00:16:51,950 --> 00:16:57,963
Image Classification 문제에서 이 방법이 별로인 것 같지만
연습삼아 해보시면 아주 좋습니다.
167
00:16:57,963 --> 00:17:01,991
"두 이미지간의 차이를 어떻게 측정 할 것인가?"
에 구체적인 방법을 제시합니다.
168
00:17:01,991 --> 00:17:07,147
지금 예제의 경우에는 두 이미지간에
"456" 만큼 차이가 나는군요.
169
00:17:08,446 --> 00:17:16,582
NN Classifier를 구현한 Python 코드는
상당히 짧고 간결합니다.
170
00:17:16,583 --> 00:17:21,348
NumPy에서 제공하는 Vectorizaed operations을
이용했기 때문이죠
171
00:17:21,348 --> 00:17:28,946
여기 앞서 살펴보았던 Train 함수가 있군요.
NN의 경우 Train 함수가 상당히 단순합니다.
172
00:17:28,946 --> 00:17:33,427
단지 학습 데이터를 기억하는 것입니다.
할 일이 크게 없습니다.
173
00:17:33,427 --> 00:17:39,126
Test 함수에서는 이미지를 입력으로 받고
L1 Distance로 비교합니다.
174
00:17:39,126 --> 00:17:45,395
학습 데이터들 중 테스트 이미지와 가장 유사한 이미지들을 찾아냅니다.
175
00:17:45,395 --> 00:17:53,882
Numpy의 vectorized operations을 활용하면
구현은 Python code 한 두 줄이면 충분합니다.
176
00:17:53,882 --> 00:17:57,779
첫 과제에 있으니 연습해 보시기 바랍니다.
177
00:17:58,628 --> 00:18:02,179
이 Simple Classifier에 대한
몇 가지 궁금증이 생길 수 있습니다.
178
00:18:02,179 --> 00:18:09,077
첫째, Trainset의 이미지가 총 N개라면
Train/Test 함수의 속도는 어떻게 될까요?
179
00:18:12,233 --> 00:18:17,878
우선 Train time은 상수시간 O(1) 일테죠
데이터를 기억만 하면 됩니다.
180
00:18:17,878 --> 00:18:22,703
포인터만 잘 사용해서 복사를 하면, 데이터 크기와 상관없이
상수시간으로 끝마칠 수 있습니다.
181
00:18:22,703 --> 00:18:31,099
하지만 Test time에서는 N개의 학습 데이터 전부를
테스트 이미지와 비교해야만 합니다.
182
00:18:31,099 --> 00:18:33,766
상당히 느린 작업입니다.
183
00:18:34,991 --> 00:18:38,641
상당히 "뒤집어진" 것이죠
(Train TIme < Test TIme)
184
00:18:38,641 --> 00:18:45,326
실제로 우리는 "Train Time은 조금 느려도 되지만"
"Test Time에서는 빠르게 동작"하길 원합니다
185
00:18:45,326 --> 00:18:49,882
가령 여러분이 데이터 센터에서
어떤 Classifier를 학습시키고 있다고 생각해보면
186
00:18:49,882 --> 00:18:54,640
Classifier의 좋은 성능을 보장하기 위해서
Train Time에 많은 시간을 쏟을 수도 있겠죠.
187
00:18:54,640 --> 00:18:57,566
하지만 이 Classifier의 "Test Time" 을 생각해보면
188
00:18:57,566 --> 00:19:02,248
이 모델이 핸드폰이나, 브라우저와 등
Low Power Device에서 동작해야 할 수도 있습니다.
189
00:19:02,248 --> 00:19:07,075
이런 상황에서는 Classifier가 Test Time에서
어느정도 빠른 성능을 보장해야 할 것입니다.
190
00:19:07,075 --> 00:19:11,826
그런 관점에서 NN 알고리즘은
정 반대의 경우입니다.
191
00:19:11,826 --> 00:19:18,286
CNN 같은 parametic model들은
NN과는 정 반대입니다.
192
00:19:18,286 --> 00:19:24,936
Train TIme은 엄청 오래 걸릴지 모르나
Test Time은 엄청 빠릅니다.
193
00:19:24,936 --> 00:19:30,816
그렇다면 NN알고리즘을 실제로 적용해 본다면 어떻게 생겼을까요?
194
00:19:30,816 --> 00:19:36,130
NN의 "decision regions" 을 한번 그려 보았습니다.
195
00:19:36,130 --> 00:19:47,547
2차원 평면 상의 각 점은 학습 데이터 입니다. 그리고
점의 색은 클래스 레이블(카테고리) 입니다.
196
00:19:47,547 --> 00:19:53,921
이 예제에서는 클래스가 5개군요. 왼쪽 구석에는
파란색이 있고 오른쪽 구석에는 보라색이 있습니다.
197
00:19:53,921 --> 00:20:02,560
2차원 평면 내의 모든 좌표에서
각 좌표가 어떤 학습 데이터와 가장 가까운지 계산합니다.
198
00:20:02,560 --> 00:20:06,954
그리고 각 좌표를 해당 클래스로 칠했습니다.
199
00:20:06,954 --> 00:20:14,979
NN 분류기는 공간을 나눠서
각 레이블로 분류합니다.
200
00:20:14,979 --> 00:20:18,320
하지만 이 분류기는
그닥 좋지 않습니다.
201
00:20:18,320 --> 00:20:24,676
이 그림을 보면 NN 분류기에서 발생 가능한
문제들을 살펴볼 수 있습니다.
202
00:20:24,676 --> 00:20:31,591
가령 가운데를 보시면, 대부분이 초록색 점들인데
중간에 노란 점이 끼어있습니다.
203
00:20:31,591 --> 00:20:40,087
NN 알고리즘은 "가장 가까운 이웃" 만을 보기 때문에, 녹색
무리 한 가운데 노란색 영역이 생겨 버립니다. 좋은 일은 아니죠
204
00:20:40,087 --> 00:20:44,081
사실은 노란색이 아닌 초록색 영역이어야만 합니다.
205
00:20:44,081 --> 00:20:50,225
그리고 유사하게 초록색 영역이
파란색 영역을 침범하고 있습니다.
206
00:20:50,225 --> 00:20:55,180
이 또한 초록색 점이 끼어들어서 그렇습니다.
아마 이 점은 잡음(noise)이거나 가짜(spurious)일테죠
207
00:20:55,180 --> 00:21:01,606
이러한 문제들이 발생하기 때문에 NN의 조금 더
일반화된 버전인 k-NN 알고리즘이 탄생하였습니다.