본문 바로가기

Study/딥러닝 텐서플로 교과서 - 길벗

[Book]4. 딥러닝 시작

 

개요

  • 책을 보고 공부한 내용을 정리합니다.

딥러닝 텐서플로 교과서

  • 저자 서지영님 
  • 길벗 출판사

코드 출처

https://github.com/gilbutITbook/080263

 

GitHub - gilbutITbook/080263

Contribute to gilbutITbook/080263 development by creating an account on GitHub.

github.com


[Book]4.1 인공 신경망의 한계와 딥러닝 출현

퍼셉트론
  •  다수의 신호를 입력으로 받아 하나의 신호를 출력
  • 흐른다/안흐른다(1/0) 정보 전달
  • AND 게이트는 모든 입력이 1일 떄
  • OR 게이트는 둘중하나만 '1'이거나 둘 다 '1' 일 떄
  • 데이터가 선형적으로 분리되서 기본적인 분류가 가능하다
  • 하지만 XOR 게이트는 두 개 중 한 개만 '1' 일때 작동한다.
  • XOR 게이트는 데이터가 비선형적으로 분리되서 분류가 힘듬
  • 단층 퍼셉트론에서는 AND,OR 계싼이 가능하지만 XOR은 힘들다
  • 이를 극복하기 위해 입력층과 출력층 사이에 하나 이상의 은닉층(hidden_layer)을 두어 비선형적으로 분리되는 데이터에서도 학습이 가능한 다층 퍼셉트론을 고안
  • 입력층과 출력층 사이에 은닉층이 여러 개 있는 신경망을 심층 신경만(Deep Nenural Network)라고 함 , 이를 다른말로 딥러닝이라고 함

4.2 딥러닝 구조

1. 층

  • 입력층(input layer) : 데이터를 받아들이는 층
  • 은닉층(hidden layer) : 모든 입력 노드부터 입력 값을 받아 가중치 계산하고, 활성화 함수에 적용하여 출력층에 전달
  • 출력층 (output layer) : 신경망의 최종 결괏값이 포함된 층


2 . 가중치(weight)

  • 노드와 노드 간 연결 강도

3. 바이어스(bias)

  • 가중합에 더해 주는 상수, 출력되는 값을 조절하는 역할

4. 가중합(weighted sum) 

  • 가중치와 노드의 곱을 합한 것

5. 함수

  • 활성화 함수(activation function) : 신호를 입력받아 이를 적절히 처리하여 출력하는 함수
  • 손실 함수(loss function) : 출력 함수의 결과와 실제 값 간의 오차를 측정하는 함수

 

활성화 함수

1. 시그모이드 함수

  • 함수 결과를 0 ~ 1사이에서 비선형 형태로 변형
  • 로지스틱 회귀와 같은 분류 문제를 확률적으로 표현하는데 사용
  • 딥러닝 모델의 깊이가 깊어지면 기울기 소멸 문제가 발생하여 잘 사용 하지 않음

시그모이드

2. 하이퍼볼릭 탄젠트 함수

  • 선형 함수의 결과를 -1 ~ 1 사이에서 비선형 형태로 변형
  • 시그모이드에서 결괏값의 평균이 0이 아닌 양수로 편향된 문제해결하는데 사용
  • 기울기 소멸문제는 여전함

쌍곡선 함수

3. 렐루 함수

  • 음수일 떄는 0을 출력, 양수일 떄는 x 출력
  • 경사하강법에 영향을 주지 않아 학습 속도가 빠름
  • 기울기 소멸 문제 없음
  • 하이퍼볼릭 탄젠트 함수 대비 학습 속도가 6배 빠름
  • 음수일 때 항상 0을 출력하는 점 떄문에 학습 능력이 감소

렐루 함수

 

4. 리키 렐루 함수

  • 입력 값이 음수이면 0이 아닌 0.001 처럼 매우 작은 수 반환
  • 입력 값이 수렴하는 구간이 제거되어 렐루 함수를 사용할떄 생기는 문제를 해결

리키 렐루 함수

5. 소프트 맥스 함수

  • 입력 값을 0~1 사이에 출력되도록 정규화 하여 출력
  • 총합이 항상 1
