꺼내먹는지식 준

신경망 개념 완벽 이해 본문

AI/딥러닝 기초

신경망 개념 완벽 이해

알 수 없는 사용자 2022. 2. 12. 18:20

신경망에 대한 이해가 잘 되어 있다고 생각해도, 시각적으로 정리를 한번 하면 여러 인사이트를 얻을 수 있다고 생각한다. 

다음의 정리를 보자. 

 

모든 내용과 자료는 유튜브 3blue1 강의를 참고하였다.

 

설명 내용은 탑 다운 방식으로 점차 세부적인 내용이 설명 된다. 

신경망은 어떻게 작동하는가?

다음의 숫자가 적힌 28 $\times$ 28 크기의 이미지가 있다고 하자. (28 $\times$ 28 크기의 뉴런)

각 뉴런들은 픽셀은 밝기에 따라 [0, 1] 값을 가지고 있다. 1에 가까울 때, 각각의 신경망이 더 큰 정도로 활성화된다. 

신경망에 입력으로 주어지기 위하여 1차원으로 정렬한다. 

 

정렬된 784 크기의 입력이 입력층으로 들어간다. 

이미지에 적힌 숫자에 따라 활성화 된 뉴런이 다르다. 

 

출력층은 우리가 찾고자 하는 답, 즉 해당 사진이 0~9 중 어느 숫자에 해당되는가이기에 10개이다. 

 

입력층과 hidden 층과의 상호작용을 통해 해당 0~9 뉴런들은 0과 1사이의 어떤 값을 취하고, 그 값은 뉴런이 대표하는 숫자와 입력값이 일치하는 정도를 나타낸다.(softmax I guess) 

 

입력 층과 hidden 층과의 상호작용

사진의 필셀인 784개에 해당하는 입력 뉴런들을 모두 활성화 시킬 때, 활성화 된 뉴런들의 특정 패턴이 다음 층을 활성화 되게 한다. 

 

이러한 layer가 다음의 결과를 얻어낼 수 있는 이유는 무엇일까? 

hidden layer가 하는 것은 뭘까? 

 

사람이 특정 물체 혹은 여기서는 숫자를 인식할 때 다음의 사진 처럼, 나눠서 인식하는 경향이 있다. 

즉, 이상적으로는 오른쪽 그림 같이 두번 째 층의 각 뉴런들이 이러한 부분들에 대해 대응하기를 바란다. 

 

1) 오른 쪽 그림과 같이 9 혹은 8이 주어지면 이상적으로는 왼쪽 상단에서 두번째 이미지에 해당하는 특정 뉴런의 활성치가 1에 가까워 질 것이라 기대한다. 

2) 이러한 방식이면 세번 쨰 층에서 마지막 층으로 갈 때 어떤 부분들결합어떤 숫자를 가르키는지 보기만 하면 된다. 

 

하지만 이는 어떻게 각각의 부분들이 인지되는가, 혹은 어떠한 위치에 있어야 하는가와 같은 해결하지 못한 문제가 있다. 

한번 나눴던 부분을 더 쪼개서 이해하여보자. 

 

왼쪽의 이미지와 같이 쪼개진 부분들이 첫번째 hidden layer에 해당하여 활성되고, 이러한 쪼개진 부분들의 결합이 두번째 hidden layer에 해당하여 활성되어(상단의 원, 하단의 수직선), 최종적으로 우리가 원하는 결과값을 얻어낼 것이라 기대한다. 

 

(정말로 네트워크가 이렇게 동작하는지는 추후 설명이 이어진다. , 먼저 신경말을 훈련시키는 방법에 대해 알아보자. )

하지만, 이러한 처리 방식을 통해 여러 추상화 단계로 나눌 수 있는 복잡한 것들이 많다. 

음성 분석도 이에 해당한다. 특정 소리들을 합쳐 음절을 만들고, 음절을 합쳐 단어, 단어를 합쳐 문장과 추상적인 생각을 구성한다. 

 

 

한층의 활성이 어떻게 다음 층의 정확한 활성을 이끌어 내는 것일까? 

 

목표는 픽셀을 테두리로 결합시키거나, 테두리를 패턴으로 결합시키거나, 패턴을 숫자로 결합하는 매커니즘을 만드는 것이다.  

두번째 층의 한 뉴런이 사진 속 이미지의 외곽선이 있는지 없는지 판별한다고 가정해보자. 

