Post

퍼셉트론과 선형분리, 그리고 신경망이 LLM 구조로 이어지는 흐름

퍼셉트론과 선형분리, 그리고 신경망이 LLM 구조로 이어지는 흐름

참고자료


배경

생성형 AI 서비스 개발 실무 교육 1일차 자료가 퍼셉트론에서 시작했다. AND, OR, NAND, NOR 게이트를 퍼셉트론으로 구현하는 예제였는데, XOR 게이트 칸만 가중치와 임계값이 물음표로 남아 있었다.

여기서 막혔다. 게이트 넷 다 0과 1만 출력하는 건 똑같은데 왜 XOR만 안 되는지 감이 안 왔고, “퍼셉트론이 곧 신경망의 최소 단위”라는 말도 처음엔 이해가 안 갔다. 뒤로 가면서 LLM까지 이어 보려니 토크나이징과 임베딩, Transformer 쪽에서도 막히는 지점이 여럿 나왔다.

질문이 나온 순서와 상관없이, 이해에 필요한 순서대로 정리했다.

  • 퍼셉트론이 뭔데, AND 게이트 같은 논리 회로와는 뭐가 다른가
  • 퍼셉트론 하나가 신경망이라는 말은 무슨 뜻인가
  • AND, OR, NAND는 되는데 XOR만 안 되는 이유가 뭔가
  • XOR은 그럼 어떻게 만드는가
  • 이 신경망이 왜 LLM으로 이어지는가
  • 텍스트는 신경망에 어떻게 들어가는가
  • 토큰 ID도 숫자고 임베딩도 숫자인데, 왜 굳이 숫자를 또 숫자로 바꾸는가
  • 그 벡터를 신경망이 어떻게 다루는가
  • 인코더와 디코더를 어떻게 쓰느냐로 모델이 왜 갈리는가
  • 다음 단어 예측만으로 번역까지 되는 이유가 뭔가

큰 그림

먼저 전체 지도를 펴놓는다. 텍스트 한 문장이 신경망을 통과해 다시 텍스트로 나오기까지, 실제로 거치는 칸을 전부 그린다.

flowchart TB
    subgraph S0["1~2절: 신경망"]
        N["뉴런<br/>가중합으로 켜짐/꺼짐을 정한다"]
        NN["신경망<br/>뉴런을 층으로 쌓는다"]
        N --> NN
    end

    subgraph S1["6절: 토크나이저"]
        TXT["텍스트"]
        TID["토큰 ID<br/>신경망 아님, 사전 찾아보기"]
        TXT -- "encode()" --> TID
    end

    subgraph S2["7절: 임베딩"]
        VEC["임베딩 벡터<br/>실제 의미를 담은 좌표"]
    end

    subgraph S3["8절: Transformer"]
        ENC["인코더<br/>전체를 한 번에 봄"]
        DEC["디코더<br/>한 단어씩 순서대로"]
    end

    subgraph S4["9절: BERT / GPT"]
        BERT["BERT<br/>인코더만, 빈칸 채우기"]
        GPT["GPT<br/>디코더만, 다음 단어 예측"]
    end

    subgraph S5["10절: 디코딩"]
        NEXT["다음 토큰 ID"]
        OUT["생성된 텍스트"]
        NEXT -- "decode()" --> OUT
    end

    NN -.-> TXT
    TID --> VEC
    VEC --> ENC
    VEC --> DEC
    ENC --> BERT
    DEC --> GPT
    GPT --> NEXT

뉴런 하나(퍼셉트론)가 왜 혼자서는 부족한지가 1~2절이다. 6절에서 텍스트를 토큰 ID로, 7절에서 그 ID를 임베딩 벡터로 바꾸고 나서야 8절의 Transformer(진짜 신경망)에 들어간다. 인코더만 쓰면 9절의 BERT, 디코더만 쓰면 GPT가 되고, GPT가 뱉은 다음 토큰은 10절에서 다시 텍스트로 돌아온다. 토크나이저의 encode()/decode()(6절, 10절 칸)와 Transformer의 인코더/디코더(8절 칸)를 지도 위 서로 다른 칸에 그려둔 건, 둘이 이름만 같지 완전히 다른 자리에 있다는 걸 보이기 위해서다.

