반응형

8.4.3 사진 캡션 생성

사진을 주면, 그 사진을 설명하는 글(사진 캡션)을 자동으로 생성하는 연구입니다.

 

딥러닝으로 사진 캡션을 생성하는 방법으로는 NIC Neural Image Catpion 모델이 대표적입니다.

NIC는 심층 cnn과 자연어를 다루는 순환 신경망으로 구성됩니다.

RNN은 순환적 관계를 갖는 신경망으로 자연어나 시계열 데이터 등의 연속된 데이터를 다룰 때 많이 활용합니다.

NIC는 CNN으로 사전에서 특징을 추출하고, 그 특징을 RNN에 넘깁니다.

NIC는 2개의 신경망 RNN, CNN

멀티모달 처리 multimodal processing: 사진이나 자연어와 같은 여러 종류의 정보를 조합하고 처리 하는 것

 

8.5 딥러닝의 미래

8.5.1 이미지 스타일(화풍)변환

그림을 그리는 연구

콘텐츠 이미지

스타일 이미지

 

8.5.2 이미지 생성 

DCGAN Depp convolutional generative adversarial network 기법

생성자와 식별자 로 불리는 2개의 신경망을 이용한다는 점

생성자가 진짜와 똑같은 이미지를 생성하고 

식별자는 그것이 진짜인지(생성자가 생성한 이미지인지 , 아니면 실제로 촬영된 이미지)를 판정합니다.

자율학습 : 지도 없이 스스로 학습하는 문제

 

8.5.3 자율 주행

SegNet

주위 환경을 올바르게 인식하는 기술이 가장 중요한 문제

 

 

8.5.4 Deep Q-Network(강화학습)

강화학습에서는 에지전트라는 것이 환경에 맞게 행동을 선택하고, 그 행동에 의해서 환경이 변한다는게 기본적인 틀입니다.

환경이 변화하면 에이전트는 어떠한 보상을 얻습니다. 

강화학습의 목적은 더 나은 보상을 받는 쪽으로 에이전트의 행동 지침을 바로 잡는 것입니다.

 

 

Deep Q-Network => DQN

Q학습이라는 강화학습 알고리즘을 기초로 합니다.

Q학습에서는 최적 행동 가치 함수로 최적인 행동을 정합니다.  이 함수를 딥러닝(CNN)으로 비슷하게 흉내 내어 사용하는 것이 DQN입니다.

CNN게임 영상 프레임

DQN 연구 중에는 비디오 게임을 자율 학습시켜 사람을 뛰어넘는 수준의 조작을 실현한 사례가 보고 되고 있습니다.

 

알파고와 DQN은 모두 구글이 인수한 딥마인드 가 진행한 연구입니다.

 

 

APPENDIX A

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

 

반응형

' > 밀바닥부터 시작하는 딥러닝' 카테고리의 다른 글

08-2. 딥러닝  (0) 2021.01.04
08-1. 딥러닝  (0) 2020.12.28
07-3 합성곱 신경망(CNN)  (0) 2020.12.18
07-2. 합성곱 신경망(cnn)  (0) 2020.12.09
07-1. 합성곱 신경망(cnn)  (0) 2020.11.19
반응형

8.3 더 빠르게 (딥러닝 고속화)

CPU만으로 딥러닝을 처리하기는 부족하게 현실입니다.

GPU Graphics processing unit


8.3.1 풀어야 할 숙제

시간이 오래 소요 할 수 있다.

AlexNet에서는 오랜 시간을 합성곱 계층에서 소요합니다.

합성곱 계층 단일 곱셈-누산

그래서 딥러닝 고속화라는 주제는 대량의 '다인 곱셈-누산'을 어떻게 고속으로 효율적으로 계산하느냐는 것입니다.

 

8.3.2 GPU를 활용한 고속화

GPU는 원래 그래픽 전용보드에 이용해왔습니다.

그러나 최근에는 그래픽 처리뿐 아니라 범용 수치 연산에도 이용합니다.

gpu 컴퓨팅

 gpu 로 범용 수치 연산을 수행하는 것을 gpu 컴퓨팅이라고 합니다.

cuDNN이라는 딥러닝에 최적화된 라이브러리를 이용하면 더욱 빨라짐을 확인할 수 있습니다.

GPU는 엔비디아와 AMD 두 회사가 제공합니다.

두 회사의 GPU 모두 범용 수치 연산에 이용할 수 있지만, 딥러닝과 더 '친한' 쪽은 아직까지는 엔비디아입니다.

엔비디아의 GPU컴퓨팅용 통합 개발 확경인 CUDA를 사용하기 때문이죠 

cuDNN은 CUDA위에서 동작하는 라이브러리로 , 딥러닝에 최적화된 함수 등이 구현 되어 있습니다.

 

합성곱 계층에서 행하는 연산은 im2col을 이용해 큰 행렬의 곱으로 변환할 수 있습니다. 

이러한 im2col의 방식은 gpu로 구현하기에도 적합합니다. 

GPU는 '작은 단위로 계산하기 보다는 큰 덩어리를 한번에 계산하는 데 유리하기 때문이죠 ,즉 im2col로 거대한 행렬의 곱으로 한 번에 계산하여 gpu의 잠재력을 끌어내는 것입니다.

 

8.3.3 분산 학습

수평확장 scale out하자는 아이디어 즉 분산 학습 가 중요해지는 것입니다.

gpu와 기기로 계산을 분산하기도 합니다.

cntk computational network toolkit는 분산 학습에 역점을 두고 개발하고 있습니다.

저지연 고처리량 low latency, high throughput 네트워크 위에서 이 프레임워크들이 수행하는 분산 학습은 놀라운 효과를 보이고 있습니다.

 

8.3.4 연산 정밀도와 비트 줄이기

계산 능력 외에도 메모리 용량과 버스 대역폭 등이 딥러닝 고속화에 병목이 될 수 있습니다.

메모리 용량 면에서는 대량의 가중치 매개변수와 중간 데이터를 메모리에 저장해야 한다는 것

버스 대역폭 면에서는 gpu (혹은 cpu)의 버스를 흐르는 데이터가 많아져 한계를 넘어서면 병목이 됩니다.

이러한 경우를 고려하면 네트워크로 주고받는 데이터의 비트 수는 최소로 만드는 것이 바람직합니다.

 

다행히 딥러닝은 높은 수치 정밀도(수치를 몇 비트로 표현하느냐)를 요구하지 않습니다.

이는 신경망의 중요한 성질중 하나로 , 신경망의 견고성에 따른 특성입니다.

 

컴퓨터에서 실수를 표현하는 방식으로 32비트  단정밀도 와 64비트 배정밀도 부동소수점 등의 포맷이 있지만, 지금 까지의 실험으로는 딥러닝은 16비트 반정밀도 만 사용해도 학습에 무제가 없다고 알려져 있습니다. 

실제로 엔비디아의 2016년 gpu인 파스칼 아키텍처는 이 포맷을 지원하여 , 이제는 반정밀도 부동소수점이 표준적으로 이용되리라 생각합니다.

 

 

 

엔비디아의 맥스웰 세대 gpu는 반정밀도 부동소수점 수를 스토리지 (데이터를 저장하는 기능)로 지원하고 있었지만, 연산 자체는 16비트로 수행하지 않았습니다. 이것이 파스칼 세대에 와서 연산 역시 16비트로 하기 시작하여 이전 세대보다 2배 정도 빨라졌습니다.

 

파이썬에서는 일반적으로 64비트 배정밀도 부동소수점 수를 사용합니다.

