이전글

http://www.inven.co.kr/board/powerbbs.php?come_idx=2097&iskin=lol&l=519508

-------------------------------


지난 글에서 우리는 컴퓨터 내부에 대해 알아봤습니다.

 

컴퓨터의 내부는 연산 장치메모리로 이루어져 있습니다.

 

연산 장치메모리에 기록된 명령어를 하나씩 수행하면서 프로그램을 실행합니다.

 

또한 병렬 컴퓨터가 어떤 의미를 가지며,

GPU가 어떤 의미를 가지고

또 이것이 딥 러닝 기술과 어떤 관련이 있는지 알아봤습니다.

 

이번 글에서는 최종적으로

프로그램이 어떻게 만들어지며,

또 위에서 배운 컴퓨터 내부에서 어떻게 실행되는지 알아보겠습니다.

 

또한 더 나아가서 딥 러닝과 알파고의 원리가 어떻게 되는지 까지 다뤄보도록 하겠습니다.

 

--------------------------------------------------


3. 프로그램과 명령어

 

3.1 기계어와 어셈블리어

 


지난 글에서 메모리 내부에는


컴퓨터가 해야 할 일 들,

명령어가 기록되어 있다는 것을 알아봤습니다.

 

연산장치메모리에 기록된 명령어들을

한 번에 하나씩 순차적으로 읽어서,

명령어들을 수행합니다. (즉 명령에 따라서 연산을 합니다.)

 

예를 들어서

메모리0001번째 위치를 읽었더니

덧셈을 하라는 연산이 있었다고 해봅시다.

그러면 CPU는 덧셈을 처리하기 시작합니다.

 

그리고 그 다음 CPU

이번에는 다음 위치인 메모리0002번째 위치를 읽고

곱셈을 하라는 연산을 발견하여, 곱셈을 처리하는 식입니다.

 

그런데 이 덧셈을 하라던가 곱셈을 하라던가 하는 명령어들은

모두 메모리에 저장되어 있으며,

또한 그렇기 때문에 01의 형태로 저장되어 있습니다.


따라서 여기서 나오는 명령어들은 모두 01의 형태를 취합니다.

이전 글에서 이러한 명령어들을 기계어라고 말했었죠.

 



하지만 기계어는 사람이 해석하기에 매우 어렵습니다. ㅠㅠ

비슷한 숫자만 반복되니, 뭔 소린지 알 수가 있어야죠.

 

이 때문에 컴퓨터를 개발하는 개발자들은,

사람이 이해하기 쉽도록 명령어를 바꿔주었는데,

이렇게 해서 바꿔준 명령어들을 어셈블리어 라고 합니다.

 

인간이 어셈블리어로 명령어 집합을 만들게 되면, (즉 프로그램을 만들게 되면)

어셈블러 라고 하는 프로그램이 동작하여

어셈블리어로 만들어진 명령어들을 기계어로 번역해줍니다.

 

어셈블리어CPU를 만드는 회사에 따라 종류가 달라집니다.

대표적인 어셈블리어 로는

ARM, MIPS , 인텔의 x86 등이 있습니다.

보통 ARM은 스마트폰에 많이 쓰이고, x86PC에서 많이 쓰입니다.

 

그렇다면 실제로 ARM의 어셈블리어를 예제로 해서

어셈블리어가 어떻게 기계어로 번역되는지 알아보겠습니다.

 

가장 쉬운 어셈블리 명령어 중에는

ADD 명령어가 있습니다.

 

ADD는 말 그대로 두 개의 숫자를 더하라는 명령어입니다.

 

사용할 때는 이런 식으로 사용하게 됩니다.

 

ADD r1, r2, r3

 

이 명령어는, r2r3 레지스터에 저장된 데이터를 서로 더하고

그 결과 값을 r1 레지스터에 저장하라는 의미를 가지고 있습니다.

실제로 컴퓨터에 이를 입력하면 덧셈이 실행되는 거죠.

 

그런데 이를 기계어로 바꾸면 이렇게 됩니다.

 

