[딥러닝] 3. 인공신경망(ANN, Artificial Neural Network)
목차
1. 3층 신경망
1-1. 입력층에서 1층으로의 신호전달
1-2. 1층에서 2층으로의 신호전달
1-3. 2층에서 출력층으로의 신호전달
2. Softmax 함수
2-1. 확률 벡터
2-2. softmax 변환
3 Python으로 신경망 구현
1. 3층 신경망
3층 신경망은 " 퍼셉트론 + 활성화 함수 + soft max "라고 할 수 있습니다.
아래 사진은 3층 신경망 구조를 나타낸 사진입니다.
입력값이 은닉층 2개를 지나 출력값으로 나오는 구조입니다.
각 n층에서 n+1층으로 가는 구조를 보겠습니다.
1) 입력층에서 1층으로의 신호전달
컴퓨터는 숫자가 1부터가 아니라 0부터 시작을 합니다. 그렇기 때문에 신경망 또한 입력층(0층)에서 시작합니다.
사전에 배웠던 방식으로, 입력값에 가중치를 곱하고 편향을 포함해 다 더한 식이 a로 변수를 뒀습니다.
이 다항식 a를 h(x)라는 sigmoid함수를 거치고 그 출력값은 또, 다음 층 (1층)의 입력값으로 되는 것이죠.
2) 1층에서 2층으로의 신호전달
다음은 1층에서 2층으로의 신호전달입니다.
1층에서 sigmoid함수를 거쳐 나온 출력값들은 또다시 1층에서의 입력값으로 들어가게 되고, 이 또한 가중치와의 곱, 편향 더하기, h(x) : sigmoid함수 를 거칩니다.
2층에는 2개의 출력값이 생깁니다.
1) 2층에서 출력층으로의 신호전달
마지막으로 2층에서 출력층으로의 신호전달입니다.
같은 방식으로 쭉쭉 2층까지 왔는데, 2층에서 출력층으로 갈 때에는 같은 방법으로 sigmoid 함수를 이용하지 않고, 일반 벡터를 확률벡터로 변환해주는 Softmax 함수를 적용합니다.
2. Softmax 함수
1) 확률 벡터
먼저 확률벡터에 대해 간단하게 설명하고 넘어가겠습니다.
확률 벡터란, 말 그래도 확률들을 벡터로 표현한 것인데요.
우리가 '동전 던지기'의 확률은 반반이듯이 확률벡터로 표현한다면, [1/2, 1/2]가 되겠죠?
또, 주사위를 던졌을 때, 각 숫자가 나올 확률을 벡터로 표현한다면, [1/6, 1/6, 1/6, 1/6, 1/6, 1/6]가 됩니다.
확률벡터의 당연한 특징 2가지
1) [p1, p2, p3, ,,,, , pn] 의 원소들은 0~1 사의 확률 값을 가지게 된다.
2) [p1, p2, p3, ,,,, , pn] 원소들의 합은 당연히 1 이어야 한다.
2) Softmax 변환
Softmax 변환은 일반 벡터 (a1, a2, a3, - - -, an, 음수도 있을 수 있음) 를 확률벡터의 특징을 만족시킬 수 있게 바꿔주는 것을 말합니다.
벡터들의 각 원소마다 자연상수 e를 적용시켜 양수로 바꿔주고 그 값들이 더해서 '1'을 만들도록 normalization을 합니다.
(a1, a2, a3, - - -, an) 과 (a1 +C, a2 +C, a3 +C, .... , an +C)의 Softmax값은 동일합니다. 이걸 이용해 훈련 시 overflow를 방지할 수 있습니다.
※ Overflow란?
입력된 숫자가 너무 커 컴퓨터에서 인식하기를 'Inf' (무한) 이라고 인식하여 훈련 또는 계산 시 발생하는 문제
(3. python 예제에 설명)
Softmax 변환을 통한 벡터들 사이에서 softmax(6)을 뽑고 싶다. ---> 그러면 확률벡터들 중 가장 높은 확률, 다시 말해 제일 반응을 잘하는 전기신호 6개를 뽑겠다.라는 함수입니다.
3. Python으로 신경망 구현
Numpy는 벡터, 행렬, 텐서에 특화된 라이브러리입니다. 그래서 인공신경망에서 등장하는 여러 수식들을 행렬로 바꿔줄 필요가 있습니다.
Python으로 3층신경망 구현.ipynb
Colaboratory notebook
colab.research.google.com
참고 문헌
[1] 참고 영상