하지만 numpy는 16비트 반정밀도 부동소수점도 지원하며 , 이를 사용해도 정확도가 떨어지지 않는 것을 쉽게 확인할 수 있습니다.

 

8.4 딥러닝의 활용

사물 인식: 손글씨 숫자 인식

이미지 ,음성, 자연어 등 수많은 분야에서 딥러닝은 뛰어난 성능을 발휘

8.4.1 사물 검출

이미지 속에 담긴 사물의 위치와 종류(클래스)를 알아내는 기술입니다.

사물 검출은 사물 인식보다 어려운 문제입니다.

CNN을 이용하여 사물 검출을 수행하는 방식은 몇 가지가 있는데 , 그 중에서도 R-CNN이 유명합니다. 

 

R-CNN의 처리 흐름

1. 입력 이미지 

2. 후보 영역 추출

추출한 영역으로 

3. CNN 특징 계산

4. 영역 분류

 

먼저 사물이 위치한 영역을 (어떤 방법으로 ) 찾아내고 , 추출한 각 영역에 CNN을 적용하여 클래스를 분류하는 것이죠 . 

여기서 이미지를 사각형으로 변형하거나 분류할 때 서포트 벡터 머신 SVM을 사용하는 등 실제 처리 흐름은 다소 복잡하지만 , 큰 틀에서는 이 두가지 후보(우보 영역 추출과 CNN 특징 계산)로 구성됩니다.

 

후보 영역 추출 (사물처럼 보이는 물체를 찾아 처리)에는 컴퓨터 비전 분야에서 발전해온 다양한 기법을 사용할 수 있고 , R-CNN논문에서는 Selective Search기법을 사용했습니다.

최근에는 이 후보 영역 추출까지 cnn으로 Faster R-cnn기법도 등장했습니다. 

Faster R-cnn 은 모든 일을 하나의 cnn에서 처리하기 때문에 아주 빠릅니다.

 

8.4.2 분할

분할 segmentation이란 이미지를 픽셀 수준에서 분류하는 문제입니다.

픽셀 단위로 객체마다 채색된 지도 supervised데이터를 사용해 학습합니다.그리고 추론할 때 입력 이미지의 모든 픽셀을 분류합니다.

 

신경망을 이용해 분할하는 가장 단순한 방법은 모든 픽셀 각각을 추론하는 것입니다. 

짐작한 대로 이런 식으로는 픽셀의 수만큼 forward처리를 해야 하여 긴 시간이 걸리게 됩니다(정확히는 합성곱 연산에서 많은 영역을 쓸데없이 다시 계산하는 것이 문제가 됩니다.)

이러한 낭비를 줄여주는 기법으로 fcn fully convolutional network이 고안됬습니다. 이는 단 한번의 forward처리로 모든 픽셀의 클래스를 분류해주는 놀라운 기법입니다.

fully convolutional network를 직역하면 '합성곱 계층만으로 구성된 네트워크'가 됩니다.

일반적인 cnn이 완전연결 계층을 이용하는 반면, fcn은 이 완전연결 계층을 '같은 기능을 하는 합성곱 계층'으로 바꿉니다.

사물 인식에서 사용한 신경망의 완전연결 계층에서는 중간 데이터의 공간 볼륨(다차원 형태)을 1차원으로 변환하여 한 줄로 늘어선 노드들이 처리했으나 , fcn에서는 공간 볼륨을 유지한 채 마지막 출력까지 처리할 수 있습니다.

 

fcn에서 보듯 마지막에 공간 크기를 확대하는 처리를 도입했다는 것도 특징입니다.

이 확대 처리로 인해 줄어든 중간 데이터를 입력 이미지와 같은 크기까지 단번에 확대할 수 있습니다.

fcn의 마지막에 수행하는 확대는 이중 선형 보간 bilinear interpolation에 의한 선형 확대입니다.

fcn에서는 이 선형 확대를 역합성곱 연산으로 구현해내고 있습니다.

 

완전 연결 계층에서는 출력이 모든 입력돠 연결됩니다.

 

반응형

' > 밀바닥부터 시작하는 딥러닝' 카테고리의 다른 글

08-3. 딥러닝  (0) 2021.01.06
08-1. 딥러닝  (0) 2020.12.28
07-3 합성곱 신경망(CNN)  (0) 2020.12.18
07-2. 합성곱 신경망(cnn)  (0) 2020.12.09
07-1. 합성곱 신경망(cnn)  (0) 2020.11.19
반응형

심층 신경망

 

8.1 더 깊게

8.1.1 더 깊은 신경망으로 

손글씨 숫자를 인식하는 심층 cnn

채널 수 : 16, 16, 32, 32, 64, 64

가줓이 초깃값: He 초깃값

가중치 매개변수 갱신 : Adam

 

3x3 의 작은 필터를 사용한 합성곱 계층

활성화 함수는 ReLU

완전연결 계층 뒤에 드롭아웃 계층 사용

Adam을 사용해 최적화

가중치 초기값은 'He의 초깃값'

 

8.1.2 정확도를 더 높이려면

data augmentation: 입력 이미지(훈련 이미지)를 알고리즘을 동원해 '인위적'으로 확장합니다.

미세한 변화를 주어 이미지의 개수를 늘리는 것

crop이미지 일부를 잘라내는

flip*좌우를 뒤집는

밝기 등의 외형 변화

확대  축소 등의 스케일 변화

 

8.1.3 깊게 하는 이유

이론적인 근거는 아직 많이 부족한 것이 사실이다.

연구와 실험 결과를 바탕으로 설명할 수 있는 것이 몇가지 있다.

 

1. ILSVRC로 대표되는 대규모 이미지 인식 대회의 결과에서 파악 할 수 있다.

층의 깊이에 비례해 정확도가 좋아진다.

깊게 하는 이점:

 신경망의 매개변수 수가 줄어든다는 것입ㄴ디ㅏ.

 층을 깊게 한 신경망은 깊지 않은 경우보다 적은 매개변수로 같은(혹은 그 이상)수준의 표현력을 달성 할 수 있다.

 5x5 -> 연산 1회   (5x5) => 25개

 3x3 -> 2회 반복하여 5x5 대체 가능 (2x3x3) => 18개

 3x3 3회  => 7x7

 

receptive field:

작은 필터를 겹쳐 신경망을 깊게 할 때의 장점은 매개변수 수를 줄여 넓은 수용 영역을 소화할 수 있다는 데 있다.

(수용 영역은 뉴런에 변화를 일으키는 국소적인 공간 영역)

게다가 층을 거듭하면서 ReLU 등의 활성화 함수를 합성곱 계층 사이에 끼움으로써 신경망의 표현력이 개선됩니다.

이는 활성화 함수가 신경망에 '비선형' 힘을 가하고 , 비선형 함수가 겹치면서 더 복잡한 것도 표현할 수 있기 떄문ㅇ

 

2. 학습의 효율성

학습 데이터의 양을 줄여 학습을 고속으로 수행할수 있다는 뜻

 

합성곱 계층에서는 에지 등의 단순한 패턴에 뉴런이 반응하고 층이 깊어지면서 텍스처와 사물의 일부와 같이 점차 더 복잡한 것에 반응한다.

 

3. 신경망을 깊게 하면 학습해야 할 문제를 계층적으로 분해 할 수 있습니다.

각 층이 학습해야 할 문제를 더 단순한 문제로 대체할 수 있는 것이죠 .

 

4. 정보를 계층적으로 전달 할 수 있다는 점도 중요

예: 에지를 추출한 층의 다음 층은 에지 정보를 쓸 수 있고 , 더 고도의 패턴을 효과적으로 학습하리라 기대할 수 있습니다.

