본문 바로가기
AI

CNN / RNN / LSTM

by anion 2023. 11. 2.

 

Conv2d

1. Convolution Layer

: Convolution Filter를 이용하여 이미지의 특징을 다양하게 추출

- 이때의 filter는 학습된 weight 값으로 보통 크기(ex. 3 X 3)만 지정함

- 아래와 같이 위치를 옮겨가며, element wise multiplication 수행하여 특징을 추출함

- 하나만 만드는 것이 아니라, 여러 개의 filter를 이용하여 여러 특징을 추출

2. Max Pooling

- Convolution Layer에서는 한 칸씩 움직였다면 이번엔 두 칸씩 움직임

- 해당 영역의 특징 값은 최대값으로 기록

 

CNN (Convolutional Neural Network)

 

  • 각 레이어의 입출력 데이터의 형상 유지
  • 이미지의 공간 정보를 유지하면서 인접 이미지와의 특징을 효과적으로 인식
  • 복수의 필터로 이미지의 특징 추출 및 학습
  • 추출한 이미지의 특징을 모으고 강화하는 Pooling 레이어
  • 필터를 공유 파라미터로 사용하기 때문에, 일반 인공 신경망과 비교하여 학습 파라미터가 매우 적음

이미지의 특징을 추출하는 부분과 클래스를 분류하는 부분으로 나눌 수 있습니다.

특징 추출 영역은 Convolution Layer와 Pooling Layer를 여러 겹 쌓는 형태로 구성됩니다.

Convolution Layer는 입력 데이터에 필터를 적용 후 활성화 함수를 반영하는 필수 요소입니다.

Convolution Layer 다음에 위치하는 Pooling Layer는 선택적인 레이어입니다.

CNN 마지막 부분에는 이미지 분류를 위한 Fully Connected 레이어가 추가됩니다.

이미지의 특징을 추출하는 부분과 이미지를 분류하는 부분 사이에 이미지 형태의 데이터를 배열 형태로 만드는 Flatten 레이어가 위치합니다. 

 

CNN은 이미지 특징 추출을 위하여 <그림1>과 같이 입력데이터를 필터가 순회하며 합성곱을 계산하고, 그 계산 결과를 이용하여 Feature map을 만듭니다. Convolution Layer는 Filter 크기, Stride, Padding 적용 여부, Max Pooling 크기에 따라서 출력 데이터의 Shape이 변경됩니다.

 

  • Convolution(합성곱)
  • 커널(Kernel)
  • 채널(Channel)
    • Convolution Layer에 유입되는 입력 데이터에는 한 개 이상의 필터가 적용됩니다. 1개 필터는 Feature Map의 채널이 됩니다. Convolution Layer에 n개의 필터가 적용된다면 출력 데이터는 n개의 채널을 갖게 됩니다.
    • 높이가 39 픽셀이고 폭이 31 픽셀인 컬러 사진 데이터의 shape은 (39, 31, 3)으로 표현
  • 필터(Filter)
    • CNN에서 Filter와 Kernel은 같은 의미
    • 필터는 지정된 간격으로 이동하면서 전체 입력데이터와 합성곱하여 Feature Map을 만듭니다.
    • 필터는 입력 데이터를 지정한 간격으로 순회하면서 합성곱을 계산합니다. 여기서 지정된 간격으로 필터를 순회하는 간격을 Stride라고 합니다. 
  • 스트라이드(Strid) 
  • 피처 맵(Feature Map)
    • Convolution Layer의 입력 데이터를 필터가 순회하며 합성곱을 통해서 만든 출력을 Feature Map 또는 Activation Map이라고 합니다.
    • Feature Map은 합성곱 계산으로 만들어진 행렬입니다. 
  • 액티베이션 맵(Activation Map)
    • Activation Map은 Feature Map 행렬에 활성 함수를 적용한 결과입니다. 즉 Convolution 레이어의 최종 출력 결과가 Activation Map입니다.
  • 패딩(Padding)
    • Convolution 레이어에서 Filter와 Stride에 작용으로 Feature Map 크기는 입력데이터 보다 작습니다. Convolution 레이어의 출력 데이터가 줄어드는 것을 방지하는 방법이 패딩입니다. 
    • 패딩은 입력 데이터의 외각에 지정된 픽셀만큼 특정 값으로 채워 넣는 것을 의미합니다. 
    • Padding을 통해서 Convolution 레이어의 출력 데이터의 사이즈를 조절하는 기능이 외에, 외각을 “0”값으로 둘러싸는 특징으로 부터 인공 신경망이 이미지의 외각을 인식하는 학습 효과
  • 풀링(Pooling) 레이어
    • 풀링 레이어는 컨볼류션 레이어의 출력 데이터를 입력으로 받아서 출력 데이터(Activation Map)의 크기를 줄이거나 특정 데이터를 강조하는 용도로 사용됩니다.
    • Max Pooling과 Average Pooning, Min Pooling
    • 정사각 행렬의 특정 영역 안에 값의 최댓값을 모으거나 특정 영역의 평균을 구하는 방식으로 동작
  • Convolution 레이어 출력 데이터 크기 산정
  • 입력 데이터 높이: H
  • 입력 데이터 폭: W
  • 필터 높이: FH
  • 필터 폭: FW
  • Strid 크기: S
  • 패딩 사이즈: P

