기계 학습(Machine Learning, 머신 러닝)은 즐겁다! Part 3

Jongdae Lim
21 min readDec 16, 2016

--

딥러닝(Deep Learning)과 컨볼루션 신경망(Convolutional Neural Network 또는 CNN)

딥러닝(Deep Learning)에 관한 끝없는 뉴스 기사를 읽고는 있지만 실제로는 무슨 의미인지 잘 모르시나요? 그럼 이제 바꿔봅시다!

이번에는 딥러닝을 사용해서 사진속에서 객체를 인식하는 프로그램을 작성하는 방법에 대해 알아보도록 하겠습니다. 다시 말해, Google Photos에서 사진 속에 포함된 객체를 기반으로 원하는 사진을 검색할 수 있는 그 흑마법(black magic)에 대해 알려드리겠습니다.

Google에서는 이제 사진에 태그가 지정되지 않아도! 원하는 사진을 검색 할 수 있습니다! 도대체 어떻게 하는걸까요??

Part 1Part 2와 마찬가지로, 이 안내서는 기계 학습에 궁금한 점은 있지만 어디서부터 시작해야할지 모르는 사람들을 위한 것입니다. 이 글의 목표는 누구에게나 쉽게 다가가는 데 있습니다 — 이는 글에 많은 일반화가 있음을 의미합니다. 하지만 어떻습니까? 그래서 더 많은 사람들이 ML에 관심을 가지게 된다면, 목표를 달성한 것입니다.

(아직 Part 1Part 2,를 읽지 않았다면, 지금 읽어보세요!).

xkcd #1425 (원본 보기)

당신은 이 유명한 xkcd 웹툰를 본 적이 있을지도 모릅니다.

이 웹툰은 3살짜리 아이는 새의 사진을 쉽게 인식 할 수 있어도, 50년 이상 최고의 컴퓨터 과학자들은 컴퓨터로 객체를 인식하는 방법을 알아내기 위해 노력했으나 불가능했다는 것을 보여줍니다.

지난 몇 년 사이, 우리는 마침내 딥 컨볼루션 신경망(deep convolutional neural networks)을 사용해 드디어 객체 인식에 대한 좋은 접근방법을 발견했습니다. 마치 William Gibson의 SF소설에서 따온 인용문처럼 들리지만, 이 아이디어를 하나씩 차례 차례 들여다 보면 완전히 이해할 수 있습니다.

자 그럼 시작하겠습니다. 새를 인식할 수 있는 프로그램을 만들어 봅시다!

심플하게 시작

새의 사진을 인식하는 방법을 배우기 전에, 손으로 쓴 숫자 “8”과 같은 좀더 심플한 것을 인식하는 방법을 알아보겠습니다.

Part 2에서는 단순한 뉴런(neuron)을 많이 연결함으로써 신경망(neural network)이 어떻게 복잡한 문제를 해결할 수 있는지에 대해 배웠습니다. 그리고 우리는 얼마나 많은 침실이 있는지, 얼마나 큰지, 어느 동네에 있는지에 따라 집의 가격을 추정 할 수있는 작은 신경망을 만들었습니다.

우리는 또한 기계 학습이라는 아이디어는 동일한 일반 알고리즘을 다른 데이터로 재사용해서 다른 종류의 문제를 해결할 수 있다는 것을 알고 있습니다. 그럼 필기체를 인식하기 위해 이 신경망을 수정하겠습니다. 그러나 일을 정말 심플하게 만들기 위해, 우리는 하나의 글자인 숫자 “8”만을 인식할 해볼 예정입니다.

기계 학습은 데이터가 있을 때 그것도 아주 많이 있을 때 잘 동작합니다. 그래서 손으로 쓰여진 “8”이 정말 많이 필요합니다. 다행이도, 연구자들이 이와 같은 목적을 위해 필기체 숫자의 MNIST 데이터 세트(MNIST data set of handwritten numbers)를 만들었습니다. MNIST는 하나 당 18x18 픽셀 크기의 이미지로 60,000개의 필기체 숫자 이미지들를 제공합니다. 다음은 데이터 세트에 있는 “8”에 대한 이미지 예입니다.

