1.2 비결정성(Nondeterminism)의 기술적 근원과 이해

1.2 비결정성(Nondeterminism)의 기술적 근원과 이해

소프트웨어 엔지니어링 1.0의 시대를 이끌어온 가장 거대한 수학적, 철학적 기둥은 바로 연산의 과정과 그 결과가 동일한 입력에 대해 영구적으로 동일함을 증명할 수 있는 ’결정론적 속성(Deterministic Property)’이었다. 튜링 머신(Turing Machine)과 폰 노이만 아키텍처(Von Neumann Architecture)로 대변되는 고전 컴퓨팅 구조 하에서, 기계는 오직 사전에 개발자가 명시한 레지스터(Register) 기반의 상태(State) 기계처럼 움직여 왔다.

하지만, 오늘날 대규모 인공 신경망(ANN; Artificial Neural Network)과 거대 언어 모델(LLM; Large Language Model) 등 소프트웨어 2.0 시대를 구축하는 모델들은, 본질적으로 그리고 아키텍처 구조적으로 **비결정성(Nondeterminism)**을 필수 불가결하게 잉태하고 있다. 이 장에서는 현대 AI 시스템에서 도출된 결과물들이 왜 똑같은 질문에 대해서조차 매번 다른 답변으로 산출될 수밖에 없는지에 대한 그 기술적 근원을 다층적으로 해부한다.

1. 통계적 사상(Statistical Mapping)과 언어 모델의 본질

가장 빈번하게 활용되는 대규모 언어 모델들(예: GPT, Claude, LLaMA 계열 모델 등)의 기저 작동 원리는 사실상 “주어진 컨텍스트(입력 프롬프트 텍스트)를 조건(Condition)으로 활용하여, 통계학적으로 가장 발화될 확률이 높은 ’다음 토큰(Next Token)’을 추론해내는 확률적 과정“이다.

이러한 오토리그레시브(Autoregressive; 자기회귀) 방식의 모델 내부 구조는 결정론적 해답이 저장된 일종의 거대한 ’관계형 데이터베이스(RDB; Relational Database)’가 결코 아니다. 수십억 개에서 수조 개에 이르는 파라미터(Parameters) 공간 내에 인코딩(Encoding)된 훈련 데이터의 잠재 공간(Latent Space)에 분포된, 고차원적인 통계 맵핑(Statistical Mapping) 덩어리에 불과하다.

따라서 사용자의 질의(Query)가 입력되면, 언어 모델은 수학적으로 정확한 1개의 ’정답(Correct Answer)’을 찾는 탐색 과정을 거치는 것이 아니다. 대신, 모델은 코더 디코더 네트워크(Encoder-Decoder Network)나 트랜스포머 어텐션(Transformer Attention) 메커니즘을 거쳐 단어 코퍼스(Corpus) 상의 모든 토큰에 대해 그 확률 분포(Probability Distribution) 값—소프트맥스(Softmax) 함수의 출력물—을 할당하게 된다.

2. 확률적 샘플링(Probabilistic Sampling) 파라미터의 간섭

통계적 사상 과정에서 도출된 확률 분포표를 바탕으로 실제로 화면 상에 텍스트를 출력하기 위해 단 하나(Single Token)를 뽑아내는 과정이 바로 **디코딩(Decoding) 및 샘플링(Sampling)**이다. 바로 이 샘플링 단계야말로 비결정성이 폭발하는 핵심적 소프트웨어 구간이다.

일반적으로 어플리케이션 개발자는 API 요청 시 Temperature, Top-p (Nucleus Sampling), Top-k 파라미터들을 함께 네트워크에 전송하여 모델의 창의성(무작위성)과 결정성의 균형을 제어하려 시도한다.

graph TD
    A[입력 프롬프트] --> B[트랜스포머 레이어]
    B --> C[소프트맥스 함수 - 확률 분포 도출]
    C --> D{비결정성을 강제하는 파라미터 조작 공간}
    
    D --> |Temperature > 0.0| E[분포의 평탄화 Smoothing]
    D --> |Top-p / Top-k 샘플링| F[후보군 절삭 Truncation]
    
    E --> G((무작위 난수 기반 샘플링 확률의 주사위 굴리기))
    F --> G
    
    G --> H[다음 토큰 출력 결정]
    H --> |자기회귀 루프 반복| A
    
    style D fill:#e0f7fa,stroke:#00bcd4,stroke-width:2px;
    style G fill:#ffcdd2,stroke:#f44336,stroke-width:2px;

만약 파라미터 중 Temperature = 0.0으로 설정한다면, 가장 확률값이 높은 단어(Greedy Search)만을 획일적으로 선택하여 어느 정도 환각 요소 없이 결정론적인 결과물을 유도할 수 있다. 하지만 온도가 단 0.01이라도 할당되는 순간, 혹은 Top-p 기반의 샘플링이 작동하는 순간 시스템 내에는 완전한 무작위적(Randomized) 난수가 개입된다. 이 난수 생성기의 시드(Seed) 값에 따라 방금 전과 동일한 조건임에도 불구하고 미세하게 다른 후보가 선택되고, 이 미세한 오차가 다시 이어지는 입력(Autoregressive Input)으로 피드백되어 결과적으로 문장 전체의 톤과 메시지가 완전히 다른 곳으로 흘러가 버리는 나비효과를 유발한다.

3. 부동소수점 병렬 연산(Parallel Floating-point Calculation)의 한계

소프트웨어 외부적인 파라미터를 넘어, 물리적인 하드웨어 설계상의 특성 또한 비결정성의 치명적인 근원이 된다.

거대한 가중치 매트릭스의 곱셈 기반 선형 대수학(Linear Algebra) 연산은, 고도의 처리 속도를 달성하기 위해 주로 엔비디아(NVIDIA) GPU나 텐서 처리 장치(TPU) 클러스터에서 수만 개의 코어 다발로 병렬(Parallel) 처리된다. 하지만 IEEE 754 부동소수점 표준 체계 하에서는 컴퓨터 구조 상 결합 법칙(Associative Law: (a+b)+c != a+(b+c))이 절대적으로 성립하지 않는다.

GPU에서 쿠다(CUDA) 코어가 가용한 스레드 블록에 따라 연산을 분할하고 병합(Reduction)을 수행할 때, 그 합산의 미시적인 순서는 스레드 동기화 타임과 메모리 대역폭 상황에 따라 매번 달라진다. 이 순서의 뒤틀림은 극도로 좁은 소수점 이하의 자릿수 반올림 오차(Round-off Error)를 유발하며, 이 미세한 편차가 모델 내부의 깊숙한 신경망 레이어를 겹겹이 통과하면서 누적되고 증폭(Overflow)되어 소프트맥스 샘플링 결과의 판도를 근본적으로 뒤바꿀 수 있다.

결과적으로, AI 시대를 지탱하는 현대 소프트웨어 시스템에서는 소프트웨어 로직 자체의 확률적인 특성뿐만 아니라, 물리 칩 수준의 병렬 연산 분산 환경이 가지는 하드웨어적 구조성에 의해서도 완전한 결정론은 철저히 파괴된다. 결국, “왜 매번 답변이 달라지는가?“에 대한 질문의 해답은, 우리가 설계한 현재의 소프트웨어 2.0 환경의 뿌리가 ’정확성’이 아닌 ’통계적 타당성’과 연산의 ’가속성’에 그 초점을 맞추었기 때문에 나타나는 피할 수 없는 공학적 등가교환(Trade-off)의 결과물이다.