[딥러닝] 순전파와 역전파
퍼셉트론
레고?
다수의 신호를 출력받아서 하나의 신호를 출력함
활성화 함수
가중합의 결과를 하나의 값으로 변환하기 위한 것???
가중합의 결과를 하나의 출력신호로 바꿔주는 것
ex) 시그모이드, relu, 소프트맥스
입력층과 은닉층 출력층의 개수??
입력층
데이터가 가지고 있는 특성에 따라 결정됨
은닉층
데이터의 특성 수와 상관없이 노드의 수를 결정할 수 있음
출력층
이진분류 : 1 (활성화는 시그모이드)
다중분류 : 레이블의 클래수의 수 (활성화는 소프트맥스)
회귀 : 출력층의 노드수는 보통 1로
활성화 함수
활성화 함수는 계산된 가중합을 얼마 만큼의 신호로 출력할지를 결정합니다.
아래에서는 여러 가지 활성화 함수를 알아보도록 하겠습니
하나의 층에서 값이 계산된 다음에 활성화 함수를 이용해서 어떤 신호로 변환되어서 다음 층으로 넘겨지게 한다.
시그모이드 함수(Sigmoid function)
기존의 계단함수는 중간에 미분을 할 수 없지만 얘는 특정 임계값보다 크면 1에 가까워지고 작으면 0에 가까워지는 식이다.
조금 더 부드럽게 연결되어 있기 때문에 모든 지점에서 미분 가능하며, 미분값도 0이 아닙니다.
ReLU 함수(ReLU function)
ReLU(렐루) 함수는 신경망 발전에 큰 영향을 미친 활성화 함수입니다.
시그모이드 함수를 중복하여 사용하게 되면 기울기 소실(Vanishing Gradient) 문제가 발생하게 되는데요.
기울기 소실 문제를 해결하기 위해서 등장한 것이 ReLU 입니다.
소프트맥스 함수(Softmax function)
소프트맥스(Softmax) 함수는 다중 분류(Multi-classification) 문제에 적용할 수 있도록 시그모이드 함수를 일반화한 활성화 함수입니다.
가중합 값을 소프트맥스 함수에 통과시키면 모든 클래스의 값의 합이 1이 되는 확률값으로 변환됩니다.
예시
import pandas as pd
import tensorflow as tf
mnist = tf.keras.datasets.mnist
(x_train, y_train), (x_test, y_test) = mnist.load_data()
x_train, x_test = x_train / 255.0, x_test / 255.0
이미지 데이터에서는 정규화가 필요하다고 한다. 이때 픽셀은 0-255사이의 값이니 정규화를 위해서 255로 나눈다.
model = tf.keras.models.Sequential([
tf.keras.layers.Flatten(input_shape=(28, 28)),
tf.keras.layers.Dense(100, activation='relu'),
tf.keras.layers.Dense(10, activation='softmax')
])
위의 코드에서 입력층의 노드는 28, 한개의 은닉층이 있고 노드는 100개이고 출력층은 10개이다.
각 활성화 함수는 relu와 softmax가 있다.
model.compile(optimizer='adam',
loss='sparse_categorical_crossentropy',
metrics=['accuracy'])
옵티마이저는 경사하강법처럼 어떻게 가중치를 갱신할지?? 정하는 것이고 loss는 손실함수를 의미한다. (회귀에서는 mse처럼)
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test, verbose=2)
마지막으로 fit으로 학습시키면 된다.
추가) verbose의 의미
함수 인자로 verbose가 있으면 함수 수행시 발생하는 상세한 정보들을 표준 출력으로 자세히 내보낼 것인가를 나타냅니다. 보통 0 은 출력하지 않고, 1은 자세히, 2는 함축적인 정보만 출력하는 형태로 되어 있습니다.