← --library
이과 · 21이과

인공지능 및 생성형 AI

AI & Generative AI

단계1단계2단계3단계4단계5

AI & 생성형 AI 1단계: 기계는 어떻게 배우는가?


이론적 기초 — 배경지식

기계학습을 이해하려면 먼저 질문 하나에서 시작해야 해. "학습이란 무엇인가?" 네가 어릴 때 "개"라는 개념을 배울 때를 떠올려봐. 누군가가 다리 네 개 달리고 짖는 동물을 가리키면서 "개야"라고 말했겠지. 그 다음엔 말티즈든 진돗개든, 처음 보는 개도 "개구나"라고 인식하게 됐어. 이게 바로 패턴 학습이야. 기계도 똑같아. 수많은 예시를 보여주고 "이게 정답이야"라고 알려주면, 기계는 그 속에서 패턴을 뽑아내. 이걸 수학적으로 엄밀하게 만든 게 **머신러닝(Machine Learning)**이야.

본격적인 내용으로 들어가기 전에, 두 가지 수학 도구를 챙겨가야 해. 첫째는 **함수(Function)**고, 둘째는 **미분(Differentiation)**이야. 함수는 입력을 받아서 출력을 내뱉는 기계야. f(x) = 2x + 3이라는 함수에 x = 5를 넣으면 13이 나오듯이, 머신러닝에서 모델 자체가 하나의 함수야 — 입력 데이터를 받아 예측값을 출력하는 함수. 미분은 "이 함수가 얼마나 가파르게 변하는가"를 측정하는 도구야. f(x) = x²의 미분은 f'(x) = 2x인데, 이건 x = 3일 때 함수가 기울기 6으로 증가 중이라는 뜻이야. 나중에 배울 경사하강법이 바로 이 미분을 이용해서 "어느 방향으로 가야 손실이 줄어드는가"를 계산하니까, 지금 당장 완벽히 이해 못해도 **"미분 = 방향을 알려주는 나침반"**이라고 기억해둬.

[노트 기록]: 함수 f(x): 입력 → 출력. 미분 f'(x): 함수의 기울기(순간 변화율). 머신러닝 = 데이터에서 패턴을 찾는 함수를 자동으로 만드는 과정.


본 내용 1: 선형 회귀 (Linear Regression)

첫 번째 모델로 들어가자. 아주 간단한 질문에서 시작해: "키와 몸무게 사이에 관계가 있을까?" 키가 170cm인 사람과 190cm인 사람이 있을 때, 후자가 더 무겁다는 건 경험적으로 알아. 그 관계를 직선 하나로 표현할 수 있다면? 바로 그게 **선형 회귀(Linear Regression)**야. 수학적으로 쓰면 ŷ = w·x + b인데, ŷ(y-hat)은 예측값, x는 입력(키), w는 가중치(weight), **b는 편향(bias)**이야. w는 직선의 기울기고, b는 y절편이야. 우리가 할 일은 주어진 데이터를 가장 잘 설명하는 w와 b를 찾는 거야.

"가장 잘 설명한다"는 게 수학적으로 무슨 의미냐고? 여기서 **손실 함수(Loss Function)**가 등장해. 예측값 ŷ와 실제값 y의 차이를 측정하는 함수야. 선형 회귀에서는 **평균 제곱 오차(MSE, Mean Squared Error)**를 써: L = (1/n) Σ(yᵢ - ŷᵢ)². 차이를 제곱하는 이유를 잠깐 생각해봐 — 예측값이 실제값보다 5 크거나 5 작아도 둘 다 "5만큼 틀렸다"고 봐야 하잖아? 그냥 빼면 (+5) + (-5) = 0이 되어 오류가 상쇄되어버려. 제곱하면 항상 양수가 되고, 큰 오류에 더 큰 패널티를 줄 수 있어. 이 L을 최소화하는 w와 b를 찾는 게 선형 회귀의 학습 목표야. 해석적으로 풀면 19세기 Gauss가 발견한 **최소제곱법(Ordinary Least Squares, OLS)**이 나오는데, 실제 딥러닝에서는 변수가 수백만 개라 이 방법이 불가능하고 그래서 나중에 나올 경사하강법을 써.

