codingeverybody / codingyahac

https://coding.yah.ac
291 stars 50 forks source link

텐서플로우 102에서 Conv이나 MaxPool을 쓰는 이유 #1096

Open JunDamin opened 3 years ago

JunDamin commented 3 years ago

해결하고자 하는 문제

안녕하세요. 이번에 처음으로 텐서플로우를 배워보고 있는 초보 입니다. 초보자들을 위해서 간단한 것에서 점점 복잡하게 만들어가서 마냥 무서웠던 딥러닝에 대한 맛을 볼 수 있었던 것 같습니다. 강의를 들으면서 Convolution이나 Maxpooling을 도입해서 설계를 하는 것을 보았는데요.

CNN 또는 Maxpooling = 제약이 있는 레이어?

잘 모르는 사람이 보기에는 필터를 쓰거나 풀링을 하는 것이 weight를 줄 수 있는 노드를 제약한 레이어를 추가 하는 것과 동일하지 않을까 생각이 들었습니다. 즉 레이어를 그냥 추가해도 충분한 학습이 진행되면 같은 수준의 정확도가 생기지 않을까 싶었습니다. 어쩌면 비선형적 특성을 가지고 있는 부분을 놓치지 않고 패턴이 반영되서 더 나을 수도 있지 않을까 싶었습니다.

찾아야 하는 파라미터를 줄여서 학습시간이 짧아지는 장점 말고 Convolution이나 Maxpooling을 사용하는 이유가 혹시 있을지 문의드립니다.

storykim commented 3 years ago

말씀하신대로 레이어를 그냥 추가해도 같은 수준의 정확도, 혹은 더 높은 수준의 정확도를 보일 수 있습니다. 심지어 한 개의 히든 레이어만 가지고 있는 Neural Network가 어떠한 함수든 근사시킬 수 있다는 정리도 있습니다 (Universal Approximation Theorem).

그럼에도 불구하고 우리가 CNN이나 Maxpooling, 혹은 다른 테크닉들을 사용하는 이유는 네트워크를 학습하는 과정에서 일종의 힌트를 제공하기 위함입니다. 이미지로 예를 들어보겠습니다. 대부분의 이미지에서 우리는 이미지의 한 픽셀이 바로 인접한 픽셀과 크게 연관되고 있다는 사실을 알고 있습니다. 예를 들어 한 픽셀이 눈동자의 일부이면 그 이웃 픽셀도 눈동자의 일부거나, 눈동자와 연관된 무언가일 가능성이 높죠. 그런 지역적인 연관성을 모델이 쉽게 캐치하도록 돕기 위해 CNN을 사용합니다. 만약 Convolution을 사용하지않았다면 이 픽셀과 다른 픽셀의 연관성을 찾기위해 모든 픽셀들과 연산을 하는 비효율적인 과정을 거치겠죠? Maxpooling을 사용하는 이유도 비슷합니다. 이웃한 픽셀들은 비슷한 정보를 가지고 있기 때문에, 굳이 모든 정보들을 다 다음 레이어로 넘겨주는 것이 아니라 그 중에 가장 강한 시그널을 가지고 있는 정보만 다음 레이어로 넘겨주는 것입니다.

JunDamin commented 3 years ago

그렇군요.

그러면 구조를 만든다는 것이 ▲피팅이 더 빠르다는 장점 말고도 ▲모델의 설명력(어떻게 구동되는지) 알 수 있고 ▲잡음에 대한 저항성도 더 커질 것 같네요.(아주 멀리 떨어진 곳의 시그널은 필터 안에 들어오지 못하니까요)

답변 감사드립니다.