My Code Philosophy
"명확하게 이해되고, 성능이 좋고, 설계가 잘 되어 있어서 운영 및 추가 개발시 좋았던 코드"
— 제가 "잘 짰다"고 느꼈던 코드에 대한 정의
"명확하게 이해되고, 성능이 좋고, 설계가 잘 되어 있어서 운영 및 추가 개발시 좋았던 코드"
— 제가 "잘 짰다"고 느꼈던 코드에 대한 정의
KL Divergence를 정보이론 기초부터 이해하기. Self-Information, Entropy, Cross-Entropy의 관계를 통해 KL Divergence가 왜 이런 형태인지 직관적으로 설명합니다.
머신러닝을 하다 보면 "두 확률 분포가 얼마나 다른가?"를 측정해야 하는 상황을 자주 만납니다. 모델이 예측한 분포와 실제 데이터 분포의 차이, VAE에서 latent space의 분포와 prior의 차이, 또는 시간에 따른 데이터 분포의 변화(drift) 감지까지. 이 모든 상황에서 KL Divergence라는 개념이 등장합니다.
이번 글에서는 KL Divergence가 "무엇"인지보다 "왜" 이런 형태를 갖게 되었는지에 초점을 맞춥니다. 정보이론의 기초 개념부터 차근차근 쌓아올려 보겠습니다.
Forward KL과 Reverse KL의 차이, Mode-covering과 Mode-seeking 행동의 이해. VAE의 Reparameterization Trick까지 상세 설명.
Part 1에서 KL Divergence의 정의와 정보이론적 의미를 살펴봤습니다. 그런데 한 가지 의문이 남습니다. KL Divergence가 비대칭적이라면, 와 중 어떤 것을 사용해야 할까요?
이 선택은 단순한 수학적 문제가 아닙니다. ML 모델의 학습 행동을 근본적으로 바꿉니다. 이번 글에서는 Forward KL과 Reverse KL의 차이를 깊이 이해하고, VAE에서 Reparameterization Trick이 왜 필요한지 알아보겠습니다.
GAN 학습이 어려운 이유와 해결책. JSD의 gradient vanishing 문제부터 Wasserstein Distance, WGAN까지의 발전 과정.
Part 1에서 KL Divergence의 정보이론적 의미를 살펴봤습니다. 하지만 KL Divergence에는 실용적인 한계가 있습니다. 비대칭적이고, 특정 상황에서 무한대로 발산합니다. 이번 글에서는 이러한 한계를 극복하기 위해 등장한 **Jensen-Shannon Divergence(JSD)**와, GAN 학습에서 JSD의 치명적인 문제를 해결한 Wasserstein Distance를 다룹니다.
이 여정을 따라가다 보면 GAN이 왜 학습하기 어려운지, 그리고 WGAN이 어떻게 이를 해결했는지 깊이 이해할 수 있습니다.
KL, JSD, Wasserstein을 실제 시스템에 적용하는 방법. Drift Detection, Anomaly Detection, Model Monitoring 구현 패턴과 실무 체크리스트.
지난 세 편에서 KL Divergence, JSD, Wasserstein Distance의 이론적 배경을 살펴봤습니다. 이제 가장 중요한 질문이 남았습니다. "실제로 어떻게 쓰는가?"
이번 글에 서는 분포 비교 기법을 실제 시스템에 적용하는 구체적인 패턴들을 다룹니다. Feature drift detection, anomaly detection, model monitoring 등 바로 활용할 수 있는 내용에 집중합니다.
robots.txt가 검색 엔진을 위한 것이라면, llms.txt는 AI를 위한 것입니다.
웹사이트에 robots.txt가 있듯이, 이제 llms.txt도 등장했습니다. 2024년 9월 Jeremy Howard가 제안한 이 표준은 LLM(Large Language Model)이 웹사이트 콘텐츠를 쉽게 이해할 수 있도록 돕는 파일입니다.
Claude Desktop에서 개발 블로그 콘텐츠를 실시간으로 조회할 수 있도록 하는 MCP 서버를 만들어보겠습니다.
블로그 포스트와 기술 문서가 늘어나면서 한 가지 고민이 생겼습니다. "Claude에게 내 블로그 내용을 어떻게 알려줄 수 있을까?"
매번 대화할 때마다 복사-붙여넣기로 콘텐츠를 전달하는 건 비효율적입니다. 그래서 MCP (Model Context Protocol) 서버를 구축해서 Claude Desktop이 직접 블로그 콘텐츠에 접근할 수 있도록 만들기로 했습니다.
Git Commit Hash 기반 캐싱으로 서버 시작 시간을 1초 미만으로 줄이고, 에러 복구 전략을 구현합니다.
1편에서 Git 기반 아키텍처를, 2편에서 역인덱스 검색 기능을 구현했습니다. 하지만 실제로 사용해보면 한 가지 불편함이 있습니다.
"서버 시작이 너무 느려요"
매번 Claude Desktop을 열 때마다 Git clone과 인덱스 빌드가 발생합니다. 콘텐츠가 늘어날수록 점점 더 오래 걸리죠.
이번 편에서는 캐싱 시스템을 구현해서 Cold Start를 1초 미만으로 줄이고, 에러 복구 전략으로 안정성을 높입니다.
두 확률 분포의 차이를 측정하는 Bhattacharyya Distance를 실생활 예시와 수식으로 완벽히 이해하기
Bhattacharyya Distance는 두 개의 확률 분포가 얼마나 다른지를 측정하는 지표입니다. 쉽게 말하면, 두 그룹이 얼마나 "구별 가능한지"를 숫자로 나타낸 것이죠.
두 그룹의 키를 비교한다고 생각해봅시다:
그룹 A: ___
/ \
/ \___
/ \
165 175 185 (cm)
그룹 B: ___
/ \
/ \___
/ \
155 162 170 (cm)
**Bhattacharyya Coefficient (BC)**는 두 분포의 겹치는 부분(overlap)을 측정합니다:
산술평균과 기하평균의 차이를 직관적으로 이해하고, 왜 Bhattacharyya Coefficient에서 기하평균을 사용하는지 알아봅니다
이산 분포 예시:
두 확률 분포가 있다고 가정:
x₁ x₂ x₃ x₄ x₅
p: 0.3 0.2 0.1 0.2 0.2
q: 0.1 0.3 0.2 0.3 0.1
각 점에서의 계산:
x₁: √(0.3 × 0.1) = √0.03 = 0.173
x₂: √(0.2 × 0.3) = √0.06 = 0.245
x₃: √(0.1 × 0.2) = √0.02 = 0.141
x₄: √(0.2 × 0.3) = √0.06 = 0.245
x₅: √(0.2 × 0.1) = √0.02 = 0.141
합산 (BC):
BC = 0.173 + 0.245 + 0.141 + 0.245 + 0.141 = 0.945
시각 적 이해:
각 점에서:
p(x) ━━━━━━━━━ (높이)
q(x) ━━━━ (높이)
기하평균 ━━━━━ (두 높이의 "균형잡힌" 중간)
↑
이걸 모든 점에서 더함
Black, isort, Flake8을 Ruff 하나로 통합하고, 생산성을 극대화하는 VSCode 설정
Python 개발을 하다 보면 코드 포맷팅, 린팅, import 정리 등 여러 도구를 조합해서 사용하게 됩니다. 기존에는 Black + isort + Flake8 조합이 일반적이었지만, 이제는 Ruff 하나로 이 모든 것을 대체할 수 있습니다.
이 글에서는 Ruff를 중심으로 한 VSCode Python 개발환경 설정을 정리합니다.
안녕하세요! 이 블로그에 오신 것을 환영합니다.
저는 데이터 사이언티스트로 시작해 파트 리더, 팀 리더, Data PM을 거쳐 현재 Data Fullstack Engineer로 활동하고 있습니다. 이는 단순한 직급의 변화가 아닌, 경험의 확장을 통해 데이터의 전 영역을 이해하고 구현할 수 있게 된 여정입니다.