CNN : 합성곱 신경망 - Convolutional Neural Network
# CNN 기본 개념
- 구조 : 합성곱층(Conv. layer) + 풀링층(Pooling)
1) 합성곱층 : 합성곱(Conv) 단계 + 렐루(Relu) 단계
2) 풀링층 : 풀링 연산 진행
- 필요성 : 이전의 다층 퍼셉트론 종류의 한계 때문
** 다층 퍼셉트론 : 은닉층이 여러 개 있는 머신러닝 기본 모델
- CNN 도 다층 퍼셉트론의 한 종류. 여러 개의 Dense 레이어들로 구성된 것도 다층 퍼셉트론의 종류.
- 이전 다층 퍼셉트론 (Dense 층 등) 의 한계 : 3D -> 2D 전처리를 반드시 해야 함
** (batch, width, height) 의 3차원 텐서를 입력값으로 받을 경우, 반드시 (batch, w * h) 의 2차원 텐서로 전처리 해줘야 했다
** 근데, 이것도 Embedding 층을 거치게 되면 결국 (batch, w * h, onehot) 의 3차원 텐서로 다시 변형되어 전달됨 ㅋㅋ;;
** Why? 모름. 그냥 관행상 그래왔음. 다른 방법이 아직 개발되지 못했던 시기였는듯
- 한계 : "공간적 특성" 을 잃어버린다!
-> 상하좌우에 어떤 값을 지니고 있었는지가 무의미해짐 ( (w,h) 였던 값을 (w*h) 값으로 바꿔버렸으니.. )
-> 이미지의 경우, 공간적 특성을 반영하는게 중요한데
CNN 은 공간적 특성마저 반영해서 학습을 시키도록 해준다!!
- 이미지의 기본 구조 : (height, width, channel)
1) height, width : 말 그대로, 이미지의 높이와 너비
2) channel : R, G, B 각각에 대해서 하나의 layer 가 생긴다고 보면 된다
> 각각의 R, G, B 층은 일반적으로 8비트인 256 pixel 값으로 채워진다.
(즉, 내부 값이 0~255 의 값들 중 하나라는 것. 원핫 이 아니다!)
< CNN 적용 단계 >
# CNN 의 각 단계 (1) : 합성곱 연산 (Conv. 연산)
- 입/출력 값 :
1) 인풋 값 : (batch, height, width) 의 3차원 텐서
2) 출력 값 : 커널(=필터) 와의 연산이 완료 된 "특성 맵"(=feature map)
- 목적 : 이미지의 특성을 추출하기 위함
- 기본 용어 설명
1) 커널(=필터) :
- 3*3 또는 5*5 크기의 배열 (2D 배열)
- 원핫 으로 구성
2) 특성 맵 :
- 커널과의 합성 곱 연산을 마무리 한 후의 결괏값 (2D 배열)
3) stride (=스트라이드) :
- 합성 곱을 하는 과정 하나하나마다, 커널을 얼만큼씩 이동하면서 연산할 것인가?
4) padding (=패딩) :
- 자연어 처리에서도 언급했던, "덧붙이는" 과정
- 의의 : 특성맵의 크기는 원본보다 크기가 작을수밖에 없다
-> 굳이, 특성맵의 크기를 원본과 똑같이 유지하고싶다면 padding 연산을 해주면 된다
-> 가장자리 부분을 0 으로 채워주는 것이며, 따로 패딩 부분은 제외하고 계산하는 방법도
있기 때문에 padding 연산은 디폴트로 해주는게 낫지 않을까 싶다.
- 커널(=필터) 사용 의의 :
- 밀집 층의 경우, 가중치(weight) 가 여러개 필요했음
> 임베딩된 인풋 벡터 차원 수 = N, 밀집층의 벡터 차원 수 = M 일때,
가중치 갯수 = N*M
- 커널 사용시, "커널의 크기만큼만" 가중치(weight)를 필요로 한다
> 커널 크기가 3*3 인 경우, 가중치 갯수 = 9
>> 더 적은 갯수의 가중치를 학습해도 되며 (=매개변수=파라미터)
이미지의 공간적 특성도 반영할 수 있다
# CNN 의 각 단계 (2) : 활성화 함수 통과
- 의의 : 비선형성을 추가하기 위함
> WHY?
- 선형성만 갖고 있는 모델의 경우,
데이터 값이 선형모델로는 절대 처리할 수 없는 경우에 대해서 대응이 불가능함.
- 억지로 비선형성을 추가해주는 것.
- 주로 사용하는 활성화 함수 : ReLU 함수
- 다른 퍼셉트론에서도, 활성화함수를 추가해서 비선형성을 추가해준다!
(CNN에만 국한되는게 아님)
# CNN 의 각 단계 (3) : 풀링 (Pooling)
- 방식 : 특성맵을 구했다면, 다시 한 번 더 "특성들" 을 추출해내는 과정을 거친다
> 특정 크기만큼의 샘플들로부터 대표값을 "하나씩" 뽑아온다
- 종류 :
1) Max Pooling (샘플중에서 가장 큰 값을 추출)
2) Average Pooling (샘플들의 값들을 평균 내서 추출)
- 합성곱 연산과의 차이점?
1) 합성곱 연산 : N 개의 채널들이 인풋으로 들어온다면, 1개의 채널 값으로 축소되어서 출력된다
WHY? 맨 마지막에, 각각의 채널들에 해당되는 특성 맵을 "더하는" 과정이 있기 떄문
> 즉, "차원" 자체가 줄어들게 된다 (3차원->2차원)
2) 풀링 : 각각의 채널들에 대해 대표 값들만 찾아서 "크기"를 줄일 뿐, "차원"을 줄이지는 않는다
> (3차원->3차원) 또는 (2차원->2차원)
# CNN 적용 : 여러 개의 채널에 대해서?
- 추가 연산 :
1) 1단계인 합성곱 연산(Convolution Operation) 과정에서,
"각 채널에 대해서" 커널을 이용해 특성맵을 추출한다
2) 추출해낸 여러 개의 특성맵들을 한 곳으로 모아서, "한꺼번에 더해"준다
> 이 결괏값을 새로운 특성맵으로 사용한다 (이것만 사용. 이전의 특성맵들은 더 이상 사용 안 함)
- 커널 텐서 차원 수 :
- 인풋 값이 3차원 텐서라고 하자 : (height, width, channel)
- 이때, 커널도 마찬가지로 3차원 텐서여야 한다 : (3, 3, channel) 또는 (5, 5, channel)
> 그래야, "각각의 채널" 에 대해 "맞춤형" 커널 곱을 해줄 수 있다
- 입출력 텐서 차원 수 :
- 인풋 텐서 : 3차원
- 커널 텐서 : 3차원
- 출력값 텐서 : 2차원 !!!!!!
WHY? 특성맵을 구해준 다음에, 결국엔 "합"을 구해준다고 했다!!
- "여러 개"의 커널 텐서들을 사용한다면? :
- 3차원 텐서의 커널들을 N 개 사용한다고 하자
- 그렇게 된다면, 각각의 커널들을 한개씩 뽑아서, 이에 대응되는 특성맵 2차원 텐서를 출력해낸다
- 결국, N 개의 특성맵 2차원 텐서들이 쌓이게 된다
>> 2차원 텐서 * N = 3차원 텐서 !!!
# CNN 에서 학습해야 하는 매개변수들은 뭘까?
'기계학습 > 자연어 처리 머신러닝' 카테고리의 다른 글
Generative 모델 & Discriminative 모델 (0) | 2020.04.25 |
---|---|
활성화 함수 & 출력층 함수 개념정리 (0) | 2020.02.21 |
유동 인구 예측 - 실전 프로젝트 (0) | 2020.02.20 |
글자 단위 RNN - N:1 모델 LSTM (0) | 2020.02.18 |
글자단위 예측 모델 - N:N 모델 LSTM (0) | 2020.02.18 |