본문 바로가기
Deep Learning

넘파이(numpy)로 신경망 구현하기

by 햇농nongnong 2022. 5. 31.

신경망에서의 행렬 곱


  • 넘파이 행렬을 사용해 신경망 구현해보기
  • x1, x2 에서 y1, y2, y3 로 가는 간단한 신경망 구현 (편향과 활성화 함수 생략하고 가중치만 갖는)
  • X, W, Y 형상 주의 (X와 W 의 대응하는 차원의 원소 수 일치해야 함)

 

 

간단한 신경망의 행렬 곱 구현

 

 

  • 다차원 배열의 스칼라곱을 구해주는 np.dot 함수를 통해 이렇게 간단하게 결과 Y 계산 가능
  • Y 의 원소가 100개든 1000개든 한 번의 연산으로 계산 가능
  • 만약 np.dot 이 없었으면 for 문 사용해서 계산해야 함
  • 따라서 행렬의 곱으로 한꺼번에 계산해주는 이 기능은 신경망 구현에 있어서 핵심

 

3층 신경망 구현하기 (순방향 처리 구현)


  • 입력부터 출력까지의 순방향 처리 구현해보기
  • 신경망에서의 계산을 행렬 계산으로 정리할 수 있다는 것이 핵심
  • 입력층(0층)은 2개, 첫 번째 은닉층(1층)은 3개, 두 번째 은닉층(2층)은 2개, 출력층(3층)은 2개의 뉴런으로 구성된 3층 신경망 구현해보기

 

 

각 층의 신호 전달 구현하기

 

  • 편향은 앞 층의 편향 뉴런이 하나뿐이기 때문에 오른쪽 아래 인덱스가 하나 뿐
  • 위의 식을 행렬의 곱을 이용하면 1층의 '가중치 부분' 을 다음 식처럼 간소화 가능

 

 

위 식을 넘파이의 다차원 배열을 사용해서 구현해보기

# 넘파이의 다차원 배열 사용해서 신경망 신호 전달 구현하기
# 입력 신호, 가중치, 편향은 적당한 값으로 임의 설정

X = np.array([1.0, 0.5])
W1 = np.array([[0.1, 0.3, 0.5], [0.2, 0.4, 0.6]])
B1 = np.array([0.1, 0.2, 0.3])

print(W1.shape) # (2, 3)
print(X.shape)  # (2,)
print(B1.shape) # (3,)

A1 = np.dot(X, W1) + B1

 

1층의 활성화 함수에서의 처리

 

  • 은닉층에서의 가중치 합(가중 신호와 편향의 총합)을 a 로 표기하고 활성화 함수 h() 로 변환된 신호를 z 로 표기
  • 이 예시에서는 활성화 함수로 시그모이드 함수를 사용함

 

입력층에서 1층으로의 신호 전달 파이썬 구현
Z1 = sigmoid(A1)

print(A1) # [0.3, 0.7, 1.1]
print(Z1) # [0.57444252, 0.66818777, 0.75026011]

 

1층에서 2층으로의 신호 전달 파이썬 구현
W2 = np.array([[0.1, 0.4], [0.2, 0.5], [0.3, 0.6]])
B2 = np.array([0.1, 0.2]) # 뒤에 노드 2개에 편향 두개 각각 다른 값 들어감

print(Z1.shape) # (3,)
print(W2.shape) # (3, 2)
print(B2.shape) # (2,)

A2 = np.dot(Z1, W2) + B2
Z2 = sigmoid(A2)
  • 1층의 출력 Z1 이 2층의 입력이 되는 것 빼고는 조금 전의 구현과 똑같음
  • 이렇게 넘파이 배열을 사용해 층 사이의 신호 전달을 쉽게 구현 가능

 

2층에서 출력층으로의 신호 전달 파이썬 구현
def identity_function(x) :
	return x
    
W3 = np.array([[0.1, 0.3], [0.2, 0.4]])
B3 = np.array([0.1, 0.2])

A3 = np.dot(Z2, W3) + B3
Y = identity_function(A3) # 혹은 Y = A3
  • 항등 함수 identity_function() 을 정의하고, 이를 출력층의 활성화 함수로 이용
  • 항등 함수는 입력을 그대로 출력하는 함수
  • 출력층의 활성화 함수는 풀고자 하는 문제의 성질에 맞게 정함
    회귀에는 항등 함수
    두 개의 클래스를 분류하는 문제에서는 시그모이드 함수
    다중 클래스 분류 문제에는 소프트맥스 함수 

 

 

 

 

 Reference

  • 밑바닥부터 시작하는 딥러닝

댓글