2장의 마지막은 딥러닝의 개념과 활용입니다.
사실 딥러닝은 이 한 챕터에 다 담을 수 없을 만큼 내용도 많고, 역사도 깊고 공부할 것도 많습니다. 인공신경망의 구조와 그 안에 담긴 수학적 내용, 구현 방법, CNN, RNN 등을 보자면 한 학기 동안 공부해도 모자랄 판이죠.. 인공지능 기초에서는 아주 간략하게 다루어야 하지만.. 그래도 학생들은 매우 어려워하는 게 사실입니다.
(최대한 쉽게 쓰겠지만..이번 글은 좀 길 수 있고.. 좀 어려울 수 있습니다. ;)
우선 네이버 '소프트웨어야 놀자'에서 만든 영상을 한 번 보고 시작합니다. 그나마 조금이라도 이해를 돕고.. 전체적인 윤곽을 잡고 시작하는 게 도움이 되더라고요. :)
딥러닝이란?
교과서의 처음은 위와 같이 시작합니다. 그런데 첫 문장부터 턱 막히는 기분이죠. 인공신경망이라니.. 인공신경망을 아직 배운 적이 없는 학생들은 첫 문장부터 물음표를 달고 있는 느낌입니다..;
그래서 간단하게 인공신경망에 대해 살펴보겠습니다. 인공신경망은 사람의 신경계를 본떠 만든 수학적 모델입니다. 사람의 신경계를 이루는 가장 기본단위인 뉴런은 여러 개의 가지돌기에서 자극을 받아들여 자극의 강도를 합산합니다. 그 자극이 특정한 값을 초과하면 축삭돌기를 통해서 다음 뉴런으로 자극을 전달하게 됩니다.
그런데 이 과정을 살펴보면 특정 자극의 크기가 얼마 이상일 때 스위치를 켜주고 그 값에 미달할 때는 스위치를 끄는 것과 비슷합니다. 따라서 값의 강도를 측정해 스위치를 켜주고 꺼주는 식으로 회로망을 구현할 수 있다면 뇌의 신경망을 구성할 수 있을 것이라는 아이디어입니다. 이 내용이 활성화 함수인데, 수업 시간에는 다루지 않기로 했어요.
최초의 인공신경망은 1957년 로젠블랫이 구현했습니다. 로젠블랫은 자신이 만든 인공신경망의 이름을 '퍼셉트론'이라고 불렀는데 인식을 의미하는 Perception과 Neuron의 합성어입니다. 그런데 지금 생각하는 형태와는 꽤 다른 모습으로 생겼습니다. 저 형태로 생겼더라도 원리는 같습니다. 수많은 입력값들에 적절한 가중치를 곱하고, 신호 전달 크기를 결정짓는 기준을 0으로 만들어주는 편향값을 더해줍니다. 그런 후 값이 0보다 크면 통과 (스위치 ON), 그보다 작으면 스위치를 끄는 형태입니다.
이 내용은 교과서에는 등장하지 않지만.. 어떤 식으로 퍼셉트론이 작동하는지 이해해 보는 페이지예요. 퍼셉트론은 회로를 구성하는 게이트를 직접 구성할 수 있습니다. 이 내용은 사실 컴퓨터 구조론을 배워야 좀 이해가 쉬운데요.. 컴퓨터 구조론에서는 입력값과 원하는 결괏값을 만들어내는 회로를 수학적으로 설계를 해야 하는 내용이 있습니다. 가령 입력 신호가 이렇게 들어올 때는 이 결과를, 저 입력신호가 들어올 때는 저 결과를 만들고 싶어요. 그런 결과를 만들어내는 회로를 게이트를 조합해가며 사람이 직접 설계를 해야 하는 거죠.
그런데 퍼셉트론은 그 회로 조합을 알아서 해준다는 겁니다. 입력값과 출력값만 주면 알아서.. 이 과정은 사실 한 번에 일어나진 않고요, 임의로 조합을 하나 만든 다음 (대부분 결과를 만족하지 않는) 계속 업데이트를 하며 가중치와 편향 값을 조정해갑니다. 그래서 성공하면 '학습이 완료되었다'라고 합니다.
퍼셉트론이 만들어졌을 때 반응은 뜨거웠습니다. 1958년 뉴욕 타임스의 기사인데 미국 해군에서 퍼셉트론에 대한 이야기를 하고 있는 기사네요. 1년 안에 사람의 지도나 조정 없이 스스로 인식을 하는 수준에 이를 것이라고 예측을 했었습니다. 지금은 NASA가 최첨단을 달리는 미국의 기관이겠지만, 당시에는 2차 대전 때 일본, 독일군의 암호를 파헤치며 전쟁을 수행했던 해군이 가장 기술력이 뛰어났었어요. 즉, 퍼셉트론은 어떤 면에서 해군이 보증하는 인공지능이라고 할 수 있었습니다.
그런데 교과서 중간에 이런 내용이 나와요. 초기 인공 신경망의 활용 사례를 다룰 때 저 그림이 어떤 내용인지 맥락 없이 등장하죠. 여기에는 수학적인 내용이 좀 추가되어야 하는데요..
수업시간에 수학 이야기를 하면 학생들이 싫어합니다. ㅠ 어쩔 수 없이 양해를 구하고..
퍼셉트론이 직선으로 영역을 구분한다는 의미는 위와 같습니다. 일단 각 입력값들을 x, y 2가지가 있다고 하고, 0보다 큰지 작은지를 구분하는 경계선을 구해보면 ax+by+c=0이라는 일차식이 나옵니다. 이 식을 변형하면 y=px+q의 직선의 형태로 만들어낼 수 있습니다.
예를 들어서 입력값이 x, y이고 x=1, y=1 일 때만 참, 나머지는 거짓으로 처리하는 And 게이트를 퍼셉트론으로 구현한다고 합시다. 그러면 각 입력값을 순서쌍으로 묶은 (0, 0), (0,1), (1,0), (1,1)이 있고, 참은 빨간 동그라미, 거짓은 파란 동그라미로 그리면 위의 그림이 됩니다. 그리고 이 값들을 구분하는 직선을 퍼셉트론이 y=-3x+4를 찾았다고 해볼게요. 그러면 빨간 동그라미는 직선 위, 나머지는 직선 아래로 구분하게 됩니다. 즉, 1950년대의 퍼셉트론은 이런 형태의 문제를 풀 수 있었죠.
AND 게이트뿐만 아니라 x=0, y=0 외에 모두 참으로 처리하는 OR 게이트도 퍼셉트론은 쉽게 찾아냈습니다. 예를 들면 위의 사례가 AND, OR 게이트를 구현한 퍼셉트론의 구분선이라고 할 수 있습니다.
그런데 1960년대 말.. 마빈 민스키가 Papert와 함께 썼던 '퍼셉트론'이라는 책에서 퍼셉트론의 한계를 수학적으로 증명해냅니다. 게이트 중에서 XOR이라고 부르는 Exclusive OR가 있는데, 이 게이트는 두 개의 신호가 서로 다르면 참, 같으면 거짓을 출력합니다. 이 경우 직선을 어떻게 긋더라도 영역을 나눌 수 없게 됩니다. 결국 하나의 퍼셉트론으로는 매우 단순한 문제들만 해결할 수 있었고, 그렇지 못한 사례가 있음을 수학적으로 증명을 해버린 것이죠.
그런데 민스키는 한계만 지적한 것이 아니라 해결 방법도 함께 제시했습니다. 하나의 층이 아니라 2개의 층으로 XOR 게이트를 구현할 수 있음을 설명했습니다. 이런 퍼셉트론을 '다층 퍼셉트론'이라고 불렀고, 입력층과 출력층 사이에 존재하는 또 다른 층을 '은닉층'이라고 불렀습니다.
그러나 퍼셉트론은 한번에 짠! 하고 만들어지는 것이 아닙니다. 임의로 하나의 상태를 만들어낸 후 수많은 업데이트 과정을 통해 구현해나가야 하는데.. 이 다중 퍼셉트론은 학습을 어떻게 시켜야 할지 민스키는 찾지 못했습니다. 민스키도 '지구상의 누구도 다중 퍼셉트론의 학습 방법을 알 수 없다.'라고 말을 했고, 이렇게 한계가 증명된 인공 신경망은 그야말로 '폭망'을 했습니다. 연구비 모두 회수.. 논문 모조리 심사 불가..
그런데 이런 복잡한 은닉층을 학습시키려는 다양한 시도는 있어왔어요. 결과로부터 수정을 해야 하기 때문에 결과층부터 가까이 있는 은닉층을 업데이트하고, 그 은닉층을 바탕으로 그 앞의 은닉층을 업데이트하고.. 그런 과정을 통해 입력층에 적용하는 가중치까지 거꾸로 업데이트를 하면 되겠다는 시도가 있었습니다. 결국 1989년에 제프리 힌튼 교수가 다중 퍼셉트론의 학습에 성공을 하게 되는데, 이 방법을 '오차 역전파'라고 부릅니다.
은닉층은 어떤 특성이 있을까요? 무조건 많으면 좋을까요? 은닉층을 아파트로 비유해서 설명을 해봤습니다.
Q. 은닉층은 몇 층으로 해야 할까요?
아파트의 층수가 높으면 높을수록 좋을까요? 물론 좋을 수는 있지만 지나치게 높으면 공사 기간이 높아지고.. 아무나 공사를 할 수가 없습니다. 은닉층이 너무 많아지면 학습 시간이 많이 길어지게 됩니다.
Q. 은닉층의 뉴런은 몇 개나 해야 할까요?
세대수가 많으면 좋겠지만.. 너무 많아도 복잡하죠. 뉴런이 너무 많으면 지나치게 자료를 파헤치므로 과적합(Overfitting)에 빠지기 쉽습니다. 옷을 만들기 위한 모델이 너무 딱 맞게 만들어버려서 다른 사람들이 입기에는 불편한 옷을 만들게 됩니다. 반면 뉴런이 너무 적으면 데이터의 특성을 제대로 파악하기 어렵습니다. 마치 옷을 허수아비 옷처럼 헐렁하고 멋이 하나도 없는... 제대로 데이터를 반영하는 모델이 나오지 않게 됩니다.
[추가. 그런데!!]
예전.. 교과서가 개발될 때까지만 해도 과적합에 대한 내용 때문에 위의 내용이 맞았는데요. 요즘 LLM(Large Language Model)이 등장하면서 무조건 뉴런이 많으면 다 잘되는 시대가 되었다고 합니다. 이 부분은 좀 더 공부가 필요할 것 같아요. 개정된 교과서에는 어떤 내용이 실릴지 살펴봐야겠습니다. 초창기 딥러닝 모델에 대한 설명이라고 이해해주시면 좋겠습니다.
다중 퍼셉트론이 1980년대 말에 나왔지만 상용화가 되기까지는 오랜 시간이 걸렸습니다. 여러 가지 이유가 있는데 학습의 성공률이 낮았고, 학습 시간도 너무 오래 걸렸죠. 1990년 초반의 컴퓨터의 성능을 생각하면 이해가 됩니다.
그리고 과적합에 빠지는 경우도 너무 많았습니다. 며칠 걸려서 훈련을 열심히 시켜놨는데 실전만 가면 결과가 엉망으로 나오는 사례가 많았어요. 그래서 이 사례들을 해결하기 위해 오랜 시간을 노력한 결과 딥러닝이 탄생합니다. (딥러닝도 힌튼이 고민해서 내어놓은 네이밍입니다. 다중 퍼셉트론이란 이름만 달아도 논문 채택이 안되니까 새로운 이름으로.. 그전에 DBN, Deep Belief Network라는 이름을 먼저 사용하기도 했습니다.)
이 딥러닝이 세상에 드러난 것은 2012년이었습니다. 이미지를 분류하는 방식이 이전에는 서포트 벡터 머신 알고리즘을 주로 사용했는데 성능이 그다지 높지 않았어요. 1년 노력해서 1% 높일까 말까.. 했는데 딥러닝은 나오자마자 거의 10%의 성능 향상을 보이면서 압도적으로 우승을 해버립니다. 이때는 약 8개의 층을 가지고 구현을 해냈는데 마이크로소프트가 구현한 2015년 Resnet의 경우 152개의 층으로 구성을 했죠. 그만큼 딥러닝의 학습이 안정적이 되었고, 구현을 위한 SW, HW 모두 발전했습니다. Resnet은 드디어 사람의 능력을 능가하게 됩니다.
딥러닝은 이전의 SVM(서포트 벡터 머신) 방식과 달랐는데요, 아시다시피 SVM은 지도학습입니다. 그래서 사람들이 데이터에서 특징을 추출하고 레이블을 만들어 학습을 시켜야 했었습니다. 그런데 이미지 데이터에 활용한 CNN 방식은 이미지의 특징들을 스스로 파악하고 특징을 추출했어요. 즉 딥러닝에서는 정형 데이터가 아닌 비정형 데이터를 그대로 사용할 수 있다는 장점이 있습니다.
이미지를 주로 다루는 CNN(합성곱 신경망), 일상적으로 사용하는 자연어 등을 처리할 때 사용하는 RNN(순환 신경망) 등에서는 비정형 데이터를 정형 데이터로 처리하지 않아도 됩니다. 우리가 생성하는 대부분의 데이터가 비정형 데이터임을 감안하면 딥러닝은 정말 활용가치가 높습니다.
하지만 딥러닝은 아직 완전하진 않습니다. CNN, RNN은 그렇지만 일반적인 신경망을 활용하는 경우에도 아직은 레이블이 포함된 데이터를 학습에 많이 활용하고 있죠. 레이블은 대부분의 경우 사람이 수작업으로 모두 하나하나 입력을 해야 하기 때문에 시간과 비용이 많이 듭니다. 따라서 레이블이 없는 데이터를 학습하는 비지도 학습을 기반으로 하는 딥러닝의 성능을 끌어올리는 연구가 진행되고 있다고 합니다.
다음 글부터는 3장으로 넘어가서 '데이터와 기계학습'의 내용을 다루어 보겠습니다!