3P by GN⁺ 3일전 | ★ favorite | 댓글 1개
  • 불확실성을 코드 수준에서 다루기 위한 새로운 추상화인 Uncertain<T> 타입의 개념 소개
  • 이 타입은 확률적 프로그래밍 방법론을 적용해 전통적 불리언 로직 대신 값의 신뢰도나 가능성을 모델링함
  • GPS, 센서 데이터 등 노이즈가 많은 실제 데이터를 수학적 확률 분포로 다루는 기능 제공
  • SPRT와 Monte Carlo 방법 등 샘플링 기술로 연산 효율 및 결과 신뢰도 균형을 지원함
  • 기존 코드와 점진적 통합이 가능하여 실무 적용성이 뛰어남

불확실성의 코드화: 자신감과 실제 데이터의 간극

  • 많은 사람들이 확증에 지나치게 의존하는 현상 언급
  • 소프트웨어 개발 경력이 쌓이면 “상황에 따라 다름”이라고 말하는 빈도가 늘어남을 지적함
  • 코드에서는 여전히 참/거짓 판단에만 의존하는 패턴이 반복됨
  • 특히 GPS 등 불확실한 데이터를 다루면서도 불리언 값만 사용하는 현실 비판
  • 프로그래밍 모델이 실제의 ‘불확실성’을 너무 빨리 이분화하여 복잡함을 은폐함

올바른 추상화의 선택

  • 2014년, University of Washington과 Microsoft Research에서 불확실성을 타입 시스템에 직접 반영하는 개념을 제안함
  • 논문 "Uncertain<T>: A First-Order Type for Uncertain Data"를 통해 확률적 프로그래밍 방식이 실용적임을 증명함
  • Swift로 개념을 포팅한 코드를 GitHub 저장소에 게시함
  • Uncertain<T>를 사용하면, 비교 결과 또한 상대 확률로 표현하고, 참/거짓이 아닌 Uncertain<Bool>로 결과를 반환함
  • GPS 위치 오차는 Rayleigh 분포 등 실제 데이터 특성에 맞게 모델링함

다양한 불확실성 연산의 실제

  • 여러 연산자와 확률 분포 모델을 지원하며, 연산 그래프를 구축하고, 필요할 때만 샘플링 실행
  • SPRT(Sequential Probability Ratio Testing)로 효율적인 샘플 수 조절
  • 예시 코드에서 단순 비교—복합 비교 각각 필요한 샘플 개수 차이 설명
  • 이러한 추상화로 불확실성을 무시하지 않고, 계산 과정에서 자연스럽게 활용함으로써 더 ‘똑똑한’ 코드 구현 가능함

Monte Carlo 방법론의 적용

  • 확률 분포 분석 및 기대값 산정을 위해 Monte Carlo 샘플링 도입
  • 실제로 슬롯머신 결과값을 반복 시뮬레이션하여 기댓값을 손쉽게 도출할 수 있음
  • 복잡한 해석적 계산 없이 컴퓨터 반복 샘플링만으로도 현실적인 결과 산출 가능함

풍부한 확률 분포 모델링

  • Uncertain<T>는 다양한 확률 분포 생성자를 내장하여, 각종 센서 노이즈, 사용자 행동, 네트워크 레이턴시 등 현실 세계 데이터를 정교하게 모델링할 수 있음
  • 혼합 분포(mixture), Bernoulli, exponential, normal 등 여러 상황별 파라미터화 지원
  • 각 분포의 직관적 이해를 돕기 위해 상호작용형 시각화 프로젝트도 별도로 제공

통계 및 분석 연산 제공

  • 기대값, 표준편차, 신뢰구간, 치우침(skewness), 첨도(kurtosis), 엔트로피 등 다양한 통계 함수 제공
  • 연산 결과는 샘플링 수도 조절 가능하여, 정밀도와 효율의 트레이드오프 가능
  • 누적분포함수(CDF) 활용해 특정 값 이하일 확률 등도 손쉽게 계산 가능

현실 적용 가이드

  • 실제로 앱 등에서 불확실성을 무시한 채 부상당할 수 있는 문제(예: 말도 안 되는 GPS 속도 표시 등) 설명
  • 점진적 전환 강조: 기존 거리 측정 등 핵심 경로부터 부분적으로 Uncertain<T> 통합 권장
  • 샘플 수 등 계산 비용 설정으로 정확도·성능 균형 조절 가능
  • 실무에서는 Instruments.app 등 프로파일링 도구 적극 활용 권장
  • 목표는 불확실성을 제거가 아니라, 존재 자체를 인정하고 적절히 다루는 개발 패턴 확보

결론 및 전망

  • 개발자는 작은 영역부터 불확실성 처리를 도입하여 사용성 개선 및 오류 완화 기대
  • 완전한 확실성은 존재하지 않음을 받아들이고, 적절한 도구와 추상화를 통해 소프트웨어의 품질을 한 단계 높임
  • 실질적으로, 존재하는 불확실성 자체를 제대로 다루는 것이 진정한 실무적 개선임
