[음악] 앞에서 CNN, 컨볼루셔널 뉴럴 네트워크의 기본 아이디어, 로컬 피처를 익스트랙션하자. 그다음 그걸 가공하자에 대해 말씀드렸고, 로컬 피처를 뽑아서 가공하는 연산이 컨볼루션과 풀링에 대해 말씀드렸고요. 이제 그것들을 다 결합해서 실제로 컨볼루셔널 뉴럴 네트워크의 구조... 실제로 컨볼루셔널 뉴럴 네트워크를 만드는 거죠? 그것에 대해서 말씀드리겠습니다. 자, 앞에서 말씀드린 걸 정리하면, 일단 이미지가 있고요. 이미지의 컨볼루션과 스레숄드, 이 두 가지를 합쳐서 그냥 컨볼루션이라고 말하는 경우도 있다고 했죠? 이걸 합쳐서 컨볼루션이라고 말할 수도 있고, 스레숄드, 렐루죠? 렐루를 빼고, 컨볼루션이라고 말하는 경우도 있다고 말씀드렸는데, 여하튼. 컨볼루션, 스레숄드, 풀링. 이렇게 세 단계로 이루어지고, 이걸 통해 만들어지는 게 바로 피처 맵. 피처 맵이 나온다고 말씀드렸어요. 자, 이걸 가지고 여러분이 이제부터 어떻게 이미지 프로세싱을 하냐. 그것에 대해 살펴보겠습니다. 입력이 있으면, 예를 들어 개/고양이라고 하죠. 여러분이 개/고양이 구분기를 만드셔야 하는데요. 그럼 여러분이 첫 번째로 할 일이 뭐죠? 개/고양이를 구분하는 데, 도움이 되는 로컬 피처가 뭘까 고민하셔야 돼요. 그다음에 그 로컬 피처를 정의하셔야겠죠? 로컬 피처를 정의한다는 얘기는, 제가 여기 안 그렸습니다만, 여기 뭐가 존재하는 거죠? 예. 필터, 마스크가 있어야 되겠죠? 아, 이러이러한 로컬 피처가 필요할 거야. 마스크. 정의는 일단 사람이 하기로 했죠, 우리? 여러분이 마스크를 하나 정의하셔서 그 마스크를 가지고 저런 컨볼루션, 스레숄드, 풀링을 할 피처 맵을 하나 만들어내고, 그다음에 로컬 피처 하나만 가지고는 안 되겠죠, 당연히. 그래서 또 뭐가 있을까? 개/고양이를 구분하는 데 도움이 되는 로컬 피처가 뭘까 고민해서 두 번째 로컬 피처를 여러분이 찾아내요. 아, 이런 로컬 피처가 있으면 도움이 될 것 같다, 라고 해서 이렇게 로컬 피처를 정의하시고, 여러분이 또 돌리고, 또 땡 땡 땡해서 n개니까, 이렇게 해서 또 이렇게, 로컬 피처를 찾아내요, 이렇게. 그래서, 여러분이 로컬 피처를 머릿속에서 잘 디자인해서, 피처 맵을 n개를 만들었다고 치죠. 앞에서 설명한 게 여기까지예요. 그렇죠? 여기까지 설명했어요. 그다음에는 어떻게 하죠? 라는 질문이죠. 그다음에는 어떻게 하면 될까요? 그다음에는... 여러 가지 옵션이 있는데, 생각해보면 옵션 하나는 이겁니다. 앞에서 말씀드린 대로 이 각각은 피처 맵이었고, 피처 맵이라는 건 이미지라고 부를 수 있었죠. 이미지. 이미지. 이미지. 결국 피처 맵이 이미지라고 했잖아요. 이미지, 이미지, 이미지가 됐으니까. 여기에서 한번, 우리 마술을 한번 부려보도록 할게요. 무슨 마술이냐면, 지금은 1채널짜리 이미지, 1채널짜리 이미지... 이미지가 n개가 있는데, 이걸 조삼모사로 샥, 하고 마술을 부렸어요. 무슨 얘기죠? 아까는 채널 하나짜리 이미지가 n개가 있었는데, 아까는 1채널짜리 이미지 몇 개가 있었죠? 1채널짜리 이미지 n개가 있었는데, 이제는 어떻게 하냐면 n채널짜리 1개의 이미지로 샥! 조삼모사로 이렇게 바꿔치기할게요. 사실은 그냥 생각만 바꾸면 될 문제죠. 다시 말씀드리면, 지금 컨볼루션이 몇 개가 있는 거죠? 여기 한 번, 두 번, 세 번, 네 번, 해서 n개. 컨볼루션이 있다는 얘기는 뭐가 있다는 얘기죠? 마스크. 컨볼루션 마스크가 1개, 2개, 3개, ..., n개의 마스크가 있어서. n개의 컨볼루션 마스크가 n개의 피처 맵을 만들어냈는데, 그 피처 맵을 착착 쌓아가지고 1개의 이미지로 간주하자고요. 1개의 이미지로 간주하자고요. 1개의 이미지로. 한 개의 이미지로 간주하면 얘는 채널이 몇 개죠? 대신 1개의 이미지니까, 채널은 채널 수는 n개가 되는 거죠. 채널 n개를 가진 하나의 이미지로 변환을 하자고요. 이건 아무 어려움이 없죠? 그냥 얘를 묶어서 한 개라고 생각하자, 라고 하는 겁니다. 결국 컨볼루션이 뭘 한 거냐면 이미지 하나가 들어가서 결국 이미지 하나가 나오는 셈이 된 거예요. 자 그러면 '이것도 이미지네...' 물론 이 이미지가 로컬 피처의 정보를 담고 있기는 하지만, 이것도 이미지니까 뭐하면 되죠? '야, 이것도 이미지니까, 컨볼루션 한 번 더 하자.' 해도 될까요, 안 될까요? 안 될 이유 뭐 있어요? 이미지에 컨볼루션할 바에야 이것도 결국은 이미지인데, 이미지에 컨볼루션 한 번 더 하면 되죠. 다시 말하면, 이건 피처죠? 피처니까. 이미지에서 로컬 피처를 찾아냈다면 이제 뭐하는 거죠? 피처 맵에서 피처를 찾아내는 일을 하는 겁니다. 좀 복잡합니다, 여기서부터는. 이미지에서 피처를 찾아내고, 찾아낸 피처들에서 다시 하이 레벨의 피처를 찾아내요. 다시 말하면 여기서 또 컨볼루션을 하는 거예요. 이것을 이미지로 간주해서... 이걸 이미지로 간주해서 또 컨볼루션해서 로컬 피처를 찾고, 찾고, 찾는 거죠. 그래서 또 이걸 짠! 하고 다시 뭉쳐요, 이렇게. 이렇게 뭉치고 나면 다시 이미지가 되잖아요? 이걸 계속 반복, 반복하는 겁니다. 그러면 무슨 얘기가 되냐? 이미지에서 피처를 찾고, 그 피처의 피처를 찾고, 한 번 더 하면, 피처의 피처의 피처를 찾고, 한 번 더 하면, 피처의 피처의 피처의 피처를 찾으니까, 점점... 이미지에서 정보를 뽑아내는 것이 점점 하이 레벨 정보를 뽑아내는 거다, 라고 이해할 수 있겠죠. 물론 여기서 고민은 돼요. '저 컨볼루션 마스크는 누가 정의해요?'라는, 상당히 곤란한 질문을 하게 되죠. 첫 번째 여기서는 컨볼루션 마스크를 사람더러 찾으라고 하면, 찾을 것 같아요. 그렇죠? 왜냐하면 개/고양이를 구분하는 피처가 뭐가 있을까... 하면 뭐 대충 찾으라고 하면 찾을 것 같은데. 이건 좀, 이미지이기는 하지만, 조금 추가 정보가 섞여 있는 이미지니까, 도대체 이 이미지에서 어떤 로컬 피처를 찾아야 도움이 될까? 어떤 로컬 피처를 찾아야 도움이 될까? 생각해보면 이게 쉽지 않아요. 피처 맵을 여러분이 정의해야 하는데, 여기 피처 맵을 여러분이 정의해야 되는데, 그거 생각하기가 쉽지 않아요. 여기도 어떤 피처의 피처 맵? 필터죠. 어떤 필터를 우리가, 정의해야 하는가. 쉽진 않아요. 그래서 말씀드린 대로 이 과정이 아, 아이디어는 좋은데요... 피처를 찾고 다시 피처를 가공해서 더 좋은 피처를 찾고, 가공된 피처를 가공해서 더 좋은 피처를 찾고 해서 가공, 가공, 가공해서 계속 가는 게 좋기는 한데, 그걸 누가 디자인합니까? 라는 이슈는 있어요. 그건 잠시 접어두고요. 이런 식으로 이미지에서 로컬 피처를 찾고, 로컬 피처에서 더 높은 로컬 피처를 찾고, 또 이걸 계속 반복하다 보면, '진짜 개/고양이를 구분하는 데 도움이 되는 훌륭한 로컬 피처가 나오지 않겠니?' 나오겠죠. 단, 마스크를 잘 정의할 때. 필터를 잘 정의할 때라는 단서가 붙기는 하지만. '그래, 뭐 되겠지...' 라는 거죠. 예. 그게 바로 컨볼루셔널 뉴럴 네트워크예요. 컨볼루셔널 뉴럴 네트워크를 보면요, 계속 여기에서, 이것을 찾고, 찾고, 찾고, 찾고 찾고, 찾고... 해서, 컨볼루션, 풀링, 컨볼루션, 풀링, 컨볼루션, 풀링, 컨볼루션, 풀링...을 계속해요. 그러면 맨 마지막 단계 여기에 오면, 지금 이렇게 그려놨는데요, 이렇게 그려놨는데, 조금 생소해 보일 수는 있는데, 이게 뭐냐면, 앞에서 말한 그림 한 장 있죠? 그림 한 장, 그림 한 장, 그림 한 장을 앞에서 땡땡땡땡... 해서 앞 그림과 조금 비교해보면, 저는 앞에서는 이 그림을 이렇게, 이렇게 말했죠. 이렇게 했는데 이것은 보통 이렇게 안 그리고요, 이런 식으로, 식빵처럼 그려요. 이건 그냥 그림이 여러 장 쌓여 있는 거다. 다시 말하면, 지금 로컬 피처, 로컬 피처, 로컬 피처에서 나온 각각의 채널들을 묶어놓은 거다. 이렇게 보시면 됩니다. 그래서 최종적으로 컨볼루션, 풀링, 컨볼루션, 풀링... 해가지고 최종적으로 이런 식빵 모양이 나올 거고. 결국 이 식빵을 말하는 거죠? 이 식빵. 이 식빵이 나오고, 이 식빵을 어떻게 하냐면 그다음에 이건 뭐가 되겠죠? 피처가 되는 거죠. 최종적인 피처 맵. 다시 말씀드리면 개/고양이를 구분하는 데 어떤 피처를 보면 개/고양이 구분이 잘될까를 고민해서 컨볼루션, 풀링, 컨볼루션, 풀링...을 많이 해서 이거. 이거 이거. '이것을 찾아보면 개/고양이 구분이 진짜 잘되는 그런 피처들이에요' 라고 피처 가공을 했죠. 그래서 이만큼까지가 피처 가공에 해당되고요. 그러면 이 피처를 보고 구분하면 되겠죠? 구분이 뭐냐. 클래시파이어죠? 그러니까 여기에다가 쉘로우 네트워크를 갖다 붙여요. 여기에 쉘로우 네트워크를 갖다붙이면, 드디어 이게 컨볼루셔널 뉴럴 네트워크가 됩니다. 그러니까 컨볼루셔널 뉴럴 네트워크는 별 게 아녜요. 결국은 컨볼루션-풀링을 이용해서 피처 가공, 피처 가공...을 해서 마지막에 나온 이건 피처이고, 이 피처는 개/고양이를 구분하는 진짜 도움이 될 피처예요. 물론, 필터, 마스크를 잘 정의했을 때. 이건 그런 피처예요. 그럼 이걸 보고 이제 개/고양이를 구분하라고 하면 무지 쉽게 개/고양이를 구분할 수 있는 놈이 되는 거죠. 그러니까 여기에 쉘로우 네트워크를 달아 붙여가지고, 이것이 쉘로우 네트워크으 입력으로 들어가게... ...하게 됩니다. 이것이 쉘로우 네트워크의 입력으로 들어가서, 쉘로우 네트워크가 짜자자자작! 해가지고 최종 결과를 짠! 하면 잘되지 않겠니? 라는 아이디어. 그게 바로 CNN이 되겠습니다. 자 그럼 이제 이게 사실 CNN의 최종 모양이 되겠고요, 그래서 여러분 이 그림을 해석하는 것, 이 부분만 조금 살펴볼게요. 이 그림이 이제 숫자들이 많이 있는데요. 숫자들을 좀 읽는 연습을 하도록 하겠습니다. 먼저 그 전에 이걸 보도록 할게요. 이걸 보면서 좀 말씀을 드릴게요. 자 여기서 이쪽으로 갈 때, 이 그림이 좀더 좋겠군요. 앞으로 가겠습니다. 여기서 여기로 갈 때. 여러분이 여기 필터를 정의해야 되죠? 그 필터의 모양을 좀 말할 수 있을까요? 필터는 3x3이라고 할게요. 3x3이라고 하고, 이 3x3이면... 여기서 이쪽으로 가는 필터, 그 필터의 채널 수는 몇 개죠? 채널 수? 기억나시나요? 필터의 수는 뭐와 같다? 입력의 채널과 같다고 그랬죠? 입력 채널은 몇 채널? n 채널. 그러니까 여기는 필터가 어떻게 생겼냐면 이렇게 해가지고 3x3 필터가 있고, 이렇게 생긴 것이 몇 개가 존재하냐면, n개가 존재합니다. 이렇게 해서 이것도 이렇게 해서... n개. n개의 필터가 존재해야 되는 거죠. 이렇게 생긴 게 몇 개 있죠? 여기도 똑같이 생긴 이 덩어리가 존재하고, 여기도 이렇게 생긴 덩어리가 존재해요. 자 그러면 여러분이 여기에서 이쪽으로 넘어올 때, 이쪽을 볼게요. 여기에서 이쪽으로 넘어올 때, 여기 필터가 있죠? 필터는 여러분이 정의해야 된다고 그랬죠? 물론 마지막에 가면 여러분이 하는 것 아니니까, 걱정하지 마세요. 지금 단계는 여러분이 한다고 제가 말할게요. 이렇게 생긴 n개의 채널을 가진 3x3 필터가 몇 개 존재하는 거죠? 하나, 둘, 몇 개? 개수가 몇 개? 개수가 몇 개? m개가 존재하죠. m개. m개가 존재합니다. 자 그러면 여러분이 이 필터를 정의하기 위해서는 여기 여기 여기 여기 여기 여기. 그 다음 여기 여기... 그 다음 여기 여기... 또 여기... 해서 숫자를 다 채워넣어야 하는 거죠? 여기 여기 여기... 숫자를 다 채워넣어야만 필터가 정의되니까. 자 그럼 여기에서 이쪽으로 넘어갈 때 여러분이 필터에 채워넣어야 할 숫자의 총 개수는 몇 개일까요? 채워넣어야 할 총 숫자의 개수. 필터를 여러분이 정의해야 한다고 한다면, 필터의 개수 총 몇 개를 정의해야 되죠? 일단 3x3만큼은 채워넣어야 되고. 이 채널이 n개. n개는 뭐가 되죠? 입력 채널 수. 그다음에 이렇게 생긴 덩어리가 몇 개 존재하죠? 하나, 둘, 셋, ..., 몇 개? m개. m개는 뭐죠? 출력의 채널 수. 예, 곱하기 출력의 채널 수. 이건 입력의 채널 수, 이건 출력의 채널수예요. 기억하시기 바래요. 여러분이 이 하나의 컨볼루션 레이어에서 입력에서 출력으로 가는데, 입력은 n 채널, 출력은 m 채널일 때, 여기서 이리로 넘어갈 때 여러분이 채워야 할 필터 내의 숫자 개수. 여러분이 채워야 할 필터 내의 숫자 개수는 몇 개냐? 라는 질문이 있으면 필터의 크기 곱하기 입력 채널 수 곱하기 출력 채널 수다, 라는 걸 꼭 기억하시기 바래요. 이거 여러분이 나중에 CNN 모델의 크기를 계산할 때 이게 자주 나오게 되는, 겪게 되는 문제입니다. 그래서 아, 내가 만든 CNN이 무지하게 크구나! 저 GPU에는 안 들어가겠다... 뭐 이런 계산을 여러분이 해야만, 되거든요? 그래서 그 계산할 때 필요합니다. 그래서 먼저 이 입력의 채널 수 출력의 채널 수 곱하기 필터의 크기만큼의 숫자를 여러분이 채워넣어야 한다, 라는 것. 기억하시고요. 그다음에는 이 부분, 앞서 말씀드린 대로 이 부분을 이해하는 것을 한번 설명하도록 하겠습니다. 자 여기 보면 어떻게 생겼죠? 여기 잘 보시면 이렇게 해서 이렇게 한 다음에 32x32하고 이렇게 해서 32x32에 여기는 3 되어 있어요. 이게 무슨 의미일까요? 일단 입력의 크기가 32x32. 작은 이미지네요. 32x32의 굉장히 작은 이미지고. 채널 수는 얼마? 3 채널. 컬러라는 얘기죠? 3 채널을 받았어요. 그다음에 이렇게 해서 여기에 3, 3 적혀 있죠. 무슨 얘기일까요? 컨볼루션의 필터의 크기가 3x3이었다는 얘기죠. 3x3이었다는 얘기고요, 그다음 보면 이렇게 해서 제가 그림이 좀 일치하지는 않지만, 그다음에 보면 식빵이 이렇게 생겼죠? 이렇게 하고 여기가 32x32 하고, 여기가 64 되어 있어요. 자 이게 무슨 의미가 될까요? 64라는 건, 여기 식빵의 개수가 64개 있다는 거라고 말씀드렸죠. 이렇게 해서 식빵의 64개 있다는 얘기는 바로 출력의 채널이 몇 개다? 64개다, 라는 소리예요. 그러니까 입력의 채널이 3이고, 출력의 채널이 64예요. 그런데 여기서 이리로 넘어갈 때는 뭐죠? 컨볼루션이에요. 컨볼루션. 여러분이 여기서 이쪽으로 넘어갈 때 컨볼루션, 예, 컨볼루션을 이용해서 이쪽에서 이리로 넘어갔다는 얘기가 되겠죠. 자 그러면 입력의 채널이 3개고 출력 채널이 64개니까, 필터의 개수는 몇 개 있는 거죠? 필터. 필터의 채널은 몇 개죠? 필터의 채널. 하나의 필터의 채널은? 3개죠. 왜냐면 필터의 채널 개수와 입력의 채널 개수는 같다고 누누히 강조했죠? 예. 3개고요. 그럼 필터는 몇 개예요? 필터는 몇 개죠? 앞으로 좀 갈게요. 필터는 몇 개죠? 필터는 이게 하나입니다. 필터 하나 둘 셋... 필터 n개가 있는 게 아니에요. 필터 채널이 n개고요. 이게 필터 하납니다. 필터 하나, 필터 하나, 필터 하나... 해서 필터 몇 개가 있는 거죠? 64개. 예. 필터 하나가 채널 하나를 만들어내요. 필터 하나가 출력의 채널 하나를 만들어내기 때문에, 필터 몇 개가 있습니까? 출력의 채널만큼 존재해요. 그러니까 여기는 필터가 64개 있는 겁니다. 그러면 여기서 이리로 넘어갈 때 여러분이 결정해야 될 필터 속 파라미터는 몇 개일까요? 3x3이고, 그다음 입력 채널 3개, 출력 채널 64개. 해서, 이만큼의 파라미터를 우리가 채워넣어야 한다, 라는 것. 여러분이 기억하시면 되겠습니다. 자 그리고 풀링이 있는데요. 예를 들면 풀링을 했어요. 풀링을 하면 어떤 일이 생기죠? 풀링을 하면 어떤 일이 생길까요? 예를 들어서 이렇게 해가지고, 여기 32x32인데, 64채널이에요. 이걸 풀링했어요. 풀링하면 어떤 일이 생길까요? 채널의 개수가 바뀔까요... 이 식빵의 개수가 바뀔까요, 식빵의 단면적이 바뀔까요? 풀링을 하면, 식빵의 단면적이 바뀌어. 풀링으로는 절대로 식빵의 개수가 바뀌지 않습니다. 그래서 풀링을 했다고 하면, 여기가 16x16에 여기는 64 해서, 채널 수는 유지가 돼요. 여러분이 풀링을 했다고 하면. 64가 64로 유지되고, 단, 단면적. 그림의 단면적이 32x32에서 16x16으로 이렇게 감소되는 것을 여러분이 알 수가 있습니다. 그래서 그것을 잘 기억하시기 바래요. 자 그래서 지금까지 CNN의 기본 구조. 어떻게 된다? 컨볼루션 풀링, 컨볼루션 풀링, 컨볼루션 풀링이 반복되고, 맨 마지막에 쉘로우 네트워크에 붙어 있다. 그다음에 앞서 말씀드린 대로 풀링은 옵셔널이다. 그래서 컨볼루션 풀링, 컨볼루션 풀링... 할 필요 없고, 컨볼루션, 컨볼루션, 컨볼루션, 풀링, 컨볼루션, 풀링, 컨볼루션, 풀링, 컨볼루션, 컨볼루션, 풀링... 그냥 여러분이 구상하고 싶은 대로 풀링은 넣었다 뺐다... 하면 된다는 것도 기억하시기 바래요. 자 그래서 구조까지 말씀드렸고, 이제 남아 있는 문제가 뭐냐 하면 바로 필터예요. 아까 저는 계속 앞에서 필터는 누가 디자인한다고 그랬죠? 개/고양이를 구분하는 로컬 피처가 뭐가 있을까... 아 요거! 해서 그 필터를 여러분이 디자인한다... 라는 것처럼 말씀을 드렸는데요, 실제로 CNN에서는 그 필터를 여러분이 디자인할 필요가 없어요. 왜냐하면, 제가 뭐라고 그랬죠? CNN은 뭐랑 똑같다고 그랬죠? CNN은 FCNN으로 변환 가능하고요. 그러면 여기에 있는 필터들 있죠? 필터. 필터 속에 들어가는 값들 있죠? 필터 속에 들어가는 값들이 다 이쪽으로 뭘로 변환되냐면, 커넥션 웨이트로 변환돼요. 커넥션 웨이트. 그러니까 CNN의 필터에 들어가는 값들 있죠? CNN에 들어가는 필터들의 값이, 다 이렇게 FCNN으로 변환되고 나면 이게 커넥션 웨이트로 바뀝니다. 자 그럼 무슨 장점이 있느냐? FCNN을 학습시킨다는 것은 뭐가 학습된다는 얘기죠? 웨이트를 학습시킬 수 있죠? 그러면 CNN을 FCNN으로 변환시킨 다음에 이걸 학습시켜요. 그러면 뭐가 학습되는 셈이죠? 필터가 학습이 된다는 거예요. 다시 말하면 이 필터, 컨볼루션 마스크를 저는 계속 사람이 만들어야 됩니다, 사람이 만들어야 됩니다... 했지만. 사실은 CNN은 일반 풀리 커넥티드... 앞서 말씀드린 FCNN으로 얼마든지 변환 가능하고... 변환된다고 하면 필터들은 다 뭘로 바뀐다? 커넥션 웨이트로 바뀌게 되고, 결국 이 FCNN은 학습이 가능하기 때문에, 이걸 학습시키면 결국, 이 필터를 여러분이 찾는 게 아니고, 누가 찾는다? 학습에 의해서. 그레디언트 디센트 메소드에 의해서 자동으로 필터를 찾게 된다는 얘깁니다. 무슨 얘기냐? 여러분이 트레이닝 데이터를 열심히 만들어줘요. 트레이닝 데이터를 열심히 만들어서, '자, 이 그림은 멍멍이니까 1이라고 대답해.' '이 그림은 고양이니까 0이라고 대답해.' '이것은 개니까 1이라고 대답해.' 이렇게 해서 트레이닝 데이터를 쭉 만들어줘요. 그러면 뉴럴넷이 이걸 쳐다보고, '음... 이건 개고, 이건 고양이고, 이건 고양이고, 이건 개네요. 어, 아! 그러면 이런 필터가 있으면 구분이 되겠구나! 어, 이런 필터가 있으면 구분이 되겠네요! 어, 이런 필터가 있으면 구분이 되겠네요!' 하고 자기가 스스로 필터를 찾는다는 거예요. 개/고양이를 구분하기 위해 필요한 필터를 자동으로 찾아서 학습을 한다. 그러니까 나는 할 일이 하나도 없어요. 뭐만 하면 되죠? 그냥 CNN 구성하고요, 그다음에 트레이닝 데이터만 모아놔요. '야, 이게 개고, 이게 멍멍이다?' 하고 모아놓고 '네가 한번 학습해봐.' 그러면 제가 주욱 돌면서, 개/고양이를 구분할 때 도움이 되는 로컬 피처들을 촥- 찾아내요. 그다음부터는 그걸 기반으로 내가 어떤 이미지, 어떤 이미지를 주면 그걸 기반으로 얘가 '이건 멍멍이네요?/고양이네요?' 자동으로 찾게 된다, 라는 얘기가 되겠습니다. 자 그러니까 이제부터 말씀드릴 것은 뭘 말씀드리면 되죠? 바로 CNN을 FCNN으로 변환시키는 과정만 살펴보면 되겠죠? 그다음부터 저는 학습 알고리즘 얘기 안 할 거예요. 왜냐하면 FCNN으로 변환되고 나면, 학습 알고리즘 알고 있잖아요? 그것 가지고 학습시키면 될 테니까. 뭐 엄밀히 말하면 변환할 필요도 없어요. CNN은 그냥 곧바로 그레디언트 디센트 메소드로 학습을 시키지만, 여러분의 이해를 돕기 위해서 변환을 한다, 라는 것도 기억해 주세요. 자, 다시 말씀드리면, 피처 익스트랙션 과정, 컨볼루션-스레숄드- 풀링에서 이 과정이 풀리 커넥티드 뉴럴넷으로 변환 가능하다는 것을 말씀드리도록 할게요. 자, 먼저 이걸 보도록 하겠습니다. 입력 이미지가 있고요, 커널이 있어요. 그다음 이쪽은 출력 이미지가 있어요. 그러니까 이게 피처 맵이죠? 피처 맵이 있고 이 입력에다가 이 커널을 넣어서 샤샤샤샥 하고 나면 이 출력이 나오는데, 이제부터 어떻게 할 거냐면, 이것을 세로로 다 잘라요. 세로로 다 잘라서 착! 갖다 붙이면 25개가 나오겠죠? 그걸 한 줄로 쭉 세워요. 다시 말씀드리면, 그림에서 각각의 픽셀이 뉴럴넷으로 오니까 뭘로 바뀌죠? 노드로 바뀌어요. 노드, 노드, 노드,... 노드 하나로. 쫙 하고 나면 결국 25개. 5x5 이미지가 25개의 노드를 가진 뭘로 바뀌죠? 레이어로 이렇게 변환이 되고요. 마찬가지로 출력 그림도 이걸 쭉 잘라가지고 쫙 갖다 붙이면, 16개의 노드를 가진 하나의 레이어로 변환이 되겠죠? 그래서 입력 이미지와 출력 이미지가 다 레이어로 이렇게 변환이 되고요. 그다음에 이제 컨볼루션 연산을 해야 되는데요, 컨볼루션 연산을 어떻게 할 거냐면, 여기에다가 이 필터를 탁 갖다 붙여서 계산하니까 이 값이 나오겠죠? 계산하면 0이 나오네요. 다시 말씀드리면, 어떤 거죠? 이거 이거니까, 이 녀석과 이 녀석. 그다음에 저거니까, 이것과 이것이 참여를 하고, 그래서 얘들이 해가지고 출력의 이 노드를 만들어냈네요. 자, 필터는 어떻게 됐죠? 이것의 검정 0. 이 작대기의 의미는 검정 0을 의미해요. 검정 0. 그다음에 이것에는 빨간 1. 빨간색은 이 빨간 1을 의미하는 것이고, 그다음에 이것은 파란 1을 의미하고, 저거랑 곱해지는 이것은 보라 0을 의미합니다. 자, 이렇게 해서 다시 말하면 0 곱하기 까만 0, 0 곱하기 빨간 1, 0 곱하기 파란 1, 0 곱하기 보라 0 하면 그게 바로 컨볼루션이잖아요? 그 결과는 얼마? 0이 나와요. 다시 말하면, 입력 웨이트 입력 웨이트 입력 웨이트 입력 웨이트 써메이션한 거랑, 하등의 차이가 없는. 완전히 똑같은 연산 결과가 생기게 되는 것이죠. 바로 컨볼루션의 결과가, 입력 웨이트 입력 웨이트 써메이션이 되는 거고요. 이미지가 입력이고 웨이트가 뭐가 되는 거죠? 커널. 예. 바로 이 커널에 있는 값들이 이 값들이 바로 커넥션 웨이트로 변환이 되어서 이렇게 쫙 들어갑니다. 말씀드린 대로, '어? 풀리 커넥티드가 아닌데요?' 라고 하시는 분 계실지도 모르... 뉴럴넷은 이 사이가 완전 풀리 커넥티드인데 여기는 파셜리 커넥티드인데요? 라고 하면, 이미 말씀드렸죠? 커넥션이 없는 게 아니고, 있는 거다. 있는데 커넥션 웨이트가 얼마다? 0이다, 라고 말하면 되겠죠. 그러면 풀리 커넥티드 뉴럴넷으로 변환이 되죠. 자 두 번째도 마찬가지가 되겠죠. 보시면, 이 값은 어디서 나오냐, 여기서 나오는 거고요. 다시 말하면 이 노드랑 이거, 그다음에 이것과 이것이 될 거고요. 여기에 검정 0, 여기에 빨간 1, 여기에 파란 1, 여기에 보라색 0을 곱한 다음에 하면 바로 이 값이 나오게 되겠죠? 네 이렇게 해서 쭉 진행하면 결국 이 컨볼루션 과정이 뭘로 바뀌냐? 이렇게 생긴 파셜리 커넥티드 셰어드 웨이트를 갖는 하나의 레이어로, 컨볼루션이 하나의 레이어로 변환하게 돼요. 그래서 이런 식으로 하면 모든 컨볼루션 연산이 풀리 커넥티드 뉴럴넷 연산으로 변환이 되고요, 그다음에 풀링은 자세히 말씀드리지 않겠습니다만, 풀링도 유사하게 이런 레이어로 변환 가능합니다. 그래서 여기 잘 보시면 맥스 값이 나오는데요, 어디서 많이 보던 애 아녜요? 렐루. 렐루가 어떻게 생긴 거죠? ReLU(x)라는 것은 이렇게 생긴 거죠? 맥스 (0, x). 이게 렐루잖아요? 잘 보면 맥스 풀링도 맥스값, 이렇게 맥스값에 해당되니까, 렐루랑 비슷한 연산이라고 생각하셔도 충분합니다. 네, 그래서 이렇게 해서 컨볼루션과 풀링이 모두 다 뉴럴넷의 한 레이어로 변환 가능하다, 라는 걸 기억하시기 바랍니다. 그러면, 레이어의 커널이 커넥션 웨이트로 다 변환됐기 때문에, 여러분이 학습 알고리즘을 이용하면 여기 있는 모든 커넥션 웨이트, 즉 이 필터, 커널에 있는 값들을 자동으로 학습할 수 있다라는 건 직관적으로 이해가 되시죠? 자 그래서 이렇게 컨볼루션-스레숄드-풀링으로 생긴 한 세트를, 우리는 이렇게 해서 뉴럴넷으로, 한 레이어로 바꿔치기할 수 있는 거고요. 그 얘기를 다시 보면, 여기 있는 이미지가 있으면, 이 이미지는 이렇게 생긴 한 레이어로 변환 가능하다. 이미지는 레이어로 변환 가능하다. 그다음에 여러분이 이렇게 해서 하나의 필터를 가지고 이렇게 해서 피처 맵을 만들어냈다는 얘기는, 여기에서 똑같이 입력 이미지에 대해서 어떤 셰어드 웨이트를 갖는, 얘들끼리 셰어드 웨이트를 갖는 이런 노드들로 만들어낼 수 있고, 여러분이 또 필터 하나를 만들면 다시 이렇게 하나 만들고, 또 필터를 만들면 ...이죠. 이렇게 된다. 다시 말씀드리면, 이게 사실은 하나의 레이어예요. 하나의 레이어인데, 레이어의 이만큼은 자기들끼리 셰어드 웨이트, 웨이트를 셰어하고, 이만큼은 자기들끼리 웨이트를 셰어하고 이만큼은 자기들끼리 웨이트를 셰어하는, 이러한 하나의 레이어가 만들어지는 셈이다. 다시 말씀드리면 이게 입력 이미지이고 이게 전체를 하나로 합치면 이게 이미지가 된다고 했는데, 다시 말씀드리면 이게 하나의 레이어고, 이게 하나의 레이어. 그러니까 하나의 입력, 출력, 해서 이게 컨볼루션 레이어가 되는 거죠? 그렇게 해서 컨볼루션 레이어가 하나 만들어진다. 그래서 이걸 보시면 아셔야 될 것이, 컨볼루션 레이어를 컨볼루션, 컨볼루션... 쌓아가면, 풀리 커넥티드 레이어에서 레이어, 레이어, 레이어... 쌓아가는 것과 똑같고, 한 컨볼루션 레이어 내에서 필터, 필터, 필터...를 계속 증가시킨다는 것은 하나의 레이어 속에서 뭘 증가시키는 효과를 내는 거죠? 노드. 예. 여러분이 필터 하나 쓰면 노드가 쫙 생기고, 또 두 번째 필터 쓰면 노드가 쫙 생기고. 필터를 n개 쓰면 각 필터마다 이미지가 생기고 바로 노드 개수가 늘어난다. 바로 이 채널, 이 채널이 늘어난다는 것은 노드가 늘어난다, 매핑된다라는 걸 우리가 알 수 있습니다. 자 그래서 궁극적으로 이렇게 생긴 컨볼루셔널 뉴럴 네트워크가 여기만 뉴럴 네트워크가 아닌 컨볼루션-풀링 컨볼루션-풀링도 다 뉴럴넷으로 변환 가능하니까, 결국 다 이렇게 해서 뉴럴 네트워크로 변환 가능하고. 그다음에 여기에 트레이닝 데이터를 줘서 멍멍이 고양이 멍멍이 고양이 그 트레이닝 데이터를 줘서 이걸 가지고 여러분이 쫙쫙... 커넥션 웨이트를 다 학습시키면 뉴럴넷 학습이 되겠죠? 이게 들어오면 1을 출력해라, 저게 들어오면 0을 출력해라, 이게 들어오면 1을 출력해라... 해가지고 에러 백프로퍼게이션으로 쭉 학습을 시켜요. 학습을 시키면 당연히 그게 이쪽으로 넘어가서는 그 필터 마스크. 어떤 로컬 피처를 찾아야 되지? 어떤 로컬 피처를 찾아야 되지? 해서 이만큼은 로컬 피처를 찾는 거고, 이만큼은 클래시피케이션을 하는 것처럼 기능은 나뉘지만, 전체적으로는 다 FCNN으로 바뀌게 되고, FCNN의 학습이 가능했던 것처럼, 컨볼루션 뉴럴 네트워크도 학습을 통해서 이러한 피처 맵들을, 피처 필터들을 찾아낼 수 있게 된다. 그래서 우리가 원하는 그림을 처리할 수 있게 된다, 라는 걸 기억하시면 되겠습니다. 자 그래서 이번 시간에는 CNN의 구조에 대해 말씀드렸고요. 그래서 CNN은 컨볼루션-풀링, 컨볼루션-풀링... 계속 반복되는 구조고, 그다음에 컨볼루션은 맨데토리지만, 풀링이라는 건 옵셔널이다, 라는 걸 기억하시고, 이 모든 것들은 다 뉴럴넷, 풀리 커넥티드 뉴럴넷으로 변환 가능하고, 그래서, 필터들, CNN에서 사용되는 필터들은 모두 다 그레디언트 디센트 메소드로 우리가 학습을 통해 찾아낼 수 있다, 라는 것까지 기억하시면 되겠습니다. [음악]