3~5절은 이 지도 위에 별도 칸으로 없다. 왜 층을 쌓아야 하는지(3~4절)와 신경망이 왜 LLM으로 이어지는지(5절)를 설명하는 절이라, 칸과 칸 사이를 메우는 절이지 파이프라인의 칸 자체는 아니기 때문이다. 아래 절은 이 지도를 순서대로 채운다.


1. 퍼셉트론이란?

퍼셉트론은 입력 여러 개를 받아 가중치를 곱해 더하고, 그 합이 임계값을 넘는지로 0 또는 1을 내보내는 함수다.

\[y = \begin{cases} 0 & (w_1x_1 + w_2x_2 \le \theta) \\ 1 & (w_1x_1 + w_2x_2 > \theta) \end{cases}\]
  • $x_1, x_2$: 입력
  • $w_1, w_2$: 가중치, 입력마다 얼마나 중요한지
  • $\theta$: 임계값, 이 값을 넘어야 켜진다

코드로 옮기면 이렇다.

1
2
3
4
5
6
7
8
9
class Perceptron:
    def __init__(self, w1, w2, theta):
        self.w1 = w1
        self.w2 = w2
        self.theta = theta

    def run(self, x1, x2):
        tmp = x1 * self.w1 + x2 * self.w2
        return 1 if tmp > self.theta else 0

AND, OR, NAND는 이 구조 하나에 숫자만 바꿔서 만든다. AND 게이트를 예로 들면, 네 가지 입력 조합이 각각 만족해야 하는 부등식을 세우고 그걸 동시에 만족하는 $w_1, w_2, \theta$를 하나 찾으면 된다.

$x_1$$x_2$$y$조건
000$0 \le \theta$
010$w_2 \le \theta$
100$w_1 \le \theta$
111$w_1 + w_2 > \theta$

$w_1 = w_2 = 0.5$, $\theta = 0.7$이면 네 조건이 전부 성립한다. OR는 $\theta$를 낮추면 되고, NAND는 부호를 전부 뒤집으면 된다.

이 규칙을 왜 if-else로 하드코딩하지 않고 굳이 가중치와 임계값이라는 숫자로 표현하는가. if-else로 짜면 조건이 하나 바뀔 때마다 사람이 코드를 다시 써야 한다. 퍼셉트론은 $w_1, w_2, \theta$ 숫자 세 개만 조절하면 되는 형태라서, 이 숫자를 사람이 손으로 정하지 않고 데이터로부터 찾아내는 학습이 가능해진다. AND 게이트와 퍼셉트론의 차이가 여기서 드러난다. 게이트는 회로로 동작이 고정돼 있고, 퍼셉트론은 숫자 세 개로 AND도 OR도 NAND도 될 수 있는 조절 가능한 함수다.


2. 신경망이란?

1절의 퍼셉트론 하나는 신경망이 아니라 신경망을 이루는 뉴런 하나다. 그 뉴런을 여러 개, 여러 층으로 엮은 것을 신경망이라 부른다.

실제 뉴런에는 두 가지가 더 붙는다.

편향(bias). 임계값 $\theta$를 좌변으로 이항하면 $w_1x_1 + w_2x_2 + b > 0$ 형태가 된다. $b$가 편향이고, 얼마나 쉽게 켜지는가를 조절하는 역할을 한다.

활성화 함수(activation function). 가중합 이후에 씌우는 함수다. 원래 퍼셉트론이 쓰는 계단 함수(step)를 왜 그대로 안 쓰는가. 계단 함수는 0 아니면 1만 나오고 기울기가 없어서, 오차를 거꾸로 흘려보내 가중치를 조금씩 고치는 경사하강법을 적용할 수 없다. 그래서 기울기가 있는 함수로 바꾼다. 시그모이드(sigmoid)는 입력이 아무리 작거나 커도 출력을 0과 1 사이로 완만한 S자 곡선을 그리며 눌러 담는 함수고, ReLU는 입력이 0보다 작으면 0을, 0보다 크면 입력을 그대로 내보내는 더 단순한 함수다. 그 결과로 뉴런의 출력을 미분할 수 있게 되고, 이게 신경망을 자동으로 학습시킬 수 있는 전제가 된다.