Hacker News 의견
  • GPS의 불확실성은 일반적으로 개방된 하늘 아래 장시간 측위 등 특정 조건에서만 원형으로 근사할 수 있음, 사실 전체적인 오차 모델은 훨씬 복잡하며 다양한 방식의 오차 측정이 존재함, 이 점은 위치를 점 하나로 취급하기 어렵게 만드는 여러 상황에서 중요해짐, 예를 들어 자율주행차의 경우, 위치 추정 불확실성이 비원형적인 다중 경로 현상에 의해 지배되는 사례를 자주 만나게 됨, 이런 난관을 깊이 고민하다 보면 결국 파티클 필터 같은 기법을 다시 발명하는 지점에 도달하게 됨
    • 차량용 GPS는 보통 여러 센서와 추가 가정으로 보완함, 특히 속도계, 나침반, 그리고 차량이 지도 위의 도로 중 어느 하나에 있을 것이라는 지식 등이 중요하게 작용함, 또한 마지막 전원 종료~재시작 사이에 위치 변화가 없을 것이란 가정을 통해 빠른 측위가 가능함
    • 라이다(Lidar) 점들은 사실 단순한 점이 아니라, 가장 가능성 높은 위치를 중심으로 하는 타원체 형태로 존재함
  • University of Cambridge에서 Uncertain<T>(James Bornholt)와 관련 연구에 영감을 받아 프로세서 마이크로아키텍처를 설계함, 파라메트릭 분포(Gaussian, Rayleigh 등)뿐 아니라 임의의 샘플 집합을 레지스터/메모리에 로드해 프로그램 값이 비파라메트릭 분포로 산술 연산을 따라 전파되도록 설계함, 이 기술을 기반으로 Signaloid라는 스핀오프 기업이 시장에 진출 중이며, 나도 이를 상태 추정(예: 파티클 필터)에 적용하는 연구를 진행 중임 논문 링크
  • 프로그래밍에서 변수에 수학적인 변수의 ‘명세’가 담길 수 있다는 개념을 이해하면, 현대 AI의 근간이 되는 놀라운 가능성이 열림, y = m * x + b라는 익숙한 수식을 생각하면, 이들이 모두 리터럴일 때는 단순 렌더 함수에 불과하지만, 만약 변수들이 도출된 연산 경로의 전체 구조를 담고 있다면, 연산 방향에 따라 값을 예측해 렌더링(포워드 패스)하거나, 자동으로 그래디언트/미분을 구해 신경망 학습까지 연결시킬 수 있음, 이러한 산출 결과를 수학적으로 샘플링하면 모델을 형성하는 가중치 획득이 가능함, 딥러닝의 각 레이어는 이렇게 설계되어 있으며, PyTorch 같은 시스템은 연산의 조합만 명시해도 최적의 코드로 컴파일할 수 있음, 즉 Uncertain<T>는 시작점에 불과하며, 모든 숫자 변수가 언제든 후보 값의 메타데이터로 정의되고, 이 메타데이터를 변수값 더하기만큼 손쉽게 조작할 수 있다고 상상해보면 매우 흥미로운 실험이 됨
    • 이거 정말 흥미롭게 들림, 머신러닝이나 수학 지식이 많지 않은 나 같은 사람도 쉽게 이해할 수 있도록 설명해줄 수 있는지 궁금함
    • PL(프로그래밍 언어) 중에서 이런 개념을 언어 수준에서 지원하는 사례가 실제로 존재하는지 궁금함
    • 이 댓글이 변수, 함수, 선형 시스템을 한데 섞어 얘기하는 것 같은데, 굳이 이렇게 합칠 필요는 없는 것 같음
  • 여러 변수 간의 공분산도 이 방식으로 처리할 수 있는지가 궁금함, 예를 들어 측정 대상 객체의 위치 자체도 오차가 있을 수 있고 내 위치 오차와 이 둘이 상관관계를 가질 수도 있음(GPS가 같은 시점에 측정됐다면 더더욱), 타입 시스템에 단변량 모델만 있다면 쓸모는 있겠지만, 공분산까지 다룬다면 훨씬 강력하고 정확한 사용이 가능할 것이라 생각함
    • 샘플링 기반 접근법을 쓰면 공분산 모델링이 자동으로 포함됨, 특정 평가 과정에서 여러 번 쓰이는 리프 값을 한 번만 샘플링 하면 되는데, 실제로 해당 구현이 그렇다는 걸 아래 코드에서 확인할 수 있음 Uncertain.swift 코드
    • 프로그램이 실제 사용 중에 공분산을 ‘학습’할 수 있을지 오래전부터 궁금했음, 변수들을 독립적으로 모델링하면 계속해서 실제와 어긋나게 될 것 같음, 그리고 규모가 큰 프로그램에서는 모든 변수 쌍의 상관관계를 수동으로 고려하는 게 사실상 불가능함, 어쩌면 자동으로 학습하는 방식을 고안해야 할 것 같음
    • 공분산 추적이 필요하다면 python의 gvar 라이브러리를 다뤄보는 것도 추천함
    • 만약 양자역학을 제대로 모델링하려면 서로 얽혀 있는 변수 집합마다 복소수 형태의 파동함수를 연관시켜야 함
  • 기계공학 도면 등에서 가공 작업자와 소통할 때 ‘공차’라는 개념을 사용함, 예: 10cm +8mm/-3mm 식으로 허용 범위를 위아래로 명확히 표시함, GPS 기반 “거의 도착했나요?” 같은 질문 역시, 오차의 방향성을 이해하고 불확실성의 ‘방향’에 따라 더 나은/나쁜 경우를 구분하는 게 중요할 것으로 기대함
    • 이 표기 방식이 아쉬운 점은, 어떤 경우에는 “절대로 최대/최소 범위를 넘기지 않는다”는 의미이고, 어떤 경우에는 “10% 확률로만 범위를 넘긴다”는 뜻으로 해석될 수 있다는 점임
    • 일의 계획 수립 등에서 자주 쓰이는 세 점 방식(낙관적, 현실적, 비관적) 산정도 비슷함, 매우 단순한 확률분포라도, 불확실성이 개입된 모든 분야에선 확률분포 기반의 관점이 훨씬 명확함을 제공함
  • 이 개념은 과거에 여러 차례 ‘간격 산술(interval arithmetic)’이란 이름으로 구현되었음, Boost와 flint 등에서도 지원함 Boost Interval flint(arb), 이렇게 반복적으로 재발견됐음에도 불구하고 왜 본격적으로 주류가 되지 않는지 궁금함, 혹시 실제 현장에서 써보고 별로라서 포기한 사람 있다면 얘기를 들어보고 싶음
    • 본문에서는 Uncertain<T>가 GPS 불확실성에 Rayleigh 분포를 사용한다고 설명함, Rayleigh 분포는 균등분포가 아니라 실세계의 오차 분포를 더 잘 모델링함, 예를 들어 Boost 라이브러리에서 (-2,2)*(-2,2)를 계산하면 (-4,4)로 나오는데 실제 확률적으로는 극단값 동시 발생 가능성이 훨씬 낮으므로 대략 (-2.35,2.35)정도가 더 현실적임
    • 물리학에서는 오차 전파(error propagation)를 초반에 배우게 됨, 오차가 가우시안 분포라고 가정하면 아주 우아하게 계산되지만, 실제로는 측정치의 대부분이 가우시안 분포를 따르지 않고, 비확률적(시스템적) 오차가 문제가 되며, 이를 제대로 다루기는 어렵기 때문에 자동 오차 전파는 거의 쓸모가 없는 경우가 많음, 대부분의 경우 수동 분석이 필요함
    • 이 글이 왜 주목받는지 잘 모르겠음, 이 프로젝트는 간격 산술만이 아니라 다양한 불확실성 분포를 지원함
    • 단순한 Boolean 등의 타입은 간단하게 추론이 가능해서 제약도 명확함, 반면 물리적 불확실성은 복잡해서 도메인마다 모델이 달라야 하고, 한 번 복잡한 불확실성을 다루기로 한 이상, 그냥 이쁘게 패키징된 라이브러리보다 해당 목적에 특화된 전문 모델을 쓰는 게 더 바람직함
    • 간격 산술은 연산 속도가 단순 수치 연산보다 상수 배 느릴 뿐 큰 차이는 없고, 모든 연산에 대해 고유의 가장 정밀한 간격 결과가 존재함, 그러나 정밀도가 항상 보장되는 것은 아님, 본문과 같이 샘플링하는 연산 그래프는 느리지만 대신 실제 오차 모델에 더 정확하게 접근할 수 있음, 정밀도를 빼앗기는 추상 도메인이 없어도 되는 장점이 있음
  • 내가 만들고 싶던 데이터 타입은 어떤 값이 주어진 확률분포(혹은 확률 밀도 함수) 내에서 얼마만큼 알려져 있는지를 표현하는 것임, 그리고 각각의 변환 과정에도 그만큼의 불확실성이 추가됨, 관측이 늘어날수록(혹은 조건부 분류가 달라질수록) 이 확률분포의 집합이 계속 정제되는 흐름을 상상함, 궁극적으로 이런 분포 기반의 무작위 결과 케이스들을 시뮬레이션해보는 게 목표였음
  • 이 개념은 오래된 Functional Pearl “Probability Functional Programming”과도 밀접한 관련이 있음 PDF 링크, 정말 멋짐, 나는 Haskell 입문 수업 첫 시간에 Monty Hall 문제를 확률 모나드로 시연하는 걸로 시작함, 두 전략의 승리 확률을 정수 분수로 활짝 계산해 보여줌
  • 어쩌면 Uncertain이 기본 타입이 되고, 정말 확실한 경우에만 certain T라고 따로 명시하게 하면 좋을 듯함
    • 물리 측정값에 한정해서라면 맞겠지만, 화폐 같은 대상은 소수점 이하 단위까지 정확해야 함, 참고로 이러한 접근법은 일부 최신 Fortran 라이브러리에도 구현되어 있음
    • Optional 타입의 보완재로 기능할 수 있음
  • 이게 점근적으로 프로그래밍 버전의 퍼지 로직(fuzzy logic) 인지 궁금함 Fuzzy Logic 위키피디아