취미/전공 관련 서재

밑바닥부터 시작하는 딥러닝1

Se-chan Oh 2022. 1. 8. 19:04

퍼셉트론 (Perceptron)

퍼셉트론은 프랑크 로젠블라트가 1957년에 고안한 알고리즘이다.

입력신호 x에 가중치 w를 곱해서 출력 y를 결정한다.

임계값을 (theta)라 하면,

if ((x1w1+x2w2)<=(theta)) y=1;

else y=0;

 

- 단층 퍼셉트론은 AND, NAND, OR 게이트를 충분히 구현할 수 있다.

- 단, XOR 게이트는 단층 퍼셉트론으로 구현할 수 없고, 다층 퍼셉트론으로 구현 가능하다. (단층 퍼셉트론은 좌표계를 직선 하나로 나눈 영역만 표현할 수 있기 때문)

- (theta)를 -b로 바꾸면, b + x1w1 + x2w2 <= 0 와 같이 식이 깔끔해진다. 이때 b를 '편향'이라 한다.

 

신경망

배열로 입력 신호의 합 A를 표현하면 : A = XW + B

활성함수 : 입력 신호의 총합을 출력 신호로 변환하는 함수

활성함수의 종류

- 계단함수(step function)

- 시그모이드 함수 (1/1+exp(-x))

- ReLU 함수 (ramp function 같은 느낌)

- 소프트맥스 함수 (y_k = exp(a_k) / ∑(exp(a_i))) -> 구현 시 주의점 : y_k = exp(a_k - a_max) / ∑(exp(a_i - a_max))  ∵ 오버플로우 때문

 

배치 처리(batch processing) : 하나씩 처리하는 것보다 여러개를 묶어서 한꺼번에 처리하는 방식이 효율적이다.

 

신경망 학습

알고리즘 : 사람이 생각한 알고리즘 -> 결과

머신러닝 : 사람이 생각한 특징(SIFT, HOG 등) -> 기계학습(SVM, KNN 등) -> 결과

딥러닝 : 신경망 -> 결과

- 사람이 개입하지 않음

 

원 핫 인코딩(one hot encoding) : 한 원소만 1, 나머지는 0으로 표현하는 표기법

 

손실함수

- 오차제곱합(Sum of Squares for Error, SSE) : E = 1/2 * ∑(y_k - t_k)^2

- 교차 엔트로피 오차(Cross Entropy Error, CEE) : E = -∑(t_k * ln(y_k)) -> 구현 시 주의점 : E = -∑(t_k * ln(y_k+1e-7)) ∵ ln(0)이 나오지 않도록 하기 위함

 

미니배치(mini-batch) : 훈련 데이터 전체의 손실함수를 계사할 수 없으니 그중 몇 개만 뽑아서 손실함수를 계산한다.

 

경사하강법(gradient descent)

- x_0 = x_0 - (에타) * (df/dx_0). x_1 = x_1 - (에타) * (df/dx_1)

- (에타) : 학습률(learning rate)

 

오차역전파법

계산그래프

계산 그래프의 역전파

- 덧셈 노드의 역전파

- 곱셈 노드의 역전파

- ReLU 계층의 계산그래프

- Sigmoid 계층의 계산그래프

- Softmax-with-Loss 계층의 계산그래프

- Affine 계층 : 행렬을 입력값으로 받아와 순전파와 역전파를 구현할 수 있는 구조

- 이 계층들을 조합하여 신경망을 구축할 수 있다.

 

오차역전파법으로 구한 기울기 검증하기 : 수치미분은 느리지만 정확도가 높으므로 오차역전파법을 정확히 구현했는지 확인하는 용도로 사용한다.

 

학습 관련 기술들

매개변수 최적화

- 확률적 경사 하강법(SGD)

W에 대한 손실함수의 기울기와 학습률을 곱한 값을 이용해 가중치 매개변수를 갱신한다.

- 모멘텀(Momentum)

속도 개념을 도입하여 기울기 방향으로 힘을 받아 물체가 가속된다는 물리법칙을 나타냈다.

- AdaGrad

개별 매개변수에 적응적으로 학습률을 조정한다.

- RMSProp : AdaGrad의 갱신 강도가 0이 되는 문제를 개선한 기법. 지수이동평균을 이용하여 과거의 기울기는 적게, 새로운 기울기는 크게 반영한다.

- Adam : 모멘텀과 AdaGrad를 융합한 방법.

 

가중치 초기값

- 가중치 초기값에 따라 활성화 값 분포가 달라지게 된다.

- 기울기 소실 : 활성화값들이 0과 1에 치우쳐 분포하게 되면 역전파의 기울기 값이 점점 작아지다가 결국 사라지게 되는 현상