\[a = w_1x_1 + w_2x_2 + b, \quad y = h(a)\]

이 뉴런을 층으로 쌓으면 신경망이 된다. 층은 역할에 따라 세 가지로 나뉜다.

  • 입력층(input layer): 원본 데이터가 그대로 들어오는 층. 계산은 하지 않고 값을 다음 층으로 넘기기만 한다.
  • 은닉층(hidden layer): 입력층과 출력층 사이에 있는 층. 가중합과 활성화 함수를 거쳐 입력을 조합하고 변형하는 실질적인 계산이 여기서 일어난다. 은닉층이 하나면 얕은 신경망, 여러 개면 심층 신경망(deep neural network)이라 부르고, 딥러닝의 “딥”이 이 은닉층 개수를 가리킨다.
  • 출력층(output layer): 최종 결과를 내보내는 층. 몇 개의 범주로 분류하느냐, 숫자를 예측하느냐에 따라 뉴런 개수와 활성화 함수가 달라진다.

아래 그림에서 왼쪽이 입력층, 가운데가 은닉층, 오른쪽이 출력층이다. 뒤에서 다룰 XOR 예시로 보면, NAND와 OR을 계산하는 부분이 은닉층이고 그 결과를 AND로 합치는 부분이 출력층에 해당한다.

flowchart LR
    subgraph Input["입력층"]
        i1((" "))
        i2((" "))
    end
    subgraph Hidden["은닉층"]
        h1((" "))
        h2((" "))
        h3((" "))
    end
    subgraph Output["출력층"]
        o1((" "))
        o2((" "))
    end
    i1 --> h1 & h2 & h3
    i2 --> h1 & h2 & h3
    h1 --> o1 & o2
    h2 --> o1 & o2
    h3 --> o1 & o2

지금 다루는 GPT 같은 거대 LLM도 뜯어보면 이 가중합 계산을 하는 뉴런이 수천억 개 쌓여 있는 구조다. “70B 모델”이라는 말은 저 $w$ 값, 즉 파라미터가 700억 개 있다는 뜻이다. 복잡해 보이는 모델도 재료 자체는 1절의 퍼셉트론과 다르지 않고, 개수와 층수가 다를 뿐이다.


3. 선형분리란?

넷 다 0과 1만 출력하는 건 같다. 차이는 입력 네 점 중에서 1인 점과 0인 점을 직선 하나로 갈라놓을 수 있는가에 있다.

$x_1, x_2$를 사각형 네 꼭짓점이라고 하고, 출력값을 점 옆에 적어보면 이렇게 된다.

 $x_1=0$$x_1=1$
$x_2=1$AND 0 / OR 1 / NAND 1 / XOR 1AND 1 / OR 1 / NAND 0 / XOR 0
$x_2=0$AND 0 / OR 0 / NAND 1 / XOR 0AND 0 / OR 1 / NAND 1 / XOR 1

AND는 1인 점이 $(1,1)$ 하나뿐이라 그 구석만 잘라내는 직선 하나로 나머지 셋과 갈라진다. OR는 0인 점이 $(0,0)$ 하나뿐이라 마찬가지고, NAND는 AND와 경계선이 같고 어느 쪽을 1로 보는가만 반대다. 셋 다 1인 점들이 한쪽에 뭉쳐 있다.

XOR은 1인 점 $(0,1), (1,0)$과 0인 점 $(0,0), (1,1)$이 서로 대각선으로 마주보고 있다. 두 대각선은 사각형 한가운데서 교차하는데, 그 교차점을 사이에 두고 한쪽 대각선의 두 점만 같은 편에 놓는 직선은 그릴 수 없다. 이 성질을 선형 분리 가능성(linear separability)이라 부르고, XOR은 선형 분리가 안 되는 첫 사례다.

