너도 ChatGPT 만드는
개발자가 되고 싶어?
#인공지능 

한국어 자연어처리를 통한 언어 사용법 이해하기

언어가 실제세계에서 사용되는 방법론을 통해 NLP(자연어처리)가 어떻게 이해될 수 있는지를 풀어봅니다.

2022-07-26 | 이창호

NLP(자연어처리)를 통한 언어에 대한 이해 

1. 알 수 없어요

“바람도 없는 공중에 수직(直)의 파문을 내이며 고요히 떨어지는 오동잎은 누구의 발자취입니까

지리한 장마 끝에 서풍에 몰려가는 무서운 검은 구름의 터진 틈으로, 언뜻언뜻 보이는 푸른 하늘은 누구의 얼굴입니까.

꽃도 없는 깊은 나무에 푸른 이끼를 거쳐서, 옛 탑(塔) 위의 고요한 하늘을 스치는 알 수 없는 향기는 누구의 입김입니까.

근원은 알지도 못할 곳에서 나서 돌뿌리를 울리고, 가늘게 흐르는 작은 시내는 구비구비 누구의 노래입니까.

연꽃 같은 발꿈치로 가이없는 바다를 밟고, 옥 같은 손으로 끝없는 하늘을 만지면서,
떨어지는 해를 곱게 단장하는 저녁놀은 누구의 시(詩)입니까.

타고 남은 재가 다시 기름이 됩니다.

그칠 줄을 모르고 타는 나의 가슴은 누구의 밤을 지키는 약한 등불입니까.”

학창시절의 저는 이 시를 읽을 때마다 별다른 감흥을 느끼지 못했었습니다.
아마 아래와 같은 문제들이 한 몫을 한 게 아닐까 싶기도 합니다.

각 행의 핵심어 중, 함축적 의미가 나머지와 다른 것은? 

① 1행 – 오동잎 
② 2행 – 푸른 하늘 
③ 4행 – 작은 시내
④ 5행 – 저녁 놀 
⑤ 7행 – 약한 등불

하지만 수년이 지나, 언제 어디선가 나무에 달린 이파리들이 떨어지는 모습을 보는 순간,
저도 모르게  ‘공중에 수직의 파문이 이는’ 이미지가 상상이 되었던 날이 또렷이 기억납니다.

그때 그 이파리들이 조용히 떨어지는 모습을 보면서,
눈에 보이지 않는 그 파문들이 마치 ‘누군가의 발자국처럼’ 보일 수도 있겠다는 생각이 들었습니다.

당시 제 마음에 떠오른 그림이, 심상(心象) 이라고도 하는, 저 이미지들이
이 글을 읽는 여러분의 마음속에도 떠오르시나요?

아래 이미지가 상상을 해보시는데 도움이 될지도 모르겠습니다.

구글 검색창에 ‘수직의 파문’ 을 입력하신뒤 검색버튼을 누르고
스크롤을 몇 번 내려보시면 위 이미지를 찾으실 수 있을 겁니다. (2022년 7월 22일 현재 기준)

혹시 검색창의 스크롤을 끝까지 내려보신 분이 있으셨을까요?
제 개인적으로는 아주 놀라움을 느꼈습니다.
‘수직의 파문’ 을 제대로 보여주는 이미지를 그 방대한 구글 이미지 DB에서 찾을 수 없었기 때문입니다.

그래도 위에 있는 이미지를 활용해 약간의 상상력을 동원해 보도록 하겠습니다.

위 이미지에 보이는 수면의 파동을 하나를
수직(直)이 되게 일으켜 세우고
물의 표면에 이는 일렁임이 아닌, 공기 중의 파동이라고 상상해보면
‘바람도 없는 공중에 수직(垂直)의 파문을 내이며’ 라는 구절이 그려내는 이미지에
보다 가까워졌다고 할 수 있지 않을까요?

물론 문자 그대로 읽혀지고 그려지는 그 이미지가
저 구절로 시작하는 시 ‘알 수 없어요’를 지으신 ‘한용운’ 선생님이 의도한 이미지인지는

끝내 알 수 없을테지만요.

2. DALL-E