- 표현력 제한 : 활성화값들이 한 쪽으로 치우쳐서 분포하면 뉴런 1개짜리와 별반 다를게 없어진다.

- 활성화값들을 고르게 분포시켜야 학습이 잘 이루어진다.

 

Xavier 초깃값

- sigmoid 또는 tanh 함수와 같이 활성화 함수가 선형일 때 사용한다.

- 앞 계층의 노드가 n개라면 가중치 초기값을 표준편차가 1/√n인 분포로 생성한다.

 

He 초깃값

- ReLU에 특화된 초깃값이다.

- 앞 계층의 노드가 n개라면 가중치 초기값을 표준편차가 √2/√n인 분포로 생성한다.

 

배치 정규화

- 배치 정규화를 활성화 함수의 앞 혹은 뒤에 삽입함으로써 데이터 분포가 덜 치우치게 할 수 있다.

- 학습 속도 개선, 초깃값에 크게 의존하지 않음, 오버피팅 억제와 같은 효과를 기대할 수 있다.

 

오버피팅

- 신경망이 훈련 데이터에만 지나치게 적응되어 그 외의 데이터에는 제대로 대응하지 못하는 상태.

- 매개변수가 많고 표현력이 높은 모델 또는 훈련데이터가 적은 경우에 주로 발생한다.

- 오버피팅은 매개변수의 값이 커서 발생하는 경우가 많기 때문에 '가중치 감소(weight decay)'로 해결할 수 있다. 손실함수에 W의 L2 norm인 ((람다)*W^2)/2를 더하면 가중치가 커지는 것을 억제할 수 있다. 역전파에서는 (람다)*W를 더한다.

- 뉴런을 무작위로 삭제하는 방법인 드롭아웃(Dropout)을 이용하여 오버피팅을 억제할 수 있다.

 

앙상블 학습(ensemble learning)

- 개별적으로 학습시킨 여러 모델의 출력을 평균 내어 추론하는 방식.

- 드롭아웃이 학습 때 뉴런을 무작위로 삭제하는 행위를 매번 다른 모델을 학습시키는 것으로 해석한다면 드롭아웃과 앙상블학습은 매우 밀접하다고 할 수 있다. 또한 드롭아웃은 앙상블 학습과 같은 효과를 하나의 네트워크로 구현했다고 생각할 수 있다.

 

적절한 하이퍼파라미터 값 찾기

- 매개변수 학습을 위한 훈련데이터, 신경망의 성능평가를 위한 시험데이터와는 별개로 '검증 데이터'를 따로 선정하여 하이퍼파라미터의 적절성을 평가한다.

- 우선 대략적인 범위를 설정하고 그 범위에서 무작위로 하이퍼파라미터 값을 골라낸 후 정확도를 평가한다. 이 작업을 반복하여 최적 값이 존재하는 범위를 좁혀나간다.

- 수학적으로 엄밀하고 더 효율적으로 최적화를 수행하는 기법으로 베이즈 최적화(Bayesian optimization)이 있다.

 

합성곱 신경망(CNN)

합성곱 계층

- 패딩(padding): 입력 데이터 주위에 0을 채운다.

- 스트라이드(stride) : 합성곱을 할 때 건너뛰는 간격.

- 합성곱(convolution) : 입력 데이터에 필터를 적용하고 스트라이드만큼 건너뛰면서 연산한다.

 

im2col

- image to column

- 입력 데이터를 필터링하기 좋게 전개하는 함수이다.

- 필터를 적용하는 영역을 한 줄로 늘어놓아 2차원 행렬 데이터로 변환한다.

- 입력 데이터와 필터를 im2col로 전개한 후 행렬곱을 하면 합성곱을 빠르게 할 수 있다.

- 합성곱계층의 역전파에서는 im2col을 사용하면 된다.

 

풀링 계층

- 최대 풀링을 주로 사용한다. 평균 풀링도 있다.

- 일반적으로 윈도우의 크기와 스트라이드를 같은 값으로 사용한다. (ex. 윈도우:4x4, 스트라이드:4)

- 학습해야 할 매개변수가 없다.

- 채널 수가 변하지 않는다.

- 입력의 변화에 영향을 적게 받는다(강건하다).

- 구현할 때에는 im2col을 이용해 전개한 후 각 행별 max값을 구하면 된다.

 

층 깊이에 따른 추출 정보 변화 : CNN의 합성곱 계층에서 추출되는 정보, 1번째 층은 에지와 블롭, 3번째 층은 텍스처, 5번째 층은 사물의 일부, 마지막 완전연결 계층은 사물의 클래스에 뉴런이 반응한다.

 