가중합을 아무리 조절해도 직선 하나로 표현되는 경계밖에 못 그리기 때문에, 단일 퍼셉트론으로는 XOR에 대응하는 $w_1, w_2, \theta$가 존재하지 않는다. 실제로 네 조건을 부등식으로 세워보면 서로 모순이 나서 해가 없다.

이 문제를 사람이 직접 특징을 조합해서 풀 수도 있다. 예를 들어 “$x_1$과 $x_2$가 다르면 1”이라는 특징을 미리 계산해서 넣어주면 퍼셉트론 하나로도 된다. 문제는 이런 조합을 매번 사람이 손으로 설계해야 한다는 것이고, 다음 절에서 보는 다층 구조는 그 설계를 신경망이 알아서 학습하게 만든다.


4. 다층 퍼셉트론이란?

직선 하나로 안 되면 퍼셉트론을 층으로 쌓아서 우회한다. NAND와 OR을 먼저 통과시켜 각각 다른 경계선을 그은 다음, 그 결과 두 개를 AND로 다시 합친다.

\[s_1 = \text{NAND}(x_1, x_2), \quad s_2 = \text{OR}(x_1, x_2), \quad y = \text{AND}(s_1, s_2)\]
flowchart LR
    x1((x1)) --> NAND
    x2((x2)) --> NAND
    x1 --> OR
    x2 --> OR
    NAND -- s1 --> AND
    OR -- s2 --> AND
    AND --> y((y))
$x_1$$x_2$$s_1$(NAND)$s_2$(OR)$y$(AND)
00100
01111
10111
11010

XOR 진리표와 정확히 일치한다. 은닉층 하나(NAND, OR)를 거쳐 출력층(AND)에서 합치는 이 구조가 다층 퍼셉트론(MLP)이고, 3절에서 말한 “사람이 손으로 특징을 설계하는” 일을 층 하나를 늘리는 것으로 대신했다. 1969년 민스키와 페퍼트가 단일 퍼셉트론의 XOR 한계를 증명하면서 신경망 연구에 대한 기대와 투자가 크게 꺾인 1차 AI 겨울이 왔고, 1986년 오차 역전파(backpropagation, 출력에서 생긴 오차를 뒤에서 앞으로 층마다 전달하며 각 뉴런의 가중치를 조금씩 고치는 방법)로 다층 구조의 학습이 가능해지면서 이 접근이 다시 주목받았다.


5. LLM이란?

AI, ML, DL, LLM은 포함 관계로 정리된다.

flowchart TB
    AI["Artificial Intelligence<br/>사람처럼 보이는 시스템"] --> ML["Machine Learning<br/>데이터로부터 규칙을 학습"]
    ML --> DL["Deep Learning<br/>은닉층이 여러 개인 신경망"]
    DL --> LLM["Large Language Model<br/>텍스트를 파싱하고 생성하는 대규모 신경망"]

GenAI는 이 신경망으로 텍스트, 이미지 등 새 콘텐츠를 만들어내는 활용 범주이고, LLM은 그중 텍스트를 다루는 신경망이다. 2절의 신경망이 결국 GPT 계열 LLM의 몸통이라는 뜻이다. 다만 신경망은 숫자만 계산할 수 있는데 텍스트는 문자다. 그 틈을 메우는 게 다음 절부터 나오는 토크나이징과 임베딩이다.


6. 토크나이징이란?

텍스트를 잘게 쪼개서 다루는 발상 자체는 새롭지 않다. Lucene 같은 검색엔진도 Analyzer로 문서를 단어(Term) 단위로 쪼개고, 그 Term을 키로 삼아 어느 문서에 들어있는지 찾는 역 인덱스(inverted index)를 만든다. LLM의 토크나이징도 텍스트를 쪼갠다는 점은 같지만 쪼갠 결과를 쓰는 목적이 다르다. 역 인덱스는 쪼갠 단어를 “이 단어가 들어있는 문서 목록”을 찾는 조회표의 키로 쓰고, LLM은 쪼갠 조각(토큰)을 신경망이 계산할 수 있는 숫자로 바꾸는 최소 단위로 쓴다.

