딥러닝은 연구 단계를 넘어 우리 일상생활의 다양한 분야에 활용되고 있다. 대표적인 예로 자율주행, 문자 인식(OCR), 음성 인식, 스팸 탐지 등이 있으며, 이러한 기술들은 우리의 삶을 더욱 편리하게 만들어 주고 있다. 하지만 딥러닝 모델이 잘못된 판단을 내릴 경우 그 영향은 단순한 오류를 넘어 심각한 사고로 이어질 수 있다. 예를 들어 도로에 출입금지 표지판이 있을 때 자율주행 시스템이 이를 올바르게 인식한다면 해당 도로로 진입하지 않을 것이다. 그러나 누군가 표지판에 작은 스티커를 붙이거나 특정한 패턴을 추가했을 때, 사람은 여전히 이를 출입금지 표지판으로 인식하지만 딥러닝 모델은 다른 표지판으로 오인식하거나 아예 인식하지 못할 수 있다. 그 결과 차량이 잘못된 경로로 진입하는 등의 문제가 발생할 수 있다. 이처럼 입력에 사람이 인지하기 어려운 작은 변화를 가해 모델의 예측을 크게 변화시키는 입력을 adversarial example(적대적 예제) 이라고 한다. 이번 포스트에서는 현실 세계에서 발생할 수 있는 adversarial example의 사례를 살펴보고, 이러한 현상이 왜 발생하는지 그리고 이를 방어하기 위한 방법에는 무엇이 있는지 알아본다.
in projects on Blog, Github, Pages, Jekyll, Spacy, Regularization, Normalization
딥러닝 모델은 일반적으로 Gradient Descent를 사용하여 학습되며, 효율적인 최적화를 위해 입력 데이터의 분포를 적절히 조정하는 것이 중요하다. 입력 feature들의 스케일이 크게 다르거나 강한 상관관계를 가지면 최적화가 어려워질 수 있기 때문에, Standardization, Decorrelation, Whitening과 같은 전처리 기법이 사용된다. 이러한 아이디어를 네트워크 내부의 각 레이어에 적용한 것이 Batch Normalization이며, 이는 학습을 안정화하고 학습 속도를 향상시키는 데 도움을 준다. 이 포스트에서는 Batch Normalization의 동작 원리를 살펴보고, 왜 이 기법이 딥러닝 학습에 효과적인지 분석한다.
Weight Decay는 딥러닝에서 가중치의 크기를 제한하여 모델의 복잡도를 조절하는 대표적인 정규화 기법이다. 단순히 파라미터를 작게 만드는 방법처럼 보이지만, 실제로는 데이터가 특정 방향으로 얼마나 잘 관측되었는지에 따라 학습의 민감도를 조절하는 역할을 한다. 특히 선형 모델 관점에서 보면 Weight Decay는 데이터 행렬의 singular value 분포, 즉 스펙트럼 구조에 따라 서로 다른 방향을 다르게 처리하는 것으로 해석할 수 있다. 또한 이러한 정규화는 Bayesian 관점에서도 해석할 수 있다. 가중치에 Gaussian prior를 가정하면 L2 regularization과 동일한 형태의 MAP estimation으로 이어지며, Laplacian prior를 가정하면 L1 regularization과 같은 형태로 연결된다. 즉 정규화 기법은 단순한 heuristic이 아니라, 가중치에 대한 사전 확률 가정을 반영한 추론 과정으로 볼 수 있다. 따라서 다양한 데이터 조건과 prior 가정 하에서 Weight Decay 및 L1/L2 정규화가 모델의 안정성과 일반화 성능에 어떤 방식으로 기여하는지를 단계적으로 살펴본다.
머신러닝에서 우리는 관측된 데이터로부터 모델의 파라미터를 추정하는 문제를 다룬다. 이때 동일한 데이터를 잘 설명하는 파라미터가 여러 개 존재할 수 있기 때문에, 단순히 데이터 적합성만으로는 하나의 해를 선택하기 어려운 경우가 많다. Bayesian estimation은 이러한 문제를 확률적으로 접근하는 방법으로, 데이터뿐 아니라 파라미터에 대한 사전 지식을 함께 고려하여 추론을 수행한다. 이 과정에서 대표적으로 사용되는 두 가지 방법이 Maximum Likelihood (ML) estimation과 Maximum A Posteriori (MAP) estimation이다. 이 글에서는 ML과 MAP estimation의 기본 정의와 차이를 살펴보고, 이를 간단한 예시를 통해 직관적으로 이해해본다.
딥러닝 모델은 이미지 분류, 음성 인식, 자연어 처리와 같은 다양한 문제에서 뛰어난 성능을 보여준다. 그렇다면 신경망은 어떻게 이렇게 복잡한 문제들을 해결할 수 있을까? 가장 단순한 형태의 신경망은 입력 벡터 에 대해 선형 변환을 수행한다. 하지만 선형 함수만으로는 XOR 문제조차 해결할 수 없으며, 현실 세계의 복잡한 데이터 관계를 표현하기에는 한계가 있다. 이를 해결하기 위해 신경망은 Sigmoid, ReLU 와 같은 활성화 함수를 사용하여 비선형성을 추가한다. 놀랍게도 이러한 비선형 활성화 함수와 충분한 수의 뉴런만 있다면, 신경망은 우리가 원하는 거의 모든 함수를 원하는 정확도로 근사할 수 있다. 이 사실을 보장하는 이론이 바로 Universal Approximation Theorem (UAT) 이다. 이번 글에서는 간단한 XOR 예제부터 시작하여, 활성화 함수가 어떻게 Rectangular Function을 만들고, 이를 조합하여 복잡한 함수를 근사할 수 있는지 직관적으로 살펴본다.
Universal Approximation Theorem(UAT)에 따르면, 충분히 큰 신경망(MLP)은 어떤 연속 함수라도 근사할 수 있다. 즉 이론적으로는 Transformer가 구현하는 복잡한 함수도 DNN으로 표현하는 것이 가능하다. 하지만 실제 학습에서는 이야기가 다르다. MLP는 구조적인 inductive bias가 부족하기 때문에, 같은 함수를 표현할 수는 있어도 효율적으로 학습하기가 어렵다. 반면 Transformer는 self-attention 구조를 통해 입력 토큰 간 관계를 명시적으로 모델링하며, 이러한 inductive bias 덕분에 복잡한 sequence 문제를 훨씬 효율적으로 학습할 수 있다. 이 글에서는 이러한 관점에서 Transformer가 학습한 것을 DNN으로 distillation하는 것이 가능한지, 그리고 왜 단순하지 않은 문제인지 살펴본다.
in projects on Sampling, Probability, Distribution, Generation
컴퓨터는 어떻게 특정 확률분포에서 샘플을 간단한 함수 호출만으로 생성할 수 있을까? 확률분포란 특수한 환경에서 관측된 데이터들이 어떤 통계적 패턴을 가지는지 수학적으로 기술한 모델이다. 컴퓨터에서 이런 물리적 상황을 그대로 시뮬레이션하는 방식으로 확률변수 샘플을 얻을 수도 있지만, 이러한 접근은 일반적으로 비효율적이거나 경우에 따라서는 불가능한 경우도 많다. 그렇다면 컴퓨터에서는 어떻게 Gaussian이나 chi-square와 같은 다양한 확률분포의 샘플을 효율적으로 생성할 수 있을까? 그 해답이 바로 Inverse Transform Sampling 기법이다.
딥러닝 모델은 입력과 출력 사이의 패턴을 학습하고 학습된 패턴을 기반으로 새로운 입력에 대해 적절한 출력을 예측한다. 그리고 다양한 입력에 대해 잘 일반화(generalization)하기 위해 다양한 상황를 포함한 충분한 데이터가 필요하다. 하지만 실제로 모든 상황을 고려한 입력을 수집하는 것은 불가능하기 때문에 제한된 입력으로만 학습이 되는 경우가 많다. 데이터가 부족 하면 모델은 사전에 접한 입력에만 출력을 예측하고 새로운 입력에 대해 제대로 응답을 예측 못할 수 있다. 이러한 과적합 (overfitting) 현상을 완화하기 위해 실제로는 모델 복잡도를 조절하거나 학습을 안정화하는 다양한 정규화 (regularization) 기법들이 사용된다. 이번 포스트에서는 최근 모델에서 일반적으로 사용되는 다양한 정규화 기법들을 자세히 살펴본다.
in Unclassified on Blog, Github, Pages, Jekyll, Markdown
이번 포스트에서는 깃허브 블로그 작성에 사용되는 마크다운(Markdown) 에 대해 알아본다. 마크다운은 처음 접할 때는 문법이 다소 낯설게 느껴질 수 있지만, 한 번 익숙해지고 나면 HTML과 같은 다른 웹 기반 언어보다 훨씬 간결하고 편리하게 문서를 작성할 수 있다. 특히 코드 블록, 링크, 이미지, 표와 같은 요소들을 간단한 문법만으로 표현할 수 있어 기술 문서나 개발 블로그 작성에 널리 사용된다. 이번 글에서는 이러한 마크다운의 기본 문법과 실제 블로그 작성에서 자주 사용되는 기능들을 함께 살펴본다.