대표적인 CNN

- LeNet(1998)

- AlexNet(2012)

 

딥러닝

데이터 확장 : 입력 이미지를 회전, 대칭이동, 밝기조절, 확대, 축소, crop, flip 등의 변형을 주어 이미지의 개수를 늘린다.

 

층을 깊게 하는 이유

- 이론적인 근거는 아직 많이 부족하다.

- 층을 깊게 하면 매개변수 수가 줄어든다. (ex. 5x5 필터는 변수가 25개, 3x3필터 2개는 같은 기능을 하면서도 변수가 18개) -> 매개변수 수를 줄여 넓은 수영 영역을 소화할 수 있다.

- 신경망을 깊게 하면 학습해야 할 문제를 계층적으로 분해하여 더 단순한 문제로 대체할 수 있다.

 

유명한 신경망들

- VGG : 기본적인 CNN. 작은 필터를 사용한 합성곱 계층을 연속으로 거치고 마지막에는 완전연결 계층을 통과시켜 결과를 출력한다.

- GoogleLeNet : CNN이긴 한데 가로방향으로 폭이 있는 인셉션 구조. 인셉션 구조는 크기가 다른 필터와 풀링을 여러 개 적용하여 그 결과를 결합한다. 또한 1x1 필터를 이용한 합성곱 연산을 많이 사용하는데, 체널 쪽으로 크기를 줄이는 것으로 매개변수 제거와 고속 처리에 기여한다.

- ResNet : 층이 지나치게 깊으면 학습이 잘 되지 않는 문제를 해결하기 위해 VGG를 기반으로 스킵 연결을 도입.

 

전이 학습(transfer learning) : 학습된 가중치를 그대로 다른 신경망에 가져다가 재학습하는 것.

 

딥러닝 고속화

딥러닝에서는 가장 오랜 시간을 합성곱 계층에서 소요한다. 합성곱 계층에서 일어나는 단일-곱셈 누산을 고속으로 처리하는 것이 GPU 컴퓨팅의 목적.

GPU는 엔비디아와 AMD에서 제공하는데, 엔비디아의 GPU 컴퓨팅용 통합 개발환경인 CUDA에서 cuDNN이라는 딥러닝에 최적화된 함수들이 구현된 라이브러리를 제공.

분산학습 : 여러개의 GPU를 사용해서 학습하면 속도가 빨라짐. -> 텐서플로우같은 라이브러리에서 알아서 해줌.

딥러닝은 16비트 반정밀도만 사용해도 학습에 문제가 없다고 알려져 있음.

 

딥러닝의 활용

- 사물 검출 : 입력 이미지 -> 후보 영역 추출 -> CNN 특징 계산 순서로 처리함. 컴퓨터 비젼 분야의 다양한 기법을 사용해 후보영역을 추출하고 CNN으로 특징을 계산하는 것이 일반적인 R-CNN, 후보영역 추출까지 CNN으로 처리하는 것이 Faster R-CNN이다. 모든 일을 하나의 CNN에서 처리하기 때문에 Faster R-CNN이 더 빠르다.

- 분할 : 합성곱 계층만으로 구성된 네트워크인 FCN(Fully Convolutional Network)를 이용한다. FCN은 완전연결계층을 같은 기능을 하는 합성곱 계층으로 구현했다.

- 사진 캡션 생성 : NIC 모델이 대표적인데, 이는 심층 CNN과 자연어를 다루는 RNN으로 구성된다. RNN은 순환적 관계를 갖는 신경망으로 자연어나 시계열 데이터 등의 연속된 데이터를 받을 때 많이 활용한다. 사진이나 자연어와 같은 여러 종류의 정보를 조합하고 처리하는 것을 멀티모달 처리(multimodal processing)라고 한다.

- 이미지 생성 : DCGAN(Deep Convolutional Generative Adversarial Network)을 이용한다. GAN은 생성자와 식별자가 대립하는 구도의 모델이다.

- 강화학습 : 딥러닝을 이용한 강화학습 중 DQN(Deep Q-Network)이 있다. Q학습이라는 강화 알고리즘을 CNN으로 비슷하게 흉내 내어 사용한다. DQN은 딥마인드가 진행한 연구이다.

'취미 > 전공 관련 서재' 카테고리의 다른 글

SLAM의 이해와 구현  (0) 2023.07.23
수학으로 풀어보는 강화학습 원리와 알고리즘  (0) 2023.06.26
혼자 공부하는 로봇SW  (0) 2023.06.23
Do-it 강화학습 입문  (2) 2023.03.11