이 변환은 텍스트를 토큰 단위로 쪼개고 정수 ID로 바꾸는 것으로 시작한다. 코드로는 tokenizer.encode(text)가 이 변환을 맡고, 반대로 토큰 ID를 다시 글자로 되돌리는 것은 tokenizer.decode(ids)가 맡는다. 둘 다 사전을 찾아보는 것뿐이라 이 단계에는 신경망이 전혀 관여하지 않는다.

단어 전체를 통째로 사전에 담는 방식도 있지만, 그러면 사전에 없는 단어가 나올 때마다 처리할 방법이 없다. BPE(Byte Pair Encoding, 자주 붙어 나오는 글자 쌍을 반복해서 하나의 토큰으로 합쳐나가는 방식)는 사전에 없는 단어를 더 작은 하위 단어나 개별 문자로 쪼개서 처리하기 때문에, 미등록 단어를 위한 별도 토큰이 따로 필요 없다.

여기까지는 텍스트를 번호로 바꾼 것뿐이다. 이 번호를 신경망이 실제로 계산에 쓸 수 있는 값으로 다시 바꾸는 이유는 다음 절에서 본다.


7. 임베딩이란?

둘 다 숫자라서 하나로 충분해 보이지만, 이름표와 성적표만큼 다른 물건이다.

반에서 출석번호를 매긴다고 하면, 1번, 2번, 3번은 그냥 순서대로 붙인 이름표다. 1번이 2번보다 공부를 잘한다거나 키가 크다는 뜻은 전혀 없다. 반면 그 학생의 실제 성적이나 키는 다르다. 82점이 75점보다 실제로 더 잘 본 거고, 숫자끼리 비교하고 더하고 빼는 게 의미가 있다.

토큰 ID는 출석번호 쪽이다. 사전에서 몇 번째 단어냐를 나타내는 색인일 뿐이라서 크기 비교가 의미 없다. “fox”가 2번이고 “dog”가 1번이라고 fox가 dog의 2배인 무언가는 아니고, 사전을 다른 순서로 다시 매기면 번호는 통째로 바뀌지만 단어 뜻은 그대로다.

반면 1절의 가중합 계산 $w_1x_1 + w_2x_2 + \dots$ 은 크기와 방향이 실제로 의미 있는 값을 요구한다. 토큰 ID를 그대로 이 자리에 넣으면 신경망은 사전 순서가 우연히 만든 숫자에 없는 의미를 억지로 읽어낸다. 그래서 이 이름표를 실제 의미를 담은 성적표, 즉 임베딩 벡터로 바꿔치는 과정이 필요하다.

이 변환은 복잡한 계산이 아니라 표 조회에 가깝다. 임베딩 층은 단어마다 실수 벡터를 한 줄씩 적어놓은 표(가중치 행렬)이고, 토큰 ID는 몇 번째 줄을 볼지 가리키는 인덱스다. ID 2번(fox)이 들어오면 표의 2번 행을 그대로 꺼내 쓴다. 이 표도 2절에서 말한 파라미터의 일부라서, 학습하면서 의미가 비슷한 단어끼리 행이 가까워지도록 값이 조금씩 바뀐다.

 토큰 ID임베딩 벡터
정체사전 색인 번호실제 의미를 담은 좌표
크기 비교의미 없음의미 있음(가까우면 비슷한 뜻)
계산에 쓸 수 있나못 쓴다쓴다
정해지는 방식사전 순서로 그냥 매김학습으로 값이 조정됨

숫자를 두 번 만드는 게 아니라, 찾기 위한 이름표와 계산하기 위한 값이 원래 다른 물건이었던 것뿐이다.


8. Transformer란?

예전에는 RNN(Recurrent Neural Network, 순환 신경망)을 썼다. 문장을 한 단어씩 순서대로 읽으면서 직전까지 읽은 내용을 다음 계산으로 계속 넘기는 구조다. 순서대로 읽어야 해서 병렬 계산이 어렵고, 문장이 길어지면 앞쪽 단어의 정보가 뒤로 갈수록 희미해지는 문제가 있었다.

