[AIB 18기] Section 3 - Sprint 1 - Note 1 - Artificial Neural Network

ysk1230·2023년 4월 18일
0

퍼셉트론

  1. 신경망을 이루는 가장 기본단위
  2. 다수의 신호를 입력으로 받아 하나의 신호를 출력
  3. 가중치-편향 연산 -> 활성화 함수

여기서 자주 사용되는 활성화 함수

1. 계단함수 (Step)

  • 임계점 기준 0 아니면 1 출력
  • 0 아니면 1이기 때문에 학습률이 떨어짐

2. 시그모이드 함수 (Sigmoid)

  • 계단 함수의 단점을 보완
  • 모든 지점에서 미분 가능

3. ReLU(렐루) 함수

  • 시그모이드 함수를 중복사용 시 기울기 소실 문제 발생. 이걸 보완하기 위해 도입된 함수
  • 양의 값이 입력되면 그 값을 그대로 출력하고 음의 값이 입력되면 0을 반환

4. 소프트맥스 함수

  • 다중 분류 문제에 적용할 수 있도록 시그모이드 함수를 일반화한 활성화 함수
  • 합이 1이 되는 확률값으로 변환

논리 게이트로 퍼셉트론 알아보기

1. AND GATE

예시 ) 운동을 하러 갈지 말지 고민 중
1. 어제 운동을 했는가
2. 체중이 증가했는가

두 조건을 만족할 때만 운동을 하는 사람이면 AND GATE

아래 기호는 학계 약속이니 그냥 받아들이자

2. NAND GATE

AND GATE의 결과를 반대로 출력

3. OR GATE

OR GATE 는 입력 신호 중 하나만 1(True)이라도 1(True)을 출력

4. XOR GATE

XOR GATE 는 배타적 논리합(Exclusive-OR)이라고도 불리는 GATE 입니다. 입력 신호가 다를 경우 1(True)을 출력
XOR GATE가 초기 퍼셉트론의 한계를 지적한 이론

이걸 선형 그래프로 표현

XOR 이 하나의 결정 경계로 구분 할 수 없는 것이 보입니다.

하지만 비선형 결정 경계를 사용하면 XOR문제를 해결할 수 있습니다.

다층퍼셉트론(Multi-Layer Perceptron, MLP) 이라는 인공 신경망 알고리즘을 사용하면 해결이 가능하다.
MLP는 하나이상의 은닉층을 가진 인공 신경망으로 이러한 은닉층을 추가하여 비선형성 모델링을 실행합니다
다층 퍼셉트론은 두 개의 은닉층과 미분 가능한 시그모이드 활성화 함수를 사용하여 구축할 수 있습니다.



인공신경망(Artificial Neural Networks)

딥러닝 = 인공신경망 층을 깊게(Deep) 다층으로 쌓은 것

그럼 다층 쌓는 이유는?

XOR GATE를 다시 생각해보면 1개의 분류기로는 해결이 불가

그런데 AND, NAND, OR GATE를 다층으로 활용하면 XOR GATE를 구할 수 있다.

신경망 층 구성

입력층, 은닉층, 출력층

1. 입력층

  • 데이터셋이 입력되는 층
  • 데이터셋 특성에 따라 입력층 노드의 수가 결정
  • 층수 셀 때 입력층은 포함하지 않습니다

2. 은닉층

  • 가중치, 편향이 연산되는 층
  • 입력층과 출력층 사이에 존재하는 층
  • 계산의 결과를 사용자가 볼 수 없음
  • 일반적인 딥러닝은 이 은닉층이 2개이상

3. 출력층

  • 은닉층 연산을 마친 값이 출력되는 층
  • 풀어야할 문제에 따라 출력층을 잘 설계하는 것이 중요
  • 출력층 구성요소
    - 이진분류 : 시그모이드 함수 사용. 출력되는 값은 0과 1사이의 확률
    - 다중분류 : 소프트맥스 함수 사용. 출력층의 노드 수 = 레이블의 클래스 수
    - 회귀 : 활성 함수를 지정해주지 않으며, 출력층 노드 수 = 출력값의 특성 수

Tensorflow를 사용한 신경망 예제

Tenserflow는 딥러닝 프레임워크.
상위 API는 케라스

항상 전처리가 가장 중요. 아무리 좋은 머신러닝, 딥러닝이어도 데이터가 좋지 않으면 성능이 나오기 어렵다.

1. 신경망 구성

* Sequential API : 레이어를 순차적으로 연결하여 신경망을 구성하는 방법

model = tf.keras.models.Sequential([
tf.keras.layers.Dense(1, activation='sigmoid')
])

이 코드는 은닉층이 없는 입력층 - 출력층으로만 구성된 단층 모델

tf.keras.layers.Dense 함수를 이용하여 새로운 레이어를 추가할 때, 첫 번째 인자로 지정한 숫자는 해당 레이어에 배치할 뉴런의 개수를 의미합니다. 이때, 첫 번째 레이어를 입력층으로 간주하며, 입력층에 배치할 뉴런의 개수는 input_dim 매개변수를 이용하여 지정합니다.

따라서 model = tf.keras.models.Sequential([tf.keras.layers.Dense(1, activation='sigmoid')]) 코드에서는 하나의 Dense() 레이어를 생성하며, 이 레이어는 하나의 뉴런을 가지고 있습니다. 이때, 첫 번째 레이어를 입력층으로 간주하므로, 입력층에 배치할 뉴런의 개수는 input_dim 매개변수로 지정되지 않습니다. 즉, 입력층의 노드 개수는 지정되지 않은 것으로 간주됩니다.

바꿔 쓴 동일코드

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))

Functional api(함수형 API)

input = tf.keras.layers.Input(shape=(2,))
output = tf.keras.layers.Dense(1, activation='sigmoid')(input)
model = tf.keras.models.Model(inputs=input, outputs=output)

일반적인 코드

* 인공 신경망 모델 구성하기(입력,은닉,출력)

model = tf.keras.models.Sequential([
tf.keras.layers.Dense(16, input_dim=4, activation='relu'), #입력층
tf.keras.layers.Dense(8, activation='relu'), # 은닉층
tf.keras.layers.Dense(1, activation='sigmoid')
]) # 출력층

2. 신경망을 구성한 다음 신경망의 학습 방법 설정

model.compile(optimizer='sgd',
loss='binary_crossentropy',
metrics=['accuracy']) # 학습 지표를 정확도로 설정합니다.

아직 optimizer나 loss(손실함수) 는 추후 나올 예정

3. 신경망 학습

model.fit(X_train, y_train, epochs=30)

epochs 도 다음 파트에서 정리
epochs를 조정하면 학습 횟수를 조정할 수 있다.

4. 학습한 신경망 모델을 사용하여 평가

model.evaluate(X_test, y_test, verbose=2)

신경망 구성 진행 방법

데이터 전처리 -> 테스트 셋 구성 -> 신경망 구성 - > 학습 방법 설정 -> 신경망 학습 -> 평가


0개의 댓글