[노트 기록]: ŷ = wx + b. MSE: L = (1/n)Σ(y - ŷ)². 학습 목표 = 손실 함수를 최소화하는 w, b 찾기.


본 내용 2: 로지스틱 회귀 (Logistic Regression)

선형 회귀는 연속적인 숫자를 예측할 때 좋아. 근데 **"이 이메일이 스팸인가 아닌가?"**처럼 예/아니오로 답해야 하는 분류(Classification) 문제는 어떻게 하지? 잠깐 생각해봐 — 선형 회귀 ŷ = wx + b의 출력은 -∞부터 +∞까지 아무 값이나 나올 수 있는데, 확률은 반드시 0과 1 사이의 값이어야 해. 그래서 선형 회귀의 출력을 0~1 사이로 압축해주는 함수가 필요하고, 그게 바로 **시그모이드 함수(Sigmoid Function)**야: σ(z) = 1 / (1 + e^(-z)). z = wx + b를 시그모이드에 넣으면, 출력이 "이 데이터가 클래스 1(스팸)일 확률"이 돼. 0.5 이상이면 스팸, 미만이면 정상 메일로 분류하는 거야.

앞에서 배운 MSE 손실 함수도 바뀌어야 해. 분류에서는 **크로스 엔트로피(Cross-Entropy)**를 써: L = -[y·log(ŷ) + (1-y)·log(1-ŷ)]. 왜 좋은지 직접 느껴봐 — y = 1(스팸이 맞음)인데 ŷ = 0.01(스팸 아니라고 예측)이면 -log(0.01) ≈ 4.6, 엄청난 패널티야. 반면 ŷ = 0.99면 -log(0.99) ≈ 0.01로 패널티가 거의 없어. 잘 맞추면 손실이 작고, 크게 틀리면 손실이 폭발하는 구조야. (이건 정보이론의 Shannon entropy와 연결되는 개념이기도 한데, 나중에 자연스럽게 만나게 될 거야.)

[노트 기록]: 시그모이드 σ(z) = 1/(1+e^(-z)): 입력이 아무리 크거나 작아도 출력은 항상 (0, 1). 크로스 엔트로피: L = -[y·log(ŷ) + (1-y)·log(1-ŷ)].


본 내용 3: SVM (Support Vector Machine)

SVM은 분류 문제를 완전히 다른 관점에서 봐. 질문을 바꿔보자: "두 클래스를 나누는 경계선이 여러 개 가능할 때, 어떤 선이 가장 좋은 선이야?" SVM의 대답은 명확해 — 마진(Margin)이 최대인 선. 마진은 두 클래스의 가장 가까운 점들로부터 경계선까지의 거리를 합친 값이야. 이 경계에 가장 가까운 데이터 포인트들을 **서포트 벡터(Support Vector)**라고 불러. 직관적으로, 마진이 클수록 새로운 데이터에 대한 일반화 능력이 높아지는 거야. 수학적으로 SVM은 최적화 문제야: 마진을 최대화하되, 모든 데이터 포인트가 올바른 쪽에 있어야 한다는 제약 조건을 만족해야 해. 이걸 **제약 최적화(Constrained Optimization)**라고 하고, Lagrange multipliers라는 도구로 풀어.

SVM의 가장 강력한 아이디어는 **커널 트릭(Kernel Trick)**이야. 2D에서 선으로 분리 안 되는 데이터도 더 높은 차원으로 매핑하면 평면 하나로 분리될 수 있어. 도넛 모양의 데이터를 생각해봐 — 2D에선 원으로 나눠야 하지만, 3D로 띄우면 평면 하나로 자를 수 있잖아. 커널 함수(RBF, Polynomial 등)는 이 고차원 매핑을 실제로 계산하지 않고도 내적(dot product)을 통해 효율적으로 흉내 낼 수 있어. 이게 수학적으로는 Mercer's theorem에 기반한 아이디어야.

[노트 기록]: SVM = 마진 최대화 분류기. 서포트 벡터 = 경계에 가장 가까운 점들. 커널 트릭 = 저차원 데이터를 고차원으로 매핑해 선형 분리 가능하게 만듦.


본 내용 4: 신경망 기초 — 퍼셉트론 (Perceptron)

