해당 포스팅은 네이버 부스트캠프 AI Tech 학습 정리 자료임을 알려드립니다.
1. 강의 정리
오태현 교수님 - Image Classification 1
1) Computer Vision 개관
컴퓨터 비전 분야는 딥러닝이 가장 활발하게 적용된 분야라고 해도 과언이 아닙니다. 이처럼 컴퓨터 비전의 시각적인 인식은 어떻게 중요할까요? 옥스포드 사전에서는 인공지능은 인간지능을 컴퓨터 시스템으로 구현하는 과정이라고 설명하면서 인간지능에는 시각, 소리에 대한 지각능력이나 이해에 관련된 내용도 포함하고 있는 것을 확인할 수 있습니다. 여기서의 사람의 지능에는 인지능력, 지각능력, 기억과 이해 및 사고능력을 포함하는 넓은 영역이라고 말하고 있습니다. 우리가 어렸을 때를 생각하면 쉽게 이해할 수 있습니다. 세상을 알아가기 위해 어떤 방식으로 접근했는지를 살펴보면, 어린 아이는 다양하게 만지고, 입에 넣어보고, 보고, 듣고, 냄새를 맡는 등의 행동을 통해서 배워가기 시작합니다.
이처럼 지각 능력은 시스템으로 구현할 때, input, output data가 됩니다. 특히, 사람은 앞에서 언급한 지각능력 외에도 교차감각, 다중감각, 제 3의 감각들을 활용하기 때문에, 기계에서 이를 인식하기 위한 연구는 여전히 계속되고 있습니다. 지각 능력이 제대로 인식되어야 추후 다양한 작업에 활용이 가능합니다. 그 중 시각은 다른 오감에 비해 많은 비중을 차지하고 있습니다. 이러한 시각 지각 능력에 관한 분야가 바로 Computer Vision입니다.
그렇다면, 사람의 시각과 컴퓨터의 시각에는 어떠한 관계가 있을까요? 사람의 시각은 먼저 장면을 인식하게 되면, 이를 뇌를 통해서 어떤 상황인지 파악하고 장면에 대한 내용을 설명할 수 있습니다. 동일한 관점에서 컴퓨터는 카메라로 장면을 인식하게 되고, GPU를 통해서 어떤 사물이 있고, 상황은 어떤 것인지 파악해서 정보들을 표현하게 됩니다. 이처럼 비슷한 구조를 가지게 됩니다. 여기서 얻어진 자세한 정보들을 다시 시각화하는 것이 우리가 흔히 아는 Computer Graphics(Rendering)에 해당됩니다. Rendering의 반대 과정이 바로 우리가 배우는 Computer Vision(Inverse rendering)이고, 이 과정을 통해서 장면의 정보를 얻어내는 것입니다.
그래서 Computer Vision은 이미지나 비디오같은 시각화된 자료가 input으로 들어오게 됩니다. 포함되는 시각 인식의 종류에는 color perception, motion perception, 3D perception, Semantic-level perception, Social perception, Visuomotor perception 등이 존재합니다. 또한 Computer Vision 분야는 인간이 시각정보를 어떻게 받아들이는 지에 대한 이해도 포함하고 있습니다.
가수 아델의 25집 앨범 사진을 거꾸로 놓은 사진입니다. 혹시 이상한 것을 느끼셨나요? 아마 모르실 가능성이 높습니다. 그것은 대처 착시효과 때문입니다. 자세하게 잘 보시면 우리가 평소에 보는 눈의 모습과 입의 모습을 그대로 놓은 것을 확인할 수 있습니다. (이걸 반전시켜놓은 사진은 깜짝 놀라실 수 있기 때문에 블로그에 넣어 놓지 않았습니다.) 이처럼 우리의 시각 능력도 똑바로 그려진 것들이 잘 학습되어서 이상하다고 못 느끼는 것입니다. 이처럼 사람의 시각에는 불완전한 점이 존재합니다.
불과 5~6년 전만 해도 머신러닝을 활용한 컴퓨터 비전은 "입력 - 특징 추출(사람에 의한) - 분류 - 결과" 순으로 진행되었습니다. 딥러닝이 적용되면서 사람이 직접 특징 추출하지 않고 입력만 넣어주면 알아서 학습에 의해 결과를 내주는 형태로 발전되었습니다.
2) Image Classification
이미지 분류는 컴퓨터 비전에서 가장 쉬운 문제이면서도 가장 중요한 문제입니다. 이미지 분류는 기본적으로 이미지가 입력으로 들어오면 분류기를 통해서 클래스를 알려주는 형태의 Task입니다. 만약 세상에 모든 데이터를 가지고 있다면, K-NN을 이용해 찾는 방법의 문제로 바꿀 수 있습니다. 하지만, 이 방법은 현실적으로 불가능합니다. 모든 정보들 간의 유사도를 측정해야 하며, 모든 데이터를 가지고 있을 메모리가 부족하기 때문입니다. 그래서 방대한 데이터를 압축해서 Neural Network에 넣는 것이라고 생각하면 좋을 것 같습니다.
가장 먼저 가장 간단한 모델인 Fully connected layer에 대해서 설명하겠습니다.
위의 그림처럼 Fully Connected Layer는 각 모든 pixel의 값과 다른 weight들을 곱해서 가중합을 구한 것을 비선형함수를 통해서 얻는 과정입니다. 하지만, 이 방법은 문제가 있습니다.
학습한 Weight를 각 클래스에 해당되는 그림을 살펴보면 특정 위치에 우리가 원하는 픽셀이 존재해야 합니다. 만약에 자동차가 일부만 짤려있는 사진이 input으로 들어왔다면 어떻게 인식할까요? 우리가 원하는 것처럼 자동차로 인식하지 않을 수 있습니다. 그래서 Fully Connected Neural Net을 대신해서 Locally Connected Neural Net을 사용하게 됩니다. 이렇게 하게 되면, Parameter 수도 줄어들 수 있고, 지역적인 부분에 대해서도 학습을 할 수 있다는 장점이 있습니다. 이러한 CNN 모델은 Computer Vision의 많은 문제들의 backbone으로 사용됩니다.
3) CNN은 어떤 과정에 의해 발전되었는가?
가장 처음으로 효과적으로 사용된 것은 1998년에 만들어진 간단한 CNN인 LeNet-5였습니다. LeNet은 우편번호를 인식하는 방법에 잘 사용되었습니다. 이를 발전시킨 것이 AlexNet이였는데, LeNet과 다르게 7개의 hidden Layer를 사용했으며, ImageNet으로 학습을 시켰습니다. 이 때, 처음으로 ReLU와 dropout이 적용되었습니다. 실제 AlexNet은 2개로 나눠서 학습되었는데 그 당시에는 계산 자원과 메모리가 부족해서 나눠서 작업을 했습니다. AlexNet에서는 Local Response Normalization이라는 방법을 사용했지만 지금은 사용하지 않습니다. 이 방법은 명암을 정규화하는 역할을 했지만 추후 Batch normalization으로 대체되었습니다. 또한 11*11 처럼 큰 conv filter를 사용했지만 이 역시 현재까지도 사용하지 않습니다.
그 다음으로 발전하게 된 것 중 하나는 VGGNet입니다. 이전의 Neural Net보다 더 깊은 층을 쌓아서 학습시켰고, 좋은 퍼포먼스와 fine-tuning 없이 다른 테스크에서도 일반화되는 좋은 성능을 가진 Neural Net이었습니다.
오태현 교수님 - Annotation data efficient learning
1) Data Augmentation
일상에서 찍히는 사진들은 대부분이 bias를 가지고 있습니다. 그 이유는 사람에 의해서 촬영이 되고 사진학을 기반으로 구도를 잡고 찍기 때문입니다. 그래서 이러한 사진들에는 bias가 존재할 수 밖에 없습니다. 그렇다면 어떻게 현실의 데이터를 재현할 수 있을까요? 그 방법이 바로 Data Augmentation입니다. 예를 들어, 밝은 사진의 데이터로 학습을 시켰다고 해봅시다. 그 후에 약간 어두운 사진을 인퍼런스한다면 어떤 결과를 얻게 될까요? 아마도 좋은 결과는 얻지 못할 것입니다. 모델은 어두운 사진을 하나도 학습하지 못했기 때문이죠. 가지고 있는 데이터를 어둡게도 만들고, 다양한 형태로 만들어서 현실 데이터와 비슷하게 얻어내기 위한 방법입니다.
Augmentation 방법에는 Crop, Shear, Brightness, Perspective, Rotate 등이 존재하며 OpenCV와 NumPy 등을 활용하면 쉽게 만들 수 있습니다. 이러한 다양한 방법을 적용하는 것이 더 좋은 결과를 얻을 수 있었습니다.
2) Leveraging pre-trained information
지도학습은 항상 많은 양과 좋은 질의 데이터셋을 구해야 합니다. 하지만, 이것은 사람에 의해 만들어지기 때문에 비용도 비싸고 질이 안좋을 가능성이 높습니다. 이를 보완하는 방법 중 하나는 Transfer learning으로, 이미 학습한 모델에 적은 데이터셋을 학습시키는 방법입니다. 기본적인 아이디어는 비슷한 데이터셋들은 비슷한 정보를 포함하고 있을 것이라는 것에서 시작했습니다. Transfer learning에도 다양한 방법이 존재합니다.
첫 번째, 주어진 미리 학습된 데이터 셋에서 Conv Layer는 weight를 Freeze 시키고(학습 시키지 않음), Fully Connected Layer만 우리가 원하는 class의 dimension으로 바꿔주고 학습시키는 방법입니다.
두 번째, 전체 모델을 Fine tuning하는 방법입니다. 이것은 주어진 미리 학습된 데이터 셋에서 Conv Layer는 엄청 적은 Learning rate를 적용하고, Fully Connected Layer는 큰 Learning rate를 적용하는 방법입니다. 이것이 첫 번째 방법보다 더 좋은 방법입니다.
Transfer learning 말고 Knowledge distillation이라는 방법도 존재합니다. 기본적인 아이디어는 Teacher는 이미 train된 모델을 활용해서 Student Model에 대해서만 학습하는 방법입니다. 이 방법은 Student 모델이 Teacher 모델보다 작은 모델을 활용합니다.
위의 그림처럼 Teacher와 Student에게 A가 무엇인지에 대한 문제를 냅니다. 그러면 이미 학습이 잘 된 Teacher는 정답을 말할 것이고, Student는 모르니까 아무거나 고르게 됩니다. 그 후에 Distillation Loss(KL-divergence)에 의해서 Student는 답이 B라는 것을 학습하게 됩니다. 여기서 Distillation Loss는 각각의 softmax에 의해 만들어진 distribution을 비교하는 과정을 말합니다. 이 때의 softmax는 T로 나눠준 식으로 좀 더 소프트하게 값을 내주는 역할을 합니다. 그리고 Student는 T가 1인 softmax를 통해서 실제 정답과 비교해서 Student Loss를 또 학습합니다.
3) Leveraging unlabeled dataset for training
이 방법은 반지도 학습으로, label이 된 데이터와 label이 되지 않은 데이터를 활용하기 위한 방법입니다. 대표적으로 Self-training with noisy student라는 방법이 있고, Augmentation과 Teacher-Student networks와 반지도 학습을 적용한 것으로 가장 좋은 성능을 나타냈습니다. 기본적인 방식은 아래 그림과 같습니다.
가장 먼저 Teacher Model에 라벨링이 된 ImageNet 데이터를 학습시킵니다. 그렇게 학습된 Teacher Model로 라벨링 되지 않은 데이터를 인퍼런스해서 해당 데이터에 대한 가짜 레이블링을 합니다. 가짜 레이블링한 데이터와 이미 라벨링 된 ImageNet 데이터를 같이 Student 모델에 학습을 시킵니다. 이 과정에서는 RandAugment를 적용합니다. 그러면 이렇게 학습된 Student model을 라벨링 안되어 있는 데이터를 인퍼런스를 통해서 또 새로운 가짜 라벨링된 데이터를 구하는 방식으로 반복하게 됩니다.