Transformer는 2017년에 나온 신경망 구조로, 문장을 순서대로 읽는 대신 텍스트 전체를 한 번에 보고 각 단어가 서로 얼마나 관련 있는지를 계산한다. 이 계산 방식을 어텐션(attention)이라 부른다. 그 안에서 인코더(encoder)는 입력 텍스트 전체를 보고 문맥을 담은 벡터를 만드는 부분이고, 디코더(decoder)는 그 벡터를 받아 한 단어씩 순서대로 출력을 만드는 부분이다.

여기서 나오는 인코더와 디코더는 6절에서 본 tokenizer.encode() / tokenizer.decode()와 이름만 같은 별개의 것이다. 토크나이저의 encode/decode는 텍스트와 토큰 ID 사이를 오가는 사전 찾아보기라 신경망이 관여하지 않는다. 반면 여기 인코더와 디코더는 7절에서 만든 임베딩 벡터를 받아 어텐션과 가중합 같은 실제 계산을 하는 신경망 절반이다. 이름이 겹치는 것은 우연이고, 파이프라인에서 완전히 다른 자리에 있다. 순서로 보면 텍스트가 토크나이저의 encode를 거쳐 토큰 ID가 되고, 그 ID가 임베딩 벡터로 바뀐 다음에야 Transformer의 인코더와 디코더로 들어간다.


9. BERT와 GPT란?

BERT(Bidirectional Encoder Representations from Transformers)는 인코더만 써서 문장 중간에 가려진 단어를 맞히도록 학습한다. 앞뒤 문맥을 양쪽에서 다 보고 판단해야 하는 텍스트 분류, 감성 예측에 적합하다. GPT(Generative Pre-trained Transformer)는 디코더만 써서 다음 단어를 예측하도록 학습한다. 앞쪽 내용만 보고 이어질 말을 만들면 되는 텍스트 생성에 적합하다.


10. 창발적 행동이란?

GPT는 번역을 위해 설계된 모델이 아니라 다음 단어 예측만 훈련받은 모델인데, 그 훈련만으로 번역, 요약 같은 능력이 명시적 지시 없이 나타난다. 이걸 창발적 행동(emergent behavior)이라 부른다. 학습 목표를 다음 단어 예측 하나로 단순화한 덕분에, 작업마다 별도 모델을 만들지 않아도 데이터와 파라미터 규모를 키우는 것만으로 여러 작업에 대응하는 능력이 따라왔다.


덧붙여, 실습에서 쓰는 도구들

1일차 후반부는 개념보다 실습 환경 소개였다. 질문으로 던지진 않았지만 세션 내용이라 짧게 남긴다.

  • Hugging Face: 모델과 데이터셋을 올려두는 허브. 직접 학습시키지 않아도 API나 로컬에서 바로 추론을 돌려볼 수 있다.
  • OpenAI, Google GenAI: 각 사가 제공하는 LLM API. SDK 설치 후 몇 줄로 채팅, 임베딩, 이미지 생성을 호출한다.
  • LangChain: LLM 기반 애플리케이션을 조립하는 프레임워크. Chat Model(모델 호출 인터페이스), Message(역할별 대화 메시지), Prompt Template(재사용 가능한 프롬프트), Structured Output(정해진 JSON 형태로 응답 강제), LCEL(prompt | model | parser처럼 컴포넌트를 파이프로 연결하는 선언형 표현식), Tool Calling(모델이 외부 API나 함수를 스스로 판단해서 호출)이 기본 컴포넌트다.

LLM 혼자서는 실시간 데이터에 접근하지 못하고, 수학 계산에 약하고, 환각(hallucination, 사실이 아닌 내용을 그럴듯하게 지어내는 현상)이 나기 때문에, Tool Calling으로 외부 도구와 묶어 쓰는 것이 실무 구성의 기본 전제였다. 위 큰 그림 지도에는 없지만, GPT 다음에 자연스럽게 붙는 조각이다.


