Notice
Recent Posts
Recent Comments
Link
12-27 12:54
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

킹머핀의 제작 일지

단층신경망에서 다층신경망으로 본문

엔트리/심화

단층신경망에서 다층신경망으로

KingMUffin 2020. 10. 25. 22:38

강의 들으면서 정리하는 거라 내용이 완전하지 않음.


 

인공신경망과 직선의 방정식

강의 들으면서 정리하는 거라 내용이 완전하지 않음. 대충 인터넷 뒤져보았을 때 인공신경망을 가장 쉽게 설명하는 위의 이미지. 신경망 그림에는 없지만, 서로 이어져있는 신경세포의 시냅스

kingmuffin.tistory.com

위의 퍼셉트론 학습은 선형 분리가 가능해야만 학습이 가능한 한계가 있다. 모든 확률이 1일 때만 유의미한 AND와 최소 하나의 확률이 1인 OR에는 적용할 수 있지만, 모든 확률이 같지 않을 때 유의미한 XOR에는 적용할 수 없다. 비선형 분포이기 때문에 선이 두 개가 필요해서 비선형 분리에 해당함. (근데 AND, OR, XOR은 왜 쓰이는 건지?) 게다가,

단층신경망(단층 퍼셉트론)은 하나의 입력층(Input layer)과 출력층(Output layer)이다. 이전까지 단층신경망으로 분류와 회귀를 하는 방법을 배웠지만(아마도..?) 복잡한(?) 데이터의 경우 오류 가능성이 크다. (교수님이 신경망 말하셨다가 퍼셉트론 말하셨다가를 반복하시니까 방금까지도 두 용어가 다른 의미인 줄 알았다. 용어 통일 좀 해주세요 ㅠ..)

다층 분류기는 비선형 분포를 계층 선형으로 분류할 수 있다. 이전까지 직선의 기울기와 y절편(bias)만으로 데이터를 서로 분류했다면, 이번에는 계단처럼 생긴 수직/수평 직선 여러 개를 이어서 분류하는 것이다. 이것을 업그레이드한 것이 바로..

다층신경망(Multi-Layer Perceptron)이다. 단층신경망 사이에 입력층과 출력층 사이에 가상의 층인 은닉층(Hidden layer)을 추가한 것이다. 은닉층은 여러 개일 수도, 노드가 더 많거나 적을 수도 있다. 물론 이 개수도 최적을 찾아야 한다.

중요한 것은, 이전까지 배웠던 단층신경망에서는 데이터를 더욱 정확히 분류하기 위해 활성함수로 시그모이드 함수를 사용했는데, 이게 은닉층이 많을수록 오히려 정확도가 떨어진다는 것이다. 교수님 말씀으로는 딥러닝에서 꽤 중요한 발견이라고 한다.

그 이유는 시그모이드 함수는 0과 1로 수렴하는 S자 곡선(로지스틱 곡선)인데, 0과 1로 갈수록 기울기가 0에 가깝다. 즉 이전 글에서 배운 경사하강법을 제대로 수행할 수 없게 되는 것이다.

 

딥러닝에서 사용하는 활성화함수

An Ed edition

reniew.github.io

왜냐하면 내가 이해한 바로는 시그모이드 함수의 인수인 wx + b 의 기울기 w가 0에 가장 가까운 구간을 찾아야 하는데, 시그모이드 함수의 기울기가 0에 가까울수록 경사하강법에서 하강이 잘 이루어지지 않기 때문이다. 위의 출처에서도 'Gradient Vanishing'라고 설명한다!

그럼 어떤 함수를 써야하나? 비선형 활성화 함수인 ReLU(Rectified Linear Unit)를 사용한다. 약자가 대문자와 소문자로 이루어져 있어서 무섭지만 그냥 계단함수에 가깝다. y = x 직선에서 0 이하는 0으로, 양수는 1로 취급한다. 양수가 항상 1이므로 Gradient Vanishing도 없을 것이다. 계산 복잡도도 시그모이드보다 낮다.

이러한 비선형 함수와 은닉층을 활용하면 비선형 결정 경계면을 만들어서 더 정교한 데이터 분리가 가능하다. (아까는 수직/수평 직선 여러 개를 이어서 분류했는데 지금은 또 비선형 선으로 분류한다. 무엇이 다르지..?)

다층신경망에서 은닉층 때문에 출력층 바로 이전의 w와 b는 학습할 수 있어도 입력층 바로 다음의 w와 b를 학습할 수 없다. cost를 계산할 수 없으니까. 이를 해결하기 위해 역전파 오류법(Back Propagation)을 사용한다. 미로찾기도 막히면 출구부터 그리는 법.

출력층 바로 이전의 w와 b를 학습할 수 있으면, 거기서부터 시작하는 것이다. 출력층의 오차를 이전 은닉층 노드의 각 가중치만큼 해당 노드에 나누어주는 것을 시작으로 입력층까지 계산한다. 그걸 언제 다해? 괜찮아, 텐서플로우가 다 해주니까.