즉 , 층을 깊게 함으로써 각 층이 학습해야 할 문제를 '풀기 쉬운 단순한 문제'로 분해할 수 있어 효율적으로 학습하리라 기대할 수 있습니다.

 

 

8.2 딥러닝의 초기 역사

이미지 인식 기술을 겨루는 장인 ilsvrc imageNet Large scale visual recognition challenge 2012년 대회

AlexNet

 

8.2.1 이미지넷 

이미지넷 은 100만 장이 넘는 이미지를 담고 있는 데이터셋

ILSVRC대회:

분류 classification 

톱-5 top-5 error  확률이 가장 높다고  생각하는 후보 클래스 5개 안에 정답이 포함되지 않는 , 즉 5개 모두가 틀린 비율

 

 

2012년 AlexNet

2015년 ResNet 

 

8.2.2 VGG

합성곱 계층과 풀링 계층으로 구성되는 '기본적'인 CNN입니다.

비중있는 층(합성곱 계층, 완전 연결 계층)을 모두 16층(혹은 19층)으로 심화한게 특징입니다.( layer에 따라서 VGG16, VGG19 )

VGG : 주목할 점 : 3X3 작은 필터를 사용한 합성곱 계층을 연속으로 거친다는 것입니다.

2~ 4회 연속으로 풀링 계층을 두어 크기를 절반으로 줄이는 처리를 반복합니다. 

그리고 마지막에는 완전연결 계층을 통과시켜 결과를 출력합니다.

VGG는 2014년 2위

성능 면에서는 1위인 GoogLeNet에 뒤지지만 , VGG는 구성이 간단하여 응용하기 좋습니다.

 

8.2.3 GoogLeNet

인센션 구조

GoogLeNet은 세로 방향 깊이뿐 아니라 가로 방향도 깊다는 점이 특징입니다.

GoogLeNet 가로 방향에 '폭'이 있습니다.

이를 인셉션 구조라 하며  , 그 구조는 위의 그림과 같습니다.

인셉션  구조 : 같이 크기가 다른 필터(와 풀링)를 여려 개 적용하여 그 결과를 결합니다.

이 인셉션 구조를 하나의 빌딩 블록(구성요소)으로 사용하는 것이 GoogLeNet의 특징인 것이죠 , 또 GoogLeNet 에서는 1x1 크기의 필터를 사용한 합성곱 계층을 많은 곳 에서 사용합니다. 

이 1x1 의 합성곱 연산은 채널 쪽으로 크기를 줄이는 것으로 , 매개변수 제거와 고속 처리에 기여합니다.

 

8.2.4 ResNet 

마이크로소프트의 팀이 개발한 네트워크입니다.

특징: 지금 까지 보다 층을 더 깊게 할 수 있는 특별한 '장치'에 있습니다.

깊게 하는 것이 성능 향상에 중요하다는 건 알 고 있었지만 그러나 딥러닝의 학습에서는 층이 지나치게 깊으면 학습이 잘 되지 않고 , 오히려 성능이 떨어지는 경우도 많습니다.

ResNet에서는 그런 문제를 해결하기 위해  스킵연결skip connection을 도입합니다.

이 구조가 층의 깊이에 비례해 성능을 향상시킬 수 있게 한 핵심입니다.( 물론 층을 깊게 하는 데는 여전히 한계가 있습니다.)

 

시킵 연결이란 아래 그람와 같이 입력 데이터를 합성곱 계층을 건너뛰어 출력에 바로 더하는 구조를 말합니다.

스킵 연결은 층이 깊어져도 학습을 효율적으로 할 수 있도록 해주는데 , 이 는 역전파 때 스킵 연결이 신호 감쇠를 막아주기 때문입니다.

스킵 연결은 입력 데이터를 '그대로 ' 흘리는 것으로 , 역전파 때도 상류의 기울기를 그대로 하류로 보냅니다.

여기에서의 핵심은 상류의 기울기에 아무런 수정도 가하지 않고 '그대로 '흘린다는 것이죠 . 그래서 스킵 연결로 기울기가 작아지거나 지나치게 커질 걱정 없이 앞 층에 '의미 있는 기울기'가 전해지리라 기대할 수 있습니다.

층을 깊게 할 수록 기울기가 작아지는 소실 문제를 이 스킵 연결이 줄여주는 것입니다.

VGG신경망을 기반으로 스킵 연결을 도입하여 층을 깊게 했습니다.

ResNet은 합성곱 계층을 2개 층마다 건너뛰면서 층을 깊게 합니다

 

