본문 바로가기

머신러닝,딥러닝/딥러닝 화제의 기술들

딥러닝에 대한 흐름 이해 : 노드와 학습

시작하기에 앞서서..

이 시리즈의 작성이 어디까지 어떻게 행해질지는 모르겠으나 엔지니어 입장에서 변화하는 딥러닝 모델들의 흐름을 쫓아가기 위해 단어를 이해하고 정리하는 시리즈가 될 거 같습니다. 현재로서는 GPT-3 그리고 그 근간에 있는 랜스 포머(Transformer) 기술을 알아먹을 수 있게 해 보는 것이 일차적 목표입니다. 그러므로 첫 글은 딥러닝에서 자주 사용되는 노드의 개념과 학습이란 무엇인가를 알아보는 글을 작성해보려고 합니다. 그럼 시작해 보도록 하겠습니다.

컴퓨터에서 AND OR NOT은 우리가 생각하는것 보다는 매우 전지전능한 만능 도구에 가깝습니다. 그저 0 1에 대한 연산을 담당하는 것처럼 보이는 저런 간단한 도구들이 얼마나 다양하고 복잡한 기능들이 가능한지에 대하여 

모르고 넘어가는 경우가 많습니다. 일딴 간단하게 컴퓨터에서의 덧셈 은 어떻게 이루어지는지 확인해 봅시다. 또한 이 글은 연구자가 아닌 공학자의 입장에서 설명하는 글이기 때문에 최대한 간단하게 이해하고 그 짧은 이해를 전달하는 글이 될 것입니다. 

컴퓨터에서의 연산

컴퓨터는 우리가 컴퓨터 시간에 많이 들었던 0 과 1을 통한 동작이 이루어진다는 사실을 알고 있습니다. 하지만 대부분의 경우 여기까지의 지식 많은 습득하고 있는 경우가 많고 필자 또한 그랬습니다. 그래서 그 과정에 대한 공부와 함께 과거의 컴퓨터가 왜 그리 클 수밖에 없는지 등 여러 부가적인 지식을 얻을 것입니다.

가장 간단한 덧셈 연산에 대하여 설명해 보겠습니다. 1+9 = 10이라는 연산을 인간의 표현으로 하면 다음과 같이 표현됩니다.

       1                                                                                   0001(1)

+     9                                                                             +    1001(9)

------------     하지만 이를 컴퓨터 식으로 바꾸게 된다면          --------------------   으로 표현이 되어집니다.

     10                                                                                   1010(10)

사람이 생각하는 바로는 1 + 1 = 2 가 되어야 하지만 컴퓨터는 0/1 즉 2진수로 계산하기 때문에 사람이 생각하는 것과 표기 방식이나 계산방식이 달라지는 것입니다.

여기서 중요한 부분은 저 덧셈 연산이 어떻게 이루어지는가 확인하는 것입니다.  예를 들어서 저 숫자들이 있는 자리가 회로가 존재한다고 생각하고 각 회로마다 AND가 있다고 생각해봅시다.

AND 게이트

 각 회로마다 존재하는 AND연산자는 결국 올림 연산 기능을 위의 사진처럼 수행할 것입니다. 2진 연산에서는 연산 결과의 합이 2가 넘을 수 없고 뒤의 연산의 결과가 2가 넘었을 때 앞의 자릿수를 1로 바꿔주는 연산을 해야 하는데

결국 이 연산은 AND로 가능하며 AND의 개수만큼 덧셈의 올림 연산이 가능하다는 사실을 우리는 알 수 있습니다.  

XOR 게이트 구현

이와 같은 XOR게이트는 우리에게 한자리 수의 결괏값을 알려주는 논리 연산자로 작동하여 같은 숫자 00/11이 들어오면 0으로 아니면 1로 돌려주면서 연산을 반복하게 됩니다. 그렇게 된다면 우리가 알고 있는 합연산이랑 동일한 결과가 출력되는 것을 알 수 있습니다. 

애니약

우리가 알고 있는 가장 유명한 컴퓨터 애니 약은 1초에 5000개의 덧 샘 연산을 할 수 있는 그 당시에 엄청난 계산기였으나 그 수많은 계산을 처리하기 위해 들어간 진공관의 개수가 또한 만만치 않아서

전기세 도둑(?)이라는 평가를 받았습니다.

트랜지스터

하지만 현제는 저 커다란 진공관들이 자그마한 트랜지스터로 발전되었고 2018년도의 1nm크기(머리카락 길이보다 작고 더 작은 단위입니다.)의 트랜지스터가 등장하면서  현재

아이폰 X의  동전만 한 크기의 프로세서인 A11에는 무려 43억 개의 트랜지스터가 들어 있다고 합니다. 현제 우리의 스마트폰은 저런 단순한 논리게이트 들로 이루어진 그저 작은 칩셋 하나로 보는

기적이라고 간단히 설명할 수 있을 정도로 많은 발전을 이루어 왔습니다. 결국 현제 7nm, 5nm 등등 이는 모두 작은 면적 속에 많은 논리게이트를 집어넣으려고 하는 노력이라고 이해해 볼 수 있습니다.

추가적으로 우리가 알고 있는 AND OR NOT 등등을 조합한 여러 소자들을 통해서 미분기(!)/적분기(!) 또한 구현할 수 있습니다. 이에 대한 자세한 내용은 위의 설명에서는 가능하다는 부분만 남기고 넘 거 갑니다.

궁금하신 분들은 미분기 - 적분 시 회로 그리고 OPAMP(연산 증폭기) 등등 을 검색해 보시면서 공부하시면 될것습니다.

컴퓨터와 노드

