신경망에서의 행렬 곱
- 넘파이 행렬을 사용해 신경망 구현해보기
- 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
- 밑바닥부터 시작하는 딥러닝
'Deep Learning' 카테고리의 다른 글
신경망 출력층 설계하기 (분류, 회귀에 맞는 활성화 함수 선정) (0) | 2022.05.31 |
---|---|
넘파이(numpy)로 신경망 구현하기 최종 코드 (0) | 2022.05.31 |
numpy를 이용한 다차원 배열 계산 - 신경망 효율적 구현 (0) | 2022.05.31 |
ReLU 함수 - 신경망에서 자주 사용하는 활성화 함수 (0) | 2022.05.31 |
비선형 함수를 사용하는 이유 (신경망, 선형함수 비교) (0) | 2022.05.31 |
댓글