CNN 구조와 활성화 함수

파이썬 딥러닝 실무 프로젝트 강좌의 맛보기 강의입니다.

강의 대본 보기

CNN 모델 정의 컴파일 설정을 할 건데 데이터 준비가 다 끝나면 저희가 이제 CNN 모델을 만들어야 되겠죠. CNN 모델을 만들 건데 일단 저희가 이제 두 가지를 써야 돼요. 딥러닝도 아셔야 되고 CNN도 아셔야 되기 때문에 간단히 딥러닝 구조를 잠깐 살펴보고 구성 요소를 살펴보고 가겠습니다. 딥러닝은 저희가 이렇게 생겼죠. 입력층이 있고 그 다음에 출력층이 있습니다. 그리고 그 안에 다양하게 은닉층을 쌓은 걸 기본적인 딥러닝 우리가 말하는 DNN이죠. DNN 딥뉴럴 네트워크의 구조는 이렇게 생겼어요 CNN하고 상관없이 DNN은 이런 구조를 가지고 있고요 그 다음에 여기 각각의 은닉층은 은닉층 갯수와 여기 은닉층의 각각 노드라 부르죠 이런 노드의 갯수는 우리가 설정할 수가 있어요 이거는 우리가 설정할 수 있는 부분이고 층을 몇 개로 쌓을 건지 각 층마다 노드를 몇 개로 할 건지 결정하셔야 되는데 꼭 알고 계셔야 되는 것은 원래 딥러닝 구조 자체가 각각의 가중치합을 구해서 그 값을 가지고 저희가 활성화 함수를 통해서 결과가 어떤 결과가 나가는지를 결정해주는 활성함수가 붙어야 되거든요 그래서 은닉층의 각 노드마다 활성함수를 붙이는데 저희는 이미 기울기 소실 문제 때문에 렐루라고 결정이 나 있어요 처음엔 시그모이드를 썼다가 기울기 소실 문제가 커서 은닉층이 깊어졌는데도 가중치가 계산이 안 되는 이상한 현상이 벌어졌죠 그래서 렐루라는 함수로 바꾸고 났더니 그런 기울기 소실 문제가 없어졌다 그래서 렐루로 다 바꿨으면서 모든 은닉층의 노드에 렐루 함수가 붙는다고 보시면 좋을 것 같고요 그리고 우리가 지금 다중 분류를 하기 때문에 제가 활성화 함수를 그려놨는데 0이냐 1이냐 2이냐 이렇게 가릴 거잖아요 그래서 저희는 Softmax를 쓰겠습니다 Softmax 함수가 바로 다중 분류할 때 쓰는 출력층에 쓰는 활성화 함수다 이렇게 보시면 되겠습니다 구조는 이렇게 생겼고요 딥러닝을 구성할 때는 반드시 층, 입력층, 은닉층, 출력층을 뭐로 할 건지 여러분이 설계를 하셔야 되고 가중치, 바이어스, 가중합에 관한 생각들, 또 활성함수를 각 층마다 뭘 써야 될지를 여러분이 결정해 주셔야 되고요. 그리고 가장 중요한 건 손실함수라고 말씀을 드렸죠. 딥러닝을 회귀로 할 거냐, 분류 중에 이진 분류로 할 거냐, 다중 분류 할 거냐는 손실함수로 결정되기 때문에 굉장히 중요한 부분이고요. 오차를 줄이는 방법을 공부할 때 어떤 방법으로 해야 되는지 옵티마이저죠. 그 다음에 몇 번 공부를 시킬 거고 각 에포크마다 몇 개씩 잘라서 메모리에 올려줄 건지 배치 사이즈도 결정해주는 구성 요소들이 기본적으로 이렇게 되어 있어요 그래서 이 부분을 좀 이해하시고 가시는 게 나을 것 같아서 한번 들어왔고요 그리고 다시 한번 잠깐만 보시면 활성함수, 활성함수만 잠깐 볼게요 활성함수를 보시면 저희가 입력이 들어오면 가중의 합을 구했고 그 합을 가지고 활성함수를 처리를 해서 출력을 나가는 거죠 그럼 이 활성함수는 시그모이드 함수, 렐루 함수, 하이퍼볼릭 탄젠트 함수 시그모이드 함수는 중요한 함수이고 시그모이드 함수는 특히 이진 분류를 할 때는 출력층에 우리가 활성화 함수로 써야 되는 함수이기도 하거든요. 그래서 식은 이건데요. 1 플러스 e에 마이너스 x 승분의 1인 거고요. 그래서 우리가 전체 값, 실제 선형 같은 경우는 일직선이라 y는 ax+b 이게 선형 회귀선이잖아요 단순 선형 회귀선이었는데 요거는 마이너스 무한대에서 플러스 무한대 사이로 움직였지만 그래서 분류 문제를 해결 못했던 거예요 회귀는 해결했지만 분류 문제로 바꿀 수 있게 만든 게 바로 시그모이드 함수의 역할이었죠 그래서 y 값을 0하고 1 사이로 가둬 버리는 거예요 y를 0하고 1 사이로 가둬서 어떤 값이 돼도 0하고 1 사이 범위 내에서 왔다 갔다 할 수 있게 만든 게 시그모이드 함수라 예를 들어 그러면 어떤 값이 x 값에 의해서 0.5 보다 만약에 크다 y 값이 그렇게 나왔다 그러면 우리 뭐라 그러죠 0.5 보다 큰 값이 만약 나오면 저희가 1이라 그러자 그 다음에 0.5 보다 작은 값은 0이라 하자 이렇게 분류가 되는 거죠 그게 바로 시그모이드 함수고 분류할 때 특히 이진 분류에서 가장 많이 쓰는 함수고요 이 함수를 우리가 활성화 함수로 쓰긴 하는데 만약 은닉층에 썼더니 처음에는 활성화 함수가 시그모이드밖에 없었거든요 처음에 딥러닝 시작할 때 그래서 은닉층에도 썼더니 이상하게 은닉층을 많이 쌓았는데도 불구하고 별로 이렇게 계산이 잘 안 되더라 공부가 잘 안 되더라 라는 문제에 봉착이 됐었죠 굉장히 한동안 인공지능 딥러닝의 암흑기로 들어간 그런 문제였고요 그걸 해결한 게 바로 렐루 함수였다는 거죠 그래서 렐루 함수는 어떻게 식이 되냐면 만약에 x가 0보다 크면 원래 값을 그냥 가져가요 그런데 x가 0보다 작으면 어떻게 했죠 저희가 어떻게 되냐면 0으로 가져가는 거죠 아까 그 시그모이드가 왜 기울기 소실을 가져갔냐면 결국은 우리가 역전파로 순전파도 공부하지만 딥러닝은 역전파로 공부하는 거잖아요 가중치를 조절할 때 그 역전파를 할 때 쓰는 게 바로 미분이었는데 시그모이드 함수를 미분하게 되면 최대값이 0.25밖에 안 돼요 그럼 계속 은닉층에 있는 값들을 가중치 값을 곱해서 하면 1보다 작은 값이니까 곱하고 곱하고 하니까 더 작아지는 거죠 그래서 기울기가 소실됐던 문제가 있어서 만약에 작으면 어떻게 했죠? 0으로 그냥 치고 빼서 더 이상 미분이 안 되게 만들어 버린 거죠 그래서 렐루 함수가 기울기 소실문제를 해결했기 때문에 가장 많이 쓰이는 거고 렐루 함수 계열로 또 하이퍼볼릭 탄젠트인데 너무 작아 0부터 1 사이에 그래서 얘는 1과 마이너스 1 사이로 약간 좀 길게 늘렸다고 보시면 되겠습니다 하이퍼볼릭 탄젠트 함수가 있습니다 이게 바로 활성화 함수들이었어요 활성화 함수가 어떤 역할을 하는지를 꼭 알고 계셔야 돼서 한번 얘기를 했고요 손실 함수는 굉장히 중요하죠 우리의 목표니까 그래서 회귀면 평균오차 MSE를 쓰는 거고요 그 다음에 분류 같은 경우 크로스 엔트로피 오차를 쓰는데 이진분류는 바이너리 그 다음에 다중 분류 같은 경우 카테고리칼 크로스 엔트로피를 써야 된다라고 보시면 되겠고요 옵티마이저는 이 오차를 줄이는 방향으로 어떻게 공부시킬 건지에 그 방향을 결정해 주는 건데 그래서 가중치 업데이트를 결정할 수 있는 건데요 우리는 많이 쓰죠 여러 가지 방법이 있었지만 지금 현재는 다양한 알고리즘의 장점을 따온 아담을 많이 쓰는 걸로 결정이 나 있습니다. 에포크는 전체 학습 데이터를 몇 번 반복할지 결정해 주는 게 에포크요. 배치 사이즈는 그 배치 사이즈로 나누어서 메모리에 올려서 공부시키는 방법인 거죠. 그럼 가중치가 아무래도 많이 업데이트가 되니까 모니터링할 때 좀 편하겠죠. 그런 부분도 있고 메모리를 적게 갖고 있는 우리의 입장에서는 조금 더 효율적으로 진행될 수가 있습니다. 딥러닝의 필수적인 구성 요소만 잠깐 살펴봤습니다. 딥러닝에 대해서 저희가 잠깐 개념을 좀 살펴봤는데요. 복습 겸사겸사해서 우리는 결국 CNN을 오늘은 이용하셔야 되잖아요. 그래서 CNN 컨볼루션 신경망에 대해서 좀 살펴보도록 하겠습니다. 컨볼루션 신경망은 이미지에 대해서 특징을 잘 추출하는 마스크 필터 윈도우를 이용해서 하는 기법인 거고요. 그래서 이미지의 특성을 잘 파악할 수 있어요. 그냥 DNN에 비해서 딥뉴럴 네트워크 DNN에 비해 CNN은 이미지에 특화되어 있는 모델입니다. 입력층이 여전히 들어오지만 은닉층은 두 가지가 있습니다. 합성곱층에 해당되는 CNN 층인데 CNN 층도 역시 은닉층이니까 렐루라는 활성 함수가 필요하고요 그리고 합성곱층에서 특징을 추출을 했는데 너무 사이즈가 크다 보니까 얘를 좀 줄여주는 얘가 있어요 그 특징 맵을 약간 좀 줄여주는 거를 저희가 풀링층이라 그래요 대표값만 가지고 맥스 풀링 같은 걸 이용해서 대표값만 가지고 줄여서 진행하는 게 있으면서 이게 여러 번 진행될 수 있어요 그러니까 이거하고 풀링층 쌓는 거를 여러 번 쌓을 수가 있죠 그래서 은닉층이 이런 컨볼루션 층이 하나 들어오고요 그리고 제일 중요한 건 뭐냐면 컨볼루션으로 끝날 수 없어요 특징만 추출하는 거거든요 얘는 단순히 그럼 우리가 갖고 있는 그 아까 했던 DNN 있죠 DNN이 두 번째 은닉층으로 들어와서 출력층 되기 전에 은닉층 들어와서 뭘 해줘야 돼요? 분류를 해줘야죠 클래시피케이션을 해줘야 돼요 결국은 우리가 다중 분류에 해당되는 걸 해줘야 되는 거죠 소프트맥스 함수를 가져와서 다중 분류를 해줘야 되는 거죠 결국은 어렵게 생각할 필요 없어요 CNN은 입력이 들어오면 이렇게 앞단에 CNN층이 있고 얘를 분류하기 위한 뭐가 필요하다? DNN층 이렇게 해서 은닉층을 두 개 쓰는 거를 말한다 라고 보시면 되겠죠 그럼 얘 둘을 연결시켜야 되겠죠 이미지는 어차피 1차원은 아닌데 얘는 1차원이잖아요 그러면 얘를 3차원이라 칩시다 RGB 컬러까지 하면 3차원이 되는 거니까 3차원 데이터를 저희가 1차원인 데이터로 넣어주기 위해서는 플래튼이라는 층이 필요해요 플래튼이라는 함수를 이용한 플래튼이라는 층이 필요합니다 그래서 이거를 일렬로 쭉 줄을 세우는 거죠 그리고 나서 우리가 했던 덴스 레이어를 이용해서 뭐 한다? 분류를 하면 된다라고 보시면 되겠습니다 그래서 앞의 역할은 데이터를 특징하는 역할, 특징 추출, CNN은 그 다음에 이 완전연결층, 풀리커넥티드 되어 있는 DNN층은 데이터를 분류하는 목적으로 두 개를 붙여서 쓰는 거다 컨볼루션 신경망 CNN은 입력층이 있어야 되겠죠. 입력층은 높이, 너비, 채널 이렇게 들어와야 되는 거고요. 3차원 데이터가 들어오는 거고요. 합성곱층이 있는데 합성곱층은 아까 말씀드린 여기가 합성곱층이 되는 거죠. 여기는 조금 이따가 제가 연산을 보여드리긴 할 텐데요. 조그만 커널, 이걸 필터라고 해요. 셀카 찍고 필터를 통해서 사진을 내보내시잖아요, 필터링 하시잖아요. 그 필터하고 똑같고요. 이 사진을 필터를 가지고 이렇게 슬라이딩으로 움직이는 거예요. 필터를, 조그만 필터를 가지고 이 부분의 지역적인 특징을 쭉 슬라이딩 윈도우라고 해서 얘를 밀고 다니면서 특징을 파악하는 겁니다. 그래서 그 특징 파악해서 결과가 나온 게 특징 맵이라고 얘기를 하고요. 그래서 합성곱층은 특징을 파악해 주는 건데 그때 필요한 게 커널이고, 커널 사이즈는 보통 3x3 사이즈를 저희가 쓰죠. 그리고 몇 칸씩 밀 거냐, 이게 스트라이드예요. 움직이는 간격을 말하는 거죠. 그래서 합성곱층이 이루어지고, 그리고 이렇게 특징을 파악했으면 얘가 보시면 사이즈도 크죠. 그래서 얘를 좀 줄여주는 역할 풀링은 정해진 구역 안에서 가장 큰 값만 남기고 다음 층으로 넘어가는 다른 거는 무시하는 부분이 바로 맥스 풀링이라고 보시면 되겠어요. 축소가 되죠. 그래서 얘를 2를 쓴다. 2 곱하기 2를 쓴다 그러면 전체 4 곱하기 4였다 그러면 뭐가 되는 거냐면 2를 쓰게 되면 2 곱하기 2로 결정이 나는 거죠. 이런 식으로 반을, 절반을 딱 줄여주는 그런 역할을 하는 게 풀링층이라고 보시면 되겠습니다. 여러 번 반복될 수도 있어요. 특징은 다양한 필터를 또 쓰시려고 그러면 여러 층이 들어올 수 있다고 보시면 되고, 뒤에는 아까 얘기했듯이 분류하는 완전 연결층이 들어와야 되겠죠. 출력층이 나오는 거다 라고 보시면 되겠습니다.

이 강좌의 맛보기 강의

파이썬 딥러닝 실무 프로젝트
파이썬 딥러닝 실무 프로젝트강좌 자세히 보기