111000 01000 0010 0001 000000000011

 

뭔 소린지 모르겠죠? ㅎㅎ

이래서 사람들이 기계어를 안 쓰는 겁니다.

 

조금 해석을 하자면

앞부분의 111000 01000 ADD 명령어라는 걸 나타내고 있고,

00102번 레지스터, 00011번 레지스터, 0000000000113번 레지스터를 의미합니다.

 

정리해보자면

사람이 어셈블리어로 프로그램을 작성하면

어셈블러 라고 하는 프로그램이

이를 위와 같은 숫자 형태의 기계어로 바꿔주고,


이 숫자들이 메모리에 들어가게 되면

나중에 CPU가 이 메모리를 읽어서 덧셈 연산을 수행하게 되는 것입니다.

 


3.2 고급 프로그래밍 언어

 

이제 어셈블리어만 아시면, 스스로 프로그램을 만드실 수 있습니다.

 

그런데 아직 문제가 남아있는데,

기계어 못지않게 어셈블리어도 어렵다는 사실입니다 ㅠㅠ

 

위의 예시에서는 단순한 덧셈 연산을 예로 들었는데,

어셈블리 연산에는 그 외에도 복잡한 연산들이 많이 있습니다.


그래서 어셈블리어로 프로그래밍을 하면

어렵고 복잡해서 실수도 많이 나오고, 뭔소린지 모를 때가 많이 생기죠.

 

그래서 공학자들은 어셈블리어에서 더 나아가서

고급 프로그래밍 언어(혹은 고급 언어)라는 걸 만들었습니다. (고급 레스토랑..)

 

고급 프로그래밍 언어란 것은

공대생이라면 자주 들어보셨을 C언어, JAVA 등등의 언어를 말합니다.

 

고급 프로그래밍 언어

사람이 쓰기에 (비교적) 편리하고, 읽고 이해하기 쉽다는 특징이 있습니다.

그래서 많은 사람들이 이 고급 프로그래밍 언어로 프로그램을 만들죠.

 

그런데 컴퓨터 입장에서는

이런 고급 프로그래밍 언어를 곧바로 이해할 수 있는건 아니기 때문에,

아까 어셈블리어를 기계어로 번역했던 것처럼

고급 언어어셈블리어나 기계어로 번역해주는 번역기가 필요합니다.

 

그리고 이러한 번역을 해주는 프로그램을 컴파일러 라고 합니다.

 

사람이 고급 언어로 명령어를 작성하게 되면

컴파일러와 어셈블러 등의 도움으로

이런 명령어들을 컴퓨터가 이해할 수 있는 기계어로 바꿔주는 거죠.

 

그러면 이번에는 대표적인 고급 언어인 C언어를 통해

C언어가 어떻게 어셈블리어로 바뀌는지 알아보도록 하겠습니다.

 

C언어에서 어떤 메모리 공간을 이용하고 싶으면,

먼저 메모리 공간을 쓰겠다는 명령어를 내보내야 합니다.

이를 메모리 할당 혹은 변수 할당 이라고 합니다.

 

예를 들어, 다음 명령어를 봅시다.

 

sedol = 3 + 1;

 

여기서 sedol 이라는 문자의 의미는

메모리의 어떤 한 주소를 가리키는 말입니다.

 

메모리를 쓰려면 메모리의 주소 값을 알아야 하는데,

메모리의 주소 값은 숫자이므로 사람이 일일이 기억하기 어렵습니다.

 

이 때문에 사람들은 주소 대신에 별명을 부르기 시작했습니다.


예를 들어 서울시청의 주소는 서울특별시 중구 세종대로 110’ 이지만

그냥 서울시청이라고 부르는 것처럼 말이죠.


컴퓨터 공학에서는 이러한 별명들을 변수라고 말합니다.


sedol이라는 변수 옆에는

= 라는 문자가 적혀있습니다.


= 의 의미는 우리가 흔히 쓰고 있는 같다와는 조금 의미가 다른데요.