MNIST 데이터 세트에 있는 여러가지 8 이미지

생각해 보면 모든 것은 그저 숫자일뿐입니다.

우리가 Part 2에서 만든 신경망은 입력으로 3 개의 숫자(“3”개의 침실, “2000” 평방 피트 등)만을 사용합니다. 그러나 이제 우리는 우리의 신경망으로 이미지를 처리하려고 합니다. 도대체 어떻게 숫자 대신 신경망에 이미지를 공급(feed)해야 할까요?

그 해답은 놀라울 정도로 심플합니다. 신경망은 숫자를 입력으로 사용합니다. 컴퓨터에서 이미지는 실제로 각각의 픽셀이 얼마나 어두운지를 나타내는 숫자 그리드일 뿐입니다:

우리의 신경망에 이미지를 공급(feed)하기 위해서는, 먼저 간단히 18x18 픽셀 이미지를 324개의 숫자들의 배열로 생각합니다.

324개의 입력을 처리하기 위해, 우리의 신경망이 324개의 입력 노드를 갖도록 변경하기만 하면 됩니다.

우리의 신경망에는 (단 하나가 아닌) 두 개의 출력이 있습니다. 첫 번째 출력은 이미지가 “8”일 가능성이고 두 번째 출력은 “8”이 아닐 가능성을 예측하는 것입니다. 인식하려는 개별 객체에 대해 별도의 출력을 가짐으로써, 우리는 신경망을 이용해 객체를 그룹으로 분류 할 수 있습니다.

이제 우리의 신경망은 지난 번 보다 훨씬 커졌습니다(3개 대신 324개의 입력!). 그러나 모든 최신의 컴퓨터는 순식간에 수백 개의 노드가있는 신경망을 처리 할 수 있습니다. 심지어 당신의 스마트폰에서도 잘 동작합니다.

이제 신경망을 “8”과 “8”이 아닌 이미지로 훈련시켜서 이를 구분할 수 있게 하는 것이 남았습니다. 만약 “8”을 제공(feed) 할 때 그 이미지가 “8”일 확율은 100 %이고 “8”이 아닐 확률은 0 %이 되어야 합니다. 반대의 경우도 마찬가지입니다.

다음은 우리의 훈련 데이터입니다:

음… 아주 멋진 훈련 데이터네요

우리는 최신 노트북에서 몇 분 안에 이런 종류의 신경망을 훈련시킬 수 있습니다. 훈련이 끝나면 “8”이라는 그림을 꽤 높은 정확도로 인식 할 수있는 신경망을 갖게 될 것입니다. (1980 년대 말) 이미지 인식 세상에 오신 것을 환영합니다!

편협한 생각

픽셀을 신경망에 제공(feed)하는 것만으로도 이미지 인식을 제작하는데 정말 효과적입니다. 기계 학습은 마술입니다! …정말 그런가요?

네, 실제로 그렇게 간단하지 않습니다.

일단, 좋은 소식은 우리의 “8” 인식기가 글자가 이미지 중간에 있는 단순한 이미지에서는 실제로 잘 작동한다는 것입니다.

그런데, 이제 정말 나쁜 소식이 있습니다:

우리의 “8”인식기는 문자가 이미지의 중심에 완벽하게 맞지 않으면 전혀 동작하지 않습니다. 아주 약간 위치만 바뀌어도 모든 것을 망치게 됩니다.

그 이유는 우리 신경망이 “8”이 완벽하게 중심에있는 패턴만을 배웠기 때문입니다. “8”이 중심에서 벗어난 것이 무엇인지 전혀 알 수 없습니다. 정확히 단지 하나의 패턴 만 알고 있습니다.

이런 것은 현실 세계에서 전혀 쓸모가 없습니다. 현실 세계의 문제는 결코 명확하고 단순하지 않습니다. 따라서 우리는 “8”이 완벽하게 중심에 있지 않은 경우에도 신경망을 동작시킬 방법을 알아내야 합니다.