인공지능 모델이라고 일컬어지는 것들 중에 ‘DALL-E’ 라는 것이 있습니다.
최근 두 번째 버전이 나왔다고 하네요. (https://openai.com/dall-e-2/)

이 모델의 주된 기능 중 하나는
어떤 이미지와 묘사하고 싶은 문장을 입력했을 때
그게 어떤 것이든 놀라울 정도로 뛰어난 그림으로 묘사해준다고 합니다.

예컨대 아래와 같이 말이죠.

입력문장 : an astronaut surfing on a sea turtle over a rainbow past planets in space

출처 : https://twitter.com/BecomingCritter/status/1511808277490896903

“바람도 없는 공중에 수직(直)의 파문을 내이며 고요히 떨어지는 오동잎은 누구의 발자취입니까…”

DALL-E 2에 위 싯구를 입력했을 때 어떤 이미지가 생성될 지 무척 궁금합니다.
아마 한글은 아직 지원이 되지 않을 테죠.
공정성(?)을 고려해 구글 번역으로
‘바람도 없는 공중에 수직의 파문을 내이며 고요히 떨어지는 오동잎’ 을 영어로 번역하면

아래와 같은 문장이 나옵니다.

‘Paulownia leaves fall silently with vertical ripples in the windless air’

그리고 아까 구글 검색으로 찾은 이미지를 DALL-E 에 함께 넣어주면 아마 작동하게 되겠죠?

이제 우리에게 ‘알 수 없는’ 게 하나 더 늘어난 것 같습니다.

지금 저 DALL-E 라는 인공지능 모델이, 그러니까 어떤 컴퓨터가
정말로 인간이 하는 말을 ‘이해’하고 있다는 것일까요?

3. 자연어처리 (Natural Language Processing, NLP)

‘자연어처리(Natural Language Processing, NLP)’ 란 개념은
쓰이는 분야에 따라 그 의미가 조금씩 다를테지만
우리가 관심을 두고 있는 인공지능 분야, 조금 더 정확히는 딥러닝이라는 분야에선

인간이 하는 말을 컴퓨터가 이해하게 만드는,

조금 더 쉽게 말하면, 컴퓨터가 인간처럼 말하게 만드는 방법을 연구하고 실험하는 것이라고

저는 이해하고 있습니다.

그렇다면 위에서 살펴본 DALL-E 라는 모델은 부분적으로 NLP를 해내는 모델이라고도 볼 수 있을 것 같습니다.

“바람도 없는 공중에 수직(直)의 파문을 내이며 고요히 떨어지는 오동잎은 누구의 발자취입니까…”
어찌됐든 위 문장에 쓰인 단어들의 관계와 그것들의 의미를 어떻게든 알고 있어야 할테니까요.

솔직히 전 아직 DALL-E 라는 모델이 어떻게 저렇게 잘 작동하게 되었는지 잘 알지 못합니다.

하지만 NLP라는 분야에서 처음으로 사용된 인공지능 모델 몇 가지와,
그것들이 과연 인간이 언어를 이해하고 사용하는 행위와 어떤 점에서 비슷하고 다른지에 대해서는
아주 조금 알고 있습니다.

이제부터 제가 가진 그 조금의 ‘앎’에 대해 이야기를 해보려 합니다.

4. 우리가 사용하는 언어를 컴퓨터가 이해하도록 바꾸기 

처음 시작한 아이디어는 이러했습니다.

우리가 사용하는 언어, 즉 자연어를 컴퓨터가 이해하게 만들기 위해서
우선 각 단어들(혹은 문자들)을 숫자로 바꿔줘야 할 것이다.

조금 더 정확히는, 임의의 차원을 가진 벡터로 바꿔주자.
그 다음 벡터의 각 차원, (즉 어떤 숫자들이겠죠)
그 숫자들이
단어(혹은 문자)자신의 의미를 담아낼 수 있도록 ‘학습이 가능한 파라미터’가 되게 하자.이걸 조금 더 어려운 말로 ‘임베딩’ 이라 부르기도 합니다.임베딩을 하는 방법에는 여러 가지가 있지만
여하튼 임베딩을 한 것만으론, 아직 컴퓨터로 하여금 인간처럼 말을 하게 할 수는 없습니다.
인간처럼 말한다는 건 단어들을 적절하게 이어붙여 낼 수 있어야 한다는 것이니까요.이른바 ‘언어모델’ 이라는 것을 만들어야 합니다.임베딩과 마찬가지로, 언어모델 역할을 수행하는 인공지능 모델을 만드는 방법도 여러 가지가 있습니다.
어쨌든 ‘임베딩’과 ‘언어모델’ 이라는 건 일리가 있어 보입니다.말을 배워가는 아기를 생각해봅시다. 한동안 말없이 지그시 주변을 바라보기만 하던 아기들은
어느 순간부터 무슨말인지 전혀 알아들을 수 없는 단어들을 툭툭 내뱉기도 하고, 그것들을 연달아 읊어대기도 합니다.

그러다가 갑자기 제대로 된 단어를 말하기 시작합니다.
나아가 그 단어들을 연이어 붙여 문장을 말하게 됩니다.

아기가 말을 배울 때, 개별 단어들의 뜻을 먼저 안 후에 그것들을 이어 붙이는 것일까요?

아니면 맞는 뜻을 의미하는 것인지도 분명치 않은, 단어라고 하기도 애매한 일련의 웅얼거림들을
어찌됐든 ‘제대로 된 순서’로 이어 붙이게 된 다음에서야
그 웅얼거림들을 제대로 된 단어로 발음하고 의미하게 되는 것일까요?

알 수 없습니다.

그러나 확실한 건
아기들은 ‘제대로 된 순서’로 된 ‘제대로 된 단어’를
자신의 부모나 주변의 어른들로부터 끊임없이 듣는다는 사실입니다.

5. 컴퓨터에게 인간의 말을 가르치기 

인간도 컴퓨터에게 ‘제대로 된 단어’가 ‘제대로 된 순서’로 쓰인 문장을 미리 알려 줄 수 있습니다.

“바람도 없는 공중에 수직(直)의 파문을 내이며 고요히 떨어지는 오동잎은 누구의 발자취입니까…”

 ‘시’야말로 언어로 쓰인 그 어떤 문장보다
‘제대로 된 단어’와 ‘제대로 된 순서’를 가진 문장이라 할 수 있겠죠.
(그런데 학창시절의 저는 왜 저 싯구를 이해하지도 상상해내지도 못했을까요?)

컴퓨터에게 인간의 말을 가르치는 초창기의 방법,
즉 자연어를 벡터로 바꿔 학습가능한 파라미터로 쓴다는
초창기의 아이디어는 대략 이런 식으로 전개되었습니다.

바람도 

바람도 없는 

바람도 없는 공중에 

바람도 없는 공중에 수직(直)의 

바람도 없는 공중에 수직(直)의 파문을 

바람도 없는 공중에 수직(直)의 파문을 내이며 

바람도 없는 공중에 수직(直)의 파문을 내이며 고요히 

바람도 없는 공중에 수직(直)의 파문을 내이며 고요히 떨어지는

바람도 없는 공중에 수직(直)의 파문을 내이며 고요히 떨어지는 오동잎은 

바람도 없는 공중에 수직(直)의 파문을 내이며 고요히 떨어지는 오동잎은 누구의 

바람도 없는 공중에 수직(直)의 파문을 내이며 고요히 떨어지는 오동잎은 누구의 발자취입니까

위와 같이 다음에 올 단어를 순서대로 맞추게 하는 것이죠.

이 아이디어에 한에선 ‘단어의 제대로 된 순서’ 가 곧 ‘단어의 제대로 된 의미’이기도 한 셈입니다.
이렇게 보자면, 이 경우엔 ‘언어모델’의 사용이 곧 ‘임베딩’을 얻어내는 방법이 된다고도 할 수 있겠죠.

이 방법을 딥러닝에선 RNN 이라고 부릅니다.

조금 더 세련된 방법도 있습니다.

바람도 ___ 공중에 

            없는 _____ 수직(直)

                    공중에 __________ 파문을

                                수직(直)의 _____ 내이며

                                                     파문을 _____ 고요히

                                                                 내이며 _____ 떨어지는 

                                                                             고요히 ______ 오동잎은 

                                                                                        떨어지는 _______누구의

                                                                                                         오동잎은 ____ 발자취입니까

빈 칸에 들어갈 단어의 의미를
빈 칸 주변에 있는 단어의 의미로 정의하는 방법입니다.
빈 칸에 어떤 단어가 들어가야 할 지는,
이미 “알 수 없어요” 라는 시의 형태로 된 완전한 문장으로 가지고 있으니
모델에게 알려줄 수 있겠죠?

빈 칸에 들어갈 단어의 의미로 빈칸 앞뒤 2개씩의 단어를 활용한다면

이 방법대로 했을 때 ‘오동잎’의 의미는
‘고요히 떨어지는 누군가의 발자취’ 라는 의미를 가지게 되겠지요.

국어사전을 찾아보면 ‘오동잎’의 뜻은 ‘오동나무의 잎’ 이라고 나옵니다.
앞서 오동잎을 영어로 번역한 구글 번역문이 기억나시나요? Paulownia leaves
오동잎을 어떤 언어로 번역하든 많은 인구가 사용하는 언어에서 오동잎의 의미는
크게 다르지 않을 것입니다.
오동나무의 잎이라..
그럼 다시 ‘오동나무’의 뜻을 찾아볼까요?
이런 식이면 끝이 없을 지도 모릅니다.
(그래서 ‘데리다’  라는 철학자가 “텍스트 밖에는 아무것도 없다” 고 말한 걸지도 모르겠습니다)

그렇다면
오동잎의 뜻을 ‘고요히 떨어지는 누군가의 발자취’ 로 두면 어떨까요?

문득 너무 아름다운 뜻이라는 생각이 듭니다.

고요히 떨어지는 누군가의 발자취.
국어사전을 펼치고 싶어지기보단, 눈을 감고 음미하게 되네요.

딥러닝에선 이와 같은 임베딩 방법을 ‘Word2Vec’ 이라고 부릅니다.

그렇다고해서 Word2Vec 모델이 눈을 감고 오동잎의 뜻을 음미한다고 할 순 없겠죠.
하지만 최소한 위와 같은 방식으로 문장 내에 있는 모든 단어의 의미를 학습한다는 점에서
우리가 기존에 알고 있었던
‘제대로 된 단어의 의미’ 라는 표현이 의미하는 게 무엇인지를
곱씹어보게 되는 것 같습니다.

6. RNN, Word2Vec

앞서 말씀드린 RNN과 Word2Vec은
인간이 실제로 언어를 배우고 이해하고 사용하는 방법들이 조합된 거대한 퍼즐판의
퍼즐 조각들처럼 보입니다.

실제로 우리는
어떤 순서를 가진 단어들의 배열을 통해 문장의 의미를 이해하기도 하고
어떤 단어와 주로 나란히 쓰이는 다른 단어들을 통해 단어의 의미를 부여하기도 하기 때문입니다.

 RNN과 Word2Vec은 개발된 지 십여년이 지났습니다.

그 사이 훨씬 발전된(?)  방법들이 여럿 나왔습니다.

발전이라는 단어에 물음표를 붙인 이유가 있습니다.

인간이 언어를 이해하고 사용하는 방식에는 여러 가지가 있는데
그중 어떤 것이 나머지 다른 것들보다 더 ‘발전된’ 것이라고 보기가
매우 곤란한 사례들이 있기 때문입니다.

한 가지 예를 들어보겠습니다.

내셔널 지오그래픽에 따르면
현재 지구상에는 7,000개의 언어가 사용되고 있습니다.
그리고 14일마다 1개의 언어가 사라지고 있다고 합니다.

머지않아 곧 사라질 위험에 처한 언어 중
시베리아 지역에 살고 있는 소수 민족인 tuva 족이 사용하는
tuva (투바)어 라는 게 있습니다.

투바어에서 쓰이는 단어들은
소위 문명국가라고 불리는 나라들에서 쓰이는 주류 언어(영어, 중국어, 한국어 등) 의 단어들과
사뭇 다른 의미를 가지고 있습니다.
예컨대 우리가 흔히 사용하는
‘미래’ 와 ‘과거’ 라는 뜻의 단어에 해당하는 투바어는
songgaar (송가르) 와 burungaar (부른가르) 라고 합니다.

그런데 ‘송가르’의 뜻은 go back, 즉 ‘뒤로 가다’ 이고
‘부른가르’의 뜻은 go foward, 즉 ‘앞으로 가다’ 입니다.

투바족은 미래가 자신의 등 뒤에 놓여 있고
과거는 자신 앞에 펼쳐져 있다고 생각합니다.

실제로 투바족은
시간의 흐름에 따라 매순간 나에게 닥쳐오는 순간들을 가르켜 과거라 부르고
그렇게 나를 지나쳐가버린 순간들을 미래라고 부릅니다.

우리가(주류 국가들이) 사용하는 과거와 미래의 뜻과는 정반대인 셈이죠.

그렇다면 투바족이 나눈 일상대화들을 한 데 모은 말뭉치와
영어권 혹은 중국어권, 아니면 한국어권에 사는 사람들이 나눈 일상대화들을 한데 모은 말뭉치를
함께 섞어
RNN 혹은 Word2Vec을 만들면 어떻게 될까요?

미래란 문자 그대로 아직 오지 않은 순간이고
과거란 이미 지나간 순간이라고 생각하는 사람과
투바인이 만나 대화를 나눈다면
정상적인 대화가 가능할까요?
그래서 투바어가 곧 사라질 위험에 처하게 된 걸까요?
투바어와 한국어를 동시에 잘하는 인공지능은 불가능할까요?
투바어로
한용운의 “알수 없어요”를 번역한다면
어떤 모습의 시가 될까요?

송가르와 부른가르의 뜻을 보면서
투바의 사고방식이 만들어낼 문학과 철학들이 어떠할지를 잠깐이나마 상상해보시기 바랍니다.
투바족이 인공지능을 개발한다면 어떤 언어모델과 임베딩 방법을 떠올렸을 수 있을까요?

시간이 선형으로 흐른다는 생각을 하지 않는
또다른 어떤 소수민족의 언어에선
문장의 제대로 된 순서가 중요하지 않을 것입니다.

동시에 서로 다른 의미를 가진 문장들을 뒤섞어 말하는
또 다른 어떤 민족의 언어에선
나란히 쓰임으로써 단어의 의미가 형성될 수 있다는 아이디어는 폐기될 것입니다.

자연어를 처리한다는 건 무엇을 의미하는 것일까요?
인간처럼 말하는 인공지능이라는 건 정말로 무엇을 의미하는 것일까요?

7. NLP의 방법론과 인간의 언어 이해 탐구  

다시 처음으로,
한용운의 시 “알 수 없어요”로 돌아가보겠습니다.

“바람도 없는 공중에 수직(直)의 파문을 내이며 고요히 떨어지는 오동잎은 누구의 발자취입니까

지리한 장마 끝에 서풍에 몰려가는 무서운 검은 구름의 터진 틈으로, 언뜻언뜻 보이는 푸른 하늘은 누구의 얼굴입니까.

꽃도 없는 깊은 나무에 푸른 이끼를 거쳐서, 옛 탑(塔) 위의 고요한 하늘을 스치는 알 수 없는 향기는 누구의 입김입니까.

근원은 알지도 못할 곳에서 나서 돌뿌리를 울리고, 가늘게 흐르는 작은 시내는 구비구비 누구의 노래입니까.

연꽃 같은 발꿈치로 가이없는 바다를 밟고, 옥 같은 손으로 끝없는 하늘을 만지면서,
떨어지는 해를 곱게 단장하는 저녁놀은 누구의 시(詩)입니까.

타고 남은 재가 다시 기름이 됩니다.

그칠 줄을 모르고 타는 나의 가슴은 누구의 밤을 지키는 약한 등불입니까.”

가만 보니

이 시의 각 구절은

“…누구의 발자취입니까
…누구의 얼굴입니까.
…누구의 입김입니까.
…누구의 노래입니까.
…누구의 시(詩)입니까.
…”

위에서 보는 바와 같이 “누구의 ~ 입니까” 로 끝나고 있습니다.

그리고 그 ‘누구’를 형용하는 신비롭고 아름다운 자연현상들을 묘사한 절들은
그것의 진짜 모습, 진짜 의미를 알 수 없는
미지의 대상을 가리키고 있는 것만 같습니다.

하지만 그것을 알아내고자 하는 인간의 의지가 바로 다음 구절에서 엿보이는 듯합니다.

타고 남은 재는 다시 기름이 되어

나 자신을

그칠 줄 모르고 타는 등불로

하지만 겸손하게 타오르는 약한 등불로 묘사하고 있습니다.

이처럼 저에게는 이 시가

진리를 구하는 인간의 겸허한 정서를 표현한 시처럼 읽히곤 합니다.

저는,
앞으로 연재될 글에서
NLP의 방법론들을 통해 인간이 어떻게 언어를 이해하고 사용하는지를 살펴보고
거꾸로
언어가 실제세계에서 사용되는 방법론을 통해 NLP가 어떻게 이해될 수 있는지 써보고자 합니다.

알아내려 할수록 그저 빠져들고 말뿐인
저 시의 대상들처럼,
그 신비함과 아름다움에 대한 경외를 최대한 잃지 않으면서
겸허한 마음으로 언어에 대한 이야기를 인공지능으로 풀어가 보고자 합니다.

제가 가진 ‘조금의 앎’에
이 글을 읽어주신 분들의 생각과 느낌이 보태어질 수 있게 되면 좋겠습니다.