딥러닝에 본격적인 학습에 앞서, 인공 신경망을 정리하지 않는다면 안될 것 같다..
Introduction
아래에 28 by 28 픽셀 데이터가 존재한다. 그리고 우리의 뇌는 이 이미지 데이터를 3이라고 인식한다.
그리고 아래의 경우에도 우리의 각 이미지에 밝기가 다름에도 불구하고 뇌는 아래 세개의 이미지 데이터를 각각 3으로 인식한다.
분명히 우리의 시각피질에서는 각 이미지 3에 대해 받아들이는 정보가 다름에도 불구하고 이를 모두 같은 3이라고 판단하며, 이와 마찬가지로 다른 개념을 가리키는 이미지들도 구별해낸다.
(인간 뇌의 위대함이 아닐까 😲)
그러나 만약 아래와 같이 28 by 28개의 입력값을 받아 입력값만으로 숫자를 구분해보라고 한다면, 문제의 난이도는 엄청나게 올라갈 것이다.
그러나 이것은 기계학습에서 컴퓨터가 숫자 이미지를 분류하는 방식이며, 지금부터 신경망(Neural Network)에 대해 소개해보고자 한다. (신경망의 구조는 굉장히 많지만 여기서는 아주 기본적인 신경망에 대해 소개한다.)
뉴런(Neuron)
기계학습에 관심을 가지고 있는 사람이면 알다시피, 신경망은 사람의 뇌에서 아이디어를 얻어 발전된 형태이다. 이를 알기 위해서는 먼저 뉴런에 대한 개념이 선행되어야 한다.
뇌에서의 뉴런은 하나의 신경 세포를 의미한다. 그러나 인공 신경망에서의 뉴런(Neuron)은 하나의 숫자를 담는 다는 사실만 알고 있으면 된다. 즉 0~1 사이의 숫자라고 알고 있으면 된다.
예를 들어 아래처럼 28 by 28의 픽셀 이미지가 존재한다고 생각해보자. 여기서 뉴런의 개수는 28 * 28 = 784개이다. 각 뉴런은 픽셀의 밝기를 나타내며, 검은 픽셀은 0, 하얀 픽셀은 1이다. 신경망 안에서 이런 숫자들은 입력값이라고 불린다. 숫자가 높을 수록 입력값의 활성화정도가 크다고 생각하면 된다.
층(Layers)
이 784개의 뉴런이 신경망의 입력층(Input layer)을 구성하게 된다. 문제에 따라 다르겠지만, 여기서 최종 출력층(output layer)은 10개의 뉴런을 가지고 있다. 최종 출력층의 뉴런은 각각의 숫자(0~9)를 대표한다. 이 뉴런들은 마찬가지로 0~1 사이의 값을 나타내며 그 값은 주어진 입력값과 각 뉴런이 대표하는 숫자 사이의 일치 정도를 나타낸다.
그리고 중간에 있는 layer를 은닉층(Hidden layers)라고 하는데, 이 층은 인공 신경망에서 입력층과 출력층 사이에 존재하는 층이라고 생각하면 된다. hidden layer는 입력 데이터로부터 복잡한 특징이나 패턴을 추출하는 역할을 수행하는데, 일단은 이 정도만 알고 넘어가자. (추후에 자세히 설명해보려고 하니 끝까지 읽어주길 바란다!) 위에서는 2개의 Hidden layer가 존재하는데, 이는 문제에 따라 다르지만 구조를 구성할 방법에 따라 결정된다고 보면 된다.
여기서 중요한 것은 기본적으로 인공신경망의 한층에서의 활성화가 다음 층의 활성화를 유도하는 방식으로 작동한다는 것이다. 그렇다면 어떻게 한 층에서의 활성화가 다른 층의 활성화를 불러일으킬까?
이 과정은 사진의 픽셀인 784개에 해당하는 입력 뉴런들을 활성화 시킬 때, 이 때 활성화되는 뉴런들의 특정 패턴이 다음 층이 활성화 되도록 한다. 이렇게 마지막 출력 층까지 전달되어 최종적으로 출력층에서 가장 빛나는 뉴런(즉 값이 가장 높은)이 이 신경망에서 선택된 출력값이라고 보면 된다.
그렇다면 이런 구조가 어떻게 우리가 의도한대로 이미지 데이터를 분류할 수 있다는 것인가? 그리고 각각의 층은 어떤 역할을 하는 것일까?
추후에 정리할 CNN에서도 언급을 하겠지만, 각 층은 숫자의 특징을 잡아내는 것이라고 생각하면 된다. 우리는 숫자를 인식할 때 각 부분을 합친다. 예를 들어 9같은 경우 동그라미가 위에, 있고 직선이 아래에 있는 구조로 구분할 수 있다. 예를 들어 첫번째 층은 9라는 숫자를 잘게 쪼개서 특징을 구분짓고 두 번째 층에서는 위와 아래로 특징을 구분지어 결국 최종적으로 출력층에서 이러한 특징을 잡는 최종 뉴런이 활성화되는 것이다.
Edge detection
참 아이라니한 일이다. 층이 각각 데이터의 특징을 잡아내는게 어떻게 가능한 일인가? 즉, 한 층의 활성이 어떻게 다음 층에서의 정확한 활성을 이끌어내는 것일까?
여기서 신경망의 목표는 픽셀을 테두리로 결합시키거나, 테두리를 패턴으로 결합시키거나, 패턴을 숫자로 결합하는 매커니즘을 만드는 것이다. 그렇다면 그 매커니즘을 어떻게 만들기 위해 어떤 변수를 업데이트 해나가야 하는 일까. 다시 말해, 그런 매커니즘(=판별)을 하기 위해서 무엇을 조정해야 할까?
여기서 조정해야 할 것들이 바로 weight와 bias다. (이 둘은 단순 숫자라고 생각하자.)
각 층 뉴런에서의 모든 활성치를 가져와 각 신경의 가중치를 곱한다음 모두 더한다. 이렇게 출력층까지 각 뉴런과 가충치를 더한 값을 업데이트 해가면 이전 층이 다음 층으로의 활성을 이끌어내는 것으로 해석할 수 있다. 각각의 뉴런에 대한 가중치를 준 값의 합을 계산하면 어떤 값이라도 나올 수 있다. 그러나 우리가 신경망에서 원하는 출력값은 0과 1 사이의 값이다. 때문에, 이 가중치를 준 값의 합을 0~1 사이의 숫자로 변환해주는 함수에 넣을 필요가 있다. 이때는 시그모이드(=로지스틱 함수) 활성화 함수를 사용하여 가중치의 합을 0~1사이의 숫자로 만든다. 시그모이드는 0을 기준으로 0 이상이면 활성화된 것으로 판단한다.
그러나, 때에 따라서 가중치의 합이 0을 넘을 때 뉴런이 활성화 되는 것을 원하는 게 아닐 수 있다. (ex. 가중치 합이 10보다 클 때 활성화 되기를 원할 수 있다.) 이는 활성화가 되지 않기 위한 조건을 다는 거소가 유사하다. 이때는 가중치 합에 대해 bias를 더해준다. 위의 경우 시그모이드 함수에 값을 집어넣기 전에 bias를 더하고 그 값을 집어넣는다. 그렇게 되면 뉴런 활성화에 대해 조건을 다는 것과 동일한 효과를 얻을 수 있다.
즉, Bias는 뉴런이 활성화되려면 가중치의 합이 얼마나 더 높아야 하는지를 알려주는 변수며, 각각의 뉴런은 bias를 갖는다고 생각하면 된다.
Parameters
추후 발전된 신경망 구조로 갈 수록 신경써야 할 요소 중 하나는 파라미터의 수를 줄이는 것이다. 이번 예시에서 파라미터의 수를 계산해보자.
가장 먼저 첫번째 입력층(input layer)에서는 784개의 뉴런이 존재하고 2번째 은닉층(hidden layer)는 16개의 뉴런이 존재한다. 각각의 뉴런들이 연결되어야 하기 때문에, 첫번째 연결의 weight의 개수는 784 * 16이라고 볼 수 있다. 그리고 각각의 뉴런은 bias를 갖는다고 위에서 언급하였다. 때문에 입력층을 제외한 두번째 은닉층 16개만큼의 파라미터를 추가적으로 가져야 한다.
두번째 은닉층과 세번재 은닉층의 뉴런 개수는 각각 16개, 16개이다. 때문에 16 * 16만큼의 weight의 개수가 생기고 세번째 은닉층만큼의 bias 16개가 추가되어야 한다.
마지막으로 세번재 은닉층과 마지막 출력층(output layer)의 뉴런개수는 각각 16개, 10개이다.
때문에 둘 사이의 weight의 개수는 16 * 10으로 생각할 수 있으며, 마지막 출력층 10개만큼의 bias가 추가 되어야 한다.
결국 정리하자면 이번 신경망에서는 아래와 같은 파라미터 개수를 가진다고 생각하면 된다.
$$784*16+16*16+16*10+16+16+10 = 13002$$
이 13000개의 변수는 각각 다른 방법으로 작동하며, 학습이 진행됨에 따라 해당 문제 해결에 알맞은 weight와 bias로 업데이트 된다. 이 방법은 오류역전파에 따라 Loss를 최소화하는 방법으로 적절하게 업데이트 되는 방식이며 오류역전파와 Loss function에 대해서는 추후에 정리하도록 한다.
인공신경망에 최종적으로 정리하자면, 앞서 뉴런을 숫자를 보관하는 것이라고 언급했는데 뉴런이 보관하는 숫자들은 입력한 이미지에 따라 결정되고 이미지에 따른 뉴런을 weight와 bias의 계산을 통해 다음 층의 뉴런으로 넘기고 최종적으로 이전 층의 뉴런의 출력을 모두 받아서 0과 1 사이의 수를 만들어 내는 함수와 같다고 생각할 수 있다.
Reference
위 글은 해당 유튜브를 보고 정리한 내용입니다.
https://youtube.com/watch?v=aircAruvnKk&list=PLZHQObOWTQDNU6R1_67000Dx_ZCJB-3pi&index=1&t=824s
'Analytics' 카테고리의 다른 글
[ML/DL] Recurrent Neural Network(RNN) (0) | 2024.08.09 |
---|---|
[NLP] Text Representation (0) | 2024.06.14 |
[Data] 텐서(Tensor) 구조와 연산 (0) | 2024.05.08 |
[ML/DL] Activation function(활성화 함수)의 쓸모 (0) | 2024.05.05 |
[ML/DL] Faiss(Faicbook AI Similarity Search) 사용법 (0) | 2024.05.03 |