from tensorflow.keras import layers
model = tf.keras.Sequential()
model.add(layers.Dense(64, activation = 'relu')
model.add(layers.Dense(64, activation = 'relu')
model.add(layers.Dense(10, activation = 'softmax')

손실 함수

  • 경사 하강법은 학습률과 손실 함수의 순간 기울기를 이용하여 가중치를 업데이트 하는 방법
  • 미분의 기울기를 이용하여 오차를 비교하고 최소화하는 방향으로 이동
  • 이때 오차를 구하는 방법이 손실 함수
  • 대표적인 손실 함수로는 평균 제곱 오차(MSE). 크로스 엔트로피 오차(CEE)

1. 평균 제곱오차(Mean Squared Error)

  • 실제 값과 예측 값의 차이를 제곱하여 평균을 낸 것
  • 차이가 클수록 평균 제곱 오차의 값도 커짐
  • 회귀에서 주로 사용
model.compile(optimizer = tf.keras.optimizers.SGD(lr = 0.1), loss = 'mse'

2. 크로스 엔트로피 오차

  • 분류 문제에서 원-핫 인코딩 했을 때만 사용할 수 있는 오차 계산 법
model.compile(optimizer = tf.keras.optimizers.Adam(0.01),
							loss = 'categorical_crossentropy',
							metrics = ['accuracy'] )

4.2.2 딥러닝 학습

딥러닝 학습은 크게 순전파와 역전파 두 단계로 진행

 

1. 순전파

  • 훈련 데이터가 들어올 떄 발생
  • 예측 값을 계산하기 위해 전체 신경망을 교차해 지나감
  • 모든 뉴련이 계산을 완료하면 출력층에 도달
  • 그다음 손실 함수로 예측 값과 실제 값 차이(손실, 오류)를 추정
  • 이떄 손실함수값은 '0'이 이상적, 0에 가깝도록 가중치를 조정
  • 손실(오류)가 계산되면 그 정보는 역으로 전파(출력 → 은닉 → 입력) 이를 역전파라고 함

4.2.3 딥러닝의 문제점과 해결방안

  • 은닉층 개수가 많을 수록 데이터 분류가 잘됨
  • 하지만 은닉층이 많을 수록 세가지 문제가 발생

 

1. 과적합(overfitting)

  • 훈련 데이터를 과하게 학습
  • 훈련 데이터를 과하게 학습해서 예측 값과 실제 값 차이인 오차가 감소하지만, 검증 데이터에 대해서는 오차가 증가
  • 과적합을 해결하는 방법은 드롭아웃(dropout)이 있음
  • 드롭아웃 : 학습 과정 중 임의로 일부 노드들을 학습에서 제외

드롭아웃

# 텐서플로 2.x

model = tf.keras.models.Sequential([
					tf.keras.layers.Flatten(input_shape = (28, 28)),
					tf.keras.layers.Dense(128, activation = 'relu'),
					tf.keras.layers.Dropout(0,2),
					tf.keras.layers.Dense(10, activation = 'softmax')
						])

2. 기울기 소멸 문제

  • 출력층에서 은닉층으로 전달되는 오차가 크게 줄어들어 학습이 되지 않는 현상
  • 즉, 기울기가 소멸되기 떄문에 학습되는 양이'0'에 가까워져 학습이 더디게 진행되다 오차를 더 줄이지 못하고 그 상태로 수렴하는 현상


3. 성능이 나빠짐

  • 손실함수의 비용이 최소가 되는 지점을 찾을 떄까지 기울기가 낮은 쪽으로 계속 이동시키는 과정을 반복하는데, 이떄 성능이 나빠지는 문제 발생
  • 이를 개선하고자 확률적 경사 하강법과 미니 배치 경사 하강법 사용

배치 경사 하강법( Batch Gradient Descent, BGD)
  • 전체 데이터셋에 대한 오류를 구한 후 기울기를 한 번만 계산하여 모델의 파라미터를 업뎃
  • 즉, 전체 훈련 데이터셋에 대한 가중치를 편미분하는 방법
  • 학습이 오래걸리는데 이를 개선한 방법이 확률적 경사 하강법
확률적 경사 하강법(Stochastic Gradient Descent, SGD)
  • 임의로 선택한 데이터에 대해 기울기를 계산
  • 빠른 계산이 가능
  • 때로는 배치 경사 하강법보다 정확도가 낮을 수 있다.
미니 배치 경사 하강법( mini-batch Gradient Descent)
  • 전체 데이터셋을 여러 개의 미니 배치로 나누고, 미니 배치 한 개마다 기울기를 구한 후, 그것의 평균 기울기를 이용하여 모델을 업데이트해서 학습
  • 전체 데이터를 계산하는 것보다 빠름
  • 경사 하강법보다 안정적

 

1. 아다그라드(Adagrad) 
변수(가중치)의 업데이트 횟수에 따라 학습률 조정
많이 변화하지 않는 변수들의 학습률은 크게하고, 많이 변화하는 변수들의 학습률은 작게 함
즉, 많이 변화한 변수는 최적 값에 근접했을 것이라는 가정하에 작은 크기로 이동하면서 세밀하게 값 조정
반대로 적게 변화한 변수들은 학습률을 크게 하여 빠르게 오차 값을 줄임
from tensorflow.keras.optimzers import Adagrad
model.compile(loss = 'sparse_categorical_crossentropy',
							optimizer = 'Adagrad' )​

1. 아다델타(Adadelta)
아다 그라드에서 G값이 커짐에 따라 학습이 멈추는 문제를 해결
G: 이전 G값의 누적(기울기 크기의 누적)
from tensorflow.keras.optimzers import Adadelta
model.compile(loss = 'categorical_crossentropy',
							optimizer = Adagrad(rho = 0.95 ),
							metrics = ['accuracy'] )

1. 알엠에스프롭(RMSProp)
아다그라드의 G값이 무한히 커지는 것을 방지

from tensorflow.keras.optimzers import RMSprop
model.compile(loss = 'categorical_crossentropy',
							optimizer = RMSprop(lr = 0.01 ),
							metrics = ['accuracy'] )

1. 모멘텀(Momentum)
가중치를 수정하기 전에 이전 수정방향을 참조하여 같은 방향으로 일정한 비율만 수정하는 방법
양의 방향과 음의 방향으로 순차적으로 일어나는 지그재그 현상이 줄어듬
SGD와 같이 사용

from tensorflow.keras.optimzers import SGD
model.compile(loss = 'categorical_crossentropy',
							optimizer = SGD(lr = 0.01, momentum = 0.9 ),
							metrics = ['accuracy'] )

1. 네스테로프 모멘텀(Nesterov Accelerated Gradient, NAG)
모멘텀 값과 기울기 값이 더해져 실제 값을 만드는 기존 모멘텀과 달리 모멘텀 값이 적용된 지점에서 기울기 값을 계산
모멘텀 방식은 멈추어야 할 시점에서도 관성에 의해 훨씬 멀리 갈 수 있는 단점이 있지만, 절반 정도 이동후 어떤 방식으로 이동해야 하는지 다시 계산

from tensorflow.keras.optimzers import SGD
model.compile(loss = 'categorical_crossentropy',
							optimizer = SGD(lr = 0.01, momentum = 0.9, nesterov = True ),
							metrics = ['accuracy'] )

1. 아담(Adaptive Moment Estimation)
Momentum + RMSProp의 장점을 결합

from tensorflow.keras.optimzers import Adam
model.compile(loss = 'categorical_crossentropy',
							optimizer = optimizer = Adam(lr = 0.01),
							metrics = ['accuracy'] )

 

4.2.4 딥러닝 사용할 때 이점

  • 특성추출
  • 빅데이터의 효율적 활용

4.3 딥러닝 알고리즘

  • 목적에 따라 4가지 정도로 분류
  • 합성곱 신경망(CNN)
  • 순환 신경망(RNN)
  • 제한된 볼츠만 머신(RBM)
  • 심층 신뢰 신경망(DBN)

 

4.3.1 심층 신경망

  • 심층 신경망(DNN)은 입력층과 출력층 사이에 다수의 은닉층을 포함하는 인공 신경망

4.3.2 합성곱 신경망

  • 합성곱층(convolutional layer)와 풀링층(pooling layer)을 포함하는 이미지 처리 성능이 좋은 인공 신경망
  • 대표적으로 LeNet-5, AlexNet

LeNet -5

4.3.3 순환 신경망

  • 시계열 데이터같은 시간 흐름에 따라 변화하는 데이터를 학습하기 위한 인공 신경망
  • 자기 자신을 참조하는(순환)의 뜻으로, 현재 결과가 이전 결과와 연고나이 있다는 것을 의미
💡 특징
시간성을 가진 데이터가 많다.
시간에 따라 내용이 변하므로 데이터는 동적이고 길이가 가변 </aside>
  • 기울기 소멸 문제로 학습이 제대로 되지 않는 문제가 있다.
  • 이를 해결하고자 메모리 개념을 도입한 LSTM이 순환 신경망에서 많이 사용

4.3.4 제한된 볼츠만 머신

  • 가시층(visible layer)와 은닉층(hidden layer)으로 구성된 모델
💡 특징
차원 감소, 분류, 선형 회귀 분석, 협업 필터링, 특성 값 학습, 주제 모델링에 사용
심층 신뢰 신경망(DBN)의 요소로 활용