여기서 문제는 신경망이 어떠한 파라미터를 가지고 있어야, 그리고 어떻게 조정 되어야 다음과 같은 판별을 할 수 있을까이다. 

사전에 언급하였던 테두리를 모아 원형을 만드는 상황 판별또한 마찬가지이다. 

1) 첫 레이어의 뉴런의 활성치를 가져와 각 신경의 가중치를 주고 모두 더한다. 

 

사용된 예시가 CNN 의 합성곱과 동일하다. CNN의 합성곱은 다음의 글을 참고하자. 

weight는 오른쪽 사진과 같이 filter로 표현(음수 빨간색 픽셀, 양수 초록색 픽셀)되고,

우리가 보고자 하는 곳, 즉 가중치를 주고자 하는 곳 외에는 가중치를 모두 0 에 가깝게 만들고, 각 픽셀에 가중치를 준 값의 합을 구하면 구하고자 하는 영역의 픽셀에만 가중치를 주어 더한 것과 같은 상황이 된다. 

해당 영역의 활성도를 정확하게 확인하고 싶으면 해당 영역을 제외한 다른 가중치를 음수로 주면 픽셀이 어두워져 확인이 가능하다. 

 

2) 가중치를 준 값으로 [-$inf$, $inf$] 어떤 값이든 얻어낼 수 있지만 우리는 해당 값을 [0,1] 사이의 숫자로 만들고자 한다.

해당 과업은 Sigmoid 함수를 통해 해결될 수 있다. 따라서 뉴런의 활성화는 기본적으로 관련 있는 가중치의 weighted sum이 얼마나 더 양에 가까운지에 따라 결정된다. 하지만, 우리는 weighted sum이 0을 넘을 때를 활성 조건으로 삼고 싶지 않을 수도 있다. 합이 10이 넘을 때 활성화 되도록 할 수도 있다. 이때 사용 되는 것이 바로 bias term 이다.  

3) Bias Term 은 활성 조건이 될 수 있다. 

 

시그모이드 함수에 값을 넣기 전, 먼저 bias term을 더해 활성 조건을 걸 수 있다. 즉, 가중치는 레이어가 선택하려는 뉴런의 픽셀 패턴을 알려주며, bias는 뉴런이 활성화 되려면 weighte sum이 얼만큼 커야 하는지를 알려준다. 

지금까지의 설명은 단 하나의 뉴런에 대한 설명이다.

 

4) 각각의 뉴런을 각자의 가중치를 갖는다. (혹시나 가중치가 share 된다고 착각하면 곤란하다.)

또한 각각의 뉴런은 시그모이드 함수에 적용되기 전 가중치에 더한 값인 bias를 각각 갖는다. 다음과 같이 총 784 $\times$ 16의 weight와 각각 뉴런마다 1개, 총 16개의 bais 를 갖는다. 이로 인해 이 네트워크(신경망은) 총 13,000개의 가중치와 bias를 갖는다. 총 13,000개의 연결은 각각 다른 방법으로 작동한다. 

다만, 수식의 간단화를 위하여 다음과 같이 matrix 를 활용한다. 

 

\[ a^{(1)} =  \sigma\Big( Wa^{(0)} + b\Big)\]

 

1) 뉴런이 보관한 숫자들은 입력한 이미지에 따라 결정

2) 뉴런은 이전 층의 뉴런의 출력을 모두 받아서 0과 1사이의 숫자를 만들어 내는 함수로 이해 

3) 네트워크 전체도 784숫자를 받아서 10개의 수를 출력하는 함수

4) 복잡한 함수는 특정한 패턴을 인식하기 위해 13,000여개의 가중치, bias 매개변수로 수많은 벡터 행렬 곱과 non-linear activation (시그모이드 here) 압축을 반복

 

정리하자면, 학습이란, 수 많은 수치들을 찾기 위해 알맞은 환경을 얻는다는 것을 의미한다.

이러한 가중치와 bias를 직접 조정하는 것이 가능할까? 의도적으로 두번 째 층은 모서리를 인식하고, 세번재 층은 패턴을 인식하도록 하는 것 말이다. 불가능하다. 그렇다면 이 네트워크는 어떻게 데이터를 보는 것만으로도 적절한 가중치와 bias를 배울까? 

다음 글에서 계속.. 

 

 

 

 

 

 

 

Comments