전이학습 transfer learning : 학습된 가중치(혹은 그 일부_를 다른 신경망에 복사한 다음, 그 상태로 재학습을 수앵합니다.

예를 들어 vgg와 구성이 같은 신경망을 준비하고 , 미리 학습된 가중치를 초깃값으로 설정한 후 , 새로운 데이터셋을 대상으로 재학습(fine tuning)을 수행합니다.

전이 학습은 보유한 데이터셋이 적을 때 특히 유용한 방법입니다.

 

반응형

' > 밀바닥부터 시작하는 딥러닝' 카테고리의 다른 글

08-3. 딥러닝  (0) 2021.01.06
08-2. 딥러닝  (0) 2021.01.04
07-3 합성곱 신경망(CNN)  (0) 2020.12.18
07-2. 합성곱 신경망(cnn)  (0) 2020.12.09
07-1. 합성곱 신경망(cnn)  (0) 2020.11.19
반응형

7.5 CNN구현하기

단순한 CNN의 네트워크 구성

 

OrderedDict 순서가 있는 딕셔너리

 

gradient()

순전파

self.loss()

 

역전파

dout = 1

dout = self.last_layer.backward(dout)

 

layers = list(self.layers.values())

layers.reverse()

for layer in layers:

  dout = layer.backward(dout)

 

7.6 cnn 시각화하기

 

 

계층이 깊어질수록 추출되는 정보(정확히는 강하게 반응하는 뉴런)는 더 추상화된다는 것을 알 수 있습니다.

 

AlexNet: 합성곱 계층과 풀링 계층을 여러 겹 쌓고 , 마지막으로 완전연결 계층을 거쳐 결과를 출력하는 구조입니다.

합성공 계층을 여러 개 쌓으면 , 층이 깊어지면서 더 복잡하고 추상화된 정보가 추출 된다는 것입니다.

처음 층은 단순한 에지에 반응하고 , 이어서 텍스처에 반응하고 , 더 복잡한 사물의 일부에 반응하도록 변화합니다.

즉 , 층이 깊어지면서 뉴런이 반응하는 대상이 단순한 모양에서 '고급' 정보로 변화해갑니다. 

다시 말하면 , 사물의 '의미'를 이해하도록 변화하는 것입니다.

 

 

7.7 대표적인 CNN

7.7.1 LeNet

cnn의 원조 LeNet

LeNet 은 손글 씨 숫자를 인식하는 네트워크로 , 1998 년 에 제안되였다.

합성곱 계층과 풀링계층(정확히는 단순히 '원소를 줄이기'만 하는 서버샘플링 계층)을 반복하고 , 마지막으로 완전연결 계층을 거치면서 결과를 출력

 

LeNet과 '현재의 CNN' 차이점:

활성화 함수  LeNet은 시그모이드 함수를 사용하는데 반해 ,현재는 ReLU를 사용

원래의 LeNet은 서브 샘플링을 하여 중간 데이터의 크기를 줄이지만 현재는 최대 풀링이 주류입니다.

 

큰 차이는 아니다. 

'첫 cnn'

 

7.7.1 AlexNet

딥러닝이 주목받도록 이끈 것 

2012년에 발표 

AlexNet 합성곱 계층과 풀링 계층을 거듭하며 마지막으로 완전연결 계층을 거쳐 결과를 출력합니다.

LeNet에서 큰 구조는 바뀌지 않았습니다만 , AlexNet에서는 다음과 같은 변화를 주었습니다.

활성화 함수로 ReLu를 이용

LRN(Local Response Normilization)이라는 국소적 정규화를 실시하는 계층을 이용

드롭아웃을 사용

 

gpu 

딥러닝 발전의 큰 원동력: 빅데이터와 gpu

 

반응형

' > 밀바닥부터 시작하는 딥러닝' 카테고리의 다른 글

08-2. 딥러닝  (0) 2021.01.04
08-1. 딥러닝  (0) 2020.12.28
07-2. 합성곱 신경망(cnn)  (0) 2020.12.09
07-1. 합성곱 신경망(cnn)  (0) 2020.11.19
06. 학습 관련 기술들  (0) 2020.10.20
반응형

7.4 합성곱/풀링 계층 구현하기

 

7.4.1 4차원 배열

cnn에서 계층 사이를 흐르는 데이터는 4차원입니다.

 

(10,3,28,28) => 높이 28 너비 28 채널 3개인 데이터가 10개 

 

import numpy as np
x = np.random.rand(10,1,28,29)
x.shape

 

 

 

7.4.2 im2col로 데이터 전개하기

합성곱 연산을 곧이곧대로 구현하려면 for문을 겹겹이 쌓아야 하는데 성능이 떨어지는 단점이 있어서 

im2col 사용 

im2col은 입력 데이터를 필터링(가중치 계산)하기 좋게 전개하는 (펼치는 )함수입니다.

3차원 입력 데이터에 im2col을 적용하면 2차원 행렬로 바뀝니다. (정확히는 배치 안의 데이터 수 까지 포함한 4차원 데이터를 2차원으로 변환합니다.)

필털이 하기 좋게 입력 데이터를 전개합니다.

입력 데이터에서 필터를 적용하는 영역(3차원 블록)을 한 줄로 늘어놓습니다.

필터 적용 영역이 겹치게 되면 im2col로 전개한 후의 원소 수가 원래 블록의 원소 수보다 많아집니다.

단점: im2col을 사용해 구현하면 메모리를 더 많이 소비하는 단점이 있습니다.

하지만 컴퓨터는 큰 행렬을 묶어서 계산하는데 탁월합니다.

image to column => Caffe와 Chainer등 의 딥러닝 프레임워크는 im2col이라는 이름의 함수를 만들어 합성곱 계층을 구현할 때 이용하고 있습니다.

 

im2col로 입력 데이터를 전개한 다음에는 합성곱 계층의 필터(가중치)를 1열로 전개하고 , 두 행렬의 곱을 계산하면 됩니다.  Affine계층 

 

7.4.3 합성곱 계층 구현하기

input_data(데이터수 , 채널수 , 높이 , 너비) => 4차원

import sys, os
sys.path.append(os.pardir)
from common.util import im2col
import numpy as np

x1 = np.random.rand(1,3,7,7)
col1 = im2col(x1, 5, 5, stride=1, pad=0)
print(col1.shape) #(9, 75)

x2 = np.random.rand(10,3,7,7)
col2 = im2col(x2,5,5,stride=1,pad=0)
print(col2.shape) #(90, 75)

ModuleNotFoundError: No module named 'common.util'

 

im2col함수를 정의하였다.

def im2col(input_img, FH, FW, stride=1, pad=0):
    N, C, H, W = input_img.shape
    out_h = 1 + int((H + 2 * pad - FH) / stride)
    out_w = 1 + int((W + 2 * pad - FW) / stride)
    img = np.pad(input_img, [(0, 0), (0, 0), (pad, pad), (pad, pad)], 'constant')  # pad 0 
    out_img = np.zeros((N, C, FH, FW, out_h, out_w))
    for y in range(FH):
        y_max = y + out_h * stride
        for x in range(FW):
            x_max = x + out_w * stride
            out_img[:, :, y, x, :, :] = img[:, :, y:y_max:stride,x:x_max:stride] 
    out_img = np.transpose(out_img,(0, 4, 5, 1, 2, 3))  # N,OH,OW,C,FH,FW
    out_img = out_img.reshape(N * out_h * out_w, -1)  # inmage 를 reshape height N*out_h*out_w,width C*FW*FH
    return out_img

아래의 방식도 가능하다.

def im2col(input_img, FH, FW, stride=1, pad=0):
    N, C, H, W = input_img.shape
    out_h = 1 + int((H + 2 * pad - FH) / stride)
    out_w = 1 + int((W + 2 * pad - FW) / stride)
    img = np.pad(input_img, [(0, 0), (0, 0), (pad, pad), (pad, pad)], 'constant') 
    out_img = np.zeros((N, C, FH, FW, out_h, out_w))
    for y in range(out_h):
        y_left=y*stride
        for x in range(out_w):
            x_left=x*stride
            out_img[:, :, :, :, y, x] = img[:, :, y_left:y_left+FH,x_left:x_left+FW] 
    out_img = np.transpose(out_img,
                           (0, 4, 5, 1, 2, 3))  
    out_img = out_img.reshape(N * out_h * out_w, -1)  
    return out_img

out_h = (H + 2*pad - filter_h)//stride + 1 =>  3/2 =>1

np.zeros((N, C, filter_h, filter_w, out_h, out_w)) => 초기화 

np.transpose(out_img,(0, 4, 5, 1, 2, 3))

=> 0은 움직이지 않고, 1->3 , 2->4 , 3-> 5, 4->1 , 5->2

 0 1 2 3 4 5

 0 4 5 1 2 3

reshape 2차원

import sys, os
import numpy as np

x1 = np.random.rand(1,3,7,7)
col1 = im2col(x1, 5, 5, stride=1, pad=0)
print(col1.shape) #(9, 75)

 

합성곱 계층을 Convolution이라는 클래스로 구현

 

python reshape 

reshape 두번째 인수를 -1로 지정했는데 , 이는 reshape이 제공하는 편의 기능

reshape -1을 지정하면 다차원 배열의 원소 수가 변환 후에도 똑같이 유지되도록 적절히 묶어집니다.

x = np.random.rand(10,3,7,7)
print(x.shape)
print(x.reshape(10,-1).shape)

 

forward에서 

python transpose

transpose 다차원 배열의 축 순서를 바뀌주는 함수

im2col로 전개한 덕분에 완전연결 계층의 Affine 계층과 거의 똑같이 구현할 수 있다.

class Conv:
    '''
    초기 필터(가중치), 편향, 스트라이드 , 패딩  
    4차원 형상(FN , C, FH , FW)
    FN - 필터 개수 
    C - 채널 개수
    FH -  필터 높이
    FW - 필터 너비 
    '''
    def __init__(self, W, b, stride = 1, pad = 0):
        self.W = W
        self.b = b
        self.stride = stride
        self.pad = pad
    def forward(self, x):
        FN , C , FH , FW = self.W.shape
        N, C, H, W = x.shape
        out_h = int(1 + H+ 2 * self.pad -FH / self.stride)
        out_w = int(1 + W+ 2 * self.pad -FW / self.stride)
        
        #RESHAPE를 통해 2차원 배열로 전개 
        # 블록을 한 줄로 펼쳐봅니다.
        col = im2col(x, FH, FW, self.stride, self.pad)
        col_W = self.W.reshape(FN, -1).T
        out = np.dot(col, col_W) + self.b
        
        out = out.reshape(N, out_h, out_w, -1).transpose(0,3,1,2)
        
        return out
        
    def backward(self, dout):
        FN, C, FH, FW = self.W.shape
        dout = dout.transpose(0,2,3,1).reshape(-1, FN)

        self.db = np.sum(dout, axis=0)
        self.dW = np.dot(self.col.T, dout)
        self.dW = self.dW.transpose(1, 0).reshape(FN, C, FH, FW)

        dcol = np.dot(dout, self.col_W.T)
        dx = col2im(dcol, self.x.shape, FH, FW, self.stride, self.pad)

        return dx

 

 

 

 

7.4.4 풀링 계층 구현하기

채널 쪽이 독립적이라는 점이 합성곱 계층 때와 다릅니다.

풀링 적용 영역을 채널마다 독립적으로 전개합니다.

class Pooling:
    def __init__(self, pool_h, pool_w, stride = 1, pad = 0):
        self.pool_h = pool_h
        self.pool_w = pool_w
        self.stride = stride
        self.pad = pad
        
    def forward(self, x):
        N , C , H , W = x.shape
        N, C, H, W = x.shape
        out_h = int(1 + (H - self.pool_h) / self.stride)
        out_w = int(1 + (W - self.pool_w) / self.stride)
        
        #RESHAPE를 통해 2차원 배열로 전개 
        # 블록을 한 줄로 펼쳐봅니다.
        col = im2col(x, self.pool_h, self.pool_w, self.stride, self.pad)
        col = self.W.reshape(-1,self.pool_h * self.pool_w)
        
        out = np.max(col, axis = 1) #최댓값
        
        out = out.reshape(N, out_h, out_w, -1).transpose(0,3,1,2)
        
        return out
        
    def backward(self, dout):
        dout = dout.transpose(0, 2, 3, 1)
        
        pool_size = self.pool_h * self.pool_w
        dmax = np.zeros((dout.size, pool_size))
        dmax[np.arange(self.arg_max.size), self.arg_max.flatten()] = dout.flatten()
        dmax = dmax.reshape(dout.shape + (pool_size,)) 
        
        dcol = dmax.reshape(dmax.shape[0] * dmax.shape[1] * dmax.shape[2], -1)
        dx = col2im(dcol, self.x.shape, self.pool_h, self.pool_w, self.stride, self.pad)
        
        return dx

1. 입력 데이터를 전개한다.

2. 행별 최댓값을 구한다.

3. 적절한 모양으로 성형한다.

 

np.max 메소드

np.max 인수로 축(axis)과 같이 쓰면 입력 x의 1번째 차원의 축 마다 최댓값을 구합니다.

반응형

' > 밀바닥부터 시작하는 딥러닝' 카테고리의 다른 글

08-1. 딥러닝  (0) 2020.12.28
07-3 합성곱 신경망(CNN)  (0) 2020.12.18
07-1. 합성곱 신경망(cnn)  (0) 2020.11.19
06. 학습 관련 기술들  (0) 2020.10.20
05. 오차역전파법  (0) 2020.10.16
반응형

밑바닥부터 시작하는 딥러닝을 참조하여 정리한 내용이다.

 

합성곱 신경망 (Convolutional neural network , CNN) : 

이미지 인식과 음성 인식 등 다양한 곳에서 사용되는데 , 특히 이미지 인식 분양에서 딥러닝을 활용한 기법은 거의 다 CNN을 기초로 한다.

 

7.1 전체 구조 

합성곱 계층 Convolutional layer

풀링 계층 pooling layer

 

완전연결 fully -connected, 전결합: 인접하는 계층의 모든 뉴런과 결합되어 있었습니다. 

완전히 연결된 계층을 Affine계층이라는 이름으로 구현했습니다.

 

 

7.2 합성곱 계층

cnn에서는 패딩, 스트라이드 등 cnn고유의 단어가 있다.

각 계층 사이에는 3차원 데이터 같이 입체적인 데이터가 흐른다는 점에서 완전연결 신경망과 다릅니다.

 

7.2.1 완전연결 계층의 문제점

완전연결 계층(Affine 계층) : 인접하는 계층의 뉴런이 모두 연결되고 출력의 수는 임의로 정할 수있습니다.

 

완전연결 계층 문제점:  데이터의 형상이 무시된다.

 

입력 데이터가 이미지인 경우를 예로 들면 ,이미지는 통상 세로 , 가로 , 채널(색상) 로 구성된 3차원 데이터입니다.

완전연결 계층으로 할 때는 3차원이 1차원으로 flatten 해줘어야 합니다.

이미지는 3차원 형상이며, 이 형상에는 소중한 공간적 정보가 담겨 있죠 . 

완전연결 계층은 형상을 무시하고 모든 입력 데이터를 동등한 뉴런(같은 차원의 뉴런)으로 취급하여 형상에 담긴 정볼르 살릴 수 없습니다.

 

cnn은 형상을 유지합니다.

3차원 데이터  입력 -> 3차원 데이터로 전달

 

cnn에서는 합성곱 계층의 입출력 데이터를 특징 맵feature map이라고도 합니다.

합성곱 계층의 입력 데이터를 입력 특징 맵 input feature map, 출력 데이터를 출력 특징 맵 output feature map이라고  한다.

 

7.2.2 합성곱 연산

이미지 처리에서 말하는 필터 연산에 해당

 

합성곱 연산은 입력 데이터에 필터를 적용합니다.

필터( 높이, 너비) -> 커널 kernel

 합성곱 연산은 필터의 윈도우 를 일정 간격으로 이동해가며 입력 데이터에 적용

원소끼리 곱한 후 그 총합을 구합니다.(단일 곱셈- 누산 fused multiply-add, FMA이라 합니다.)

결과를 출력의 해당 장소에 저장

 

 

 

완전연결 신경망에서는 가중치 매개변수와 편향이 존재하는데 , cnn에서는 필터의 매개변수가 그동안의 '가중치'에 해당됩니다.

 

 

 

7.2.3 패딩padding

합성곱 연산을 수행하기 전에 입력 데이터 주변을 특정값으로 채우기도 합니다.

패딩은 주로 출력 크기를 조정할 목적으로 사용합니다.

 

7.2.4 스트라이드 stride

필터를 적용하는 위치의 간격을 stride라고 합니다.

stride를 키우면 출력 크기는 작아집니다.

 

7.2.5 3차원 데이터의 합성곱 연산

특징맵

 

채널 쪽으로 특정맵이 여러개 있다면 입력 데이터와 필터의 합성곱 연산을 채널마다 수행하고 , 그 결과를 더해서 하나의 출력을 얻습니다.

 

3차원의 합성곱 연산에서 주의할 점은 입력 데이터의 채널수와 필터의 채널 수가 같아야 한다는 것입니다. 

 

7.2.5 블록으로 생각하기

3차원의 합성곱 연산은 데이터와 필터를 직육면체 블록이라고 생각하면 쉽습니다.

 

7.2.5 배치 처리

(데이텃, 채널 수 , 높이 , 너비) 순으로 저장

 

 

 

 

 

7.3 풀링 계층

풀링은 세로 가로 방향의 공간을 줄이는 연산입니다.

 

max pooling  최댓값을 구하는 연산

 

7.3.1 풀링 계층의 특징"

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

채널수가 변하지 않는다.

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

 

반응형

' > 밀바닥부터 시작하는 딥러닝' 카테고리의 다른 글

07-3 합성곱 신경망(CNN)  (0) 2020.12.18
07-2. 합성곱 신경망(cnn)  (0) 2020.12.09
06. 학습 관련 기술들  (0) 2020.10.20
05. 오차역전파법  (0) 2020.10.16
04. 신경망 학습  (0) 2020.09.25
반응형

출처 : 밑바닥부터 시작하는 딥러닝

가중치 매개변수의 최적값을 탐색하는 최적화 방법 , 가중치 매개변수 초깃값, 하이퍼파라미터 설정 방법등 , 

오버피팅의 대응책인 가중치 감소와 드롭아웃 등의 정규화 방법 

 

6.1 매개변수 갱신

신경망 학습의 목적은 손실 함수의 값을 가능한 한 낮추는 매개변수를 찾는 것이다.

최적화 optimization :  매개변수의 최적값을 찾는 문제

 

확률적 경사 하강법 SGD 는 매개변수의 기울기를 이용하여 매개변수를 갱신하는 최적화의 한 가지 방법

 

6.1.1 모험가 이야기

기울기를 단서로 

SGD의 전략은 가장 크게 기울어진 방향으로 가자는 것이다.

 

6.1.2 확률적 경사 하강법 SGD

W는 갱신할 가중치 매개변수,  ∂L/∂W은 W에 대한 손실 함수의 기울기

η 는 학습률

 

6.1.3 SGD의 단점

SGD는 단순하고 구현도 쉽지만 문제에 따라서 비효율적일 때가 있습니다. 

최솟값이 되는 장소는 (0, 0) 이지만 기울기 대부분은 (0, 0) 방향을 가리키 지 않고 있습니다.

SGD의 단점: 비등방성 anisotropy 함 수에서 탐색 경로가 비효율적(방향에 따라 성질, 즉 여기에서는 기울기가 달라지는 함수)

 

SGC의 이런한 단점을 개선해주는 모멘텀, AdaGrad, Adam이라는 세가지 방법

 

6.1.4 모멘텀 Momentum

Momentum운 운동량을 뜻하는 단어로 , 물리와 관계가 있습니다.

W는 갱신할 가중치 매개변수,  ∂L/∂W은 W에 대한 손실 함수의 기울기

η 는 학습률

sgc와 차이점은 속도가 추가 된다.

velocity :기울기 방향으로 힘을 받아 물체가 가속된다는 물리 법칙 이용

항은 속도가 차츰 감소 되도록 하는 역할 ( = 0.9 등의 값 )

V 는 속도 velocity

 

SGD와 비교하여 지그재그의 정도가 덜하다.

x축의 힘은 아주 작지만 방향은 변하지 않아서 한 방향으로 일정하게 가속하기 때문입니다.

y축의 힘은 크지만 위아래로 번갈아 받아서 상충하여 y축 방향의 속도는 안정적이지 않습니다.

 

6.1.5 AdaGrad

신경망 학습에서는 학습률 값이 중요하다.

너무 작으면 학습시간이 길어지고 너무 크면 발산하여 학습이 제대로 안됨

학습률을 정하는 효과적 기술로 학습률 감소 learning rate decay 가 있음

처음에는 크게 학습하다가 조금씩 작게 학습한다는 예기로 , 실제 신경망 학습에 자주 쓰입니다.

AdaGrad - adaptive + gradient :각각의 매개변수에 적응적으로 학습률을 조정하면서 학습을 진행
각각의 매개변수에 '맞춤형' 값을 만들어줍니다.

 

h는 기존 기울기값을 제곱하여 계속 더해줌

      기호는 행렬의 원소별 곱셈을 의미

 

h는 기존 기울기 값을 제곱하여 계속 더해줍니다.

그리고 매개변수를 갱신할 때

을 곱해 학습률을 조정

 

매개변수의 원소 중에서 많이 움직인(크게 갱신된)원소는 학습률이 낮아진다는 뜻인데 , 다시 말해 학습률 감소가 매개변수의 원소마다 다르게 적용됨을 뜻하죠

 

 

RMSProp 과거의 모든 기울기를 균일하게 더해가는 것이 아니라, 먼 과거의 기울기는 서서히 잊고 새로운 기울기 정볼를 크게 반영합니다. 이를 지수이동평균Exponentail Moving Average , EMA 이라 하여 , 과거 기울기의 반영 규모를 기하급수적으로 감소시킵니다.

 

1e-7 => 대부분의 딥러닝 프레임워크에서는 이 값도 인수로 설정할 수 있습니다.

 

 

최솟값을 향해 효율적으로 움직이는 것을 알 수 있음

y축 방향은 기울기가 커서 처음에는 크게 움직이지만, 그 큰 움직임에 비례해 갱신 정도도 큰 폭으로 작아지도록 조정됩니다.

 Y 축 방향으로 갱신 속도가 빠르게 약해지고 , 지그재그 움직임이 줄어듭니다.

 

6.1.6 Adam

Adam = AdaGrad + Momentum

모멘텀은 공이 그릇 바닥을 구르는 듯한 움직임을 보였습니다. 

AdaGrad는 매개변수의 원소마다 적응적으로 갱신 정도를 조정했습니다.

 

이 두개 융합:

하이퍼파라미터의 '편향 보정'이 진행된다는 점도 Adam의 특징입니다.

대체적으로 Adam을 많이 사용

 

Adam 갱신 과정도 그릇 바다을 구르듯 움직입니다. 모멘텀과 비슷한 패턴인데 , 모멘텀 떄보다 공의 좌우 흔들림이 적습니다. 이는 학습의 갱신 강도를 적응적으로 조정해서 얻는 혜택입니다.

 

6.1.7 어떤 갱신 방법을 이용할 것인가?

모든 문제에서 항상 뛰어난 기법이라는 것은 (아직까진) 없습니다. 

요즘에는 Adam을 많이 사용합니다.

 

6.1.8 MNIST 데이터셋으로 본 갱신 방법 비교

SGR의  학습 속도가 가장 느리군요 .

나머지 세 기법의 진도는 비슷한데 , 잘 보면 AdaGrad가 조금 더 빠른 것입니다.

주의 할 점은 하이퍼파라미터인 학습률과 신경망의 구조(층 기피 등) 에 따라 결과가 달라진다

 

6.2 가중치의 초깃값

성패가 가르는 중요한 요인

 

6.2.1 초깃값을 0으로 하면 ?

오버피팅을 억제해 법용 성능을 높이는 테크닉인 가중치 감소 weight decay 기법

가중치 감소는 간단히 말하자면 가중치 매개변수의 값이 작아지도록 학습하는 방법입니다.

가중치 값을 작게 하여 오버피팅이 일어나지 않게 하는 것이죠 .

 

가중치를 작게 만들고 싶으면 초깃값도 최대한 작은 값에서 시작하는 것이 정공법이죠 .

 

실제로 가중치 초깃값을 0으로 하면 학습이 올바로 이뤄지지 않습니다.

 

이유는 : 바로 오차역전파법에서 모든 가중치의 값이 똑같이 갱신되기 떄문입니다.

 

6.2.2 은닉층의 활성화값 분포 

은닉층의 할성화(활성화 함수의 출력 데이터)의 분포를 관찰하면 중요한 정보를 얻을 수 있다.

 

데이터가 0과 1에 치우쳐 분포하게 되면 역전파의 기울기 값이 점점 작아지다가 사라집니다. 

이것이 기울기 소실 gradient vanishing이라 알려진 문제입니다. 

층을 깊게 하는 딥러닝에서는 기울기 소실은 더 심각한 문제가 될 수 있습니다.

 

활성화값들이 치우치면 표현력을 제한한 다는 관점에서 문제가 됩니다.

Xavier 초깃값 : 일반적인 딥러닝 프레임워크들이 표준적으로 이용하고 있습니다.

Xavier 초깃값을 사용하면 앞 층에 노드가 많을 수록 대상 노드의 초깃값으로 설정하는 가중치가 좁게 됩니다. 

층이 깊어지면서 형태가 다소 일그러지지만 앞의 방식보다는 확실히 넓게 분포됨을 알 수 있습니다.

 

tanh()의 사용

분포를 좀 더 개선하기 위해 tanh() 사용할 수 있음

사용하면 말끔한 종 모양으로 분포됩니다.

 

6.2.3 ReLU를 사용할 떄의 가중치 초깃값

Sigmoid 함수와 tanh 함수는 둘 다 중앙부근에서 선형인 함수이기에 Xavier 초깃값이 적당합니다.

반면 , ReLU는 음의 영역이 0이기에 더 넓게 분포시키기 위해 2배의 계수가 필요

ReLU에 특화된 초깃값: He 초깃값

 

STD=0.01일 떄의 각층의 활성화 값들은 아주 작은 값들입니다.

신경망에 작은 데이터가 흐른다는 것은 역전파 때 가중치의 기울기 역시 작 아진다는 것이며 실제로도 학습이 거의 이뤄지지 않음

 

Xavier 초깃값 결과는 깊어지면서 치우침이 조금씩 커집니다

실제로 층이 깊어지면 활성화값들의 치우침도 커지고 , 학습할 떄 '기울기 소실'문제를 일으킵니다.

 

마지막으로 He초깃값은 모든 층에서 균일하게 분포되었습니다.

층이 깊어져도 분포가 균일하게 유지되기에 역전파 때도 적절한 값이 나올 것으로 기대할 수 있습니다.

 

6.2.4 MNIST 데이터셋으로 본 가중치 초깃값 비교

 

std=0.01일 때는 학습이 전혀 이뤄지지 않습니다.앞서 활성화값이 분포에서 본 것처럼 순전파 때 너무 작은 값(0 근처로 밀집한 데이터)이 흐르기 때문입니다. 그로 인해 역전파 때의 기울기도 작아져 가중치가 거의 갱신되지 않는 것이죠 

반대로 Xavier와 He 초깃값의 경우는 순조롭게 이뤄지고 있습니다. 다만 학습 진도는 He초깃값 쪽이 더 빠르군요.

 

6.3 배치 정규화

각층이 활성화를 적당히 퍼뜨리도록 '강제'

 

6.3.1 배치 정규화 Batch Normalization 알고리즘

 

배치 정규화가 주목받는 이유:

학습을 빨리 진행할 수 있다. (학습 속도 개선)

초깃값에 크게 의존하지 않는다.(골치 아픈 초깃값 선택 장애여 안녕 !)

오버피팅을 억제한다. (드롭아웃 등의 필요성 감소)

 

각 층에서의 활성화 값이 적당히 분포되도록 조정하는 것입니다.

데이터 분포를 정규화하는 배치 정규화 계층을 신경망에 삽입합니다.

 

학습 시 미니배치를 단위로 정규화함

구체적으로는 데이터 분포가 평균이 0, 분산이 1이 되도록 정규화

 

배치 정규화 개층마다 이 정규화된 데이터에 고유한 확대와 이동 변환을 수행합니다.

 

6.2.3 배치 정규화의 효과

MNIST 데이터셋을 사용하여 배치 정규화 계층을 사용할 때와 사용하지 않을 때의 학습 속도를 실험

결과: 배치 정규화가 학습을 빨리 진전시키고 있습니다. 

 

거의 모든 경우에 배치 정규화를 사용할 때 학습이 빠르다.

 

 

6.4 바른 학습을 위해

기계학습에서는 오버피팅이 문제가 되는 일이 많음

오버피팅이란 신경망이 훈련 데이터에 지나치게 적응되어 그 외의 데이터에 대한 적응력이 떨어지는 상태 

아직 보지 못한 데이터를 바르게 식별하는 모델이 바람직

 

6.4.1 오버피팅 Overfitting

오버피팅이 주로 일어나는 경우

매개변수가 많고 표현력이 높은 모델

훈련 데이터가 적음

 

 

6.4.2 가중치 감소

오버피팅을 억제하기 위한 방법  가중치 감소 Weight decay

학습 과정에서 큰 가중치에 대해 상응하는 큰 페널티 부과하여 오버피팅을 억제하는 방법입니다.

오버피팅이 가중치 매개변수의 값이 커서 발생하는 경우가 많기 때문이죠 .

 

신경망 학습의 목적은 손실 함수의 값을 줄이는 것입니다.

가중치의 제곱 L2 norm을 손실 함수에 더하면 가중치가 커지는 것을 억제

L2 norm: 각 원소의 제곱들을 더한 것

 

가중치의 기울기를 구하는 계산에서 그동안의 오차 역전파법에 따른 결과에 λW를 더함

λ람다는 정규화의 세기를 조절하는 하이퍼파라미터

 

λ = 0.1로 가중치 감소를 적용한 결과

훈련 데이터와 시험 데이터에 대한 정확도에는 여전히 차이가 있지만 가중 치 감소를 이용하지 않은 결과와 비교했을 때 차이가 줄어들었음

오버피팅이 억제되었다는 의미

 

6.4.3 드롭아웃 Dropout

오버피팅을 억제하기 위해 뉴런을 임의로 삭제하면서 학습하는 방법입니다.

훈련 때는 은닉층의 뉴런을 무작위로 골라 삭제합니다. 삭제된 뉴런은 신호를 전달하지 않게됩니다.

 

예측 때는 모든 뉴런을 사용하되 각 뉴런의 출력에 훈련 때 삭제 비율을 곱 하여 출력

학습 시와 비슷한 출력을 위함

 

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

하이퍼파라미터 : 신경망 층의 갯수, 층의 뉴런 수, 배치 크기, 학습률, 드롭아웃 비율 등

적절한 값을 설정하지 않으면 모델의 성능이 크게 떨어지기도 함

많은 시행착오가 필요하다.

 

6.5.1 검증 데이터 

검증 데이터 Validation Dataset

훈련데이터로는 학습을 하고 , 시험 데이터로는 범용 성능을 평가했죠 . 

검증 데이터 하이퍼파라미터 조정용 데이터를 일반적으로 검증 데이터라고 부릅니다.

 

데이터셋에 따라서는 training, validation, test set을 미리 분리해서 제공되 는 것도 있음

 

6.5.2 하이퍼파라미터 최적화

하이퍼파라미터의 '최적 값'이 존재하는 범위를 조금씩 줄여가는 것입니다.

우선 대략적인 범위를 설정하고

그 범위에서 무작위로 하이퍼파라미터 값을 골라낸 후, 그 값으로 정확도 평가

정확도를 잘 살피면서 이를 반복하여 최적 값의 범위를 좁혀가는 것입니다.

 

하이퍼파라미터의 범위는 '대략적'으로 지정하는 것이 효과적입니다.

하이퍼파라미터를 최적화 할 때는 딥러닝 학습에는 오랜 시간 걸릴 수 있기에 나쁠 듯한 값은 일찍 포기하는 것이 좋습니다.

그래서 학습을 위한 에폭을 작게 하여 1회 평가 시간을 단축하는 것이 효과적입니다. 

 

6.5.3 하이퍼파라미터 최적화 구현하기

학습률과 가중치 감소 계수를 탐색하는 문제

 

잘 될 것 같은 값의 범위를 관찰한 후에 범위를 좁혀서 더 높은 성능을 내는 하이퍼파라미터 탐색

반응형

' > 밀바닥부터 시작하는 딥러닝' 카테고리의 다른 글

07-2. 합성곱 신경망(cnn)  (0) 2020.12.09
07-1. 합성곱 신경망(cnn)  (0) 2020.11.19
05. 오차역전파법  (0) 2020.10.16
04. 신경망 학습  (0) 2020.09.25
03. 신경망  (0) 2020.09.23
반응형

출처 : 밑바닥부터 시작하는 딥러닝

 

신경망의 가중치 매개변수의 기울기(정확히는 가중치 매개변수에 대한 손실 함수의 기울기)는 수치 미분을 사용해 구했습니다.

수치 미분은 단순하고 구현하기도 쉽지만 계산 시간이 오래 걸린다는 게 단점입니다.

 

가중치 매개변수의 기울기를 효율적으로 계산하는 오차역전파법 backpagation을 배워보겠습니다. 

 

오차연전파법을 제대로 이해하는 방법은 두 가지가 있을 것입니다.

하나는 수식을 통한 것이고 

다른 하나는 계산 그래프를 통한 것입니다.

 

계산 그래프를 사용해서 '시작적'으로 이해시켜드리겠습니다.

 

 

5.1 계산 그래프

계산 그래프 computational graph 는 계산 과정을 그래프로 나타낸 것입니다.

여기에선느 그래프는 우리가 잘 아는 그래프 자료구조로 , 복수의 노드와 에지로 표현됩니다.

 

5.1.1 계산 그래프로 풀다

문제 1: 현빈 군은 슈퍼에서 1개의 100원인 사과를 2개 샀습니다. 이때 지불 금액을 구하세요. 단 , 소비자가 10% 부과됩니다.

계산 그래프는 계산 과정을 노드와 화살표로 표현합니다.

'x'만을 연산으로 생각할 수 도 있다.

문제 2: 현빈 군은 슈퍼에서 사과를 2개, 귤을 3개 샀습니다. 사과는 1개에 100원, 귤은 1개 150원입니다. 소비세가 10%일 때 지불 금액을 구하세요.

계산 그래프를 구성 후 문제 풀이는 다음 흐름으로 진행

1. 계산 그래프를 구성한다.

2. 그래프에서 계산을 왼쪽에서 오른쪽으로 진행한다.

 

순전파 Forward propagation

왼쪽으로 오른쪽으로 계산 진행

계산 그래프의 출발점에서 종착점으로 전파

역전파 Backward propagation

오른쪽에서 왼쪽으로 계산 진행

미분 계산에 중요한 역할

 

5.1.2 국소적 계산

계산 그래프 특징: 국소적 계산을 전파하여 최종 결과를 얻음

전체와 상관 없이 부분적인 결과 출력 가능

 

5.1.3 왜 계산 그래프로 푸는가 ?

국소적 계산

 

5.2 연쇄 법칙 Chain Rule

한편 역전파는 '국소적인 미분'을 순방향과 반대인 오른쪽에서 왼쪽으로 전달합니다. 

또한 , 이 '국소적 미분'을  전달하는 원리는 연쇄 법칙에 따른 것입니다.

 

5.2.1 계산 그래프의 역전파

목적은 신경망의 오차를 줄이는 것

각 가중치별 Loss에 대한 그래디언트를 구한 뒤 그래디언트가 향한 쪽으로 가중치들을 업데이트

 

5.2.2 연쇄법칙이란 ?

합성 함수란 여러 함수로 구성된 함수입니다.

합성 함수의 미분은 합성 함수를  구성하는 각 함수의 미분의 곱으로 나타낼 수 있다.

 

5.2.3 연쇄법칙과 계산 그래프

 

5.3 역전파 

5.3.1 덧셈 노드의 역전파

덧셈 노드의 역전파는 상류의 값을 그대로 흘려보낸다.

 

5.3.2 곱셈 노드의 역전파

곱셈 노드 역전파는 상류의 값에 순전파 때의 입력 신호들을 '서로 바꾼 값'을 곱해서 하류로 보낸다. 

곱셈의 역전파 때는 순방향 입력 신호를 저장해 두어야 한다.

 

5.3.3 사과 쇼핑의 예

 

5.4 단순한 계층 구현하기 

5.4.1 곱셈 계층

forward()순전파

backward() 역전파 

 

5.4.2 덧셈 계층

backward() 에서는 상류에서 내려온 미분(dout)을 그대로 하류로 흘러내림

 

5.5 활성화 함수 계층

5.5.1 ReLU 계층

순전파 입력인 x가 0 보다 크면 역전파는 상류의 값을 그대로 하류로 흘립니다.

순전파 입력 x가 0 이하이면 역전파 때 하류로 신호를 보내지 않습니다.

 

5.5.2 Sigmoid 계층

 

Sigmoid Sigmoid 계층 - 1단계

Sigmoid Sigmoid 계층 - 2단계

Sigmoid Sigmoid 계층 - 3단계

Sigmoid Sigmoid 계층 - 4단계

결론: 계산 그래프의 중간 과정을 모두 묶어 sigmoid 노드 하나로 대체가능

 

5.6 Affine / Softmax Affine / Softmax 계층 구현

5.6.1 Affine 계층

신경망의 순전파에서 가중치 신호의 총합을 계산하기 위해 행렬의 곱 사용 np.dot()

affine transformation: 신경망의 순전파 때 수행하는 행렬의 곱은 기하학에선는 어파인 변환 이라고 합니다. 

 

5.6.2 배치용 Affine 계층

지금까지는 하나의 입력 데이터이나, 데이터 N개 배치를 순전파하는 경우

 

기존과 다른 부분은 입력 X의 형상이 (1, 2)에서 (N, 2)가 된 것

 

Softmax-with-Loss 계층

소프트맥스 함수 - 입력 값을 정규화하여 출력

Softmax-with-Loss 계층은 다소 복잡. 

 

5.7 오차역전파법 구현

학습: 신경망의 가중치와 편향을 훈련 데이터에 적응하도록 조정하는 과정

전체 : 신경망에는 적응 가능한 가중치와 편향이 있고 , 이 가중치와 편향을 훈련 데이터에 적응하도록 조정하는 과정을 '학습'이라 합니다. 

 

5.7.1 신경망 학습의 전체 그림

1단계 - 미니배치 훈련 데이터 중 일부를 무작위로 가져옴

2단계 - 기울기 산출 각 가중치 매개변수의 기울기(손실 함수의 값을 작게 하는 방향)를 구함

3단계 - 매개변수 갱신 가중치 매개변수를 기울기 방향으로 아주 조금 갱신

4단계 - 반복 1~3단계를 반복

 

5.7.2 오차연접파법을 적용한 신경망 구현하기

 

5.7.3 오차역전파법으로 구한 기울기 검증하기

기울기 확인 Gradient check : 수치 미분의 결과와 오차역전파법의 결과를 비교하여 오차역전파법을 제대로 구현했는지 검증하곤 한답니다. 이처럼 두 방식으로 구한 기울기가 일치함(엄밀히 말하면 거의 같음)을 확인하는 작업을 기울기 확인이라고 합니다. 

 

5.7.4 오차역전파법을 사용한 학습 구현하기

 

반응형

' > 밀바닥부터 시작하는 딥러닝' 카테고리의 다른 글

07-1. 합성곱 신경망(cnn)  (0) 2020.11.19
06. 학습 관련 기술들  (0) 2020.10.20
04. 신경망 학습  (0) 2020.09.25
03. 신경망  (0) 2020.09.23
02. 퍼셉트론  (0) 2020.09.21

+ Recent posts