인공신경망, 딥러닝, 퍼셉트론(perceptron), XOR 문제, 입력층(input layer)/은닉층(hidden layer)/출력층(output layer), 활성화 함수(activation funcion), tensorflow, Keras(케라스)
Section4 - DeepLearning
의 첫 날이었다. 약간 섹션 introudction 같은 날이었다.
신경망을 이루는 가장 기본 단위
이다. 퍼셉트론은 다수의 신호를 받아 하나의 신호를 출력하는 구조다. 이 이미지가 기억에 도움이 될 듯. 뉴런=노드
는 맞다.가중치-편향 연산
에서는 입력된 신호에 각각의 가중치가 곱해져 합해진다. 그리고 이게 활성화함수를 거쳐 output으로 나오게 된다. flow 잘 기억해둬야 해~!! 정답은 없다.
는 것이다. 뭐 어떤 기술을 쓰고, 층을 몇 개를 쌓아야 좋고 그런 정해진 게 없다는 얘기다. 그래서인지 오늘 실습 때도 정답을 요구하기보단 과정 후의 결과만 받고 끝났던 것 같다. (앞으로도 이런 식일듯?) 아무튼 이 마인드셋 기억해두자.기본이 되는 활성화 함수(Activation function)로는 계단 함수(step function), 시그모이드 함수(sigmoid funcion), ReLU 함수, 소프트맥스 함수(Softmax funtion)이 있다.
계단 함수
: 가장 간단한 형태의 활성화 함수로 임계값을 넘기면 1, 아니면 0을 출력하는 함수다. (아래 이미지에서 임계값은 0이다)
시그모이드 함수
: 이건 로지스틱 회귀할 때 봤던 거라 익숙. 아직 잘은 모르겠지만, 신경망이 경사하강법을 통해 학습하기 위해서는 미분을 해야하는데, 앞서 봤던 계단 함수는 임계점에서는 미분이 불가능하고 나머지에선 0이 된다고 한다. 이런 문제를 해결할 수 있는게 이 시그모이드 함수다. 임계값보다 작은 부분은 0에 가까워지고, 큰 부분은 1에 가까워진다.
ReLU 함수
: 신경망 발전에 큰 공헌을 한 함수라고 한다. 역시나 아직 정확히는 이해할 수 없지만, 시그모이드 함수를 중복해서 사용하면 기울기 소실
문제가 발생하는데, 이를 해결할 수 있는 함수이다. 양의 값이 입력되면 그 값을 그대로, 음의 값이 입력되면 0을 출력한다. 그래프 기억해두자.
소프트맥스 함수
: 다중 분류 문제에 쓰는 활성화 함수다. 다중 분류에 쓸 수 있도록 시그모이드 함수를 일반화한 것이다~ 정도만 일단 알고 넘어가도 될 것 같다. 가중합 값을 이 함수에 통과시키면 클래스의 합이 1인 확률값으로 변환해준다.
활성화 함수는 여러개중 어떻게 골라야 하나요?
나중에 까먹기 딱 좋을 듯! 핵심만 정리해둔다. 오늘 배운 것 중 엄청나게 막 중요하건 아니라고 했지만, 그래도 이런 논리 생각해보는 건 재밌다.
AND GATE
: 입력 신호가 모두 1(True)일 때 1(True)을 출력.NAND
: Not AND 의 줄임말로 AND GATE의 결과의 반대를 출력.OR GATE
: 입력 신호 중 하나만 1(True)이라도 1(True)을 출력.XOR GATE
: 배타적 논리합(Exclusive-OR)이라고도 불리며, 입력 신호가 다를 경우 1(True)을 출력합니다.AND(NAND(x1, x2), OR(x1, x2))
이다) 아래는 내가 풀때 적었던 거다. 지금 생각하면 역순으로 와도 됐을 듯 싶다. AND GATE
그림 하나 놔둔다. 앞서 딥러닝 부분에서 다 언급하긴 했는데, 나중에 다시 보고 정리가 안될까 우려되어 따로 파트를 빼서 다시 정리해둔다,
신경망에는 입력층
, 은닉층
,출력층
이 있다.
입력층
: 데이터셋이 입력되는 층으로 입력되는 데이터셋의 특성(Feature)에 따라 입력층 노드의 수가 결정된다. (코드 쓸 때 잘 적어야 함) / 신경망의 깊이(층수)를 셀 때 입력층은 포함하지 않는다.은닉층
: 연산이 이루어지는 단계고, 사용자가 볼 수 없어 은닉층이라고 불린다. (블랙박스 모델 생각하면 되려나..) 위에서 말한 것처럼 일반적으로 2-3개 이상이 은닉층을 가진 신경망을 딥러닝이라고 부른다고 한다. 출력층
: 은닉층 연산을 마친 값이 출력되는 층이다. 풀어야할 문제에 따라 이 출력층을 잘 구성하는게 매우 중요하다!!!!!!여기서 내 질문이 있었다.
왜 이진분류 문제에서는 출력층의 노드 수가 1이고, 다중분류 문제에서는 출력층의 노드 수를 클래스 수와 동일하게 하는지 궁금합니다. 출력층이 노드 수는 결국 나올 수 있는 경우의 수라고 이해했는데요. 그렇다면 좀 애매한 표현이긴 하지만, 이진분류는 ‘맞다/아니다’의 어떤 ‘하나의 상태’를 말하기 때문이고, 다중 분류는 하나의 상태라기보단 ‘여러 옵션 중 어떤 하나의 값' 을 고르는 것이기 때문이라고 생각해도 될까요?
오늘은 퀴즈도 풀고 실습도 했는데 다 옮겨두지는 않을거고, 코드도 필요한 것만 옮겨둔다.
- 입력 데이터 샘플과 Features : 1077 샘플 x 69 Features (변수)
- 데이터 label: 다운증후군 (1), 정상군 (2)
=> 신경망 모델과 일반 머신러닝 모델 두 개를 만들어보고 성능을 비교해본다.
신경망 모델
(데이터 읽어오는 단계 생략)
#---풀기 전에 훈련, 검증 데이터 나눠두기---#
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(df, df_label, test_size=0.2, random_state=42)
y_train = y_train.values.ravel()
y_test = y_test.values.ravel() # array로 변환 - 참고 https://stackoverflow.com/questions/34165731/a-column-vector-y-was-passed-when-a-1d-array-was-expected
X_train.shape, X_test.shape, y_train.shape, y_test.shape # 확인 완료
--
import tensorflow as tf
model = tf.keras.models.Sequential([
tf.keras.layers.Dense(1000, activation='relu'),
tf.keras.layers.Dense(1, activation='sigmoid')
])
model.compile(optimizer='sgd',
loss='binary_crossentropy',
metrics=['accuracy'])
#참고로 optimize, loss에 대해서는 앞으로 알게될 거니까 오늘은 이런게 있다 정도만 알고 있으면 된다고 했다.
model.fit(X_train, y_train, epochs=30) # 학습 30번 반복. epoch도 역시 다음 노트 때 배울거라고 했다.
model.evaluate(X_test, y_test, verbose=2)
데이터 탐색을 시작하기 전에 데이터셋에 결측치가 있는지, 각 column의 데이터 타입이 무엇인지 확인하는 습관을 갖도록 합시다.
=> 잊지 말자 제발!!!