무차별 대입(Brute Force) 아이디어 # 1 : 슬라이딩 윈도우(Sliding Window)로 찾기

우리는 이미 이미지의 중앙에 위치한 “8”을 찾을 수 있는 아주 좋은 프로그램을 만들었습니다.

그렇다면, 이미지를 작은 섹션으로 나누어 “8”을 찾을 때 까지 한번에 한 섹션씩 모두 스캔하는 방법은 어떨까요?

이 접근 방식을 슬라이딩 윈도우(sliding window)라고 합니다. 또한 이것은 무차별 대입(brute force) 솔루션입니다. 일부 제한된 경우에는 잘 동작하지만 실제로는 매우 비효율적입니다. 다양한 크기의 객체를 찾기 위해 같은 이미지를 계속해서 확인해야합니다. 이것보다 더 잘할 수 있습니다!

무차별 대입(Brute Force) 아이디어 # 2 : 더 많은 데이터와 딥 신경망(Deep Neural Net)

앞서 우리의 신경망을 훈련시킬때, 완벽하게 중앙에 위치한 “8”만을 보여주었습니다. 그렇다면 이미지안에 여러 크기의 다른 위치에 있는 “8”에 대한 더 많은 데이터로 훈련시키는 것은 어떨까요?

이를 위해서 새로운 훈련 데이터를 수집 할 필요는 없습니다. 스크립트를 작성해서 이미지내의 여러 다른 위치에 있는 “8” 이미지를 생성하면 됩니다.

이미 가지고 있는 훈련 이미지의 다른 버전을 만들어서 합성 훈련 데이터(Synthetic Training Data)를 만들었습니다. 이것은 매우 유용한 테크닉입니다!

이러한 테크닉을 통해 우리는 훈련 데이터를 손쉽게 무한정 공급할 수 있습니다.

데이터가 많을수록 당연히 신경망이 해결하기가 더 어려워집니다. 하지만 네트워크를 더 크게 만들어 더 복잡한 패턴을 배울 수 있도록 함으로써 이를 보완 할 수 있습니다.

신경망을 크게 만들기 위해서 단지 노드의 레이어를 중첩하면 됩니다:

전통적인 신경망(traditional neural network)보다 더 많은 계층(layers)을 가지고 있기 때문에 우리는 이것을 “딥 신경망(deep neural network)”이라고 부릅니다.

이 아이디어는 이미 1960년대 말부터 있었습니다. 그러나 최근까지도 이러한 대규모 신경망을 훈련하는 것은 너무 느렸습니다. 그러나 일반적인 컴퓨터 프로세서 대신에 (매트릭스 곱셈을 정말 빠르게하기 위해 고안된) 3D 그래픽 카드를 사용하는 방법을 알게되면서 대규모 신경망으로 작업하는 것이 갑자기 실용적이되었습니다. 실제로 Overwatch를 플레이 할 때 사용하는 것과 완전하게 동일한 NVIDIA GeForce GTX 1080 비디오 카드를 사용해서 신경망을 매우 빠르게 훈련시킬 수 있습니다.

그러나, 우리가 신경 네트워크를 아주 크게 만들고 3D 그래픽 카드로 신속하게 훈련시킬 수는 있겠지만, 여전히 이것이 그대로 솔루션이 되는 것은 아닙니다. 이미지를 우리의 신경망에서 처리하는 방법에 대해서는 좀더 영리해 져야 합니다.

생각해 보십시오. 두 가지 경우가 완전히 다른 객체라고 보고 그림의 위쪽에 있는 “8”을 인식하도록 신경망을 훈련시키는 것과 그림의 아래쪽에 있는 “8”을 별도로 인식하도록 훈련시키는 것은 정말 말이 안됩니다.

“8”이 그림의 어느 위치에 있더라도 추가적인 훈련 없이 같은 것이라고 인식할 만큼 충분하게 현명한 신경망을 만들 방법을 찾아야 합니다. 다행이도… 있습니다!

그 해결책이 바로 컨볼루션(Convolution) 입니다

인간인 당신은 사진에 계층 구조 또는 개념 구조(hierarchy or conceptual structure) 있음을 직관적으로 알 수 있습니다. 다음 그림을 보겠습니다.