위의 내용에서 우리가 보고 있고 구현되고 계산되고 컴퓨터의 많은 기능들이 결국은 단순한 논리게이트의 집합의 결과라고 생각해 볼 수 있습니다. 컴퓨터의 성능이란 결국 단순하게 얼마나 많은 덧셈이 가능한지 보여주는 

지표에 불과하다고도 생각할 수 있습니다.(물론 부동소수정 연산 등 그저 덧셈만이 성능이 되지는 않습니다.) 사실 노드는 컴퓨터 관련 일을 해보시거나 학과를 전공하셨다면 노드는 단순하게 데이터를 담아내는 한 공간

이라고도 해석할 수 있습니다. 예를 들자면 네트워크망을 설명할 때도 IP가 하나의 노드가 될 수 있습니다. 우리가 내부 컴퓨터에서 공유기를 타고 외부로 나가는 것처럼 노드에서는 데이터를 탐색할 때 사용되고

여러 알고리즘들이 이 노드들이랑 엮여 있습니다. 알고리즘에서 보던 노드에 개념이 왜 딥러닝에서 사용되는지 한번 알아보겠습니다.

위의 사진은 매우 뜬금없을 수도 혹은 당연할 수도 있는 사진입니다. 위의 사진은 우리의 뇌 속에 존재하는 가장 작은 기능 단위(?)인 뉴런이라는 뇌세포입니다. 평균적으로 사람은 860억 개의 뉴런과 100조 개의 시냅스(저장공간)

으로 이루어져 있습니다. 하지만 아래의 사진들을 보신다면 뉴런은 단지 당장을 연산을 처리해주는 그저 블랙박스 같은 존재로 보입니다. 실제로도 우리의 뇌는 저런 식으로 아주 많이 연결되어 있는 수많은 뉴런들의 계산 결과

라고도 표현할 수 있습니다(!). 우리가 인공지능으로 부르는 딥러닝의 영역은 결국 우리의 뇌와 동일한 과정을 거치는 것을 실현해보기 위한 연구 과제랑 동일하다고 볼 수 있습니다. 결국 컴퓨터에게 저렇게나 많은 뉴런(연산 함수)

와 학습이 있다면 인간처럼 생각할 수 있을것이다 라는 희망을 가지고요.. 아직까지는 그런 단계를 도달하지는 못하고 있습니다. 물론 뇌과학적 혹은 철학적 관점에 대한 파악이 정확히 되어 있지않은 현 시점에서는 그저 뭔지 모르지만 따라그리고 그게 반 고흐의 유명한 그림이 되기를 기대하는것과 마찬가지인 상황입니다. 하지만 그래서 이 방법론이 잘못되었다고만 생각할수 없습니다.(참고로 아주 간단한 구조의 뉴런을 컴퓨터 및 회로로 구현하여 실제 생물과 같은 움직임을 실현하는 실험이 성공한 사례가 있습니다.) 결국 이는 우리의 뇌가 논리 연산자로서 구현이 가능하다는 충분한 가능성을 보여준 것입니다.

그렇다면 딥러닝에서는 하나의 뉴런을 어떤 식으로 사용할까요?  아래의 사진을 통해서 알아봅시다

위의 사진을 그냥 바라본다면 대부분 이해가 어려울 수 있습니다. 하지만 저것은 단순히 바라본다면 그저 1차 함수를 그리고 그에 따라 참/거짓을 나누는 하나의 도구로 작동한다고 설명할 수 있습니다.

딥러닝 분야에서 w는 가중치로 b는 편향으로 해석합니다. 결국 위의 사진의 노드는 입력값 x에 가중치 w를 곱해주는 결과를 도출합니다. 곱을 MatMul이라고 표현한 이유는 입력값 x가 단순히 하나의 숫자가 들어있는

x가 아니라 여러 숫자로 이루어진 행렬(메트릭스)들의 곱임을 나타내기 위함입니다. 결론적으로 하나의 노드는 일차원 함수가 되어 선을 긋고 그 기준으로 참과 거짓을 나누는 판단의 기준이 됩니다.

위의 설명을 더 잘 이해하기 위해서 하나의 그림을 더 준비하겠습니다.

위의 사진은 하나의 노드로 그려지는 선을 그리고 입력값들과 참 거짓을 판단할 수 있음과 동시에 우리가 앞에서 설명한 AND OR 등 논리 연산자의 기능을 수행할 수 있음을 보여 줍니다.

결국 노드는 어떤 입력값에 대한 하나의 판단기준이며 해당 노드를 통과한 입력값은 판단 결과가 된다고 이해할 수 있습니다. 딥러닝에서 여러 노드들을 활용하는 이유는 하나의 문제에 대하여

여러 차원(여러 관점)으로 해석하기 위해서 사용합니다. 예를 들자면 자동차라고 판단할 수 있는 방법이 그저 바퀴와 유리창 그리고 적당한 사각형(?) 이 아닌 브랜드명 혹은 크기 질량 등 여러 관점에서

판단을 내릴 수 있을 때 좀 더 정확한 결과로 유도됩니다. 이에 따라서 딥러닝에서는 여러 노드들을 통해 구현된 기능을 가지고 노드 안에 W, b값을 조절하면서 학습을 시키고 그에 따른 결과를 확인하고 

개선하는 식으로 이루어져 있습니다. 우리가 레이어라고 부르는 것들은 대부분 이 수많은 노드들이 연결되어 결국은 해당 결과를 도출할 수 있도록 튜닝해주는 공간입니다. 정확한 결과를 위해 노드들이

늘어나고 늘어난 노드에 따른 연산량도 같이 늘어나니... 컴퓨터의 리소스가 많이 필요한 작업이 됨이 틀림없죠.