'오른쪽에 있는 값을 왼쪽의 메모리 공간에 기록하라'는 의미를 가지고 있습니다.

 

따라서

sedol = 3 + 1;


의 의미는

3+1의 연산을 하고, sedol 이라는 공간에 그 결과를 집어 넣으라는 것과 같습니다.

 

이런 C언어를 ARM 명령어로 바꾸면 대충 이런 식으로 바뀝니다.

 

ADD r4, r3, r1

STR r4, [r5, #0]

 

여기서 STR은 메모리에 저장을 하라는 명령어입니다.

 

물론 실제로는 이보다 좀 더 복잡하겠지만,

대충 덧셈 연산을 한 다음, 메모리에 저장하는 연산이 실행된다고 생각하시면 됩니다.

 

우리가 이런 식으로 고급 언어를 사용하게 되면,

여러 가지 프로그램을 만들 수 있게 됩니다.

 

우리가 흔히 자주 쓰는 카카오톡이나, 한글 프로그램, 알파고 등등...

모든 프로그램의 아래에서는

위와 같은 프로그래밍 언어와 하드웨어의 동작 과정이 숨겨져 있습니다.

 

 

3.3 인공 신경망과 딥 러닝

 

자 지금까지 우리는

논리회로에서 시작해서 하드웨어, 프로그래밍 언어까지

컴퓨터가 실행되는 원리에 대해서 알아보았습니다.

 

그렇다면 마지막으로 우리는

알파고는 그럼 과연 어떤 원리로 동작하는 지에 대해 알아보려고 합니다.

 

알파고에 대해서 알아보기 전에

우리는 딥 러닝 알고리즘에 대해서 알아보아야 합니다.

왜냐하면 알파고는 딥 러닝 알고리즘을 이용한 프로그램의 일종이기 때문이죠.

(여기서 알고리즘이란, 프로그램을 동작시키는 순서도 비슷한 거라고 보시면 됩니다.)

 


사실 최근에 와서야 알파고가 대중에 관심을 끌게 되었지만,

실제로는 기계학습이라는 분야는 1950년대에도 있었습니다.

 

알파고는 인공신경망을 통해 구현되었는데,

이 인공신경망 개념은 그때도 이미 있었고요.

 

인공신경망에 대해 알아보기에 앞서

먼저 인공신경망으로 어떤 문제를 해결할 수 있는가 알아보겠습니다.

 

인공신경망으로는

크게 2가지 정도 문제를 풀 수가 있습니다.

바로 분류(classification) 문제와 회귀분석(regression) 문제이지요.

 

분류 문제란 말 그대로, 고양이와 강아지를 분류하듯,

어떠한 데이터를 그 특성에 따라 분류를 하는 문제입니다.

 

예를 들어보죠.

고양이 7마리와 강아지 7마리를 데리고,

어떠한 A라는 특성과, B라는 특성을 조사했다고 해봅시다.

그랬더니 다음과 같은 결과가 나왔습니다.



 

여기서 갈색 점들이 각 고양이의 특성값을 조사한거고

파란색 점들이 각 강아지의 특성값을 조사한 거라고 해봅시다.

 

그렇다면 AB의 특성만 살펴봤을 때,

어떻게 하면 어떤 개체가 고양이인지 강아지인지 분류할 수 있을까요?




예를 들어 이런 식으로 빨간 선을 그어서

빨간 선 위쪽에 있으면 고양이로 보고,

빨간 선 아래쪽에 있으면 강아지로 보면 되겠지요?

 

따라서 어떠한 새로운 개체가 고양이인지 강아지인지 판단하려면

위와 같은 빨간 선에 대한 데이터를 저장해놓고,

특성이 빨간 선 위쪽에 있냐, 아래쪽에 있냐에 따라

고양이인지 강아지인지 구분할 수 있다는 겁니다.

 

그래서 분류 문제는 다시 말하자면

빨간 선을 어떻게 그어야 하는지 에 대한 문제라고 할 수 있습니다.

 


그리고 회귀 분석 문제

지금까지 축적된 과거 정보를 토대로

미래에 나올 결과를 예측하는 통계적 분석방법입니다.

 

예를 들어보겠습니다.

어떤 사람이 프로게이머 7명을 대상으로

연습 시간에 따른 승률을 조사했다고 해봅시다.

그랬더니 아래와 같은 결과가 나왔습니다.




여기서 X가 연습시간이고, Y가 승률이라고 해봅시다.

 

위의 예제에서 프로게이머의 승률과 연습시간은 상관관계가 있으므로,

이를 직선을 그려서 그래프로 표시하면 아래와 비슷해질 겁니다.

 


 

, 정확하지는 않지만, 대충 저런 직선 위에서

프로게이머의 연습시간에 따른 승률이 결정되는 것이지요.

 

그렇다면 어떤 신인 프로게이머가 있을 때,

그 선수의 승률이 대충 어느 정도인지 알려면

그 선수의 연습시간을 조사해보면 됩니다.

그리고 위의 직선에 대입해보면, 승률이 대강 어느 정도인지 알아낼 수 있는 거죠.

, 예측이 가능해지는 겁니다.

 

위의 예제에서는 조사 대상도 한정되어 있고,

특성도 몇 가지밖에 조사를 안했지만,

대충 저런 식으로 진행된다고 보시면 됩니다.

 

, 인공 신경망으로 푸는 문제들은

어떻게 하면 선을 잘 그어서 분류와 예측을 잘 해낼 수 있느냐의 문제라는 건 맞습니다.

(물론 실제로는 선을 아주 복잡하게 그려야 하기 때문에 문제가 더 어렵습니다.)

 


그렇다면 여기서 문제는

과연 선을 어떻게 그려야 할까의 문제입니다.

 

인공 신경망은 사람의 뉴런을 모방하여 선을 그리는 문제를 해결합니다.

조금 다르게 말하면 가중치 방식을 이용합니다.

 

사람의 경우, 어떤 판단을 하기 위해서는

다양한 종류의 입력(혹은 정보)를 토대로 판단을 내립니다.

그리고 그 중에는 중요한 정보도 있고, 덜 중요한 정보도 있죠.

 

그런데 예를 들어서,

사람이 학교 식당에서 밥을 먹기 전에, 종소리를 들려준다고 한다면

사람의 신경망은, 종소리를 밥을 먹는 시간에 대한 판단을 내리는 중요한 정보로 인식하게 됩니다.

따라서 그 정보에 가중치를 두게 되는 거죠.

종소리를 들려주는 횟수가 늘어날수록, 가중치는 점점 올라갑니다.

(이것을 다른 말로 하면 학습이라 할 수 있습니다.)

 


인공신경망도 비슷하게 가중치 방식을 사용합니다.

아까 고양이와 강아지를 판단하기 위해 AB라는 특성을 조사했던 것처럼,

어떤 개체에 대한 여러 가지의 특성을 컴퓨터에 입력을 해줍니다.

 

당연히 처음에 컴퓨터는 아무것도 모르기 때문에,

어떤 정보가 중요한지 모릅니다.

그래서 그냥 초기 값을 출력하게 됩니다.

 

그러나 컴퓨터에게 예시를 많이 알려주게 되면, (즉 학습을 시키면)

컴퓨터는 그걸 보고서, 스스로 가중치를 조절하게 됩니다.

(가중치 값을 기록하고 있는 메모리의 값을 바꾼다는 뜻)


이러한 과정을 전문 용어로는 back propagation 이라고 합니다.

(어떻게 가중치를 조절하는지 설명하려면 매우 복잡한 수학이 필요하므로,

여기서는 건너뛰도록 하겠습니다.)

 

그리고 학습을 통해 이러한 예시들이 많이 쌓이게 되면

가중치가 점점 판단을 내리기에 적합한 값을 가지게 되고,

나중이 되면 선긋기를 잘 할 수 있게 되는 것입니다.

 

여기까지가 바로 인공 신경망에 대한 설명이었습니다.

 

그렇다면 딥 러닝 이란 무엇이냐?

딥 러닝이란 인공 신경망의 한 일종인데,

보통은 딥 뉴럴 네트워크(Deep Neural Network)

즉 심화 인공 신경망을 말합니다.

 

아까 전에 인공 신경망은

가중치를 조절하여 판단을 한다고 했었죠?

 

그런데 Deep Neural Network에서는

가중치에 따라서 판단을 내리는 과정을 여러 번 수행합니다.

그리고 이러한 자잘한 판단 과정들의 결론을 모아서

최종적인 결론을 내리게 되는 거죠.

 

, 여러 단계를 거쳐서 판단을 내리기 때문에

Deep Neural Network이라고 부릅니다.

 

좀 비유를 들어서 설명 드리자면,

우리가 고양이를 판단할 때 그냥 판단하는게 아니라,

 

고양이의 수염을 보고서 -> 아 이건 길쭉하네? 수염이겠구나

고양이의 눈을 보고서 -> 이건 둥글고 초롱초롱하네? 눈이겠구나

고양이의 귀를 보고서 -> 이건 뾰족뾰족하고 털이 많네? -> 귀겠구나

 

이런 식으로 판단한 다음, 최종적으로 이게 고양이 인 것을 판단하게 되는 거죠.

 

이러한 Deep Neural Network을 통한 인공지능은

한동안 유행에서 사라졌다가,

1-2년 전쯤부터 다시 재발견되기 시작했습니다.

 

그리고 작년 쯤에는 구글에서 딥마인드라고 하는

Deep Neural Network 기반 인공지능을 쓰는 회사를 사들이게 되죠.

그리고 그 기술을 적용하여 만든게 바로 알파고입니다.

 

저도 알파고 논문을 다 읽어본 게 아니라서 자세히는 모르겠지만,

알파고 또한 위와 같은 Deep Neural Network 을 이용한 것으로 보입니다.

 

, 입력된 기보가 데이터가 되는 거고,

그 데이터의 특성을 인공 신경망에 집어넣어서 학습을 시키는 것입니다.

 

따라서 알파고는 바둑판 위의 여러 가지 특성을 살펴보고서

가중치 방식을 통해 승률과 상대방이 둘 수 등등을 예측하게 되고,

결과적으로 다음에 둘 수를 결정하게 되는 거죠.


(자세한 알고리즘 등은 뉴스 기사에서도 다루고 있으니 기사를 보시면 됩니다)

 

구글이 이렇게 알파고를 만든 이유는

바로 자사의 인공지능 기술을 홍보하기 위함입니다.

 

이미 구글은 알파고를 홍보하기 전에

‘Tensor Flow’ 라고 하는 딥 러닝 플랫폼을 발표하였습니다.

‘Tensor Flow’를 쓰면, 누구든지 쉽게 딥 러닝 알고리즘을 이용할 수 있는거죠.

 

따라서 구글의 입장에서 보면

이번 알파고 대국의 의미는

자사의 기술을 많이 이용하도록 홍보를 하고,

또한 앞으로 인공지능 기술 시장을 선점할 초석의 의미를 가지고 있습니다.

 

------------------------------

글을 마치며

 

일단 지금까지 제 글을 읽어주셔서 감사합니다.

최대한 제가 아는 지식을 쉽게 설명해보려고 노력했고요.

대학원생 분들이나 전공자 분들이 보면

좀 말도 안되는 내용이 있을 수가 있습니다.

(내용이 좀 비유적이고 생략해서 쓴게 많거든요)

 

혹시 조금이라도 이 분야에 관심이 있으신 분들은

전기과나 컴공과 등등에서 열리는 컴퓨터 관련 수업을 들으시거나

혹은 구글이나 위키 등에서 찾아보시면 잘 아실 수 있습니다.

 

마지막으로 긴 글 읽어주셔서 감사하고

질문이나 댓글은 언제든지 환영합니다 ㅎㅎ