1. 퍼셉트론과 XOR Problem
퍼셉트론(Perceptron)은 가장 단순한 인공신경망 구조입니다.
위와 같이 입력값 \(x_1, x_2, ... \) 에 대해 가중치 \(w_1, w_2, ... \) 들의 선형결합으로 이루어진 구조입니다.
일반화된 식으로, \(\textbf{y}=f(\textbf{w}^T\textbf{x}+b) \) 로 정리할 수 있습니다.
기본적인 퍼셉트론으로도 간단한 분류를 잘 수행할 수 있습니다.
대표적인 예로 AND 게이트를 분류해봅시다.
위 그림처럼 직선 1개로 AND결과가 0인 점 3개와 1인 점 1개를 분리해내는데 성공합니다.
하지만 XOR 의 경우 직선 1개로는 분리가 불가능합니다.
2. 다층 퍼셉트론의 등장
이 때, 층 1개를 추가하여 쉽게 해결할 수 있습니다.
위 그림처럼 1개의 층을 추가하는 효과는 위처럼 공간변환을 통해 새로운 방향으로 보면 분류가 가능해짐을
알 수 있습니다. 이렇게 여러개의 층을 조합하여 성능을 높이는 모델을 다층 퍼셉트론(MLP)이라 합니다.
다층 퍼셉트론은 완전연결구조(Fully Connected)를 지니기 때문에 깊이가 너무 깊어지면 과적합 문제가 발생합니다.
이를 해결하기 위해 많은 규제방법들이 개발됩니다. 가중치 감쇠나 드롭아웃등 여러 규제는 이후에 소개하겠습니다.
3. 활성화 함수
활성화함수는 층과 층 사이에 비선형성을 더해주어 성능을 높여주는 역할을 합니다.
활성화함수는 층마다 사용되며, 활성화함수를 거친 결과값 \(\textbf{z}=\mathbf{ReLU}(\textbf{a}) \)가
다음층의 입력값으로 들어가는 형식입니다. 층과 층사이에는 \(\textbf{ReLU}\)가 주로 사용되며,
출력층에는 \(\textbf{sigmoid}\) 와 \(\textbf{softmax}\) 가 주로 사용됩니다.
\(\textbf{ReLU}(x)=\max(0, x)\) 로 정의되고, \(\textbf{sigmoid}(x)=1/(1+e^{-x})\) 로 정의됩니다.
4. 신경망 기초 구현
신경망을 구현할 땐 일정한 형식에 따라 구현하게 됩니다. 기본적인 코딩방식은 이렇습니다.
def NetWork():
network={}
# 1 layer
network['W1']=W1
network['B1']=B1
# 2 layer
network['W2']=W2
network['B2']=B2
# 3 layer
network['W3']=W3
network['B3']=B3
# 4 layer
network['W4']=W4
network['B4']=B4
return network
각 층마다 통과할 함수들을 모두 정의하여 그 모델링된 구조를 return해줍니다.
이후 forward 함수를 통해 층을 순차적으로 통과하며 최종 출력값을 return해주는 방식으로 진행됩니다.
이러한 Model 객체 생성과 forward를 통한 방식은 PyTorch등 딥러닝 프레임워크에서 사용하는 방식입니다.
def forward(network, x):
# 1~4 layer
W1, B1=network['W1'], network['B1']
W2, B2=network['W2'], network['B2']
W3, B3=network['W3'], network['B3']
W4, B4=network['W4'], network['B4']
# 1 layer x -> z1
a1= np.dot(x, W1)+B1
z1=ReLU(a1)
# 2 layer z1 -> z2
a2= np.dot(a1, W2)+B2
z2=ReLU(a2)
# 3 layer z2 -> z3
a3= np.dot(a2, W3)+B3
z3=ReLU(a3)
# 4 layer z3 -> y(result)
a4= np.dot(a3, W4)+B4
y=sigmoid(a4)
return y
다음 글에서는 경사하강법과 오차역전파를 직접 구현해볼 것입니다.
'CS > 딥러닝' 카테고리의 다른 글
[논문 리뷰] AlexNet(2012) (0) | 2023.06.21 |
---|---|
경사하강법 (0) | 2023.03.18 |
댓글