공통 · 2026-09-13
점수를 나누어 처리하는 온라인 소프트맥스
수치 안정성을 위한 최댓값 처리와 지수합의 역할을 살펴보고, 새 점수 묶음에 따라 두 값을 유지·보정·갱신하는 온라인 소프트맥스의 원리를 설명합니다.
지난 글에서는 일부 점수만으로 소프트맥스의 최종 확률을 정할 수 없는 이유를 살펴봤습니다. 확률의 분모에는 같은 행의 나머지 점수도 반영해야 하기 때문입니다. 이번에는 그 정보를 점수를 조금씩 읽으며 누적하는 방법, 온라인 소프트맥스를 알아보겠습니다.
먼저 점수가 클 때에도 안정적으로 계산할 수 있도록 모든 점수에서 최댓값을 빼는 이유를 살펴봅니다. 이어서 이 계산에 필요한 최댓값과 지수합의 역할을 확인합니다. 마지막으로 새 점수 묶음을 읽을 때 최댓값을 유지하거나 갱신하고, 그 기준에 맞춰 지수합을 보정하고 더하는 과정을 따라가겠습니다. 핵심은 이전 점수를 모두 다시 살펴보지 않고도, 지금까지 처리한 점수의 두 값을 갱신하는 것입니다.
최댓값을 빼서 안정적으로 계산하기
소프트맥스를 짧게 복습하겠습니다. 먼저 각 점수에 지수 함수 exp를 적용해 양수로 바꿉니다. 이 값들을 모두 더한 뒤, 각 값을 그 합으로 나누면 합이 1인 확률을 얻습니다. 예를 들어 점수가 [0, 0]이면 exp 값은 각각 1이고 합은 2이므로, 확률은 각각 50%입니다.
그런데 점수가 커지면 exp 값은 매우 빠르게 커집니다. 그림 1의 점수 [1000, 1001, 1002]에 그대로 exp를 적용하면, FP32나 FP64가 표현할 수 있는 범위를 넘습니다. FP32와 FP64는 각각 32비트와 64비트로 실수를 표현하는 부동소수점 형식입니다. 수학적으로는 확률이 정의되어 있어도, 중간 계산값을 표현하지 못하면 컴퓨터는 유효한 결과를 구할 수 없습니다.
이를 피하기 위해 exp를 적용하기 전에 모든 점수에서 같은 최댓값을 뺍니다. 그림 1에서는 최댓값 1002를 빼므로 점수가 [-2, -1, 0]이 됩니다. exp를 적용하면 약 [0.135, 0.368, 1]이고, 그 합은 약 1.503입니다. 각 값을 이 합으로 나누면 약 [9.0%, 24.5%, 66.5%]를 얻습니다. 이 글과 그림의 소수는 정확한 계산 후 반올림한 값입니다.
점수를 바꾸었는데 왜 확률은 같을까요? 어떤 점수를 x, 모든 점수에서 뺄 최댓값을 m이라고 하면 exp(x − m) = exp(x) × exp(−m)입니다. 모든 exp 값에 같은 양수 배율이 곱해지므로, 분자인 개별 exp 값과 분모인 전체 합에 그 배율이 함께 적용됩니다. 나눌 때 이 배율이 약분되어 확률은 유지됩니다. 이는 수학적인 관계이며, 실제 계산에서는 원래의 큰 exp 값을 먼저 만들지 않고 점수에서 m을 뺀 뒤 exp를 적용합니다.
최댓값을 뺀 점수는 모두 0 이하이고, 최댓값에 해당하는 점수는 0입니다. 따라서 가장 큰 exp 값이 exp(0) = 1이 되어, 큰 양수에 exp를 적용할 때의 오버플로를 피할 수 있습니다. 여기서는 유한한 점수들로 이루어진 한 행을 다룹니다. 아주 작은 exp 값이 0으로 반올림되는 언더플로나 일반적인 부동소수점 오차까지 모두 사라진다는 뜻은 아닙니다. 안정적인 소프트맥스 계산식
정규화에 필요한 최댓값과 지수합
안정적으로 소프트맥스를 계산할 때는 두 값이 필요합니다. 하나는 exp를 계산할 기준인 최댓값 m, 다른 하나는 그 m을 뺀 점수들의 exp를 모두 더한 지수합 ℓ입니다. 여기서 ℓ은 알파벳 소문자 l을 구별하기 쉽게 쓴 기호입니다.
지난 글에서는 원래 점수들의 exp 합을 분모로 사용했습니다. 이제부터 지수합 ℓ이라고 할 때는 최댓값을 뺀 뒤의 exp 합을 뜻합니다. 최댓값이 달라지면 같은 점수에서도 exp 값과 그 합이 달라지므로, m과 ℓ을 항상 한 쌍으로 생각해야 합니다.
그림 2의 점수는 [1, 2]입니다. 최댓값 m은 2이고, exp 값은 exp(1 − 2) ≈ 0.368과 exp(2 − 2) = 1입니다. 따라서 지수합 ℓ은 약 1.368입니다. 첫 번째 확률은 약 0.368을 이 합으로 나눈 26.9%, 두 번째 확률은 1을 이 합으로 나눈 73.1%입니다.
이 예시에서는 점수 두 개가 행 전체이므로 이 확률이 최종 결과입니다. 하지만 [1, 2]가 더 긴 행에서 먼저 읽은 일부라면, 지금 구한 m과 ℓ도 그 일부에 대한 값입니다. 다음 점수에 따라 최댓값이 커질 수 있고 지수합에 더할 값도 생깁니다. 전체 행의 확률을 구하려면 나머지 점수를 반영해 두 값을 완성해야 합니다.
새 점수 묶음으로 두 값 갱신하기
이제 한 행의 점수 [1, 2, 0, 1, 3, 2]를 두 개씩 나누어 읽어보겠습니다. 첫 묶음 [1, 2]를 처리하면 그림 2와 같이 m은 2, ℓ은 약 1.368입니다. 이 두 값을 유지한 채 다음 묶음으로 넘어갑니다.
새 묶음을 읽으면 먼저 기존 최댓값과 새 묶음의 최댓값 중 큰 값을 새 기준으로 정합니다. 그다음 기존 지수합을 이 기준에 맞추고, 새 점수들도 같은 기준으로 exp를 계산해 더합니다. 그림 3은 최댓값이 유지되는 경우와 커지는 경우를 차례로 보여줍니다.
최댓값이 유지되는 경우
두 번째 묶음 [0, 1]의 최댓값은 1입니다. 기존 최댓값 2보다 작으므로 m은 2를 유지합니다. 기존 지수합은 이미 이 기준으로 계산되어 있어 그대로 사용할 수 있습니다.
새 점수에서도 같은 m인 2를 빼고 exp를 계산합니다. exp(0 − 2) + exp(1 − 2) ≈ 0.503을 기존 합 약 1.368에 더하면 새 지수합은 약 1.871입니다. 이제 m = 2와 ℓ ≈ 1.871에는 지금까지 읽은 네 점수 [1, 2, 0, 1]이 모두 반영되어 있습니다.
여기서 새 묶음의 exp 계산에도 지금까지의 최댓값 2를 사용한다는 점이 중요합니다. 새 묶음만의 최댓값 1을 빼서 얻은 exp 합을 기존 합에 그대로 더하면 두 합의 기준이 달라집니다. 묶음별로 확률을 만든 뒤 이어 붙이는 것이 아니라, 같은 기준으로 계산한 exp 값들을 누적하는 것입니다.
최댓값이 커지는 경우
세 번째 묶음 [3, 2]에서는 더 큰 점수 3을 만납니다. 최댓값 m을 2에서 3으로 갱신해야 합니다. 그런데 기존 지수합 약 1.871은 이전 기준인 2를 빼서 구한 값입니다. 새 점수들의 합을 더하기 전에, 기존 합도 최댓값 3을 뺀 기준으로 바꾸어야 합니다.
이전 점수 하나를 x라고 하면 두 기준의 관계는 다음과 같습니다.
최댓값을 하나 더 크게 빼므로, 이전 exp 값 각각에 exp(−1) ≈ 0.368을 곱하면 됩니다. 이 배율은 이전 점수 모두에 동일합니다. 따라서 이전 점수를 다시 읽어 하나씩 계산할 필요 없이, 그 값들을 더해둔 지수합 하나에 배율을 곱할 수 있습니다. 기존 합에 exp(2 − 3)을 곱하면 약 0.688이 됩니다.
이어서 새 점수 [3, 2]도 새 최댓값 3을 기준으로 계산합니다. 새로 더할 합은 exp(3 − 3) + exp(2 − 3) ≈ 1.368입니다. 보정한 기존 합 약 0.688과 더하면 최종 지수합은 약 2.056입니다. 이때 m = 3과 ℓ ≈ 2.056은 여섯 점수를 처음부터 한꺼번에 처리해 구한 최댓값과 지수합에 대응합니다.
최댓값이 유지되는 경우도 같은 규칙으로 설명할 수 있습니다. 기존 max와 새 max가 같으면 보정 배율은 exp(0) = 1이므로 기존 합이 그대로 남습니다. 새 max를 정하고, 기존 합을 보정한 뒤, 새 점수의 exp 합을 더한다는 한 가지 규칙으로 두 경우를 모두 처리할 수 있습니다. 온라인 정규화 통계의 갱신식
누적한 두 값으로 최종 확률 구하기
모든 묶음을 읽고 나면 행 전체의 최댓값과 지수합을 알 수 있습니다. 예를 들어 첫 점수 1의 최종 확률은 exp(1 − 3) ÷ 2.056 ≈ 6.6%입니다. 처음 [1, 2]만으로 구했던 26.9%와 달리, 이제는 나머지 네 점수까지 반영한 확률입니다.
다만 m과 ℓ을 완성하는 것만으로 모든 위치의 확률이 출력되는 것은 아닙니다. 각 확률을 구하려면 해당 점수에 최종 m과 ℓ을 적용해야 합니다. 점수를 보관하지 않고 통계만 누적했다면, 확률을 출력하는 단계에서 점수를 다시 읽거나 재계산할 수 있어야 합니다.
온라인 소프트맥스는 이 정규화에 필요한 정보를 점수 묶음마다 갱신합니다. 최댓값이 커질 때 이전 지수합을 새 기준으로 보정할 수 있기 때문에, 전체 점수를 동시에 보관하지 않고도 한 행의 공통 기준과 분모를 구할 수 있습니다.