1958년, Frank Rosenblatt는 인간의 뇌 뉴런을 흉내 낸 수학적 모델을 만들었어. 바로 **퍼셉트론(Perceptron)**이야. 뇌의 뉴런은 여러 시냅스에서 신호를 받아 일정 임계값을 넘으면 발화(activate)하는데, 퍼셉트론도 똑같아: z = w₁x₁ + w₂x₂ + ... + wₙxₙ + b = w·x + b, output = f(z). 여기서 f는 **활성화 함수(Activation Function)**야. 자, 지금 선형 회귀와 로지스틱 회귀에서 봤던 구조와 거의 동일하지? 로지스틱 회귀는 사실 활성화 함수로 시그모이드를 쓰는 단층 퍼셉트론이야.

근데 퍼셉트론에는 치명적인 한계가 있어. XOR 문제야 — XOR은 두 입력이 다르면 1, 같으면 0을 출력하는데, 이건 직선 하나로 분리할 수가 없어. 1969년 Minsky와 Papert는 이 한계를 수학적으로 증명했고, AI의 첫 번째 겨울이 찾아왔어. 해결책은 층을 쌓는 거야 — 다층 퍼셉트론(MLP, Multi-Layer Perceptron). 입력층(Input Layer), 하나 이상의 은닉층(Hidden Layer), 출력층(Output Layer)으로 구성돼. 이렇게 하면 XOR도, 훨씬 복잡한 패턴도 학습할 수 있어.

여기서 중요한 질문을 던져볼게 — 왜 활성화 함수가 필요할까? 만약 f(z) = z(선형 함수)라면, 아무리 층을 쌓아도 결국 하나의 선형 변환이야. W₃(W₂(W₁x + b₁) + b₂) + b₃는 여전히 Wx + b 형태로 축약되거든. 비선형 활성화 함수가 있어야만 층을 쌓는 의미가 생겨. 현대에 가장 많이 쓰이는 건 ReLU(Rectified Linear Unit): f(x) = max(0, x). 단순하지만 강력하고, 미분하기 쉬워서 학습이 빠르게 돼.

[노트 기록]: MLP 구조: 입력층 → 은닉층(들) → 출력층. 활성화 함수 없으면 층을 쌓아도 선형 변환. ReLU: f(x) = max(0, x), 미분: x>0이면 1, x≤0이면 0.


본 내용 5: 역전파 (Backpropagation)

이제 핵심 중의 핵심이야. MLP가 어떻게 학습하는가? 가중치 w들을 어떻게 업데이트하는가? 원리는 이거야: 오류를 뒤로 전파한다. 입력이 앞으로 흘러가서(Forward Pass) 예측값 ŷ를 만들면, 그 예측값과 정답 y의 차이(손실 L)를 계산하고, 그 오류 신호를 출력층에서 입력층 방향으로 역으로 흘려보내며 각 가중치가 손실에 얼마나 기여했는지를 계산해. 이 기여도가 바로 그래디언트(Gradient), 즉 ∂L/∂w야.

수학적 도구는 **연쇄 법칙(Chain Rule)**이야. 합성 함수의 미분 규칙이야:

∂L/∂w₁ = (∂L/∂ŷ) · (∂ŷ/∂z) · (∂z/∂w₁)

이게 왜 대단한 아이디어냐고? 층이 100개가 넘어도, 연쇄 법칙으로 미분을 체인처럼 연결하면 모든 가중치에 대한 그래디언트를 한 번의 역방향 패스로 계산할 수 있어. 1986년 Rumelhart, Hinton, Williams가 이 알고리즘을 신경망에 적용하는 논문을 Nature에 발표했고(Learning representations by back-propagating errors, Nature 1986), 이게 현대 딥러닝의 초석이 됐어. 역전파를 직관적으로 이해하려면 책임 분배를 생각해봐. 최종 손실이 크다는 건 어딘가에서 잘못됐다는 거고, 역전파는 "이 손실에 대해 각 가중치가 얼마나 책임이 있냐?"를 묻는 거야. 연쇄 법칙은 이 간접적 책임의 크기를 정확하게 계산해줘.

[노트 기록]: 연쇄 법칙: ∂L/∂w = (∂L/∂output) × (∂output/∂z) × (∂z/∂w). 역전파 = 연쇄 법칙으로 각 가중치의 그래디언트를 출력층 → 입력층 방향으로 계산.