우리 아들의 그냥 사진

인간으로서, 당신은 이 그림에서 계층구조를 즉시 인식하게 됩니다.

  • 땅은 잔디와 콘크리트로 덮여 있습니다.
  • 한 아이가 있습니다.
  • 이 아이는 점핑말(bouncy horse)에 앉아 있습니다.
  • 점핑말은 잔디 위에 있습니다.

가장 중요한 것은, 우리는 아이가 어떤 면(surface) 위에 있더라도 아이라는 개념을 인식할 수 있습니다. 우리는 아이가 나타날 수있는 모든 가능한 면(surface)에 대해서 아이라는 개념의 인식을 다시 배울 필요는 없습니다.

*역자주: 여기서 면(surface)는 앞서 설명한 계층구조(hierarchy)의 하나의 계층 또는 레이어(layer)를 의미합니다.

그러나 지금 당장 우리의 신경망이 이런 일을 할 수 없습니다. 현재는 이미지의 다른 부분에있는 “8”을 서로 완전히 다른 것이라 생각합니다. 그림상에서 어떤 객체를 움직인다고 해서 바뀌는 건 없다는 것을 이해하지 못합니다. 즉, 가능한 모든 위치에서 각 객체를 식별하는 것을 모두 다시 학습해야 한다는 뜻입니다. 이건 정말이지 끔찍하네요.

우리는 “8”은 그림에서 어디에 나타나더라도 “8”이라는 이동 불변성(translation invariance)을 우리의 신경망이 이해하도록 해야 합니다.

컨볼루션(Convolution)이라 부르는 프로세스를 사용해서 이 작업을 수행할 것입니다. 컨볼루션은 컴퓨터 과학과 생물학에서 부분적으로 영감을 받은 아이디어입니다(예를 들어, 어떤 미친 과학자가 고양이가 이미지를 처리하는 방법을 알아 내기 위해 이상한 탐침으로 고양이 두뇌를 진짜로 찔러보면 된다는 생각).

컨볼루션(Convolution)의 동작 방식

우리의 신경망에 전체 이미지를 한 개의 그리드로써 전체 이미지를 공급(feed)하는 대신에, 객체는 그림의 어디에서 나타나더라도 동일한 것이라는 아이디어를 활용해서 훨씬 더 똑똑한 방법을 사용할 것입니다.

단계별로 어떻게 동작하는지 알아보겠습니다 —

Step 1: 이미지를 중첩된 이미지 타일들로 나누기

앞선 슬라이딩 윈도우 검색과 유사하게, 원본 이미지 전체에 슬라이딩 윈도우를 적용해서 각 결과를 별도의 작은 그림 타일로 저장합니다:

이렇게 해서, 원본 이미지를 동일한 크기의 작은 이미지 타일 77개로 변환했습니다.

Step 2: 각 이미지 타일을 작은 신경망에 제공(feed)하기

앞서 우리는 “8”인지 확인하기 위해 하나의 이미지를 신경망에 제공(feed)했습니다. 여기서도 똑같은 작업을 할 것입니다. 다만 각 개별 이미지 타일에 대해 이 작업을 수행 할 것입니다.

한번에 한개의 타일에 대해 77번 반복합니다.

하지만 한가지 중요한 변화가 있습니다: 우리는 동일한 원본 이미지의 모든 단일 타일에 대해 동일한 신경망 가중치(same neural network weights)를 유지할 것입니다. 다시 말해서, 모든 이미지 타일을 동일하게 취급합니다. 어떤 타일에 무엇인가 흥미로운 것이 나타나면, 그 타일을 흥미있는 것이라고 표시 할 것입니다.

Step 3: 각 타일에 대한 결과를 새로운 배열에 저장하기

원본 타일의 배열(array) 형태를 버리고 싶지는 않습니다. 따라서 각 타일을 처리 한 결과를 원본 이미지에 대한 동일한 배열 형태로 그리드에 저장합니다. 이 과정은 다음과 같습니다:

