[음악] 많은 분들이 기다리던 convolutional neurl network를 시작할 것 같습니다. 딥 러닝이라고 하면서 많은 분들이 CNN, convolutional neural network를 떠올리고 많이 궁금해 하셨을 텐데요. 사실 CNN이 딥 러닝이기는 하지만 앞에서 말씀드렸던 많은 백그라운드, 딥 러닝 이전에 나왔던 뉴럴넷의 기초, 그다음에 딥 러닝에서 시작되었던 Gradient vanishing, Batch normalization...이런 것들이 기반이 잘 갖춰져 있지 않으면 사실 CNN을 깊이 있게 이해하고 잘 활용하는 데 어려움이 있을 수 있습니다. 그래서 앞에서 말씀드렸던 것들이, 당연히 그렇게 생각하시겠습니다만, 필요없거나 몰라도 되는 게 아니고, 여러분이 여러분의 기초를 탄탄하게 하기 위해 필요한 거고요. 여기서부터는, 14장부터는 본격적으로 convolutional neural network와 recurrent neural network, 이 이후로 convolutional neural network와 recurrent neural net에 대해서, 실제로 딥 러닝의 시대에 많이 사용되는 구조들에 대해서 하나씩 말씀드리도록 하겠습니다. 먼저 이번 시간에는 CNN의 기초에 대해 말씀드리겠습니다. CNN은 아시는 분도 많이 계시겠습니다만, 모양이 우리가 앞에서 봤던, 일반적인 fully connected neural network과는 다른 뉴럴 네트워크인 건 알고 계시죠. 그래서 어떤 분들은 fully connected neural network와 CNN은 완전히 다른 모델이고 서로 유사성이 없는, 그러나 근데 왜 뉴럴넷이라고 부르지? 완전히 생긴 게 다른데 왜 뉴럴넷이야? 하고 생각하시는 분도 있어요, 간혹 가다가. 그렇지 않습니다. convolutional neural net을 여러분이 어떻게 이해했건, 어떤 그림을 보셨던 간에, fully connected neural net과는 사뭇 다른, 상당히 달라 보이는 뉴럴넷으로 보이지만 사실은 여러분이 다 fully connected neural net으로 변환 가능해요. 그러니까 fully connected neural net의 일종이다, 라고 이해하시면 되겠습니다. fully connected neural net의 일종이기는 한데 차이가 있어요. fully connected neural net은 실제로 이렇게 레이어가 있고 레이어마다 fully connected되어 있다면, CNN은 이렇게 레이어 구조로 되어 있는 건 맞는데, fully connected되어 있지 않고 partially connected되어 있습니다. 무슨 얘기냐면 여기서 이리로 가는 것, 여기서 이리로 가는 것, 없잖아요. 여기도 이리로 가는 것 없고 여기도 이리로 가는 것 없죠? 그래서 커넥션이 다 존재하지 않고 partially connected되어 있고요. 그다음에 constraint가 하나 또 더 들어가 있어요. 그게 뭐냐면 색깔이 같은 애들은 무조건 connection weight이 같아야 된다는 거죠. 여기가 1.0이면 1.0, 1.0, 1.0. 여기가 0.5면 0.5, 0.5, 0.5. 이런 식으로 해서 커넥션이 있는데 색깔이 같은, 어떤 어떤 어떤 애들은 무조건 같은 값을 가져야 된다. 이런, 이런, 이런 애들은 무조건 같은 값을 가져야 된다, 라는 그 constraint가 추가적으로 들어가 있는 구조다, 라고 생각하시면 되겠어요. 물론 여기 커넥션이 없다고 해서 이상하게 생각할 건 없어요. 커넥션이 없는 게 아니고 커넥션이 있는데, 여기 커넥션이 이렇게 있는데, 커넥션 웨잇이 얼마일까요? 커넥션이 있는데 커넥션 웨잇이 0이겠죠? 예. 커넥션이 없는 게 아니고요, 커넥션이 있는데 그것의 커넥션 웨잇이 0이다, 라고 생각하면 되니까 사실 얘도 fully-connected 구조가 되는 거고요. 물론 얘랑 얘랑 얘랑이 connection weight이 같아야 된다는 조건이 따라 붙기는 하지만 그렇다고 해서 이 구조가 아닌가요? 맞잖아요. fully-connected되어 있고 웨이트가 존재한다는 측면에서 완전히 똑같은 구조를 갖고 있는 거죠. 그래서 CNN은 fully connectd network으로 변환될 수 있고, 변환하고 나면 partially connected이면서 shared weight를 갖는 fully connected neural net이다, 라고 생각하시면 되겠습니다. 그런데 얘는 구조상 좀 다르죠. 얘랑 얘랑 구조가 좀 다르기 때문에, 사용하는 데가 조금 달라요. 어디에 주로 사용하냐면, 얘는 시퀀셜 데이터에 많이 사용돼요. 그러니까 specialized sequential data인데요. 시퀀셜 데이터가 뭐냐? 사실은 딥 러닝 시대에 오면서, 우리가 딥 러닝, 딥 러닝 하지만, 엄밀히 따져보면 딥 러닝 시대... ...라기보다는 시퀀셜 시대다, 라고 말하는 게 좋아요. CNN, 딥러닝에서 많이 사용된 CNN과 RNN, 리커런트 뉴럴 네트워크는 다 시퀀셜 데이터 처리 전용이에요. 그래서 이미지라든지 스피치, 텍스트... 다 뭐죠? 사람이 만들어내는 데이터예요. 기계가 만들어내는 데이터가 아니고 사람이 만들어내는 데이터는 다 시퀀셜 데이터고요. 그 시퀀셜 데이터를 처리하는 전용, 전용이라고 하면 좀 그렇지만, 거기에 specialized된 모델이라고 생각하시면 되고. 다시 말해 딥 러닝의 시대가 왜 이렇게 많은 관심을 받느냐 하면 바로 인간이 만들어내는 시퀀셜 데이터를 비로소 기계가 잘 처리할 수 있게 되었다는 겁니다. 그러니까 인간이 훨씬 더 편해지고 인간에게 훨씬 더 유용한 기계가 만들어졌다는 얘기가 되죠. 그래서 딥 러닝에 많은 관심을 갖고 있는 거고요. 자, 시퀀셜 데이터가 뭐냐, 말씀을 드리겠습니다. 예를 들어 시퀀셜 데이터가 뭐냐면요, 데이터가 있는데, 1, 2, 3, 4가 있어요. 그다음에 어떤 데이터가 있는데, 4, 3, 2, 1이 있어요. 데이터가 두 세트가 있다고 치죠. 데이터가 두 세트가 있는데, 이 1, 2, 3, 4 와 4, 3, 2, 1이 같은 데이터예요, 다른 데이터예요? 물론 이걸 같다고 할 수도, 다르다고 할 수도 있겠죠? 근데 시퀀셜 데이터는 절대적인 개념이 아니고 상대적인 개념이에요. 그래서 여러분이 이걸 시퀀셜 데이터라고 해석을 하느냐, 아니라고 해석을 하느냐, 그 해석의 차이지, 데이터 자체가 시퀀셜 데이터가 있고 넌시퀀셜 데이터가 있다고 말할 수는 없어요. 어떤 주어진 데이터를 시퀀셜리 해석하면 시퀀셜 데이터고, 시퀀셜하지 않게 해석하면 걔는 시퀀셜하지 않은 데이터가 됩니다. 무슨 얘기냐? 1, 2, 3, 4가 있는데, 이건 집합이야, 라고 생각해보죠. 1, 2, 3, 4가 있는 집합, 4, 3, 2, 1이 있는 집합. 같은 집합이에요, 다른 집합이에요? 같은 집합이죠? 그러니까 여러분이 이걸 집합으로 해석을 하면, 이건 같은 데이터예요. 그런데 집합으로 해석하지 않고, 예를 들면, 주식 값으로 생각할까요? 주식이 1, 2, 3, 4는 좀 그렇지만. 예를 들면 어제 종가는 1이었고, 오늘 종가는 2였고, 그다음에 내일의 종가는 3, 모레의 종가는 4. 이렇게 해서 어떤 연속한 4일의 주식 종가가 1, 2, 3, 4가 있었다고 치죠. 이런 주식이 있었고, 이런 주식 값이 있었고, 그다음에 또 어떤 게 있는데, 4, 3, 2, 1이라는 게 있어요. 이 두 개가 같은 건가요? 완전히 다르죠. 위에는 상승장이고, 아래는 하강장이니까, 완전히 두 데이터는 완전히 다른 데이터를 의미해요. 따라서 여러분이 이것을 시퀀셜하게 해석하면, 1, 2, 3, 4와 4, 3, 2, 1은 완전히 다른 데이터가 되는 거죠. 그러니까 시퀀셜 데이터의 특징은 뭐냐면요, 4가 있니? 있어. 3이 있니? 있어. 2가 있니? 있어. 1이 있니? 있어. 어, 똑같이 다 있네? 라고 하면 넌시퀀셜 데이터예요. 그런데, 4가 첫 번째에 있고, 어? 4가 네 번째에 있네. 3이 두 번째에 있고, 어? 3이 세 번째... 이렇게 해서, 어떤 값이 있냐 없냐가 아니고, 그것이 몇 번째에 나타나냐. 그 몇 번째 위치, 데이터의 위치까지도 중요한 정보가 된다면, 그건 바로 시퀀셜 데이터가 됩니다. 그래서 인간이 만들어낸 대부분의 데이터는 다 시퀀셜 데이터예요. 왜냐하면 이 값이 있냐 없냐가 중요한 게 아니고, 그게 어디에 있냐가 중요한 거죠. 예를 들면, 인간이 쓰는 게 바로 이거죠. I go to school이라는 것하고, 그다음에 이걸 뒤집어 보죠. School go to I. 물론 여러분 밑의 문장은 문법에 맞지도 않아요. 그렇지만 School go to I? School go to I? 생각해 보세요. 무슨 느낌이 들어요? 어, 시인가? 시 같지 않아요? 시 같잖아요. 뭔가 어떤 마음을 학교에 간절히 가고 싶은 마음. 그런데 학교에 갈 수 없는 그 상황을, 시적으로 표현한 것 같지 않아요? 학교가 나한테 온다. 멋있잖아요. 그래서, 이거랑 이거랑 완전히 다른 의미를 갖게 돼요. 그러니까 보면 단어로 나열하면 단어는 똑같은 단어가 있지만, 그 단어가 몇 번째에 나타났냐가 바로 우리에게 다른 의미를 갖게 되죠. 인간의 말은 시퀀셜 데이터예요. School이 첫 번째에 있냐, 네 번째에 있냐에 따라서 I가 첫 번째에 있냐, 네 번째에 있냐에 따라서 다른 의미를 갖게 되죠. 바로 텍스트는 시퀀셜 데이터예요. 그림은 어떻게 돼요? 예를 들어 여기 그림이 있어요. 여기에 화난 고양이가 있다고 칩시다. 이렇게 해서 여기에 화난 고양이가 있어요. 자 이 화난 고양이 그림을, 우리가 픽셀을 쪼개서 한번 보도록 하겠습니다. 이걸 픽셀을 쪼개는데, 예를 들면 이것을 이렇게 픽셀별로 쪼개서, 픽셀을 셔플링해보겠습니다. 해보죠. 셔플링을 이렇게 했더니, 예를 들면, 눈 하나 여기 있고, 눈 하나 여기 있고, 코는 여기 있고, 입은 여기 있다고... 또 얼굴, 얼굴은 뭐 대충... 해보죠. 자 이렇게 해서 여기 있는 픽셀별로 픽셀을 randomly shuffling하면, 데이터가 있냐 없냐 치면, 다 있죠. 다 있어요. 다 있는데, 여러분 이건... 고양이라고 해석하겠지만, 이걸 고양이라고 해석할 사람이 누가 있겠어요? 아무도 없죠. 값이 있냐 없냐가 중요한 게 아니라 값이 몇 번째에 나타나느냐가 그 위치, 그 값뿐만이 아니라 그 값이 몇 번째, 어느 위치에 있느냐가 그것이 상당히 중요한 데이터가 바로 시퀀셜 데이터고, 바로 이 Convolutional Neural Network, 이 CNN이 그러한 시퀀셜 데이터 처리에 좋은 성능을 보이는 모델이다, 라고 생각하시면 됩니다. 그 중에서도 특히, 이미지 처리 하면 요새 대부분이 다 CNN을 사용해서 이미지 처리를 합니다. 그래서 이미지도 시퀀셜 데이터고, 이 시퀀셜 데이터의 처리에 적합한 모델이라고 생각하시면 되겠어요. 자, 이제부터는 이 시퀀셜 데이터에 대해서 말씀을 드려야 되는데요, 지금까지 말씀드렸던 CNN의 오버뷰는 다 잊어버리시고, 왜냐하면, 지금까지 말해왔던 뉴럴 네트워크하고도 조금 결이 다르고, 지금까지 말씀드렸던, 이게 좀 달라요. 그래서 여기는, 전혀 새로운 주제가 시작된다고 생각하시고 앞에 들었던 것 다 잊어버리시면 돼요. 자 여러분은 이제 대학교 1학년으로 돌아갔어요. 대학교 1학년 들어가서 처음으로 파이썬 같은 프로그래밍을 배웠는데, 숙제를 받았어요. 여기 Classifier라고 했는데, 교수님이 숙제를 내면서 2 dimension array를 줄테니, 이 어레이를 보고서 이 어레이에 있는 것이 X인지 O인지 구분하는 프로그램을 짜시오, 라는 숙제를 냈어요. 아마 1학년한테 냈으면 주말 프로젝트 정도 됐겠죠. 쉬워 보이지는 않죠? 그래서 학생들이 이걸 받아들고서, 야, 이렇게 어려운 숙제를 내면 어떡하냐, 하면서 툴툴거리고 있었습니다. 그래서, 계속 프로그램 설명이에요. 자, 무슨 얘기냐면, 여러분은 어떤 프로그램을 짜셔야 되는데요, 이런 류의 그림이 들어오면 여러분은 X라고 답을 하셔야 되고, 이런 류의 그림이 들어오면 여러분은 O라고 말해야 합니다. 그래서 그런 프로그램을 짜시오. 기말 프로젝트입니다, 라고 숙제를 냈어요. 자, 그래서 이 숙제를 가지고 어떻게 풀까, 고민을 해야겠죠. 물론 이건 여러분, 이건 뉴럴 네트워크만 이용하면 누워서 떡먹기가 됩니다. 근데 대학교 1학년이 뉴럴넷을 알겠어요, 뭘 알겠어요? 이걸 껴안고서 고민고민을 하고 있겠죠. 도대체 프로그램 이걸 어떻게 짜야 되냐, 이거? 어떻게 짜야 이거이거를 X라고 하고 저거저거를 O라고 하는 프로그램을 짜냐 하면서 고민을 시작했겠죠. 예를 들면 첫 번째가 검정, 두 번째가 검정. 검정 검정 검정. 예를 들면 여기죠? 검정 검정 검정 검정, 검정 흰색 검정 검정 검정 흰색, 이거면 X고. 뭐 이런 식으로 If then yes. 이런 걸로 짜려고 했는데 이건 한도 끝도 없는 일이죠. 왜냐하면 우리가 쓰는 X의 변형이 X의 변형이 딱 5개만 있으면 If then yes로 짤 수 있겠지만, 우리가 만들 수 있는 X가 수도 없이 많은데 그 모든 조합을 미리 사전에 If then yes로 코딩해 넣을 수는 없잖아요. O도 마찬가지고. 그래서 어떤 똑똑한 친구가 고민을 시작했어요. 도대체 사람은 어떻게 해서 이것과 이것을 같은 거라고 인식을 할까? 굉장히 창의적인 학생이죠? 사람은 어떻게 하지? 예요. 나보고 프로그램을 짜라고 했는데, 너무 어렵다. 근데 이걸 사람한테 보여주면 얘도 X, 얘도 X라고 금방 말하는데, 사람은 어떻게 하는 걸까? 그 얘기는 사람이 하는 걸 흉내내서 프로그램을 짜보자라고 하는 굉장히 창의적인 발상이죠. 그래서 이 친구가 고민, 고민하면서 쳐다보면서 내린 결론이 뭐냐면, 또 아주 창의적인 발상을 해요. 뭐냐면 로컬 피쳐다, 라는 거예요. 아, 사람이 어떻게 이것과 이것을 같다라고 말하냔 말이지? 로컬 피쳐야. 로컬 피쳐. 무슨 얘기냐면 이거죠. 자, 보면 여기여기 이렇게 생긴 거 여기 있어 없어? 있지? 그다음에 여기도 있잖아. 이렇게 생긴 거. 여기. 우하단에 있네. 물론 우하단이 정확히 일치하지 않지만, 우하단에 있네. 그다음에 이렇게 생긴 거, 로컬 피쳐지? 이게 좌하단에 있어. 그다음에 이것과 똑같이 생긴 게 어디 있죠? 우상단에도 있네. 우상단에 있죠? 그다음에 이렇게 생긴 X가 가운데에... 있지? 봐. 아, 사람은 이렇게 하는 것 아닐까? 다시 말하면, 두 그림을 비교할 때, 사람은 pixel-to-pixel로 비교하지 않는다. 어떻게 비교한다? 여기에서 로컬 피쳐를 찾아내고, 여기서 로컬 피쳐를 찾아낸 다음, 잘 보세요. 여기 로컬 피쳐를 찾아내고, 제가 찾아낸 영역에 색깔을 칠해볼게요. 제가 찾아낸 로컬 피쳐 영역만. 이렇게 pixel-to-pixel로 비교하는 게 아니고, local feature-to-local feature로 찾아낸 다음에 그 로컬 피쳐를 기반으로, 픽셀끼리가 아닌, local feature-to-local feature, local feature들끼리만 비교를 한다는 가설을 세웠어요. 이렇게 채우고 보면 어때요? 잘 표시가 안 나네요. 비슷해 보이죠? 예. 훨씬 더 비교가 수월해 보이지 않아요? pixel-to-pixel 비교보다는 훨씬 더 비교가 수월하잖아요? 그래서 이런 생각을 해요. 아, 사람은 pixel-to-pixel이 아니고 바로 로컬 피쳐를 익스트랙션한 다음에 그 로컬 피쳐를 로컬 피쳐와 비교해서, 로컬 피쳐와 로컬 피쳐를 비교해서, 같다 다르다고 생각하는 게 아니겠냐, 라는 아주 훌륭한 아이디어를 냅니다. 이게 바로 그 얘기예요. 로컬 피쳐, 그러니까 사람이 이미지를 인식하는 것, 이미지를 이해하는 것은 기본적으로 pixel-to-pixel이 아니고 로컬 피쳐를 찾아내고, 찾아낸 로컬 피쳐를 매칭함으로써 두 그림이 같다라는 걸 인식하는 게 아니겠냐, 라는 생각을 하게 됩니다. 그럼 우리도 그렇게 해보자. 그럼 우리도 프로그램을 그렇게 한번 짜보지, 해서 사람들이 생각을 낸 것이 바로 컨볼루션이고요, 그걸 조금 더 발전시킨 것이 convolutional neural network예요. Convolutional neural network가 기본적으로 이미지에 좋은 성능을 보이는 게 바로 이 아이디어, 이미지를 비교할 때 거기에 존재하는 로컬 피쳐를 찾아내고 그 로컬 피쳐들끼리 비교함으로써 같은지 다른지 판단을 하자, 이미지 프로세싱을 하자라는 아이디어에서 시작된 것이 바로 convolutional neural network이기 때문에, 이미지에서 상당히 좋은 성능을 보여주고 있습니다. 자 그러면 로컬 피쳐를 찾자, 여기에 몇 가지 문제가 있죠? 첫 번째는 로컬 피쳐를 어떻게 찾을 거냐? 라는 거고, 두 번째는 무슨 로컬 피쳐를 찾을 거냐?가 있어요. 예를 들면, 개, 고양이를 구분할 때 사용하는 로컬 피쳐랑, 말, 소를 구분할 때 사용하는 로컬 피쳐가 같을까요, 다를까요? 뭐, 아무도 말할 수는 없겠지만, 다르겠죠. 사람과 원숭이를 구분하는 로컬 피쳐랑 개 고양이를 구분하는 로컬 피쳐가 유사한 것도 있겠지만, 다르겠죠. 그러니까, 그래, 당신 아이디어는 참 좋은데, 도대체 개, 고양이를 구분하기 위해서는 어떤 로컬 피쳐를 찾아야 되며, 사람, 원숭이를 구분하기 위해서는 어떤 로컬 피쳐를 찾아야 돼? 그걸 누가 결정하니? 이런 또, 심각한 문제가 존재해요. 그다음에, 그 로컬 피쳐를 어떻게 찾아야 돼? 예를 들면, 내가 이런 로컬 피쳐를 찾겠다고 결심했어. 이 로컬 피쳐는 어떻게 찾아야 되니? 어떤 찾을 로컬 피쳐가 정해졌다고 치자. 그럼 그건 어떻게 효과적으로 찾을 수 있니? 라는, 두 가지 문제가 존재하죠. 그래서 이 두 가지 문제에 대해서 하나씩 하나씩 답을 하도록 하겠습니다. 첫 번째는, 어떤 로컬 피쳐를 찾아야 되냐라는 질문인데, 이건 너무 어렵기 때문에 접어두고요, 어떤 로컬 피쳐를 찾아야겠다고 결심을 했어. 아, 개 고양이는 개 고양이를 구분하려면 이런 로컬 피쳐가 필요하겠구나, 해서 그것까지 결정했다 칩시다. 그랬을 때, 그 로컬 피쳐가 이 이미지 어디어디에 있냐를 알아내야 될 것 아니에요? 이 이미지 어디어디에 있는지 알아내야 되겠죠. 그 연산에 대해서부터 먼저 말씀을 드리겠습니다. 그 연산이 뭐냐면 바로 convolution이라는 연산인데요. convolution은 뭐냐면, 다음처럼 이렇게 작은 매트릭스 두 개를 여러분이 받으실 거예요. 이 두 개를 받으시면 어떻게 하냐면요, Element-wise. 무슨 얘기냐면 element-wise니까 얘들끼리 곱셈 곱셈 곱셈. 곱셈 곱셈 곱셈. 곱셈 곱셈 곱셈. 이렇게 해서 작은, 매트릭스 두 개를 받으시면 걔들을 element-wise로 곱셈 곱셈 곱셈, 곱셈 곱셈 곱셈, 곱셈 곱셈 곱셈. 걔들을 샥 더한, 바로 element-wise 곱셈을 하시면 돼요. 그러니까 이걸 다 하면 얼마가 나오죠? 4가 나오죠. 이게 convolution이에요. 물론 이게 진짜 다 convolution은 아니고, 다음 페이지에서 진짜 convolution에 대해 말씀드릴게요. 이건 convolution의 기초 연산이 되겠습니다. 자, 이제 진짜 convolution을 말씀드릴게요. 진짜 convolution이라고 말씀드리니까 이상한데. 자, 이쪽에 입력이 있고요. 이게 입력입니다. 이것도 입력이에요. 그러니까 convolution이라는 연산은 Convolution 연산은요, 이렇게 해서 두 개의 입력을 받아요. 입력이 2개고요. 출력. 이게 출력입니다. 출력을 이렇게 생성해요. 그런데 convolution은 좀 웃긴 녀석이죠. 입력도 2개 다 2차원 매트릭스예요. 물론 이건 2D convolution을 설명해서 그런 거고 1D convolution을 설명하면 사실 1차원이긴 한데, CNN에서는 2D convoution을 쓰니까 2D convoution 기준으로 말씀을 드릴게요. Convolution은 재미있는 애가, 입력이 다 2D 매트릭스를 받아요. 2D 매트릭스를 하나는 작은 매트릭스, 하나는 큰 매트릭스를 받아서 출력을 내는데, 큰 매트릭스로 출력을 내는, 우리가 지금까지 보지 못했던, 조금 색다른 연산이고요. 그다음에 큰 이거는 뭐냐면 이미지예요. 이건 여러분이 이미지라고 부르는 녀석이고요. 그러니까 입력인데 이건 이미지죠. 그림이에요. 이미지고요. 어떤 이미지가 들어가 있죠? 보시면 이렇게 해서 이렇게 해서, 지금 주어진 이미지는 이렇게 해서 화살... ...화살표가 주어졌네요. 이미지로 화살표 이미지가 주어진 이미지였고요. 이 작은 걸 뭐라고 부르냐면, 마스크, 또는 커널, 또는 필터 라고 불리우는 녀석이에요. 이것의 이름은 되게 많아요. 마스크라고도 하고, 커널, 필터라고도 합니다. 이렇게 두 개의 입력을 받으면 그다음에 어떻게 하냐면 아까 말씀드린 것 있죠? 이 작은 사각형을 이 이미지에 이쪽 맨 상단에 포개놔요. 얘랑 얘랑을 포개요. 이 사각형이 바로 이것이 얹혀지는 위치를 말합니다. 그래놓고서 이 밑에 있는 작은 파란색 사각형과 이쪽 위에 있는 작은 사각형을 아까 말한 element-wise 곱셈 있죠? 곱셈 곱셈 곱셈, 곱셈 곱셈 곱셈, 곱셈 곱셈 곱셈, 더하기한 것을, 결과를, 다하면 얼마죠? -1이죠. 그 결과를 출력에 이 자리에 적어줘요. 왜 이 자리냐? 간단합니다. 이것이 이쪽으로 올라갔는데, 그 위치가 어디죠? 센터 포인트죠. 센터 포인트가 여기잖아요. 탁 올리면 여기잖아요, 센터 포인트가. 그래서 그 위치에 해당되는 지점에다가 -1을 적어줘요. 아 이것은 -1이라는 건 원본 이미지의 어디에서 나왔다? 이 자리에 나왔다. 원본 이미지의 이 자리에서 -1 값이 나왔어요, 라는 소리가 됩니다. 그러니까 값과 뭐가 같이 저장되는 셈이죠? 위치. 네, 시퀀셜 데이터예요. 값과 위치가 저장되는 거죠. 이 값은, -1이라는 값은 원본 이미지의 이 자리에서 나온 거야, 라는 의미로 여기에다 딱 쓰는 거죠. 그다음에 어떻게 하냐? 이걸 한 칸 쉬프트해가지고 똑같이 계산해줘요. 이걸 한 칸 쉬프트해서 계산을 해주고, 그래서 이렇게 해서 쭉 스캔을 합니다. 이걸 가지고 쫙 스캔을 해서 여기를 쫙 채워넣고요. 그다음에 다 밑까지 내려갔으면, 팅, 옆으로 한 칸 이동해서 이 사각형을 여기다 탁 얹어놓고서 또 계산을 한 다음 쫙 스캔을 하고, 또 다 끝나면 옆으로 팅, 움직여서 쫙 스캔하고, 팅, 움직여서 쫙 스캔해가지고 이걸 쭉, 쭉, 쭉, 쭉, 쭉, 스캔해 갑니다. 그래서 쭉 스캔하면 이렇게 쭉 채워지게 되겠죠. 이렇게 채워지는 것이 바로 convolution 연산이 되겠습니다. 그래서 물론 이렇게 하고 나면 이게 일단은 아직 제가 convolution 연산의 의미라든지, 이게 어떤 것인지 말씀은 안 드렸고요. 지금까지는 일단 convolution 연산이 기계적으로 어떻게 계산되는가에 대해 말씀을 드렸어요. 그래서 여러분이 이 convolution의 의미는 다음 장에서, 다음 챕터에서 말씀을 드리고요, 일단은 여기서 꼭 아셔야 될 것이, convolution, 이 이미지와 필터가 주어졌을 때, 어떻게 이런 출력을 얻어내는가, 이것에 대해서는 이 기계적인 계산을 여러분이 잘 아셔야겠다는 라는 것, 말씀을 드립니다. 그다음에 여기서 하나를 더 추가한다면, 여기서 음수 부분이 있죠? 음수 부분을 다 0으로 치환하는 연산도 들어가기는 해요. 그래서 이걸, threshold라고 되어 있는데요, 이 부분은 다음 장에서 이것의 의미는 다음 장에서 계속 설명을 하도록 하겠습니다. 그래서 여기까지 이 앞까지는 여러분이 꼭 기계적인 계산, 이게 비록 기계적인 계산일지라도 여러분이 꼭 잘 아시면 좋겠다는 말씀을 드립니다. 자 그래서 오늘 이 시간에 말씀드린 것은요, CNN에 대해 말씀을 드렸고, CNN이라는 건 로컬 피쳐를 기반으로 해서 동작하는 뉴럴 네트워크. 어떤 것이라고 말씀드렸습니다. 그다음에 CNN은 fully connected neural network로 변환이 될 수는 있지만, 이것은 partially connected이고 Shared weight를 가진 것이다, 라고 말씀을 드렸고, CNN은 이미지 프로세싱과 시퀀셜 데이터 프로세싱에 많이 사용되는 모델이다, 기억을 하시고. 말씀드린 convolution 연산에 대해서도 꼭 기억하시기 바랍니다. [음악]