본 내용 6: 경사하강법 및 최적화 알고리즘

역전파로 각 가중치의 그래디언트 ∂L/∂w를 구했어. 이제 이걸로 뭘 하냐고? **경사하강법(Gradient Descent)**은 이렇게 작동해:

w ← w - η · (∂L/∂w)

η(eta)는 **학습률(Learning Rate)**이야. 그래디언트의 반대 방향으로 w를 조금씩 이동시키는 거야. 왜 반대 방향? 그래디언트는 "손실이 가장 빠르게 증가하는 방향"이니까, 반대로 가면 손실이 줄어들어. 산 정상에서 눈 감고 내려오는 걸 상상해봐 — 발 아래 경사를 느끼고(그래디언트 계산), 가장 가파른 내리막 방향으로 한 발을 내딛는 거야(파라미터 업데이트). η가 너무 크면 발을 너무 크게 내딛다가 반대편 산으로 올라가버리고(발산), 너무 작으면 영원히 내려오는 거야(수렴 속도 저하).

**확률적 경사하강법(SGD, Stochastic Gradient Descent)**은 전체 데이터셋 대신 랜덤하게 선택한 작은 배치의 샘플로 그래디언트를 계산해. 노이즈가 많지만 훨씬 빠르고, 로컬 미니멈(지역 최솟값)을 탈출하는 데 도움이 되기도 해. 여기서 SGD의 문제가 있어 — 학습 과정이 불안정하게 진동하고, 어떤 파라미터는 너무 자주 업데이트되고 어떤 건 너무 드물게 업데이트돼. 이걸 해결하기 위해 더 발전한 알고리즘이 나와.

**Adam(Adaptive Moment Estimation)**은 2015년 Diederik Kingma와 Jimmy Ba가 발표한 최적화 알고리즘이야(Kingma & Ba, Adam: A Method for Stochastic Optimization, ICLR 2015). 두 가지 아이디어를 합쳐. 첫째, 모멘텀(Momentum): 이전 그래디언트의 방향성을 기억해서 공이 구르는 것처럼 관성을 줘. 계속 같은 방향으로 갔다면 더 빠르게 가고, 방향이 바뀌면 속도를 줄여. 둘째, 적응적 학습률: 자주 업데이트된 가중치는 학습률을 줄이고, 드물게 업데이트된 가중치는 학습률을 높여. 수식으로 쓰면:

mₜ = β₁mₜ₋₁ + (1-β₁)gₜ        (1차 모멘트: 그래디언트 지수 이동평균)
vₜ = β₂vₜ₋₁ + (1-β₂)gₜ²       (2차 모멘트: 그래디언트 제곱 지수 이동평균)
w ← w - η · m̂ₜ / (√v̂ₜ + ε)

기본값 β₁ = 0.9, β₂ = 0.999, ε = 1e-8이야. 이 기본값이 대부분의 상황에서 잘 작동한다는 게 실험적으로 검증되어 있어. 참고로 m̂ₜ, v̂ₜ는 초기 편향 보정(bias correction)이야 — 학습 초반에 m과 v가 0으로 초기화되어 있어서 과소 추정되는 걸 보정해줘.

[노트 기록]: w ← w - η·(∂L/∂w). η = 학습률. Adam = 모멘텀 + 적응적 학습률. β₁=0.9, β₂=0.999. 실무에서 기본 옵티마이저로 Adam을 가장 많이 써.

이제 지금까지 배운 걸 전체 사이클로 연결해봐: 데이터를 받아서(입력층 → 은닉층 → 출력층, Forward Pass) → 손실을 계산하고(MSE 또는 Cross-Entropy) → 역전파로 그래디언트를 구하고(연쇄 법칙) → Adam으로 가중치를 업데이트해. 이걸 수천, 수만 번 반복하면 모델이 데이터에서 패턴을 학습한 거야. 이게 현대 딥러닝 전체의 핵심 사이클이야.


프로젝트 — 지금부터는 네 차례야

아래 세 가지 예제 문제가 있어. 정답은 없어. 직접 손으로 계산하고, 코드로 구현해봐. 막히면 위에서 배운 개념들을 다시 짚어봐 — 공식을 외우는 게 아니라, 각 기호가 무엇을 의미하는지를 느끼면서 풀어. 전체 풀이 시간 목표는 약 40분이야.