다시 말해서, 하나의 큰 이미지로 시작해서 원래 이미지의 어느 부분이 가장 흥미로운지를 기록한 조금 크기가 작아진 배열을 얻게 됩니다.

Step 4: 시료 채취하기

Step 3의 결과는 원본 이미지의 어느 부분이 가장 흥미로운지를 나타내는 배열이었습니다. 그러나 이 배열도 여전히 너무 큽니다:

배열의 크기를 줄이기 위해서, 맥스-풀링(max pooling)이라는 알고리즘을 사용해서 시료를 채취하겠습니다. 정말 멋지게 보이는데, 사실 그 뿐 만이 아닙니다!

우리는 단순히 결과 배열을 2x2 정사각형으로 나누어 각각에서 가장 큰 숫자만을 취합할 것입니다:

이 아이디어는 각 2x2 사각형 격자(square grid)를 구성하는 4개의 입력 타일에서 흥미로운 것을 찾으면, 가장 흥미로운 것도 유지할 수 있다는 것입니다. 이를 통해 가장 중요한 부분을 유지하면서도 배열의 크기를 줄일 수 있습니다.

마지막 Step: 예측 하기

지금까지 커다란 이미지의 크기를 상당히 작은 배열로 줄였습니다.

자 이제 어떻게 해야 할까요? 이 배열은 결국 숫자들의 집합일뿐입니다. 따라서 이제 우리는 이 작은 배열을 다른 신경망에 제공할 입력으로 사용할 수 있습니다. 이 최종 신경망이 이미지가 일치하는지 또는 일치하지 않는지를 결정해줄 것입니다. 앞선 컨볼루션 단계(Step)들과 구분하기 위해 이를 “완전히 연결된” 망(“fully connected” network)라 부르겠습니다.

정리하자면, 시작에서부터 끝까지 전체 5 단계의 경로(pipeline)는 다음과 같습니다.

더 많은 단계를 추가하기

우리의 이미지 처리 경로(pipeline)는 다음과 같은 일련의 단계들로 이루어집니다: 컨볼루션(convolution), 맥스-풀링(max-pooling), 그리고 마지막 완전히 연결된 망(fully-connected network)

현실 세계의 문제를 해결할 때는 이러한 단계를 원하는만큼 많이 조합하고 반복할 수 있습니다! 2 개, 3 개 또는 심지어 10 개의 컨볼루션 레이어를 가질 수 있습니다. 데이터의 크기를 줄이고 싶다면 어느 단계에서나 맥스-풀링을 실행하면 됩니다.

기본 아이디어는 큰 이미지로 시작해서 마지막으로 하나의 결과가 나올 때까지 단계적으로 반복해서 데이터를 압축해 가는 것입니다. 더 많은 컨볼루션 단계를 가져갈 수록, 당신의 신경망은 학습을 통해 더욱 복잡한 형상을 인식할 수 있습니다.

예를 들어, 첫 번째 컨볼루션 단계에서는 날카로운 모서리를 인식하는 법을 배울 수 있고, 두 번째 컨볼루션 단계에서는 이 날카로운 모서리에 대한 지식을 사용해서 부리를 인식 할 수 있으며, 세 번째 단계에서는 부리에 대한 지식 등을 사용해서 전체 새를 인식 할 수도 있을 것입니다.

(연구 논문에서 찾을 법한) 보다 현실적인 딥 컨볼루션 망은 다음과 같습니다:

위 그림은 224x224 픽셀 이미지에서 시작해서, 컨볼루션과 맥스 풀링을 두 번 적용한 다음 컨볼루션을 추가로 3번 더 적용합니다. 그리고 다시 맥스 풀링을 적용한 다음 두 번의 완전히 연결된 망의 단계(layers)를 적용합니다. 최종 결과는 이미지가 1000개의 범주 중 하나로 분류되는 것입니다.

정확한 신경망 구축하기

그런데 이미지 분류기(image classifier)가 잘 동작할 수 있도록 어떤 단계들을 결합해야 하는지 어떻게 알 수 있을까요?