정리하며

처음 던진 질문들에 대한 답이다.

퍼셉트론이 뭔데 AND 게이트와 뭐가 다른가. 게이트는 회로로 동작이 고정돼 있고, 퍼셉트론은 가중치와 임계값 세 숫자로 AND도 OR도 NAND도 될 수 있는 조절 가능한 함수다.

퍼셉트론 하나가 신경망이라는 말이 무슨 뜻인가. 정확히는 신경망의 최소 단위인 뉴런 하나다. 이 단위에 편향과 활성화 함수를 더하고 여러 층으로 쌓으면 신경망이 되고, 거대 LLM도 같은 단위가 수천억 개 쌓인 구조다.

AND, OR, NAND는 되는데 XOR만 안 되는 이유. 넷 다 이진 출력이라는 점은 같지만, 1인 점과 0인 점의 배치가 직선 하나로 갈리는가가 갈린다. XOR은 두 대각선이 서로 다른 값을 가져서 직선 하나로 못 가른다.

XOR은 어떻게 만드는가. NAND와 OR을 먼저 거쳐 각자 다른 경계선을 긋고, 그 결과를 AND로 다시 합친다. 층 하나를 늘려서 선형 분리 문제를 우회한 것이 다층 퍼셉트론이다.

이 신경망이 왜 LLM으로 이어지는가. AI, ML, DL, LLM은 포함 관계이고, 은닉층을 여러 개 쌓은 신경망(딥러닝)이 텍스트를 다루면 LLM이 된다. 다만 신경망은 숫자만 계산하므로 텍스트를 숫자로 바꾸는 단계가 먼저 필요하다.

텍스트는 신경망에 어떻게 들어가는가. 토큰 단위로 쪼개고 정수 ID로 바꾼다. tokenizer.encode()tokenizer.decode()가 이 변환과 역변환을 맡고, 사전을 찾아보는 것뿐이라 신경망은 관여하지 않는다. BPE 덕분에 사전에 없는 단어도 하위 단어로 쪼개 처리할 수 있다.

토큰 ID와 임베딩은 왜 둘 다 필요한가. 토큰 ID는 사전 순서로 매긴 이름표라 크기 비교에 의미가 없다. 신경망의 가중합 계산은 실제 의미 있는 값을 요구하기 때문에, 이름표를 임베딩 표에서 찾아 실제 값으로 바꿔치는 과정이 따로 필요하다.

그 벡터를 신경망이 어떻게 다루는가. 예전 RNN은 순서대로 읽어야 해서 느리고 문맥을 잃기 쉬웠다. Transformer는 어텐션으로 텍스트 전체를 한 번에 보는데, 여기 나오는 인코더/디코더는 토크나이저의 encode/decode와 이름만 같을 뿐 완전히 다른 신경망 절반이다.

인코더와 디코더를 어떻게 쓰느냐로 모델이 왜 갈리는가. 인코더만 쓰면 BERT가 되어 양쪽 문맥을 보는 분류에 적합하고, 디코더만 쓰면 GPT가 되어 앞쪽만 보고 이어 쓰는 생성에 적합하다.

다음 단어 예측만으로 번역까지 되는 이유. 학습 목표를 다음 단어 예측 하나로 단순화한 덕분에, 별도 모델 없이도 번역 같은 창발적 능력이 데이터와 파라미터 규모만으로 따라왔다. 이번 자료에서 제일 인상적이었던 부분이다.

큰 그림으로 돌아가면, 뉴런에서 신경망으로, 토크나이저의 encode()가 텍스트를 토큰 ID로, 임베딩이 그 ID를 벡터로 바꾸고, Transformer의 인코더/디코더가 그 벡터를 처리해 BERT와 GPT로 갈리고, decode()가 다시 텍스트로 돌려주기까지 지도 위 칸이 전부 채워졌다. LangChain 컴포넌트는 아직 손으로 돌려본 게 아니라서 다음 실습 노트북에서 직접 확인하고 정리할 생각이다.

This post is licensed under CC BY 4.0 by the author.