
LLM의 핵심 기술인 Transformer | 딥러닝 (Deep Learning) 제5장
요약
LLM의 근간이 되는 Transformer 아키텍처의 작동 원리를 시각적으로 설명합니다. 텍스트 예측과 확률 분포를 통한 생성 과정을 다루며, 모델의 규모가 성능에 미치는 영향을 설명합니다.
핵심 포인트
- Transformer는 현대 AI 붐을 이끄는 핵심 신경망 모델임
- 텍스트 생성은 다음 토큰에 대한 확률 분포 예측을 통해 이루어짐
- 예측된 샘플을 기존 텍스트에 추가하며 반복적으로 생성 수행
- 모델의 규모(Scale)가 커질수록 생성된 텍스트의 논리성이 비약적으로 향상됨
영상: LLM의 핵심 기술인 Transformer | 딥러닝 (Deep Learning) 제5장
채널: 3Blue1Brown
길이: 27분 14초
출처: 자막 (수동, 영문)
전사(Transcript):
GPT의 약자는 Generative Pretrained Transformer입니다. 따라서 첫 번째 단어는 충분히 직관적입니다. 이는 새로운 텍스트를 생성하는 봇(bots)을 의미합니다. Pretrained(사전 학습된)는 모델이 방대한 양의 데이터로부터 학습하는 과정을 거쳤음을 의미하며, 이 접두사는 추가적인 학습을 통해 특정 작업에 맞춰 미세 조정(fine-tune)할 수 있는 여지가 더 있음을 암시합니다. 하지만 마지막 단어가 진짜 핵심입니다. Transformer(트랜스포머)는 특정한 종류의 신경망(neural network)이자 머신러닝 (machine learning) 모델이며, 현재의 AI 붐을 뒷받침하는 핵심적인 발명입니다.
이 영상과 이어지는 장들을 통해 제가 하고 싶은 것은 Transformer 내부에서 실제로 어떤 일이 일어나는지에 대해 시각 중심적인 설명을 진행하는 것입니다. 우리는 그 안을 흐르는 데이터를 따라가며 단계별로 살펴볼 것입니다. Transformer를 사용하여 구축할 수 있는 모델에는 매우 다양한 종류가 있습니다. 어떤 모델들은 오디오를 입력받아 전사(transcript)를 생성합니다. 이 문장은 그 반대 방향으로 작동하는 모델, 즉 텍스트만으로 합성 음성(synthetic speech)을 생성하는 모델에서 나온 것입니다. DALL-E나 Midjourney처럼 텍스트 설명을 입력받아 이미지를 생성하며 2022년에 세상을 놀라게 했던 모든 도구들은 Transformer를 기반으로 합니다.
비록 제가 'pi creature'가 무엇인지 정확히 이해시키지는 못하더라도, 이런 종류의 일이 원격적으로라도 가능하다는 사실 자체에 여전히 압도당합니다. 그리고 2017년 Google에 의해 처음 소개된 오리지널 Transformer는 한 언어의 텍스트를 다른 언어로 번역하는 특정 사용 사례를 위해 발명되었습니다. 하지만 여러분과 제가 집중할 변형 모델(variant), 즉 ChatGPT와 같은 도구들의 근간이 되는 유형은 텍스트 조각을 입력받고(어쩌면 주변의 이미지나 소리가 동반될 수도 있음), 해당 구절에서 다음에 올 내용이 무엇인지에 대한 예측을 생성하도록 훈련된 모델이 될 것입니다.
그러한 예측은 다음에 올 수 있는 수많은 서로 다른 텍스트 청크 (chunks)들에 대한 확률 분포 (probability distribution)의 형태를 취합니다. 얼핏 보면, 다음 단어를 예측하는 것이 새로운 텍스트를 생성하는 것과는 매우 다른 목표처럼 느껴질 수도 있습니다. 하지만 일단 이러한 예측 모델을 갖추게 되면, 모델이 더 긴 텍스트를 생성하도록 만들기 위해 시도해 볼 수 있는 간단한 방법이 있습니다. 바로 모델에게 작업할 초기 스니펫 (snippet)을 제공하고, 모델이 방금 생성한 분포에서 무작위 샘플 (random sample)을 추출하게 한 뒤, 그 샘플을 기존 텍스트에 추가하고, 방금 추가된 내용을 포함한 모든 새로운 텍스트를 바탕으로 다시 새로운 예측을 수행하도록 전체 과정을 반복하는 것입니다.
여러분의 생각은 어떨지 모르겠지만, 저는 이것이 실제로 작동할 것 같다는 느낌이 전혀 들지 않았습니다. 예를 들어, 이 애니메이션에서 저는 제 노트북에서 GPT-2를 실행하며 시드 텍스트 (seed text)를 기반으로 이야기를 생성하기 위해 다음 텍스트 청크를 반복적으로 예측하고 샘플링하도록 하고 있습니다. 이 이야기는 실제로 그다지 말이 되지 않습니다. 하지만 만약 이를 기본 모델은 동일하지만 규모만 훨씬 더 큰 GPT-3의 API 호출로 바꾼다면, 갑자기 마법처럼 말이 되는 이야기가 만들어집니다. 심지어 파이 (pi) 생명체가 수학과 계산의 땅에 살 것이라고 추론하는 것처럼 보이는 이야기까지 말이죠.
여기서 보여준 반복적인 예측과 샘플링 과정은 본질적으로 여러분이 ChatGPT나 다른 거대 언어 모델 (LLM)들과 상호작용하며 모델이 한 번에 한 단어씩 생성하는 것을 볼 때 실제로 일어나고 있는 일입니다. 사실, 제가 매우 즐거워할 만한 기능 중 하나는 모델이 선택하는 각 새로운 단어에 대한 기저의 분포 (underlying distribution)를 볼 수 있는 능력입니다. 이제 데이터가 트랜스포머 (transformer)를 통해 어떻게 흐르는지에 대해 매우 높은 수준의 개요를 살펴보며 시작해 보겠습니다. 각 단계의 동기 부여, 해석 및 세부 사항을 확장하는 데 훨씬 더 많은 시간을 할애하겠지만, 대략적으로 살펴보면 이러한 챗봇 중 하나가 특정 단어를 생성할 때 내부적으로(under the hood) 다음과 같은 일이 일어나고 있습니다.
먼저, 입력값은 여러 개의 작은 조각들로 나뉩니다. 이러한 조각들을 토큰 (tokens)이라고 부르며, 텍스트의 경우 단어이거나 단어의 작은 조각, 또는 기타 흔한 문자 조합인 경우가 많습니다. 만약 이미지나 소리가 포함된다면, 토큰은 해당 이미지의 작은 패치 (patches)나 소리의 작은 덩어리 (chunks)가 될 수 있습니다. 그런 다음 각 토큰은 벡터 (vector), 즉 해당 조각의 의미를 어떤 방식으로든 인코딩 (encode)하기 위한 숫자 리스트와 연관됩니다. 만약 이 벡터들을 매우 높은 차원의 공간에서의 좌표를 제공하는 것으로 생각한다면, 유사한 의미를 가진 단어들은 그 공간에서 서로 가까운 벡터에 위치하는 경향이 있습니다.
이러한 벡터의 시퀀스 (sequence)는 어텐션 블록 (attention block)이라고 알려진 연산을 통과하며, 이를 통해 벡터들이 서로 대화하고 정보를 주고받으며 자신의 값을 업데이트할 수 있게 됩니다. 예를 들어, "머신러닝 모델 (machine learning model)"이라는 문구에서 'model'이라는 단어의 의미는 "패션 모델 (fashion model)"이라는 문구에서의 의미와 다릅니다. 어텐션 블록은 문맥 속에서 어떤 단어가 다른 어떤 단어의 의미를 업데이트하는 데 관련이 있는지, 그리고 그 의미들이 정확히 어떻게 업데이트되어야 하는지를 파악하는 역할을 담당합니다.
다시 한번 말씀드리지만, 제가 '의미'라는 단어를 사용할 때마다, 이는 어떤 방식으로든 해당 벡터들의 항목 (entries) 안에 완전히 인코딩되어 있습니다. 그 후, 이 벡터들은 다른 종류의 연산을 통과하는데, 여러분이 읽고 있는 출처에 따라 이를 다층 퍼셉트론 (multi-layer perceptron) 또는 피드포워드 레이어 (feed-forward layer)라고 부를 것입니다. 여기서 벡터들은 서로 대화하지 않으며, 모두 병렬적으로 동일한 연산을 거칩니다. 이 블록은 해석하기가 조금 더 어렵지만, 나중에 이 단계가 각 벡터에 대해 긴 질문 목록을 던진 다음 그 질문들에 대한 답변을 바탕으로 벡터를 업데이트하는 것과 다소 유사하다는 점에 대해 이야기하겠습니다.
이 두 블록(block)의 모든 연산은 거대한 행렬 곱셈 (matrix multiplications)의 더미처럼 보이며, 우리의 주요 과제는 그 기저에 있는 행렬들을 읽는 법을 이해하는 것입니다. 중간에 발생하는 일부 정규화 (normalization) 단계에 대한 세부 사항은 대략적으로 넘어가겠지만, 결국 이것은 하이레벨 (high-level) 프리뷰니까요. 그 이후에는 프로세스가 본질적으로 반복됩니다. 어텐션 (attention) 블록과 다층 퍼셉트론 (multi-layer perceptron) 블록 사이를 왔다 갔다 하며, 마지막 단계에 이르렀을 때 문구의 모든 핵심적인 의미가 시퀀스 (sequence)의 맨 마지막 벡터에 어떻게든 구워져(baked) 들어가기를 기대하는 것입니다.
그런 다음 우리는 그 마지막 벡터에 특정 연산을 수행하여, 다음에 올 수 있는 모든 가능한 토큰 (tokens), 즉 다음에 올 수 있는 모든 작은 텍스트 조각들에 대한 확률 분포 (probability distribution)를 생성합니다. 앞서 말씀드렸듯이, 텍스트 조각이 주어졌을 때 다음에 올 내용을 예측하는 도구를 갖게 되면, 약간의 시드 텍스트 (seed text)를 입력하고 이 도구가 분포에서 샘플링 (sampling)하여 내용을 추가하고 이를 반복하는 '다음에 무엇이 올지 예측하는 게임'을 계속해서 수행하도록 할 수 있습니다. 지식이 있는 분들이라면 ChatGPT가 등장하기 훨씬 전, GPT-3의 초기 데모가 어떤 모습이었는지 기억하실지도 모르겠습니다. 초기 데모에서는 초기 조각을 바탕으로 이야기나 에세이를 자동 완성하게 만들곤 했습니다.
이러한 도구를 챗봇 (chatbot)으로 만들기 위한 가장 쉬운 시작점은, 사용자가 도움이 되는 AI 어시스턴트와 상호작용하는 설정을 구축하는 약간의 텍스트, 즉 여러분이 시스템 프롬프트 (system prompt)라고 부르는 것을 갖추는 것입니다. 그런 다음 사용자의 초기 질문이나 프롬프트를 첫 번째 대화로 사용하고, 그러면 모델이 그러한 도움이 되는 AI 어시스턴트라면 응답으로 무엇을 말할지 예측하기 시작하게 합니다. 이것이 잘 작동하게 만들기 위해 필요한 추가적인 훈련 (training) 단계에 대해서는 더 할 말이 있지만, 하이레벨 (high-level) 관점에서의 핵심 아이디어는 이것입니다.
이 장에서 당신과 저는 네트워크의 맨 처음과 맨 끝에서 어떤 일이 일어나는지에 대한 세부 사항을 확장하여 살펴볼 것입니다. 또한, Transformer가 등장했을 무렵의 머신러닝 엔지니어(machine learning engineer)라면 누구나 제2의 천성처럼 익숙했을 몇 가지 중요한 배경 지식들을 검토하는 데 많은 시간을 할애하고 싶습니다. 만약 당신이 이러한 배경 지식에 익숙하고 조금 성급한 편이라면, Transformer의 핵심으로 간주되는 어텐션 블록 (attention blocks)에 집중할 다음 장으로 바로 넘어가셔도 좋습니다.
그 이후에는 이러한 다층 퍼셉트론 (multi-layer perceptron) 블록, 훈련 (training)이 작동하는 방식, 그리고 그 시점까지 생략되었던 여러 가지 세부 사항에 대해 더 자세히 이야기하고 싶습니다. 더 넓은 맥락을 말씀드리자면, 이 영상들은 딥러닝 (deep learning)에 관한 미니 시리즈의 추가 영상들입니다. 이전 영상들을 보지 않으셨더라도 순서에 상관없이 시청하실 수 있지만, Transformer를 구체적으로 파고들기 전에 딥러닝의 기본 전제와 구조에 대해 우리가 같은 이해를 하고 있는지 확인하는 과정은 가치가 있다고 생각합니다.
당연한 이야기를 하는 위험을 무릅쓰고 말씀드리자면, 이것은 머신러닝 (Machine Learning)의 한 가지 접근 방식입니다. 머신러닝은 데이터를 사용하여 모델이 어떻게 작동할지를 어떤 방식으로든 결정하는 모든 모델을 설명합니다. 제 말은, 예를 들어 이미지를 입력받아 그것을 설명하는 레이블 (Label)을 생성하는 함수를 원하거나, 혹은 텍스트 구절이 주어졌을 때 다음 단어를 예측하는 우리의 예시, 또는 직관과 패턴 인식 (Pattern Recognition)의 요소가 필요한 다른 어떤 작업이라도 마찬가지입니다. 요즘 우리는 이를 거의 당연하게 받아들이지만, 머신러닝의 핵심 아이디어는 AI의 초기 시절 사람들이 했던 것처럼 코드로 해당 작업을 수행하는 절차를 명시적으로 정의하려고 노력하는 대신, 조절 가능한 파라미터 (Parameters) — 마치 수많은 노브(knobs)와 다이얼(dials) 같은 것들 — 를 가진 매우 유연한 구조를 설정하는 것입니다. 그런 다음, 주어진 입력에 대해 출력값이 어떤 모습이어야 하는지에 대한 수많은 예시를 사용하여, 이러한 동작을 모방할 수 있도록 해당 파라미터들의 값을 미세하게 조정하고 튜닝 (Tuning) 합니다.
예를 들어, 머신러닝의 가장 단순한 형태는 선형 회귀 (Linear Regression)일 수 있습니다. 여기서 입력과 출력은 각각 단일 숫자이며, 예를 들어 집의 면적과 그 가격 같은 것입니다. 여러분이 원하는 것은 미래의 집값을 예측하기 위해 이 데이터들을 관통하는 최적의 적합선 (Line of best fit)을 찾는 것입니다. 그 선은 두 개의 연속적인 파라미터, 예를 들어 기울기 (Slope)와 y-절편 (y-intercept)에 의해 설명되며, 선형 회귀의 목표는 데이터와 밀접하게 일치하도록 이 파라미터들을 결정하는 것입니다. 말할 필요도 없이, 딥러닝 (Deep Learning) 모델은 이보다 훨씬 더 복잡해집니다.
예를 들어, GPT-3는 2개가 아니라 1750억 개의 파라미터 (parameters)를 가지고 있습니다. 하지만 여기서 중요한 점은, 훈련 데이터에 심각하게 과적합 (overfitting)되거나 훈련 자체가 완전히 불가능해지지 않으면서 엄청난 수의 파라미터를 가진 거대 모델을 만들 수 있다는 것이 당연한 결과는 아니라는 점입니다. 딥러닝 (Deep Learning)은 지난 수십 년 동안 놀라울 정도로 잘 확장 (scale)된다는 것이 증명된 모델 군을 설명합니다. 이들을 하나로 묶어주는 공통점은 모두 동일한 훈련 알고리즘을 사용한다는 것인데, 이는 역전파 (backpropagation)라고 불리며 이전 장들에서 이미 다루었습니다. 그리고 우리가 앞으로 나아감에 있어 여러분이 인지해야 할 맥락은, 이 훈련 알고리즘이 대규모 (scale)에서 잘 작동하기 위해서는 이 모델들이 특정한 특정 형식을 따라야 한다는 것입니다.
그리고 시작하기 전에 이 형식을 알고 있다면, 자칫 임의적인 것처럼 느껴질 수 있는 트랜스포머 (transformer)가 언어를 처리하는 방식에 대한 많은 선택 사항을 설명하는 데 도움이 됩니다. 우선, 여러분이 어떤 종류의 모델을 만들든 입력값은 실수 (real numbers)의 배열 (array)로 형식화되어야 합니다. 이는 단순히 숫자의 리스트일 수도 있고, 2차원 배열 (two-dimensional array)일 수도 있으며, 매우 빈번하게는 더 높은 차원의 배열을 다루게 되는데, 이때 사용되는 일반적인 용어는 텐서 (tensor)입니다. 여러분은 종종 그 입력 데이터가 점진적으로 많은 별개의 층 (layers)으로 변환된다고 생각하게 되는데, 여기서 다시 말씀드리자면 각 층은 항상 어떤 종류의 실수 배열 (array of real numbers)로 구조화되어 있으며, 최종적으로 출력 (output)이라고 간주하는 마지막 층에 도달하게 됩니다.
예를 들어, 우리의 텍스트 처리 모델 (text processing model)에서 마지막 층 (final layer)은 가능한 모든 다음 토큰 (next tokens)에 대한 확률 분포 (probability distribution)를 나타내는 숫자들의 리스트입니다. 딥러닝 (deep learning)에서 이러한 모델 파라미터 (model parameters)는 거의 항상 가중치 (weights)라고 불리는데, 그 이유는 이러한 모델들의 핵심적인 특징이 파라미터가 처리 중인 데이터와 상호작용하는 유일한 방법이 가중합 (weighted sums)을 통해서라는 점 때문입니다. 또한 모델 곳곳에 몇몇 비선형 함수 (non-linear functions)를 뿌려주기도 하지만, 이들은 파라미터에 의존하지 않습니다. 하지만 일반적으로는 가중합을 이처럼 아무런 장치 없이 명시적으로 나열하는 대신, 행렬-벡터 곱 (matrix vector product)의 다양한 구성 요소로 묶여 있는 형태를 보게 될 것입니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 YouTube 3Blue1Brown (수학/ML)의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기