솔직히 말해서, 많은 실험과 테스트를 통해서만 답을 얻을 수 있습니다. 해결하려는 문제에 대한 최적의 구조와 매개 변수를 찾기 까지 어쩌면 100개의 신경망를 훈련시켜야 할 수도 있습니다. 기계 학습에는 많은 시행 착오가 뒤따릅니다.

새 분류기 만들기

이제 우리는 사진이 새인지 아닌지를 결정할 수있는 프로그램을 작성할 수 있습니다.

항상 그렇듯이 시작하기 위해서는 데이터가 필요합니다. 무료 CIFAR10 데이터 세트(CIFAR10 data set)에는 6,000 장의 새 사진과 52,000 장의 새가 아닌 사진이 포함되어 있습니다. 그러나 더 많은 데이터를 얻기 위해 12,000 장의 새 사진이 있는 Caltech-UCSD Birds-200–2011 데이터 세트(Caltech-UCSD Birds-200–2011 data set)도 추가 할 것입니다.

합친 데이터 세트에 있는 새들 사진 중 일부:

52,000장의 새가 아닌 사진 중 일부:

이 데이터 세트는 우리의 목적에 맞게 잘 동작하겠지만, 72,000개의 저해상도 이미지는 현실 세계의 애플리케이션에 사용하기에는 여전히 작은 데이터입니다. Google 수준의 성능을 원한다면 수백만 개의 고해상도 이미지가 필요합니다. 기계 학습에서 더 나은 알고리즘을 사용하는 것 보다 더 많은 데이터를 보유하는 것이 언제나 더 중요합니다. 이는 현재 Google이 무제한 사진 저장 용량을 제공하는 이유입니다. 당신의 달콤하고 달콤한 데이터를 원합니다!

새 분류기를 만들기 위해 TFLearn을 사용할 것입니다. TFlearn은 단순화 된 API를 제공하는 Google의 TensorFlow 딥러닝 라이브러리의 래퍼(wrapper)입니다. 이를 이용하면 신경망 계층을 정의하는데 단 몇 줄의 코드만 작성하면 되는 수준으로 컨볼루션 신경망을 네트워크 작성을 쉽게 할 수 있습니다.

신경망을 정의하고 훈련시키기 위한 코드:

Nvidia GeForce GTX 980 Ti 또는 그 상위 제품과 같이 충분한 RAM을 갖춘 좋은 비디오 카드로 훈련시키면, 1시간 이내에 훈련을 완료 할 수 있습니다. 일반 CPU로 훈련시킨다면 시간이 조금더 오래 걸릴 것입니다.

훈련을 시킬 수록 정확도는 높아집니다. 첫 번째 훈련 후에 75.4%의 정확도를 얻었습니다. 단 10회 훈련한 후 이미 91.7%까지 올라갔습니다. 50회 정도 지나면 95.5 %의 정확도에 이르렀고 추가 훈련은 도움이되지 않았기 때문에 거기에서 멈추었습니다.

축하합니다! 우리의 프로그램은 이제 이미지에서 새를 식별할 수 있습니다.

신경망 테스트 하기

이제 우리는 훈련된 신경망을 만들었고 바로 사용할 수 있습니다! 하나의 이미지 파일이 새인지 아닌지 예측하는 간단한 스크립트를 확인해 보세요.

그러나 우리 신경망이 얼마나 효과적인지를 실제로 확인하기 위해서는 아주 많은 이미지로 테스트해야합니다. 유효성 검사를 위해 15,000개의 이미지를 포함한 데이터 세트를 만들었습니다. 우리의 신경망에 이 15,000 개의 이미지를 실행해보니, 95% 수준으로 정확한 대답을 예측했습니다.

꽤 괜찮아 보이죠? 글쎄요… 상황에 따라 다르겠지만요!

정확도 95%는 얼마나 정확한 것일까요?

우리의 신경망은 95% 정확하다 할 수 있습니다. 그런데 자세히 들여다 보면 문제가 있습니다. 95%라는 것은 다른 의미로 볼 수도 있습니다