CNN 구성

전형적인 CNN 구성입니다. CNN은 Convolution Layer와 Max Pooling 레이어를 반복적으로 stack을 쌓는 특징 추출(Feature Extraction) 부분과 Fully Connected Layer를 구성하고 마지막 출력층에 Softmax를 적용한 분류 부분으로 나뉩니다.

코드 1. CNN 모델 예제 코드 (Keras)

 

Flatten Layer는 CNN의 데이터 타입을 Fully Connected Neural Network의 형태로 변경하는 레이어입니다. Flatten 레이어에는 파라미터가 존재하지 않고, 입력 데이터의 Shape 변경만 수행합니다.

  • 입력 데이터 Shape =(2, 1, 80)
  • 출력 데이터 Shape =(160, 1)

CNN은 Fully Connected Neural Network과 비교하여 다음과 같은 특징을 갖습니다.

  • CNN은 학습 파라미터 수가 매우 작음
  • 학습 파라미터가 작고, 학습이 쉽고 네트워크 처리 속도가 빠름

 

- CNN 모델링 코드 예시

cnn_1 = tf.keras.layers.Conv1D(filters=d_model, kernel_size=5, padding='same') hidden = cnn_1(hidden)

 

<요약>

CNN(Convolutional Neural Network)은 이미지의 공간 정보를 유지하면서 인접 이미지와의 특징을 효과적으로 인식하고 강조하는 방식으로 이미지의 특징을 추출하는 부분과 이미지를 분류하는 부분으로 구성됩니다. 특징 추출 영역은 Filter를 사용하여 공유 파라미터 수를 최소화하면서 이미지의 특징을 찾는 Convolution 레이어와 특징을 강화하고 모으는 Pooling 레이어로 구성됩니다.

CNN은 Filter의 크기, Stride, Padding과 Pooling 크기로 출력 데이터 크기를 조절하고, 필터의 개수로 출력 데이터의 채널을 결정한다.

CNN는 같은 레이어 크기의 Fully Connected Neural Network와 비교해 볼 때, 학습 파라미터양은 20% 규모입니다. 은닉층이 깊어질 수록 학습 파라미터의 차이는 더 벌어집니다. CNN은 Fully Connected Neural Network와 비교하여 더 작은 학습 파라미터로 더 높은 인식률을 제공합니다.

 

+ 이전 레이어의 모든 노드가 다음 레이어의 모든 노드에 연결된 레이어를 Fully Connected Layer(FC Layer)라고 합니다. FC Layer를 Dense Layer라고도 합니다.

 

< 활성화함수 >

ReLU(Rectified Linear Unit, 경사함수)는 가장 많이 사용되는 활성화 함수 중 하나이다.

Sigmoid와 tanh가 갖는 Gradient Vanishing 문제를 해결하기 위한 함수이다.

Gradient Vanishing : 미분함수에 대해 일정 값 이상에서 미분 값이 소실

Sigmoid 함수는 음수 값을 0에 가깝게 표현하기 때문에 입력 값이 최종 레이어에서 미치는 영향이 적어지는 Vanishing Gradient Problem이 발생, Sigmoid 함수의 경우 은닉층의 깊이가 깊으면 오차율을 계산하기 어렵다는 문제가 발상하기 때문에, Vanishing Gradient Problem이 발생한다.

다시 말해, x의 절대값이 커질수록 Gradient Backpropagation 시 미분 값이 소실될 가능성이 큰 단점이 있다.

ReLU 정의

ReLU 함수 그래프

x가 0보다 크면 기울기가 1인 직선, 0보다 작으면 함수 값이 0이 된다. 이는 0보다 작은 값들에서 뉴런이 죽을 수 있는 단점을 야기한다.

또한 sigmoid, tanh 함수보다 학습이 빠르고, 연산 비용이 적고, 구현이 매우 간단하다는 특징이 있다.

 

 

< 옵티마이저 >

loss function의 최소값을 찾는 것을 학습의 목표

여기서 최소값을 찾아가는 것을 최적화=Optimization 이라고 하고

이를 수행하는 알고리즘이 최적화 알고리즘=Optimizer 이다.

수렴지점으로 빨리 나아가기 위해서는 파라미터의 업데이트 빈도 수에 따라 업데이트 정도 lr을 다르게 해줘야 할 필요가 있다.

RMSProp은 Adadelta와 마찬가지로 Adagrad의 lr 소실 문제를 해결하기 위해 개발된 알고리즘이다.

Adam (Adaptive Moment Estimation)

Momentum 와 RMSProp 두가지를 섞어 쓴 알고리즘이다.

