본문 바로가기

AI: ML,DL

[인공지능] 인공 신경망(딥러닝, DNN)

인공 신경망

인공 신경망은 확률적 경사 하강법을 사용하는 로지스틱 회귀와 같다. 로지스틱 회귀는 선형 방정식을 사용한 분류 알고리즘으로 소개했다. 로지스틱 회귀는 각 클래스에 대해 선형 방정식을 통해 z값을 구한 뒤 소프트맥스 함수를 거쳐 각 클래스에 대한 확률을 구할 수 있다. 참고로 인공 신경망과 딥러닝은 사실상 동의어이며, DNN(Deep Neural Network, 심층 신경망)이라고 불리기도 한다.

x는 특성 y는 클래스의 z값

딥러닝에서 자주 활용되는 패션 MNIST의 경우 28*28(가로*세로) 픽셀로 표현된 바지, 치마, .., 구두 등 10개의 의류로 구성되어있다. 여기서, 28*28 픽셀은 각 의류를 나타내는 특성인 x가 되고, 이를 선형방정식을 거치면 y값이 나오게 된다. 소프트맥스 함수 처리한다면 의류에 대한 확률이 나오는 셈이다.

 

인공신경망에서 x는 입력층, 신경망의 최종 값인 y를 출력층이라고 한다. 그리고 y 값을 계산하는 단위를 뉴런(혹은 유닛)이라고 부른다. 그리고, 로지스틱 회귀와 같이 클래스별 선형방정식마다 가중치가 정해져있다. y1을 만들기 위해 x1에 곱해지는 가중치는 w11이라고 쓰고, z2를 만들기 위해 x1에 곱하는 가중치는 w12라고 쓴다.

 

인공 신경망으로 모델 만들기

먼저 Fashion MNIST를 다운로드 받는다.

from tensorflow import keras
(train_input,train_target),(test_input,test_target)=keras.datasets.fashion_mnist.load_data()

 

이후 가져온 데이터에 대해 정규화를 진행한다. 먼저, 각 픽셀은 0~255의 정수로 표현된다. 이를 0~1 사이의 부동소수점으로 바꾸고, 이미지는 가로X세로로 2차원이므로 이를 1차원으로 변경하는 작업을 거친다.

train_scaled = train_input/255.0
train_scaled = train_scaled.reshape(-1,28*28)

 

이후, 데이터를 훈련세트와 검증세트로 나눈다.

train_scaled, val_scaled, train_target, val_target =\
train_test_split(train_scaled,train_target,test_size=0.2, random_state=42)

 

그리고, 인공 신경망의 층(layers)를 만들어야 한다. 케라스의 Dense() 메서드를 통해 밀집층을 만들 수 있다. 밀집층은 가장 기본적인 층이며, 입력층과 출력층이 전부 연결겨외 완전 연결층이라고도 부른다.

# 밀집층 생성(출력층 수, 뉴런별 적용할 함수, 입력층 수)
dense = keras.layers.Dense(10, activation='softmax', input_shape=(784,))

# 신경망 모델 생성
model = keras.Sequential(dense)

 

이후 훈련하기 전에 거쳐야 되는 설정 단계가 있다. 이 과정은 compile() 메서드를 통해 수행한다. 이 과정에서 꼭 지정해야 할 것은 손실 함수의 종류이다. 여기서는 'sparse_categorical_crossentropy' 함수를 활용한다. 이는 이전 포스팅에서 소개한 다중 분류에서 활용하는 손실 함수이다.

이진 분류에서는 손실값을 구하기 위해 -log(예측확률) x '타깃값'을 통해 양의 클래스의 손실 값을 구하고 음의 클래스는 -log(1-예측확률) x '1-타깃값'을 통해 구했다.
하지만, 다중 분류는 2개 이상의 클래스에 대한 확률을 구해야 하기 때문에 타깃에 해당하는 원소만 1로 결정하고 나머지는 모두 0으로 만들어 곱한 결과가 0이 되게 만든다. 이처럼 타깃값을 해당 클래스만 1이고 나머지는 모두 0인 배열로 만드는 과정을 원-핫 인코딩이라고 한다.
# 다중 분류(크로스엔트로피)
model.compile(loss='sparse_categorical_crossentropy', metrics='accuracy')

# 훈련
model.fit(train_scaled,train_target,epochs=5)

# 평가
model.evaluate(val_scaled,val_target)

위처럼 설정 단계를 거친 후 훈련을 거친 뒤 모델을 평가할 수 있다.

 

요약

  • 인공 신경망은 로지스틱 회귀와 같다.
  • 다중 분류에서는 원-핫 인코딩을 통해 출력층에서 만든 확률과 크로스 엔트로피 손실을 계산한다.
  • 과정: 정규화 -> 훈련/검증세트 분할 -> 층 생성 -> 설정 -> 훈련 -> 평가 및 예측 

참고

  • 혼자 공무하는 머신러닝+딥러닝(박해선 저)