예를 들어, 만약 훈련 이미지의 5 %가 새이고 나머지 95%가 새가 아닌 경우 어떻게 될까요? 매번 “새가 아니다”라고 추측하는 프로그램이 있다면 이것은 95% 정확한 것이 됩니다! 그러나 이것은 또한 100% 쓸모 없습니다.

평균적인 정확도 보다 숫자를 좀 더 자세히 들여다 볼 필요가 있습니다. 분류 시스템이 실제로 얼마나 좋은지 판단하기 위해서, 우리는 실패한 시간의 비율이 아니라 어떻게 실패했는지를 면밀히 조사해야합니다.

우리의 예측을 “맞다”와 “틀리다”로 생각하는 대신, 다음의 네 가지 범주로 나누어 보겠습니다 —

  • 첫째, 다음은 우리의 신경망이 올바르게 식별 한 새들 사진의 예입니다. 이것을 맞힌 긍정(True Positives)이라고 하겠습니다.
와우! 우리의 신경망은 여러 종류의 새들을 성공적으로 인식할 수 있습니다!
  • 둘째, 다음은 “새가 아니다”라고 올바르게 식별 한 이미지들입니다. 이것를 맞힌 부정(True Negatives)이라고 하겠습니다.
말과 트럭 정도에는 속지 않습니다!
  • 셋째, 새라고 생각했지만 실제 새가 아닌 이미지들 입니다. 이것은 우리의 틀린 긍정(False Positives)입니다:
많은 비행기를 새라고 착각했습니다! 이해는 됩니다.
  • 그리고 마지막으로, 우리가 정확하게 새로 인식하지 못한 이미지들입니다. 이것은 우리의 틀린 부정(False Negatives)입니다:
이 새들에게 속았습니다. 망할 타조 같으니라고! 타조도 새라고 해야 합니까?

15,000개 이미지의 유효성 검사 세트를 사용해서, 우리의 예측이 각 카테고리별로 어떻게 분류 되는지 알아보았습니다.

왜 결과를 이런 식으로 세분화해야 할까요? 그 이유는 모든 실수가 같은 원인으로 발생하기 않기 때문입니다.

MRI 이미지로부터 암을 찾아내는 프로그램을 작성했다고 상상해보십시오. 우리가 암을 찾아낸 경우에 거짓 부정(false negatives)보다 거짓 긍정(false positives)이 더 낫습니다. 프로그램이 실제로 암에 걸린 사람에게 전혀 암에 걸리지 않았다고 말하는 경우를 보면 거짓 부정(false negatives)은 좋지 않을 수 있습니다.

평균적인 정확도를 보는 대신 Precision과 Recall을 계산했습니다. Precision과 Recall 측정 항목을 통해 얼마나 잘 수행했는지 보다 명확하게 알 수 있습니다.

위 결과는 우리가 97% 정확도로 “새”를 추측했음을 보여줍니다. 아주 잘 했습니다! 그러나 데이터 세트에서 실제 새의 90%만 발견했다는 사실도 알 수 있습니다. 바꿔 말하자면, 우리는 모든 새를 발견하지 못할 수도 있지만, 발견했을 때는 꽤 확실하게 맞출 수 있습니다!

이제 무엇을 해야 하나요?

딥 컨볼루션 망(deep convolutional network)의 기본 사항을 알았으니, 이제 다른 신경망 아키텍처에 직접 도전에 보기위해 tflearn에 관한 몇 가지 예제를 해보십시오. 여기에는 데이터 세트도 포함되어 있어 필요한 이미지를 찾을 필요 조차 없습니다.

당신은 이제 기계 학습의 다른 영역으로 확장해서 학습할 만큼 충분한 지식이 갖추었습니다. Atari 게임을 플레이하는 방법을 컴퓨터에 훈련시키기 위한 알고리즘을 어떻게 사용하는지 공부해보는 것은 어떨까요?

*역자주: 번역글과 관련해 의견 주시려면, 저에게 직접 이메일을 보내시거나 LinkedIn에서 저를 찾으셔도 됩니다.

--

--

Jongdae Lim

I’m a Java guy, working at Microsoft as a principal software engineering manager in CSE(Commercial Software Engineering).