예제 1 — 선형 회귀 한 스텝 직접 계산 (약 10분)

아래 3개의 데이터 포인트가 있어: (x=1, y=2), (x=2, y=4), (x=3, y=5). 초기 가중치 w = 0, b = 0, 학습률 η = 0.1이야.

(1) 현재 w, b로 세 점에 대한 예측값 ŷ를 각각 계산해봐. (2) MSE 손실 L을 계산해봐. (3) ∂L/∂w와 ∂L/∂b를 손으로 유도해봐. (힌트: MSE를 w에 대해 편미분하면 ∂L/∂w = -(2/n)Σ(yᵢ - ŷᵢ)xᵢ가 나와. b에 대해서도 같은 방식으로 유도해봐.) (4) w와 b를 한 스텝 업데이트해봐. (5) 업데이트 후 예측값과 손실을 다시 계산해서, 손실이 줄었는지 확인해봐.


예제 2 — 퍼셉트론으로 AND 게이트와 XOR의 한계 (약 10분)

AND 게이트의 진리표: (0,0)→0, (0,1)→0, (1,0)→0, (1,1)→1.

(1) 이 4개의 점을 2D 좌표계에 그려봐. 출력이 0인 점과 1인 점을 다른 모양으로 표시하고, 두 그룹을 나누는 직선을 그어봐. 왜 AND는 **선형 분리 가능(Linearly Separable)**한지 기하학적으로 설명해봐. (2) 초기 w = [0.1, 0.1], b = -0.2로 시작해서, 입력 (1,1)에 대한 순전파를 단계별로 계산해봐: z 계산 → 시그모이드 적용 → 확률값 출력. (3) 정답은 y = 1이야. Binary Cross-Entropy 손실 L을 계산해봐. (4) 이번엔 XOR 게이트의 진리표를 직접 그리고, 같은 방식으로 2D 좌표계에 점을 찍어봐. 단층 퍼셉트론으로 왜 풀 수 없는지 기하학적으로 설명하고, 이걸 MLP로 풀려면 은닉층이 최소 몇 개 노드 필요할지 구조를 제안해봐.


예제 3 — 역전파 추적하기 (약 20분)

아래 2층 신경망이 있어:

  • 입력: x = 2
  • Layer 1: z₁ = w₁·x + b₁ (w₁=0.5, b₁=0), a₁ = ReLU(z₁)
  • Layer 2: z₂ = w₂·a₁ + b₂ (w₂=-1, b₂=0), ŷ = σ(z₂) (시그모이드)
  • 정답: y = 1
  • 손실: Binary Cross-Entropy L = -[y·log(ŷ) + (1-y)·log(1-ŷ)]

(1) 순전파를 단계별로 계산해봐: z₁, a₁, z₂, ŷ를 순서대로 구해. (2) 손실 L을 계산해봐. (3) 역전파를 연쇄 법칙으로 추적해봐. 아래 순서대로 각 그래디언트를 손으로 계산해: ∂L/∂ŷ∂L/∂z₂∂L/∂w₂ 그리고 ∂L/∂a₁∂L/∂z₁∂L/∂w₁. (힌트: 시그모이드 미분 σ'(z) = σ(z)(1-σ(z)), ReLU 미분은 z > 0이면 1, z ≤ 0이면 0이야.) (4) 학습률 η = 0.1로 w₁, w₂를 각각 업데이트해봐. 업데이트 후 w의 부호와 크기가 어떻게 변했는지 직관적으로 해석해봐 — "왜 이 방향으로 움직였을까?" (5) (도전) NumPy만 써서 위 과정을 코드로 구현해봐. 100번 반복 학습하면서 손실값을 10번마다 출력해봐. 손실이 어떻게 변하는지 관찰하고, η = 0.01, η = 1.0으로 바꿔보면 어떤 차이가 나타나는지 실험해봐.


40분 뒤에 어디까지 풀었는지, 어디서 막혔는지, 손실이 왜 줄거나 늘었는지 가져와봐. 역전파의 각 기호가 단순한 미분 기호가 아니라 **"이 가중치가 최종 손실에 얼마나 책임이 있는가"**라는 의미를 몸으로 느끼게 되면, 1단계의 핵심은 소화한 거야.

단계 2