즉, 진행하던 속도에 관성을 주고, 최근 경로의 곡면의 변화량에 따른 적응적 학습률을 갖은 알고리즘이다.

매우 넓은 범위의 아키덱처를 가진 서로 다른 신경망에서 잘 작동한다는 것이 증명되어,
일반적 알고리즘에 현재 가장 많이 사용되고 있다.

Adam 에서는 기울기 값과 기울기의 제곱값의 지수이동편균을 활용하여 step 변화량을 조절한다.

또한, 초기 몇번의 update 에서 0으로 편향되어 출발 지점에서 멀리 떨어진 곳으로 이동하는, 초기 경로의 편향 문제가 있는 RMSProp의 단점을 보정하는 매커니즘이 반영되어있다.

 

RNN (Recurrent Neural Network)

- 시계열 데이터(Seqential data, 음성, 자연어, 센서 데이터, 주가 등)를 처리하기 위한 모델

- 문장에서 이전에 나온 단어를 보고 다음 단어를 예측

- 동일한 weight와 bias가 모든 입력 값에 대해서 동일하게 사용됨

- Wx, Wh, bh 는 모두 같은 값으로 모델이 Recurrent하게 사용됨

밑에서부터 위로, 왼쪽에서부터 수행

+) h4에 아무런 옵션을 주지 않으면 Embedding들이 모두 하나의 벡터로 보임

ex) return_sequence = True를 해주지 않으면 모델 생성시 랭크가 줄어듦

- Forward 및 Backward는 같은 Wx, Wh, bh를 사용하거나 각각 다른 Wx, Wh, bh를 사용할 수도 있음

Bidirectional RNN. 양방향

- 다음과 같이 활용

- 길이에 제한 없음

RNN 네트워크를 재귀적으로 사용함

 

- 순서대로 처리해야 하므로 느림

ht를 계산하기 위해서는 ht-1이 필요하므로 병렬처리가 불가능함

- 오랜 과거의 정보에 접근하기 어려움

ht는 최근 정보의 영향이 크며, 과거의 정보는 점차 약해짐

- Vanishing gradient problem

먼 거리의 gradient는 사라지고, 가까운 gradient만 영향 받음

'writer'에 의해 'is'가 되어야 하지만, 거리가 멀어 gradient가 감소하여 잘못된 답을 고를 수 있음

- Exploding gradient problem - clipping으로 해결 가능

학습이 잘 안되거나 inf, NaN 등의 loss가 발생할 수 있음

rnn = tf.keras.layers.Bidirectional(tf.keras.layers.SimpleRNN(units=128, return_sequences=True)) hidden = rnn(hidden)

 

 

LSTM (Long-Short Term Memory)

- RNN의 Vanishing gradient 문제를 해결하기 위한 모델

- long term state를 위해 Memory cell을 추가함

즉, RNN에 비해 더 긴 정보를 잘 처리 함

 

- 3개의 Gates (sigmoid: 0~1의 값을 가짐) - 1에 가까울수록 많이 사용

Forget gate : 이전 step Memory cell의 정보를 얼마나 사용할지 결정

Input gate : 새로 계산된 Memory cell을 얼마나 사용할지 결정

Output gate : Memory cell 값을 얼만큼 사용할지 결정

예) Forget gate가 1이고, Input gate가 0이면 데이터가 사라지지 않고 끝까지 남아있음

- Cell & Hidden

New Cell Content : 현재 시점의 Memory cell 값

Cell state : 과거 Cell State와 현재 시점의 Cell content의 합

Hidden state : 현재 시점의 출력값

LSTM

LSTM

 

lstm = tf.keras.layers.Bidirectional(tf.keras.layers.LSTM(units=128, return_sequences=True)) hidden = lstm(hidden)


GRU (Gated Recurrent Unit)

- LSTM을 단순하게 만든 것

- LSTM 보다 단순한 구조이면서도 긴 데이터를 잘 처리함

- Memory cell 사용 X

- Gate 수를 2개로 줄임

LSTM과 GRU

- 2개의 Gates (sigmoid: 0~1) - 1에 가까울수록 많이 사용

Reset gate : 이전 시점의 ht-1 정보를 얼마나 사용할지 결정

Update gate : 현재 시점의 ht 정보를 얼마나 사용할지 결정

- Hidden

New Hidden content : 현재 시점의 Hidden state 값

Hidden state : 현재 시점의 출력값

GRU

GRU

gru = tf.keras.layers.Bidirectional(tf.keras.layers.GRU(units=128, return_sequences=True)) hidden = gru(hidden)

 

 

출처 : http://taewan.kim/post/cnn/

'AI' 카테고리의 다른 글

TensorFlow vs Keras  (0) 2024.03.22
라이브러리 vs 프레임워크  (0) 2024.03.22
파이토치  (0) 2024.03.11
딥러닝 심층신경망(DNN) 모델 프로세스  (0) 2023.10.31
앙상블  (0) 2023.10.31