1강 - AI, ML, DL의 관계
| AI → ML → DL의 관계 | 인공지능(AI)은 가장 상위 개념, 그 안에 머신러닝(ML), 그 안에 딥러닝(DL)이 포함됨 | “AI가 가장 넓은 개념이며, 딥러닝은 머신러닝의 하위 집합이다.” |
| AI의 정의 | 인간의 지능을 기계 또는 시스템으로 모방한 것 | “AI는 인간 지능의 시뮬레이션이다.” |
| 머신러닝의 정의 | 명시적인 프로그래밍 없이 데이터를 통해 학습하는 기술 | “기계가 스스로 학습하도록 만든 기술이다.” |
| 딥러닝의 정의 | 신경망(Neural Network)을 기반으로 한 머신러닝의 한 분야 | “딥러닝은 신경망 기반의 학습 기술이다.” |
| AI의 역사 (타임라인) | - 1956년: AI 용어 최초 등장 - 1958년: 퍼셉트론 개발 - AI 겨울 1, 2회 - 1990년대: SVM, Deep Blue - 2006년: 딥러닝 개념 등장 |
“AI는 여러 번의 실패와 재도전을 거쳐 딥러닝을 중심으로 부활했다.” |
| AI 시스템 구성 개념 | 입력(X) → 과업(Task) 정의 → 출력(Y), 즉 함수 f(X)로 모델링 | “AI는 입력을 받아 과업에 따라 출력을 생성하는 함수 시스템이다.” |
| 머신러닝의 역할 | 입력-출력 데이터를 통해 함수 f(X)를 학습하고 추정 | “머신러닝은 AI의 함수 f(X)를 만드는 도구이다.” |
| 딥러닝의 차별점 | 선행 지식 없이 학습 가능, 데이터만으로도 학습 가능 | “딥러닝은 사전 지식 없이도 많은 데이터를 통해 더 나은 모델을 만들 수 있다.” |
| 데이터와 성능 관계 (ML vs DL) | ML: 데이터 증가 시 성능 제한 있음 DL: 데이터 증가 → 더 깊은 모델 학습 가능 → 성능 향상 가능 |
“딥러닝은 데이터가 많을수록 성능이 향상되는 유일한 모델이다.” |
이번 강의에서는 딥러닝(deep learning)에 대한 간략한 개요를 살펴보겠습니다.
먼저 인공지능(AI), 머신러닝(machine learning), 딥러닝(deep learning)이라는 용어에 대해 이야기해볼까요? 이 중에서 가장 큰 개념은 무엇일까요? 바로 인공지능(AI)입니다. 그 다음으로 큰 개념은 머신러닝, 마지막으로 딥러닝은 머신러닝의 하위 개념입니다.
그렇다면 AI란 무엇일까요?
AI는 인간의 지능을 기계나 컴퓨터 시스템이 모방하도록 만든 기술을 말합니다.
그렇다면 머신러닝은?
머신러닝은 기계가 명시적으로 프로그래밍되지 않아도 스스로 학습할 수 있도록 하는 기술을 의미합니다.
딥러닝은 무엇일까요?
딥러닝은 신경망(neural network)에 기반한 머신러닝의 한 분야입니다.
이제 AI와 딥러닝의 발전 과정을 간략히 살펴보겠습니다.
1956년, 존 매카시(John McCarthy)가 AI라는 용어를 처음으로 학회에서 언급했습니다.
2년 후, 뇌의 뉴런을 모방한 알고리즘인 퍼셉트론(perceptron)이 개발되었습니다.
하지만 시간이 지나면서 퍼셉트론의 한계가 드러나게 되었고, 이 시기의 AI는 대부분 규칙 기반(rule-based) 시스템으로 구현되었습니다.
이로 인해 첫 번째 AI 겨울이 찾아오게 됩니다.
하지만 이 시기에도 일부 연구자들은 퍼셉트론에 집중했고, 결국 다층 퍼셉트론(Multi-Layer Perceptron)이 개발됩니다.
하지만 여전히 학습 방법에 대한 한계가 존재했기에, 다시 두 번째 AI 겨울이 찾아옵니다.
1990년대에는 서포트 벡터 머신(SVM)과 같은 다른 머신러닝 기술들이 발전했고,
이 시기에는 체스를 인간보다 잘 두는 AI인 딥 블루(Deep Blue)처럼 머신러닝 기반의 다양한 AI 시스템이 등장했습니다.
2006년, 딥러닝(deep learning)이라는 개념이 제안되었고, 이후 많은 딥러닝 기반 모델들이 등장하게 됩니다.
지금은 Watson, AlphaGo와 같은 다양한 딥러닝 기반 AI 시스템들이 존재합니다.
지금까지 AI, 머신러닝, 딥러닝의 개념을 정리하고, 역사적 흐름을 살펴보았습니다.
이제 AI 시스템을 좀 더 자세히 이해해보겠습니다.
AI 시스템은 어떤 입력 데이터를 받아 특정 과업을 수행하고, 그에 따른 출력 결과를 제공합니다.
예를 들어, 바둑 AI를 생각해 봅시다.
입력은 지금까지의 수(바둑판 상태)이고, 과업은 다음 수를 결정하여 이기는 것입니다.
그러면 AI는 가능한 다음 수를 출력하게 됩니다.
수학적으로 AI 시스템을 표현해볼 수도 있습니다.
입력을 X, 출력을 Y라고 하면, AI 시스템은 X를 입력받아 Y를 출력하는 함수 f(X)라고 볼 수 있습니다.
그렇다면 이 함수는 어떻게 만들 수 있을까요?
이때 머신러닝이 사용됩니다.
입력 데이터(X′)와 정답 데이터(Y′)가 주어지면, 머신러닝을 통해 X에서 Y로 가는 함수 f(X)를 학습할 수 있습니다.
이 함수를 통해 AI 시스템을 구축할 수 있고, 더 나은 머신러닝 기법을 쓰면 더 똑똑한 AI가 됩니다.
하지만 전통적인 머신러닝에는 한 가지 문제가 있습니다.
좋은 함수를 학습하려면 선행 지식(prior knowledge)이 필요하다는 점입니다.
반면에, 딥러닝은 이러한 선행 지식 없이도 오직 데이터만으로 학습이 가능합니다.
이것이 오늘날 딥러닝이 주목받는 이유입니다.
전통적인 머신러닝에서는 데이터를 더 많이 주더라도 성능 향상이 어렵지만,
딥러닝에서는 데이터가 많아질수록 모델을 더 깊게 학습시킬 수 있고, 성능도 향상됩니다.
2강 - 딥러닝 수학, 통계
| 개념 | 정의 | 대표 수식 | 설명 |
| 확률 변수 | 무작위 사건에 따라 값이 달라지는 변수 | 없음 | 예: 동전 던지기 결과 (앞: 1, 뒤: 0), 주사위 결과 (1~6 중 하나) |
| 확률 질량 함수 (PMF) |
이산 확률 변수의 각 값에 대한 확률을 정의 | ∑_x P(x) = 1, 0 ≤ P(x) ≤ 10 | 예: 주사위의 각 면 확률은 1 / 6 |
| 확률 밀도 함수 (PDF) |
연속 확률 변수에 대한 확률 분포 함수 | ∫P(x) dx=1, P(x) ≥ 0 | 연속 확률에서 면적(적분값)이 전체 확률 1을 나타냄 |
| 결합 확률 | 두 변수 X, Y가 동시에 특정 값을 가질 확률 | P(X, Y) | 예: P(동전 = 앞, 주사위 = 6) |
| 주변 확률 | 전체 변수 중 일부에 대한 확률 분포 | PMF: P(X) = ∑_y P(X, Y), PDF: P(X) = ∫P(X, Y) dy |
Y를 제거한 후 X만 남는 확률 분포 |
| 조건부 확률 | 어떤 사건이 발생했을 때 다른 사건이 발생할 확률 | P(Y∣X)=P(X,Y) / P(X), 단 P(X) > 0 |
예: 비가 올 확률(전체)과 "흐림일 때 비 올 확률"은 다름 |
| 체인 룰 (Chain Rule) |
다변수 결합 확률을 조건부 확률의 곱으로 분해 | P(A,B,C) = P(A∣B,C) P(B∣C) P(C) | 다변수 확률을 한 변수씩 조건부 확률로 전개 가능 |
| 독립성 | 두 사건이 서로 영향을 주지 않음 | P(X,Y) = P(X) ⋅ P(Y) | 예: 동전 던지기와 주사위 굴리기 |
| 조건부 독립성 | 제3의 조건 하에 독립 | P(X,Y∣Z) = P(X∣Z) ⋅ P(Y∣Z) | Z가 주어졌을 때 X, Y는 독립 |
| 기댓값 (Expectation) |
확률 분포 하에서 어떤 함수의 평균 예상값 | PMF: E[f(X)] = ∑_x P(x) f(x) | 예: 주사위의 평균값은 ∑_{i=1} ^6 1 / 6 ⋅ i=3.5 |
| 분산 (Variance) |
값들이 기댓값 주변에 얼마나 퍼져 있는지를 측정 | Var(f(X)) = E[(f(X) − E[f(X)]) ^2] | 값이 평균 주변에 모이면 분산 작고, 퍼지면 큼 |
| 공분산 (Covariance) |
두 변수의 선형적 관계 정도 측정 | Cov(f, g) = E[(f − E[f])(g − E[g])] | 두 함수가 동시에 오르내리면 공분산 양수, 반대면 음수 |
| 정보량 (Information) |
사건의 놀라움 정도 (정보의 양) | Information(x) = −logP(x) | 자주 일어나는 사건일수록 정보량 작음 (예: 해가 뜬다) |
| 엔트로피 (Entropy) |
확률 분포 전체의 불확실성 | H(X) = E[−logP(X)] | 엔트로피가 높을수록 예측이 어려운 분포 |
| KL 발산 | 두 확률 분포의 차이 측정 | D_{KL}(P∥Q) = ∑_x P(x) log {P(x) / Q(x)} | P와 Q가 같을수록 발산 값이 작음 |
| 크로스 엔트로피 | 실제 분포 P와 예측 분포 Q 사이의 평균 정보량 | H(P, Q) = H(P) + D_{KL}(P∥Q) | 분류 문제에서 자주 사용되며, 모델이 예측한 확률과 실제 정답의 차이를 측정 |
이번 영상에서는 딥러닝을 위한 기본 수학 개념들을 소개합니다. 먼저 선형대수의 주요 용어들을 살펴보겠습니다.
먼저 스칼라(scalar)는 단일 숫자를 의미합니다. 보통 소문자 기호로 표기합니다.
다음은 벡터(vector)입니다. 벡터는 숫자의 배열로, 보통은 바를 씌운 소문자로 나타냅니다.
이제 행렬(matrix)을 보겠습니다. 행렬은 숫자로 구성된 2차원 배열입니다. 행렬은 대문자 기호로 표기하며, 여러 벡터로 구성되어 있습니다. 행 방향 성분은 row vector, 열 방향 성분은 column vector라고 부릅니다.
마지막으로, 다차원 배열은 텐서(tensor)라고 부릅니다.
이제 기본 연산들을 알아봅시다.
여러분은 아마 행렬 덧셈이나 행렬 곱셈에 익숙할 것입니다.
행렬 곱셈에서는 첫 번째 행렬의 열 개수와 두 번째 행렬의 행 개수가 같아야 합니다.
예시를 통해 보면, 첫 번째 행렬의 행 벡터와 두 번째 행렬의 열 벡터를 순차적으로 곱하여 새로운 결과를 생성하게 됩니다.
행렬 곱셈은 분배법칙(distributive)과 결합법칙(associative)이 성립하지만, 교환법칙(commutative)은 성립하지 않습니다.
다음은 선형대수의 기초 개념입니다.
- 전치(transpose): 행과 열을 뒤바꾸는 연산입니다. 예를 들어, 행렬 A에 전치를 적용하면 대각선을 기준으로 위쪽과 아래쪽 삼각 영역이 바뀌게 됩니다.
- 단위 행렬(identity matrix): 대각선 성분은 1이고 나머지는 모두 0인 행렬입니다. 단위 행렬을 벡터에 곱하면 벡터 자체가 그대로 나옵니다.
- 역행렬(inverse matrix): 어떤 행렬 A에 대해 A의 역행렬을 곱하면 단위 행렬이 됩니다. 역행렬은 분배 연산이 가능합니다.
- 트레이스(trace): 행렬의 모든 대각선 성분의 합입니다.
이제 놈(norm)에 대해 알아봅시다. 놈은 벡터의 "크기"를 측정하는 함수입니다. 놈은 벡터의 각 성분의 크기를 특정 거듭제곱으로 더한 값을 기반으로 정의됩니다.
- p=1일 때는 L1 놈,
- p=2일 때는 L2 놈이라고 부릅니다.
다음은 선형 독립(linear independence)입니다.
벡터 집합이 선형 독립이라는 것은, 어느 벡터도 다른 벡터들의 선형 조합으로 표현할 수 없다는 뜻입니다.
예를 들어, 세 벡터가 서로 독립이라면, 그 중 하나를 나머지 두 개로 만들 수 없어야 합니다.
반대로, 어떤 벡터가 다른 둘의 선형 조합으로 만들어진다면, 그 세 벡터는 선형 종속입니다.
행렬의 랭크(rank)는 선형 독립인 열 벡터의 최대 개수입니다.
예를 들어, 세 개의 열 벡터가 모두 독립이라면 랭크는 3입니다. 만약 그 중 하나가 다른 둘의 조합이라면 랭크는 2입니다.
다음은 특수한 행렬 및 벡터에 대한 설명입니다.
- 길이가 1인 벡터는 단위 벡터(unit vector)입니다.
- 전치한 행렬이 자기 자신과 같으면 대칭 행렬(symmetric matrix)입니다.
- 대각선 이외의 모든 성분이 0이면 대각 행렬(diagonal matrix)입니다.
여기까지 선형대수의 주요 표기법, 연산, 개념들을 살펴봤습니다.
이제 확률과 정보이론의 기본 개념을 보겠습니다.
먼저 확률 변수(random variable)는 무작위로 다양한 값을 가질 수 있는 변수입니다.
예를 들어 동전을 던지면 앞면 또는 뒷면(0 또는 1)이 나올 수 있고, 주사위를 던지면 1부터 6까지 나올 수 있습니다.
확률 질량 함수(PMF, probability mass function)는 이산 확률 변수에 대한 확률 분포를 나타냅니다.
- 모든 X에 대해 P(X)는 0과 1 사이의 값을 가져야 하며,
- 전체 확률의 합은 1이어야 합니다.
예를 들어 주사위라면 각 눈금의 확률은 1/6입니다.
확률 밀도 함수(PDF, probability density function)는 연속 확률 변수에 대한 분포를 나타냅니다.
- 모든 X에 대해 P(X)는 0 이상이어야 하며,
- 전체 면적(적분)은 1이 되어야 합니다. 즉, 함수 아래 면적이 1입니다.
결합 확률(joint probability)는 여러 개의 변수 조합에 대한 확률 분포입니다.
예: P(X, Y)는 X와 Y라는 두 변수의 결합 분포입니다.
주변 확률(marginal probability)는 하나의 변수에 대해 다른 변수들을 제거한 확률입니다.
- 이산 변수일 경우 P(X)는 모든 Y에 대해 P(X, Y)를 더한 값입니다.
- 연속 변수일 경우는 P(X, Y)에 대해 Y를 적분하여 얻습니다.
조건부 확률(conditional probability)은 어떤 사건이 일어난 조건하에서 다른 사건이 일어날 확률입니다.
- 수식: P(Y | X) = P(X, Y) / P(X)
- 단, P(X)는 0보다 커야 합니다.
체인 룰(chain rule)은 여러 확률 변수의 결합 분포를 조건부 확률들의 곱으로 분해하는 법칙입니다.
예:
P(A, B, C) = P(A | B, C) × P(B | C) × P(C)
이어서, 다변수에 대한 결합 확률 분포 P(A, B, C)와 같은 표현은 반복적으로 조건부 확률 분포로 분해할 수 있습니다. 이처럼 한 변수에 대한 조건부 분포들로 바꿀 수 있습니다.
이제 독립성(independence)에 대해 알아보겠습니다.
예를 들어, 동전을 던지는 사건과 주사위를 굴리는 사건은 서로 독립입니다.
모든 X(동전 던지기 결과)와 모든 Y(주사위 결과)에 대해 결합 확률 P(X, Y)가 P(X) × P(Y)와 같다면, 두 변수는 독립(independent)이라고 말할 수 있습니다.
이제 조건부 독립(conditional independence)을 살펴봅시다.
만약 P(X,Y∣Z)=P(X∣Z) × P(Y∣Z)라면, X와 Y는 Z에 대해 조건부 독립입니다.
다음은 기댓값(expectation) 개념입니다.
기댓값은 어떤 함수 f(X)에 대해, 확률 분포 P(X)에 기반한 평균적인 예상 값을 의미합니다.
즉, X가 확률 분포로부터 샘플링되었을 때 함수 f가 가지는 평균값입니다.
수식으로 표현하면 다음과 같습니다:
- 이산 확률 변수일 경우:
E[f(X)] = ∑P(X) ⋅ f(X) - 연속 확률 변수일 경우는 적분으로 표현됩니다.
이제 분산(variance)에 대해 알아봅시다.
분산은 함수 f(X)의 값이 얼마나 평균값 주변에서 퍼져 있는지를 나타내는 척도입니다.
다시 말해, 함수 값이 기대값과 얼마나 다른지를 측정합니다.
Var(f(X)) = E[(f(X) − E[f(X)])^2]
값이 작을수록 대부분의 데이터가 평균 근처에 있다는 것을 의미합니다.
다음은 공분산(covariance)입니다.
공분산은 두 변수 또는 함수 f와 g가 서로 얼마나 선형적으로 관련되어 있는지를 나타내는 척도입니다.
정의는 다음과 같습니다:
Cov(f, g) = E[(f − E[f]) (g − E[g])]
공분산 값이 클수록 두 변수는 평균값을 기준으로 같은 방향으로 함께 변동한다는 것을 의미합니다.
이제 몇 가지 대표적인 확률 분포들을 알아보겠습니다.
- 베르누이 분포(Bernoulli distribution): 두 가지 결과(예: 동전 앞/뒤)를 갖는 이산 분포입니다.
- 가우시안 분포(Gaussian distribution): 흔히 정규 분포(normal distribution)라고 부르며, 평균과 표준편차를 통해 표현됩니다.
- 지수 분포(exponential distribution): 시간 간격이나 대기 시간 등에 자주 사용되며, 파라미터에 따라 기울기가 바뀝니다.
이제 베이즈 정리(Bayes’ Rule)를 살펴보겠습니다.
P(X∣Y) = P(Y∣X) ⋅ P(X) / P(Y)
이 정리는 머신러닝에서 매우 중요합니다. 실제로는 P(X∣Y)를 직접 계산하기 어렵지만, 베이즈 정리를 사용하면 P(Y∣X), P(X), P(Y)를 이용해 간접적으로 계산할 수 있습니다. 이는 현실 세계 문제를 푸는 데 핵심이 됩니다.
정보 이론(information theory)에 대해서도 알아보겠습니다.
확률과 정보량 사이의 관계에서, 발생 가능성이 높은 사건은 정보량이 낮고, 발생 가능성이 낮은 사건은 정보량이 높습니다.
예를 들어, “내일 해가 뜰 것이다”는 매우 자명한 사실이므로 정보량이 낮습니다.
반면, “내일 해가 뜨지 않을 것이다”는 거의 일어나지 않기 때문에, 정보량이 높습니다.
이러한 정보량은 다음과 같이 음의 로그 확률로 표현됩니다:
Information(x) = −logP(x)
이제 엔트로피(entropy)를 살펴봅시다.
엔트로피는 전체 확률 분포의 불확실성 정도를 나타내며, 정보량의 기댓값으로 정의됩니다:
H(X) = E[−logP(X)]
앞으로 배우게 될 개념 중 하나는 KL 발산(Kullback-Leibler divergence)입니다.
KL 발산은 두 확률 분포 P와 Q 간의 차이를 측정하는 지표입니다:
D_{KL}(P∥Q) = E_P[logP(X) − logQ(X)]
KL 발산과 관련된 개념으로는 크로스 엔트로피(cross-entropy)가 있으며, 이는 KL 발산을 포함하는 형태로 나타납니다.
3강 - 지도 학습
| 분류 (Classification) | 회귀 (Regression) | |
| 정의 | 입력과 정답(레이블)을 바탕으로 데이터를 카테고리(클래스)로 분류하는 문제 | 입력을 바탕으로 연속적인 수치 값을 예측하는 문제 |
| 출력값 | 범주형 (예: 사과, 바나나) | 실수형 (예: 가격, 온도) |
| 입력값 | 특성(feature) 벡터 (예: 색, 형태, 부드러움 등) | 특성(feature) 벡터 (예: 주행 거리 등) |
| 학습 목표 | 분류 경계(Decision Boundary)를 찾아 새로운 데이터를 분류 | 입력과 출력의 관계를 나타내는 함수(회귀식)를 추정 |
| 대표 예시 | 사과 vs 바나나 분류, 다중 클래스(사과/오렌지/바나나) 분류 | 중고차 주행거리로 가격 예측 |
| 모델 표현 | 결정 경계 함수 g(, ex: 선형 또는 비선형 경계 | 예측 함수 y^ = f(x), ex: 선형 또는 다항식 |
| 오차 정의 | 분류 오류 = 잘못 예측한 개수의 합 | 회귀 오차 = 예측값과 실제값의 차이 (예: MSE) |
| 오버피팅/언더피팅 | 너무 단순하면 언더피팅, 너무 복잡하면 노이즈까지 학습 (오버피팅) | 동일하게 적용됨, 고차 함수는 과적합 위험 있음 |
| 고차원 특성 사용 시 문제 | 차원의 저주 발생 가능 (복잡한 모델로 이어짐) → 단순하고 적절한 특성 선택 필요 | 불필요한 특성은 제거하고 핵심 특성 유지가 중요 |
| 다중 클래스 확장 | 여러 이진 분류를 결합하여 다중 클래스 분류 수행 (One-vs-Rest 방식 등) | 해당 없음 (회귀는 연속값 예측이므로 다중 클래스 개념 없음) |
✅ 요약 Insight:
- 지도학습은 입력-출력 쌍을 기반으로 학습하는 것이 핵심이며,
- 분류는 클래스 예측, 회귀는 수치 예측을 목표로 한다.
- 두 경우 모두 모델의 복잡도 조절, 적절한 특성 선택, 오차 최소화가 중요하다.
이번 영상에서는 지도학습(Supervised Learning)에 대해 배워보겠습니다.
머신러닝은 크게 세 가지 범주로 나눌 수 있습니다:
- 지도학습 (Supervised Learning)
- 비지도학습 (Unsupervised Learning)
- 강화학습 (Reinforcement Learning)
지도학습의 목표는 입력과 출력 데이터를 바탕으로 예측 모델을 학습하는 것입니다.
반면 비지도학습의 목표는 입력 데이터만 가지고 이를 군집화하거나 구조를 해석하는 것이며, 출력(label)이 필요 없습니다.
강화학습은 환경과의 상호작용을 통해 경험을 바탕으로 학습합니다.
이제 지도학습과 비지도학습을 좀 더 자세히 살펴보겠습니다.
- 지도학습은 분류(Classification)와 회귀(Regression)로 나뉘고,
- 비지도학습은 군집화(Clustering)와 차원 축소(Dimensionality Reduction)로 나뉩니다.
각 범주에는 다양한 응용이 존재합니다. 예를 들어:
- 분류(Classification): 진단 시스템, 이미지 분류
- 회귀(Regression): 시장 예측, 인구 성장 예측
- 군집화(Clustering): 타겟 마케팅, 고객 세분화
- 차원 축소(DR): 구조 발견, 빅데이터 시각화 등
오늘은 지도학습 중에서도 분류(classification)와 회귀(regression)에 대해 이야기하겠습니다.
우선 분류 문제부터 살펴보겠습니다.
분류의 목표는 입력과 출력(label) 데이터를 이용하여 예측 모델을 학습하는 것입니다.
즉, 여기서 중요한 요소는 입력(input), 출력(output), 모델(model) 세 가지입니다.
1. 출력(Output)이란?
분류 문제에서 출력(label)이란 데이터의 정답입니다.
예를 들어 사과와 바나나를 분류하는 문제에서는 각 이미지의 라벨이 ‘사과’ 또는 ‘바나나’입니다.
이 경우 두 개의 클래스가 있으므로, 이는 이진 분류(Binary Classification) 문제입니다.
2. 입력(Input)이란?
입력은 데이터의 특징(feature)을 의미합니다.
다시 사과와 바나나 예시로 돌아가 보겠습니다.
- 색상: 사과는 보통 빨갛고, 바나나는 노랗습니다.
- 형태: 사과는 둥글고, 바나나는 길쭉합니다.
이처럼 색상과 형태는 사과와 바나나를 구분할 수 있는 주요 특징이 됩니다.
색상은 RGB 값으로 표현할 수 있고, 형태는 가로:세로 비율(width-to-height ratio) 등으로 표현할 수 있습니다.
이 두 가지 특징으로 데이터를 2차원 공간에 시각화할 수 있습니다.
예를 들어:
- 사과는 RGB 값이 높고 비율이 낮기 때문에 오른쪽 아래에 위치하고,
- 바나나는 RGB 값이 낮고 비율이 높아 왼쪽 위에 위치하게 됩니다.
이제 사과 10개, 바나나 10개를 이 공간에 배치하면, 각 클래스는 일정한 분포를 갖게 됩니다.
이 데이터를 기반으로 모델을 학습시키면, 두 클래스를 구분하는 결정 경계(decision boundary)를 학습할 수 있습니다.
이 결정 경계가 바로 모델입니다.
새로운 데이터가 들어오면, 그 데이터의 특징값을 결정 경계 함수에 넣고
- 경계 왼쪽이면 바나나,
- 오른쪽이면 사과로 분류(prediction)할 수 있습니다.
이제 이 과정을 수학적으로 표현해 보겠습니다.
수학적 표현:
- 하나의 데이터는 특징 벡터 x=[f1, f2]로 표현됩니다.
(예: f₁ = RGB 값, f₂ = 가로세로 비율) - 출력은 클래스 라벨 y∈{0, 1}로 표현됩니다. (예: 0 = 바나나, 1 = 사과)
- 학습 데이터가 N개 있다면, {(xi, yi)}_{i=1} ^N형태의 학습 데이터셋(training set)이 됩니다.
- 모델은 선형 결합: g(x) = w_1f_1 + w_2f_2 + b 형태의 결정 함수로 표현됩니다.
테스트 예측:
새로운 데이터 x_test가 들어오면, 해당 값을 g(x_test)에 넣어
그 결과값이 양수인지 음수인지에 따라 사과 또는 바나나로 분류합니다.
더 복잡한 예시:
이번에는 사과와 오렌지를 분류해 보겠습니다.
두 과일은 색상과 형태가 비슷하므로, 학습 데이터가 서로 가깝게 분포하게 됩니다.
이 경우 결정 경계를 학습할 수는 있지만, 일부 오분류(Misclassification)가 발생할 수 있습니다.
현실 세계 대부분의 분류 문제에서는 이처럼 오차가 존재합니다.
그래서 우리는 분류기의 성능을 평가하기 위해 오분류율을 측정합니다.
예를 들어,
Loss = ∑_{i=1} ^N 1(g(xi) ≠ yi)
위 식은 오분류된 데이터 수를 합산하여 모델의 성능을 수치화하는 지표입니다.
이번에는 모델이 어떻게 오차를 줄일 수 있는지에 대해 생각해보겠습니다.
예를 들어, 비선형 결정 경계(non-linear decision boundary)를 설정하는 방법이 있습니다.
자, 이제 두 가지 결정 경계를 비교해보겠습니다.
어느 것이 더 나은가요? 보라색 경계선은 파란색보다 더 복잡합니다.
복잡한 모델과 단순한 모델을 비교해 보면, 많은 경우 단순한 모델이 더 낫습니다.
왜냐하면 단순한 모델은 사용하기 쉽고, 해석하거나 설명하기도 간단하며, 학습 시 필요한 파라미터 수도 적기 때문입니다.
하지만 너무 단순한 모델은 데이터의 복잡한 패턴을 포착하지 못할 수 있습니다.
예를 들어, 아래 그림과 같은 경우, 모델이 지나치게 단순해서 많은 오분류가 발생했습니다.
이러한 상황을 우리는 언더피팅(Underfitting)이라고 부릅니다.
반대로, 모델이 너무 복잡해서 노이즈(outlier)까지 모두 학습해버리면, 이를 오버피팅(Overfitting)이라고 합니다.
따라서 좋은 분류기를 만들기 위해서는 언더피팅과 오버피팅 사이에서 균형을 맞추는 것이 중요합니다.
일반적으로 비슷한 성능(오차율)이 보장된다면, 더 단순한 모델이 더 일반화(generalization)가 잘 됩니다.
이것은 Occam의 면도날(Occam’s Razor)이라고 알려진 원리로, 불필요한 복잡성은 제거되어야 한다는 철학입니다.
✅ 더 나은 모델을 만드는 또 다른 방법: 새로운 특성(feature) 사용하기
예를 들어, 부드러움(softness)이라는 새로운 특성을 추가해 봅시다.
이렇게 되면 입력은 2차원에서 3차원으로 확장되고, 특성 공간(feature space)도 3D가 됩니다.
새로운 축이 생기면서, 데이터가 더 잘 구분될 수 있게 되고, 결정 경계는 하이퍼플레인(hyperplane)이 됩니다.
하지만 여기서 중요한 점은, 원래부터 '형태(shape)'라는 특성이 사과와 오렌지를 구분하는 데 적절하지 않았다는 사실입니다.
이처럼 불필요한 특성을 추가하면 모델이 복잡해지며, 이를 차원의 저주(Curse of Dimensionality)라고 합니다.
형태라는 특성을 제거하고, 색(color)과 부드러움(softness)만 사용하면,
입력은 2차원, 특성 공간도 2D가 되어 더 단순한 결정 경계로 두 클래스를 잘 분류할 수 있습니다.
✅ 다중 클래스 분류 (Multiclass Classification)
지금까지는 이진 분류(binary classification)만 다뤘습니다.
이번엔 사과, 오렌지, 바나나를 구분하는 다중 클래스 분류 문제를 생각해봅시다.
이 경우에는 색, 형태, 부드러움 같은 모든 특성을 활용하는 것이 좋습니다.
수학적으로는 새로운 클래스를 나타내는 추가적인 지시자(indicator)를 추가하면 됩니다.
모델을 학습할 때는 다중 클래스 문제를 이진 분류 문제로 분해할 수 있습니다.
즉, 한 클래스를 나머지 모든 클래스와 구분하는 방식으로 모델을 설계하는 것입니다.
예를 들어:
- 바나나 vs (사과 + 오렌지)
- 사과 vs (바나나 + 오렌지)
- 오렌지 vs (사과 + 바나나)
각 경우에 대해 이진 분류 모델을 만들고, 이를 조합하면 다중 클래스 문제도 해결할 수 있습니다.
✅ 회귀(Regression)
회귀도 분류처럼 지도학습(Supervised Learning)에 속합니다.
분류와 마찬가지로 입력과 출력 데이터를 이용하여 모델을 학습합니다.
하지만 분류와 다른 점은 출력이 연속적인 값(continuous value)이라는 점입니다.
즉, 회귀 모델은 함수 추정(function estimation)을 수행합니다.
예시로 중고차 가격 예측 문제를 살펴봅시다.
- 입력 특징(feature): 주행 거리 (mileage)
- 출력(label): 중고차 가격
데이터는 입력과 출력의 쌍으로 구성되며,
- 입력은 1차원 (주행 거리 1개),
- 출력도 1차원 (가격 1개)입니다.
총 10개의 데이터를 사용한다면, N = 10인 훈련 데이터셋이 됩니다.
✅ 모델 수식화 및 오차 계산
이 문제에서 우리는 주행 거리와 가격의 관계를 선형 함수로 가정합니다.
즉,
y^ = wx + b
라는 추정 모델을 학습합니다.
만약 한 중고차의 주행 거리가 1,000이라면,
이 모델로 해당 차량의 가격을 예측할 수 있습니다.
하지만 나중에 실제 판매 가격을 확인해보니 다를 수 있습니다.
- 예측값: y
- 실제값: y
- 오차: ∣y−y^∣
이런 방식으로 모든 데이터에 대한 오차를 합산하면 총 오차를 계산할 수 있습니다.
✅ 복잡한 모델과 단순 모델의 균형
단순한 선형 함수 대신 고차 다항식(polynomial)을 사용하면 오차를 줄일 수 있지만,
너무 복잡해지면 오버피팅이 발생할 수 있습니다.
회귀 문제에서도 분류와 마찬가지로, 언더피팅과 오버피팅 사이의 균형이 중요합니다.
- 너무 단순한 모델 → 언더피팅
- 너무 복잡한 모델 → 오버피팅
이번 강의에서는 지도학습(Supervised Learning)의 두 가지 핵심 구성:
- 분류(Classification)
- 회귀(Regression)
에 대해 실제 예제와 함께 학습했습니다.
4강 - 신경망
| ANN 정의 | 생물학적 뉴런에서 영감을 받아 설계된 계산 모델로, 간단한 노드들이 병렬적으로 연결되어 학습을 통해 지식을 습득함 |
| 지식 저장 방식 | 뉴런 간 연결 가중치(weight)를 통해 정보 저장 |
| 퍼셉트론 (Perceptron) |
선형 결합 + 활성화 함수(step function) 기반의 기본적인 인공 뉴런 모델 |
| 퍼셉트론 구성 | 입력 노드 → 선형 결합(전달함수) → 활성화 함수 → 출력 |
| 퍼셉트론 한계 | XOR 문제와 같은 비선형 분류 문제 해결 불가, 복잡한 현실 문제에 부적합 |
| 다층 퍼셉트론 (MLP) |
퍼셉트론을 여러 층으로 쌓은 다층 신경망으로 비선형 문제 해결 가능 |
| 신경망 구조 | 입력층 → 은닉층(hidden layers) → 출력층 |
| 학습 목표 | 손실 함수(loss)를 최소화하여 모델이 예측값을 실제값에 가깝게 생성하도록 가중치 조정 |
| 손실 함수 종류 | 회귀: 평균 제곱 오차(MSE), 이진 분류: 교차 엔트로피, 다중 분류: 소프트맥스 + 교차 엔트로피 |
| 활성화 함수 예시 | 시그모이드(sigmoid), 소프트맥스(softmax), 항등(identity) |
| 학습 알고리즘 | 경사 하강법(Gradient Descent) 기반으로 손실 함수의 기울기를 계산해 가중치 업데이트 |
| 가중치 업데이트 | w_{t + 1} = w_t − η ⋅ ∇L(w_t) (η: 학습률, L: 손실 함수) |
| SGD vs 배치 학습 | 배치 학습: 전체 데이터 기반 가중치 업데이트 SGD: 샘플 단위 업데이트 (메모리 효율적, 지역 최소 탈출 가능) |
| 순전파 (Forward Propagation) |
입력 → 가중치 → 활성화 함수 → 출력 → 손실 계산 |
| 역전파 (Backpropagation) |
손실로부터 오차를 계산해 각 층으로 역전달하며 가중치 미분값(gradient) 계산 후 업데이트 |
| 델타(δ) | 역전파 시 사용되는 오차 값, 다음 층의 델타와 현재 가중치를 활용해 역전달됨 |
| 목표 | 최적의 가중치를 찾아 예측 성능을 극대화하고 손실을 최소화하는 모델을 학습 |
먼저, 인공신경망이 무엇인지 간단히 소개하겠습니다.
인공신경망은 동물의 뇌를 구성하는 생물학적 신경망에서 영감을 받아 개발된 컴퓨팅 시스템입니다.
이러한 신경망은 단순한 처리 유닛들이 모여 대규모로 병렬적이고 분산된 구조로 이루어져 있으며, 학습을 통해 지식을 습득합니다.
이 지식은 뉴런 간 연결 가중치(weight)로 저장됩니다.
대부분의 인공신경망은 비선형적인 입력-출력 맵핑 기능을 수행합니다.
🧠 생물학적 뉴런과 인공 뉴런
생물학적 뉴런은 다음과 같은 구조로 이루어져 있습니다:
수상돌기(dendrite), 세포핵(nucleus), 축삭(axon), 시냅스(synapse).
- 수상돌기는 다른 뉴런들로부터 정보를 받아들이고,
- 세포핵은 이 정보를 통합하고 새로운 정보를 처리합니다.
- 처리된 정보는 축삭을 통해 시냅스로 전달되며,
- 시냅스는 이 정보를 다음 뉴런의 수상돌기로 넘깁니다.
이를 모방하여 인공 뉴런을 구성합니다.
- 입력을 받는 노드(input node)는 수상돌기 역할을 합니다.
- 각 입력에는 가중치가 곱해지고, 이 값들이 합쳐져 전달 함수(propagation function)를 구성합니다.
- 이 합산 결과가 특정 임계값(alpha)을 넘으면 활성화 함수(activation function)를 통해 출력이 생성됩니다.
📐 퍼셉트론(Perceptron) 구조
퍼셉트론은 다음과 같이 구성됩니다:
- 입력 벡터와 그에 대한 가중치,
- 전달 함수: 입력과 가중치의 선형 결합,
- 활성화 함수: 계단 함수(step function)를 사용하여 활성 여부를 결정.
예시:
합산된 입력값이 임계값보다 크면 1 출력, 작으면 0 출력.
퍼셉트론은 간단히 말해 두 개의 함수로 이루어진 구조입니다:
- 전달 함수 f(x) = w ⋅ x + b
- 활성화 함수 (예: step function)
📊 퍼셉트론으로 분류 문제 해결
두 입력 특성 x_1, x_2에 대해 퍼셉트론을 구성하고,
가중치와 편향을 설정한 후,
활성화 함수로는 임계값을 0으로 설정된 계단 함수를 사용합니다.
이 때,
- w ⋅ x + b = 0 인 곳이 결정 경계(Decision Boundary)가 되며,
- 해당 경계 아래 영역은 활성화(1), 위는 비활성화(0)로 처리됩니다.
즉, 퍼셉트론은 선형 결정 경계를 학습하는 모델입니다.
✔️ 퍼셉트론으로 해결 가능한 문제:
- AND, OR 문제처럼 선형으로 분리 가능한 데이터
❌ 퍼셉트론으로 해결 불가능한 문제:
- XOR 문제처럼 비선형 결정 경계가 필요한 문제
따라서 현실 세계의 대부분 비선형 문제를 해결하기 위해
다층 신경망(Multilayer Neural Network)이 필요합니다.
🔧 퍼셉트론 학습 알고리즘
목표: 주어진 입력 벡터에 대해 적절한 가중치 w를 학습하여 올바른 출력을 생성
- 출력값: 1 또는 -1 (이진 분류)
- 학습 과정:
- 가중치를 임의로 초기화
- 예측 오류가 발생하면 가중치를 갱신
예측 오류 2가지 유형:
- 예측은 1, 실제는 -1
- 예측은 -1, 실제는 1
가중치 업데이트 규칙:
- w_new = w_old + η ⋅ y ⋅ x
(η: 학습률, x: 입력 벡터, y: 실제 라벨)
이 규칙을 사용하면 예측이 잘못된 경우에
가중치를 조정하여 다음 예측이 더 정확해지도록 학습이 이루어집니다.
요약:
| 인공신경망(ANN) | 생물학적 뉴런을 모방한 컴퓨팅 시스템 |
| 퍼셉트론 | 가장 기본적인 신경망 구조 (단층, 선형 모델) |
| 한계점 | 비선형 문제(XOR 등)를 해결할 수 없음 |
| 해결책 | 다층 신경망(Multilayer Neural Network) 사용 |
| 학습 방법 | 오차 발생 시 가중치를 업데이트하는 방식 사용 |
이제 이 항이 항상 음수라는 것을 확인할 수 있습니다. 왜냐하면 이 항은 항상 양수이고, 이는 x^2 항이기 때문이며, 또 다른 항은 항상 0과 1 사이의 값을 갖기 때문입니다. 따라서 이 업데이트 규칙에 따르면, 우리의 예측값은 항상 이 항만큼 감소하게 됩니다.
이제 다시 이 부분으로 돌아가 보겠습니다. 여기서는 실제 정답 라벨이 음수이기 때문에 예측값을 줄여야 합니다. 이 업데이트 규칙은 예측값을 감소시키는 방향으로 작동하므로, 모델은 반복(iteration)을 거치면서 오차를 줄이게 됩니다.
다음 경우를 봅시다. 이 경우에도 마찬가지로 업데이트 규칙을 사용할 수 있고, 앞선 케이스와 마찬가지로 항을 바꿔서 나타낼 수 있습니다. 이 경우 이 항은 항상 양수입니다. 즉, 모델은 양의 라벨을 맞추기 위해 예측값을 증가시키는 방향으로 업데이트됩니다.
결과적으로 두 가지 경우는 하나의 일반화된 식으로 통합할 수 있습니다. 이 식에 따르면, 실제 라벨과 예측값 사이의 차이가 없다면 항은 0이 되며, 가중치는 업데이트되지 않습니다. 그러나 앞의 사례처럼 차이가 존재한다면, 그 차이에 따라 가중치가 조정됩니다.
이것이 바로 퍼셉트론(perceptron)의 가중치 업데이트 공식이며, 모델의 오류를 줄이기 위한 오차 수정 학습(error correction learning) 방식이라 부를 수 있습니다.
그러나 퍼셉트론 학습 알고리즘에는 한계점이 있습니다.
- 퍼셉트론은 AND, OR처럼 선형적으로 구분 가능한 데이터에 대해서는 수렴(converge)합니다.
- 그러나 XOR 문제처럼 선형 분리가 불가능한 데이터에 대해서는 학습이 수렴하지 않고 실패합니다.
이러한 문제를 해결하기 위해 더 복잡한 구조와 새로운 학습 알고리즘이 필요하며, 이로 인해 다층 신경망(Multi-Layer Neural Networks) 개념이 등장합니다.
🧠 다층 신경망(Multilayer Neural Networks)
- 퍼셉트론을 여러 층으로 쌓아서 구성할 수 있으며,
입력층(Input Layer), 출력층(Output Layer) 외에도 은닉층(Hidden Layer)이 존재합니다. - 뇌에서 뉴런이 다층으로 연결되어 있는 것처럼, 다층 신경망은 복잡한 비선형 문제를 해결할 수 있는 모델입니다.
🎯 학습을 위한 두 가지 핵심 요소
- 오차 측정(Loss Function)
- 모델의 예측값과 실제 정답 간 차이를 계산합니다.
- 손실함수, 비용함수, 에러함수 등 다양한 이름으로 불립니다.
- 학습 방식(Optimization)
- 경사 하강법(Gradient Descent)을 통해 손실을 줄이는 방향으로 가중치를 업데이트합니다.
🔢 회귀(Regression) 문제에서의 손실 함수
- 출력값은 연속적인 실수이며, 항등 함수(identity function)를 활성화 함수로 사용합니다.
- 손실 함수는 예측값과 실제값 간의 오차 제곱합을 이용한 평균제곱오차(MSE)를 사용합니다:
Loss = 1 / 2 * ∑(y − y^) ^2
✅ 이진 분류(Binary Classification)에서의 손실 함수
- 활성화 함수: 로지스틱 시그모이드 함수(sigmoid)
σ(z) = 1 / {1+e ^−z}
이 함수는 출력을 확률 값(0~1)로 바꿉니다. - 손실 함수: 교차 엔트로피(Cross Entropy)
이는 정보 이론에서 KL 발산(KL Divergence)의 개념과 연결되며,
두 분포(P: 실제, Q: 예측)의 차이를 최소화하는 방향으로 학습합니다.
Cross Entropy = −[y ⋅ logy^ + (1 − y) ⋅ log(1 − y^)]
- 여기서 y는 실제값, y^는 예측값입니다.
- 예측이 정답과 다르면 손실이 커지고, 정확할수록 손실이 작아집니다.
🧮 다중 분류(Multiclass Classification)
- 활성화 함수: 소프트맥스(Softmax)
각 클래스에 대한 확률 분포를 생성합니다. - 손실 함수: 다중 클래스 교차 엔트로피(Multiclass Cross Entropy)
이진 분류에서의 cross entropy를 일반화한 형태입니다.
🎯 신경망 학습 규칙 (Training Rules)
신경망 학습의 목적은 손실 함수(loss)를 최소화하는 방향으로 모델의 가중치(weight)를 업데이트하는 것입니다.
- 손실 함수 예시 가정
특정 시점 i에서 손실 함수가 존재하고, 현재 모델 가중치가 주어졌다고 가정합니다.
우리는 손실을 줄이기 위해 가중치를 증가시킬지 감소시킬지 방향을 결정해야 합니다. - 경사(gradient) 계산
손실 함수의 미분값, 즉 경사(gradient)를 계산하면 손실을 줄이기 위한 방향을 알 수 있습니다.
이때 가중치 업데이트 방향은 음의 경사 방향이며, 수식으로 표현하면 다음과 같습니다:
w_{i+1} = w_i − η ⋅ ∂L / ∂w- η: 학습률(learning rate)
- ∂L / ∂w: 손실 함수에 대한 가중치의 기울기
- 로컬 옵티마(local minima) 문제
시작 위치에 따라 최적값이 전역 최소가 아닌 국소 최소(local minimum)에 수렴할 수 있음
🌀 확률적 경사 하강법 (Stochastic Gradient Descent, SGD)
✅ SGD vs 배치 경사 하강법(Batch Gradient Descent)
| 항목 | 배치 경사 하강법 | 확률적 경사 하강법 |
| 방식 | 전체 데이터 기반으로 한 번에 가중치 업데이트 | 샘플 하나마다 가중치 즉시 업데이트 |
| 메모리 | 전체 데이터 필요 → 메모리 많이 사용 | 샘플 하나만 필요 → 메모리 효율적 |
| 수렴 속도 | 안정적이지만 느릴 수 있음 | 빠르나 변동 있음, 수렴까지 시간 걸릴 수 있음 |
| 로컬 미니마 탈출 | 어려움 | 다양한 방향으로 탐색 가능, 탈출 가능성 높음 |
🔁 신경망 학습: 순전파(Forward Propagation) & 역전파(Backpropagation)
- Forward Propagation (순전파)
- 입력 → 가중치 합산(선형 조합 A) → 활성화 함수 적용 g(A) → 출력
- 이를 통해 예측값을 계산하고 손실 함수를 측정함
- Backward Propagation (역전파)
- 손실 함수 기준으로 오차를 계산하고, 이를 델타(δ)로 각 층에 역전파함
- 체인 룰(chain rule)을 사용해 각 층의 가중치에 대한 미분(기울기)을 계산함
- 가중치 업데이트 수식
- ∂L / ∂W = δ^(l) ⋅ z^(l−1)
- 여기서 δ^(l)는 역전파된 오차, z^(l−1)는 전 층 출력
🧮 손실 함수 요약
| 학습 문제 | 활성화 함수 | 손실 함수 |
| 회귀 | 항등 함수 (identity) | 평균제곱오차 (MSE) |
| 이진 분류 | 시그모이드 (sigmoid) | 교차 엔트로피(Cross Entropy) |
| 다중 클래스 분류 | 소프트맥스 (softmax) | 다중 클래스 교차 엔트로피 |
- 교차 엔트로피(Cross Entropy)는 정보이론의 KL 발산(KL Divergence) 기반
- 목표: 실제 정답 분포(P)와 모델의 예측 분포(Q)의 차이를 줄이는 것
Cross Entropy = −[y log(y^) + (1 − y) log(1 − y^)]
📌 전체 학습 과정 요약
- 순전파로 예측값 계산
- 손실 함수로 오차 측정
- 역전파로 오차를 전달하고 가중치의 미분값 계산
- 가중치 업데이트 (경사 하강법 or SGD 등)
- 반복하며 손실을 최소화
5강 - 정규화
| 정규화 기법 | 설명 및 적용 방식 | 기대 효과 |
| 조기 종료 (Early Stopping) |
검증 손실이 증가하기 시작하는 시점에서 학습을 중단 | 과적합 방지, 간단하게 적용 가능 |
| L1 정규화 (Lasso) |
손실 함수에 가중치의 절댓값을 더하여 큰 가중치를 줄이도록 유도 | 일부 가중치를 0으로 만들어 희소한 모델 생성 (feature selection 효과) |
| L2 정규화 (Ridge) |
손실 함수에 가중치의 제곱합을 더해 전체 가중치의 크기를 줄이도록 유도 | 모든 가중치를 작게 만들어 모델을 부드럽게 만듦 (과적합 완화) |
| 드롭아웃 (Dropout) |
학습 시 매 이터레이션마다 일부 뉴런을 랜덤하게 비활성화 | 다양한 모델을 앙상블한 효과, 과적합 감소 |
| 배치 정규화 (Batch Normalization) |
각 미니배치마다 평균과 분산을 기준으로 입력 값을 정규화 | 학습 안정성 증가, 수렴 속도 향상, 초기값 설정에 덜 민감함 |
| 모멘텀 (Momentum) |
이전 단계의 그래디언트 방향을 반영하여 현재 가중치 업데이트에 사용 | 진동 감소, 최적점 수렴 가속화 |
| 적응적 학습률 (AdaGrad, RMSProp, Adam) |
매개변수별로 학습률을 다르게 조정하여 자주 변화하는 가중치는 덜 조정, 드문 가중치는 더 조정 | 빠른 수렴, 복잡한 지형에서도 효과적 학습, Adam은 대표적인 복합 방식 |
이번 강의에서는 딥 뉴럴 네트워크(Deep Neural Network, DNN)를 어떻게 잘 학습시킬 수 있는지에 대해 배웁니다. 우리는 신경망의 정규화(Regularization) 기법을 몇 가지 소개할 것입니다.
이전 강의에서는 회귀 및 분류 문제에서 언더피팅(Underfitting)과 오버피팅(Overfitting) 문제가 발생할 수 있음을 배웠습니다. 신경망 학습 과정 중에는 손실(loss)의 감소 패턴을 통해 이를 간접적으로 확인할 수 있습니다.
- 언더피팅: 훈련 손실(training loss)이 검증 손실(validation loss)보다 여전히 너무 높은 경우, 모델이 학습 데이터에 잘 맞지 않는 상태입니다.
- 오버피팅: 훈련 손실은 매우 낮지만 검증 손실은 높은 경우로, 모델이 학습 데이터에만 과도하게 맞춰져 있는 상태입니다.
따라서 우리의 목표는 아래 그림과 같은 잘 맞는 모델(well-fitted model)을 찾는 것입니다.
이제 이런 좋은 모델을 찾기 위한 방법들을 하나씩 살펴보겠습니다. 대부분의 딥러닝 프레임워크(예: TensorFlow, PyTorch)에서는 이런 방법들과 관련된 하이퍼파라미터들을 설정하게 되므로, 이 기법들을 알면 더 쉽게 잘 학습시킬 수 있습니다.
✅ 1. Early Stopping (조기 종료)
가장 간단한 방법 중 하나입니다. 대부분의 경우, 모델의 용량은 크고 데이터는 적기 때문에 오버피팅 문제가 발생합니다. 이를 방지하려면 학습을 조기에 중단하면 됩니다.
- 초기에는 훈련 손실과 검증 손실이 함께 감소합니다.
- 일정 시점 이후, 훈련 손실은 계속 감소하지만 검증 손실은 다시 증가하는 시점이 옵니다.
- 이때가 오버피팅의 시작이므로 학습을 중단합니다.
✅ 2. Momentum (모멘텀)
이전 강의에서 배운 확률적 경사하강법(Stochastic Gradient Descent, SGD)의 확장입니다.
- 일반 SGD에서는 현재의 그래디언트만 사용하여 가중치를 업데이트합니다.
- 모멘텀을 사용하면 이전의 그래디언트 방향(속도)을 고려하여 업데이트 방향을 결정합니다.
이렇게 하면 다음과 같은 효과를 얻을 수 있습니다:
- 경사가 좁고 긴 곡선 모양의 손실 함수에서도 빠르게 최저점을 찾을 수 있습니다.
- 진동을 줄이고 수렴 속도를 높입니다.
✅ 3. Adaptive Learning Rate (적응형 학습률)
SGD의 한계를 보완하기 위해 학습률을 자동으로 조절하는 방식입니다. 대표적인 기법들은 다음과 같습니다:
- Adagrad: 파라미터별 업데이트 이력을 고려하여 학습률을 점점 줄임
- RMSProp: Adagrad의 단점(학습률이 너무 빨리 감소)을 보완하기 위해 지수이동평균을 적용
- Adadelta: 학습률 자체를 없애고, 파라미터 변화량과 그래디언트 스케일을 직접 비교하여 조정
- Adam: 모멘텀과 RMSProp을 결합한 방식으로, 현재 가장 널리 사용됨
✅ 4. Norm 기반 정규화 (Norm-Based Regularization)
수학 강의에서 배운 Norm 개념을 활용합니다. Norm은 벡터의 크기를 측정하는 함수로, 다음과 같은 두 가지가 자주 사용됩니다:
- L1 Norm: 각 요소의 절댓값의 합 → 모델 가중치에 희소성(sparsity) 유도
- L2 Norm: 제곱합의 제곱근 → 모델 가중치를 작게 유지하여 과적합 방지
이 Norm은 손실 함수에 추가되어 모델이 지나치게 복잡해지는 것을 막습니다.
이번 강의에서는 우리의 딥 뉴럴 네트워크를 잘 학습시키기 위한 다양한 기법들에 대해 다룹니다.
📉 손실 함수와 정규화 항 적용
- 회귀(regression) 문제에서는 평균제곱오차(MSE) 손실 함수를 사용합니다.
- 분류(classification) 문제에서는 크로스 엔트로피(cross-entropy) 손실 함수를 사용합니다.
손실 함수 LL 구성:
L = E + R
- E: 데이터에 기반한 오류 항 (예: MSE, Cross Entropy)
- R: 정규화 항 (Regularization term)
🧮 L1 정규화 (Lasso)
- 정규화 항 R으로 L1 노름(norm) 사용 (절댓값의 합).
- 가중치 w에 대해 손실을 미분하면 두 항으로 나뉩니다.
- 첫 번째 항: 기존 손실 함수에 대한 그래디언트
- 두 번째 항: 정규화 항에 대한 그래디언트 → 값은 ± λ
의미:
- w > 0이면 음의 방향으로 λ만큼 감소시킴 → 0에 가까워짐
- w < 0이면 양의 방향으로 λ만큼 증가시킴 → 0에 가까워짐
- 결과적으로, 가중치를 0으로 수렴시켜 sparsity 유도 (희소성 증가)
🧮 L2 정규화 (Ridge, Weight Decay)
- R으로 L2 노름 사용 (제곱합)
- 손실 함수의 그래디언트에 L2 항을 추가하면, 업데이트할 때 가중치의 크기에 비례해 조정됨
의미:
- w > 0: 큰 값일수록 더 많이 감소됨
- w < 0: 큰 음수일수록 더 많이 증가됨
- 결과적으로, 전체 가중치의 크기를 줄이도록 유도 → Weight Decay라고 부름
🧪 Dropout
- 뉴럴 네트워크가 너무 복잡할 경우, 학습 시 일부 노드를 랜덤으로 비활성화하여 과적합 방지
- 매 이터레이션마다 일부 노드를 선택하고, 그 노드와 관련된 가중치만 업데이트
- 매번 학습 시 사용하는 노드 수를 줄여 모델 일반화 능력 향상
🧼 배치 정규화 (Batch Normalization)
- 미니배치 단위로 각 층의 입력값들을 정규화
- 각 배치에서 평균과 표준편차를 계산하여 정규화 수행
효과:
- 학습 속도 증가
- 수렴 안정성 증가
- 오버피팅 감소
🧠 Vanishing Gradient 문제와 활성화 함수
- 전통적으로 시그모이드(sigmoid) 함수 사용 → 미분값이 작음 (0에 가까움)
- 역전파 시 미분값들이 곱해져 앞쪽 레이어에서 그래디언트가 사라짐 → 학습이 되지 않음
해결책:
- ReLU 등 다른 활성화 함수 사용
- 미분값이 0보다 큰 값을 유지 → vanishing gradient 완화
📌 요약
이번 강의에서는 다음과 같은 딥러닝 학습 최적화 기술을 다루었습니다:
| L1 정규화 | 가중치를 0으로 수렴시켜 sparsity 유도 |
| L2 정규화 | 큰 가중치를 줄여 모델을 단순하게 유지 |
| Dropout | 일부 뉴런을 랜덤 제거 → 과적합 방지 |
| Batch Normalization | 입력값 정규화 → 수렴 속도 및 안정성 증가 |
| ReLU | 그래디언트 소멸 문제 완화 |
6강 - CNN
| CNN 정의 | 이미지 분류를 위해 설계된 신경망. 합성곱 연산을 사용해 특징을 추출하고 파라미터 수를 줄임. |
| CNN 구성 요소 | ① 합성곱 레이어: 필터(커널)를 통해 지역적 특징 추출 ② 풀링 레이어: 특징 맵을 다운샘플링 (Max / Average) ③ 완전연결 레이어: 마지막 출력층으로 분류 수행 |
| 합성곱 특징 | - 필터와 입력의 요소별 곱을 통해 출력 계산 - 이미지 패턴(선, 모서리 등)을 감지하는 데 유리 - 다채널 입력/출력 처리 가능 (예: RGB + 여러 필터) |
| 풀링 특징 | - 정보 요약 및 계산량 감소 - 입력에서 최대값/평균값 추출 - 차원 축소 및 과적합 방지 |
| 계층적 표현 | 낮은 층: 단순한 시각적 특징 (선, 모서리) 높은 층: 추상적인 패턴 (객체의 형태 등) |
| CNN 학습 과정 | 1. 순전파 (Forward Propagation): 입력 → 출력 예측 2. 손실 계산 (Loss Function) 3. 역전파 (Backpropagation): 오차를 기반으로 가중치 업데이트 |
| 주요 CNN 모델 | 🔹 LeNet: 손글씨 숫자 인식용 초기 CNN 🔹 AlexNet: 깊이와 너비 확장, ReLU와 Dropout 도입 🔹 VGGNet: 작은 필터(3×3)를 깊게 쌓은 구조 🔹 GoogLeNet (Inception): 다양한 크기의 필터를 병렬 사용 🔹 ResNet: 잔차 연결(Residual Block)로 깊은 네트워크 가능 🔹 SE-Block: 채널별 중요도 반영 (Squeeze & Excitation) |
| 성능 평가 지표 | ImageNet 챌린지 기준 Top-5 Error Rate 사용 (정답이 5개 예측 중에 포함되면 정답으로 인정) |
| CNN 장점 | - 지역적 특징 학습에 강함 - 파라미터 수 절감 - 계층적 표현 가능 - 다양한 이미지 응용에 효과적 |
| 활용 예시 | 이미지 분류, 객체 인식, 얼굴 인식, 자율 주행 등 |
이 강의에서는 우리가 신경망을 어떻게 잘 학습시킬 수 있는지를 이전 강의에서 배운 데 이어, 이번에는 합성곱 신경망(CNN)이라는 특수한 형태의 신경망을 다룹니다.
CNN은 이미지 분류를 위해 설계된 특수한 형태의 피드포워드 신경망입니다. CNN은 입력 데이터를 합성곱 연산(convolution)을 통해 처리합니다.
CNN의 한 가지 장점은 비전 작업에 특화된 네트워크 구조를 사용함으로써 파라미터 수를 줄일 수 있다는 점입니다.
CNN은 일반적으로 세 가지 레이어로 구성됩니다:
- 합성곱 레이어 (Convolutional Layer)
- 풀링 레이어 (Pooling Layer)
- 완전 연결 레이어 (Fully Connected Layer)
✅ 합성곱 레이어
- 합성곱 연산은 전통적인 컴퓨터 비전에서도 널리 사용되어 왔습니다.
- 예를 들어, 입력 이미지에 필터(커널)를 적용하여 각 위치마다 가중치와 입력값의 곱을 더해 하나의 출력값을 생성합니다.
- 이 과정을 반복하여 전체 이미지에 대해 필터를 적용하면 출력 이미지(feature map)를 얻을 수 있습니다.
- 필터에 따라 대각선, 수직선 등 특정 형태의 특징(line)을 감지할 수 있습니다.
- 여러 개의 필터를 사용하면 다양한 특징을 감지할 수 있습니다.
- 컬러 이미지와 같이 다채널 입력에도 적용 가능하며, 이때는 다채널 필터도 함께 사용합니다.
✅ 풀링 레이어
- 풀링은 간단하게 말해, 특정 영역에서 최대값(Max Pooling) 혹은 평균값(Avg Pooling)을 추출하는 방식입니다.
- 풀링은 이미지의 주요 특징을 유지하면서 차원을 축소하고 파라미터 수를 줄여 과적합을 방지합니다.
- 또한, 소프트 샘플링(soft sampling) 효과로 인해 모델이 좀 더 일반화될 수 있게 합니다.
✅ 완전 연결 레이어
- 풀링 레이어 이후의 출력은 벡터 형태로 펼쳐져 완전 연결 신경망(fully connected layer)에 입력됩니다.
- 이 층은 전통적인 인공신경망 구조와 동일하게 작동하며, 마지막 출력값을 생성합니다.
✅ CNN의 학습 과정
- 순전파 (Forward Propagation): 입력 → 합성곱 → 풀링 → 완전 연결 → 예측 출력
- 손실 함수 계산: 예측값과 정답 레이블 간의 오차 계산
- 역전파 (Backpropagation): 오차를 기반으로 가중치를 업데이트
✅ 계층적 표현 (Hierarchical Representation)
- CNN의 하위 계층에서는 간단한 패턴(예: 선, 모서리 등)을 감지하고,
- 상위 계층으로 갈수록 복잡하고 의미 있는 패턴(예: 숫자, 사물)을 추출하게 됩니다.
✅ 대표적인 CNN 구조 예: LeNet
- LeNet은 손글씨 숫자 인식에 사용되는 초기 CNN 모델입니다.
- 구성:
- 2쌍의 합성곱 + 풀링 레이어
- 그 후 완전 연결 레이어
- LeNet은 노이즈가 있는 이미지에서도 숫자를 인식할 수 있습니다.
✅ CNN 발전: ImageNet 대회
- ImageNet 챌린지에서는 CNN 모델의 성능을 테스트합니다.
- 데이터:
- 120만 개의 학습 이미지
- 1,000개의 객체 카테고리
- 각 모델은 테스트 이미지에 대해 5개의 예측을 제출합니다.
- 실제 정답이 5개 중 하나에 포함되면 맞은 것으로 간주합니다.
- 이를 Top-5 에러율로 평가합니다.
이 이미지는 ImageNet 챌린지에서 사용된 이미지 예시들입니다.
일부 이미지는 분류하기 쉽지만, 어떤 이미지는 사람에게도 구분이 어려울 정도로 분류가 어렵습니다.
예를 들어, 철도 공원과 보안 구역을 구분하는 것은 사람에게도 어려운 일이지만, CNN은 그럼에도 철도 공원을 정확히 인식할 수 있습니다.
또 어떤 이미지는 여러 개의 객체가 포함되어 있어 예: 다마시안 개와 체리처럼 두 개의 카테고리를 포함하고 있습니다.
아래 그래프는 이전 ImageNet 챌린지에서 CNN 모델들이 기록한 1등 성능을 나타낸 것입니다.
초기 모델은 그다지 뛰어나지 않았지만, 최근에는 CNN이 인간보다 더 나은 성능을 보이기도 했습니다.
✅ 주요 CNN 모델들 (ImageNet 챌린지 기준)
📌 1. AlexNet
- 약 6천만 개의 파라미터를 가진 대형 CNN 모델
- 각 합성곱 레이어에 많은 필터를 사용해 모델의 너비를 키움
- 드롭아웃(Dropout), 데이터 증강(Data Augmentation) 기법을 활용해 성능 향상
📌 2. VGGNet
- AlexNet과 달리 모델의 깊이(depth)를 늘리는 데 집중
- 작은 필터(3x3)를 여러 층으로 반복해서 쌓는 구조
- 수용 영역(receptive field)을 깊이로 대체하면서 성능을 끌어올림
- 결과적으로 뛰어난 성능을 달성함
📌 3. GoogLeNet (Inception Network)
- 다양한 크기의 필터를 병렬로 사용하는 Inception 모듈 사용
- 여러 필터(1x1, 3x3, 5x5 등)를 동시에 적용해 다양한 표현을 학습함
- 차원 축소를 위한 1x1 합성곱 레이어 도입
- 계층적으로 여러 개의 Inception 모듈을 쌓아 이미지 분류 성능 향상
📌 4. ResNet
- ResNet 이후 CNN 성능이 인간을 초월
- 기존 모델이 너무 깊어지면 오히려 성능이 나빠지는 문제 발생 (overfitting 아님)
- 이를 해결하기 위해 Residual Block 제안
Residual Block의 핵심:
- 기존 CNN은 레이어 간에 단순 연결만 있었지만,
- ResNet은 입력 정보를 그대로 다음 층에 전달하는 경로(스킵 연결) 추가
- 이로써 정보 손실 방지 + 역전파 시 Gradient Vanishing 문제 완화
- 이 구조 덕분에 모델 깊이를 매우 깊게 쌓아도 성능 향상 가능
✅ ResNet 이후: SE-Block (Squeeze-and-Excitation)
- 각 채널의 중요도를 반영하여 특징맵을 조절하는 구조
- Squeeze 단계: 각 채널의 전체 정보를 압축 (Global Average Pooling 등 사용)
- Excitation 단계: 두 개의 완전연결층을 사용해 각 채널별 가중치 학습
- 이로 인해 CNN이 더 중요한 특징에 집중할 수 있게 됨
- SE 블록은 다양한 모델에 접목되어 분류 성능을 향상시킴
7강 - CNN 심화
| 구분 | 모델/기법핵심 | 개념 | 주요 구성 요소 | 특징 및 장점 |
| 🧠 객체 탐지 | R-CNN | 선택적 탐색 후 각 영역마다 CNN 적용 | Selective Search, 개별 CNN | 정확하나 매우 느림 (모든 영역마다 CNN 수행) |
| 🔄 | Fast R-CNN | feature map 위에서 영역 제안 적용 | CNN → ROI Pooling → FC Layer | 이미지 전체에 CNN 1회만 수행, 효율성 향상 |
| ⚡ | Faster R-CNN | 영역 제안까지 CNN 내부에서 수행 | Region Proposal Network (RPN) + ROI Pooling | RPN을 통해 선택적 탐색 없이 빠른 영역 추출 |
| 🎨 이미지 분할 | FCN (Fully Convolutional Network) | 픽셀 단위 분류 (Image-to-Image) | Convolution + Upsampling | FC layer 없이 전체 이미지를 분할, End-to-End |
| 🔗 | U-Net | Skip connection으로 정밀도 향상 | Contracting path + Expanding path + Skip | 소량 데이터에도 강함, 의료영상 등에서 성능 우수 |
| 🔁 | Deconv + Unpooling | 원본 해상도 복원 | 위치 정보 저장 (Unpooling) + Deconvolution | 업샘플링보다 정확한 복원 가능, 정교한 분할 |
| 🧱 | PSPNet (Pyramid Scene Parsing) | 다양한 크기의 객체 대응 | Pyramid Pooling Module + Multiscale CNN | 작은 객체도 놓치지 않고 분할 성능 향상 |
✅ 추가 시각화 기법
| 기법 | 목적 | 설명 |
| Filter 시각화 | 필터가 학습한 특징 보기 | 초기: edge/라인 등 단순 특징 / 후기: 복잡한 형태 감지 |
| Feature clustering | CNN 마지막 레이어의 표현력 분석 | 유사 이미지가 feature space 상에서 잘 군집됨 |
| Activation Map | 계층별 활성화 보기 | 입력 이미지가 각 레이어에서 어떤 특징 추출하는지 시각화 |
| Class Activation Map (CAM) | 클래스별 중요한 영역 시각화 | Global Average Pooling + FC Weight 이용한 히트맵 생성 |
| Saliency via Occlusion | 객체 분류 시 중요한 영역 확인 | 마스크를 이동시키며 성능 변화 관찰해 민감 영역 파악 |
| Saliency via Backpropagation | 입력에 대한 출력의 민감도 측정 | Gradient를 입력 픽셀로 역전파하여 중요 영역 시각화 |
이전 강의에서는 합성곱 신경망(CNN)에 대해 배웠습니다. 이번 강의에서는 CNN을 시각화하고 이해하는 방법에 대해 알아보겠습니다.
CNN은 이미지 분류를 위한 모델로, 입력으로 이미지를 받아 클래스 레이블을 출력합니다. 그렇다면 CNN 내부에서는 어떤 일이 일어나고 있을까요? 중간 특징(intermediate feature)은 무엇을 보고 있을까요? 중간 특징을 살펴보는 몇 가지 방법을 알아보겠습니다.
🔍 1. 필터(커널) 시각화
가장 직관적인 방법 중 하나는 CNN의 필터를 시각화하는 것입니다. 첫 번째 합성곱 레이어의 필터를 보면 선 탐지기나 모양 감지기와 같은 저수준 특징들을 찾을 수 있습니다. 중간 레이어로 갈수록 더 복잡하고 추상적인 고수준 특징이 나타나지만, 이 경우 필터의 수가 많고 복잡해서 의미 있는 특징을 식별하기 어려울 수 있습니다. 마지막 분류기 바로 앞의 fully connected layer의 feature vector를 분석하면 CNN이 무엇을 학습했는지 간접적으로 파악할 수 있습니다.
예를 들어, AlexNet에서는 fully connected layer의 feature vector가 4096차원입니다. 입력 이미지와 해당 feature vector를 각각 최근접 이웃 기반 클러스터링으로 비교해보면, 원본 이미지와 비슷한 이미지들을 찾을 수 있습니다.
- 픽셀 기반 클러스터링 결과는 외형은 비슷하나 실제 유사하지 않은 이미지가 섞일 수 있음
- feature vector 기반 클러스터링은 더 의미 있는 유사도를 잘 포착함
→ CNN은 마지막 layer에서 의미 있는 고수준 특징을 잘 추출하고 있음을 알 수 있습니다.
🔍 2. 차원 축소를 통한 시각화 (t-SNE 등)
마지막 레이어의 feature vector는 매우 고차원이므로, 이를 2차원으로 차원 축소하면 클러스터 구조를 시각화할 수 있습니다.
- 예: MNIST 데이터셋에서 마지막 레이어 feature를 시각화하면 0~9까지 각 숫자별로 클러스터가 형성됨
- 이미지넷(ImageNet) 같은 복잡한 데이터셋에서도 유사 객체들이 모여 있는 클러스터 구조 확인 가능
🔍 3. Activation Map 시각화
합성곱 레이어의 activation map (특징 맵)을 시각화하면, CNN이 이미지의 어떤 영역에 반응하는지를 알 수 있습니다.
이것을 확장한 방법이 Class Activation Map (CAM)입니다.
- 마지막 convolution layer에 Global Average Pooling(GAP)을 적용하면, 각 activation map의 평균값을 구할 수 있음
- 이 평균값과 클래스별 가중치를 선형 조합해, 이미지 내에서 특정 클래스에 중요한 영역을 시각화하는 heatmap 생성
🔍 4. Occlusion을 활용한 Saliency Map
Occlusion(가림)을 통해 입력 이미지의 일부 정보를 제거하고 CNN의 출력을 관찰합니다.
- 마스크(0으로 채워진 정사각형)를 이미지 위에서 이동시키며, CNN의 출력 변화 측정
- 예: 마스크가 배경을 가리면 영향이 적지만, 대상의 얼굴을 가리면 출력 확률이 크게 감소
→ 이를 통해 해당 영역이 분류에 중요한 특징임을 추론할 수 있음
🔍 5. Backpropagation 기반 Saliency Map
일반적으로 backpropagation은 가중치 업데이트에 사용되지만, 이 방법은 입력 이미지 픽셀에 대한 클래스 점수의 그래디언트를 계산합니다.
- 각 픽셀의 중요도를 시각화한 saliency map 생성 가능
- 특정 입력이 어떤 특징으로 인해 분류되는지를 시각적으로 확인 가능
🧠 객체 탐지(Object Detection)
예를 들어, 이미지 안에 사람이 두 명 있다고 합시다. 우리는 단순히 사람이 있는지를 넘어서 어디에 있는지도 인식해야 합니다. 이를 위해 객체 탐지에서는 bounding box(경계 박스)를 사용하여 위치를 표시합니다.
📌 Region-based CNN (R-CNN)
- 과정
- 먼저 선택적 탐색 알고리즘(Selective Search)을 사용하여 영역 제안(region proposals)을 생성합니다.
- 비슷한 색/텍스처를 가진 작은 영역들을 합쳐 큰 영역 후보를 만듭니다 (예: 하늘, 소 등).
- 각 영역을 동일한 크기로 리사이즈하여 개별 CNN에 입력합니다.
- 각 CNN은 객체 위치 (bounding box)와 객체 레이블 두 가지 출력을 생성합니다.
- 문제점: 각 영역마다 CNN을 따로 돌리므로 계산 비용이 매우 큼.
⚡ Fast R-CNN
- 핵심 아이디어: 입력 이미지 전체에 대해 CNN을 한 번만 수행하고, 생성된 feature map 위에 영역 제안을 적용
- 이때 사용하는 것이 ROI Pooling (Region of Interest Pooling)
- 입력 이미지의 위치 정보가 feature map에서도 보존됨
- 선택적 탐색으로 만든 영역 제안을 feature map에 매핑하여 특징 추출
🚀 Faster R-CNN
- Region Proposal Network (RPN) 도입
- 기존 선택적 탐색 알고리즘 대신, CNN 내부에서 자동으로 영역 후보를 생성
- 이후 이 후보들을 ROI Pooling으로 연결하여 객체 탐지 수행
- 연산 효율성과 정확도 모두 향상됨
🧩 이미지 분할(Image Segmentation)
🎨 의미론적 분할(Semantic Segmentation)
- 목표: 이미지의 모든 픽셀에 대해 라벨을 지정하는 것
- 예시:
- 코끼리의 모든 픽셀 → 노란색
- 바위 → 갈색
- 도로 → 회색
- 즉, 픽셀 단위 분류(pixel-wise classification) 수행
📦 Fully Convolutional Network (FCN)
- 완전연결층 없이, 합성곱층과 풀링층만으로 구성
- 풀링을 통해 해상도가 줄어들기 때문에, 이를 보완하기 위해 업샘플링(up-sampling) 사용
🔗 Skip Connection
- 업샘플링만으로는 정보 손실이 있으므로, 이전 층의 feature map을 연결(concat)
- 고해상도 정보를 보존하며 결과 품질 향상
- 대표적인 구조: U-Net
- U자형 구조로, 좌측은 다운샘플링 / 우측은 업샘플링
- 다수의 skip connection 사용
🔁 디컨볼루션 기반 이미지 분할
- Deconvolution + Unpooling 활용
- 풀링 시 저장한 max 위치 정보를 통해 원래 위치 복원
- 디컨볼루션은 역방향 합성곱 연산을 학습함
- 예시:
- 디컨볼루션 결과 → 점진적으로 해상도 복원
- 최종적으로 픽셀 단위 분할 이미지 생성
- 장점: 기존 업샘플링보다 더 정확한 분할 결과
🧱 Pyramid Scene Parsing (PSPNet)
- 문제: 다양한 크기의 객체가 존재 (큰 나무 vs 작은 사람)
- 일반 CNN은 작은 객체 특징이 고수준 층에서 사라질 수 있음
- 해결책: 서로 다른 스케일로 풀링한 뒤, 각각의 특징 추출 → 업샘플링 후 통합
- Pyramid Pooling Module 사용
- 다단계 풀링 → 개별 CNN 처리 → 통합
- 작은 객체 정보도 결과에 반영 가능
✅ 정리
| R-CNN | 선택적 탐색 + 개별 CNN으로 객체 검출. 계산량 많음. |
| Fast R-CNN | feature map 위에서 ROI Pooling으로 효율적 처리 |
| Faster R-CNN | RPN을 통해 CNN 내부에서 자동 영역 제안 |
| FCN | 완전연결층 없이, 업샘플링으로 해상도 복원하며 분할 수행 |
| U-Net | skip connection 포함한 U자형 구조, 정밀한 분할 가능 |
| Deconv & Unpooling | 디컨볼루션 + 언풀링으로 픽셀 복원 정확도 향상 |
| PSPNet | 다양한 객체 크기 대응 위해 피라미드 풀링으로 다중 스케일 특징 결합 |
8강 - RNN
| RNN 개요 | 시계열 데이터를 처리하는 순환 구조의 신경망. 은닉 상태(hidden state)를 통해 과거 정보를 현재에 전달함 |
| 기본 구조 | 입력 → 은닉층 (자기 자신과 순환 연결) → 출력 |
| 은닉 상태 계산식 | h_t = tanh(W h_{t − 1} + U x_t) 현재 은닉 상태는 이전 은닉 상태와 현재 입력의 결합으로 구성됨 |
| 가중치 공유 | 시간 단계마다 동일한 가중치 집합 W, U, V사용 (시간에 따라 매개변수 고정) |
| 순전파 (Forward Propagation) |
입력 시퀀스를 따라 은닉 상태 계산 → 각 시점에서 출력 생성 |
| 오차 계산 | 시점별 출력과 실제값의 차이를 오차로 계산 → 전체 시퀀스에 대한 누적 오차를 합산 |
| 역전파 (Backpropagation Through Time) |
전체 시퀀스를 따라 오차를 뒤로 전파하면서 모든 시점의 가중치를 업데이트 |
| 기울기 소실 문제 | 긴 시퀀스에서 역전파 시 다수의 곱으로 인해 그래디언트가 점점 작아져 학습이 어려움 (Vanishing Gradient Problem) |
| 활용 예시 | - 감정 분석 (Many-to-One) - 이미지 캡셔닝 (One-to-Many) - 기계 번역 (Many-to-Many, 인코더-디코더 구조) - 동기화된 시계열 예측 (Many-to-Many, Sync) |
| 구조 확장 | 🔹 Stacked RNN: 여러 은닉층을 쌓아 표현력 향상 🔹 Bidirectional RNN: 순방향 + 역방향 흐름을 함께 학습하여 정보 보강 |
| 한계점 | - 장기 의존성 학습이 어려움 - 기울기 소실 또는 폭발 문제 존재 |
이전 강의에서는 CNN의 메커니즘과 이미지 처리에 사용되는 고급 CNN 모델들에 대해 배웠습니다. 이번 강의에서는 순환 신경망(RNN)이 신호 처리에 어떻게 사용되는지를 배웁니다.
먼저 RNN의 기본 구조를 살펴보겠습니다. 이 그림은 기본적인 RNN을 나타냅니다. 모델에 입력을 넣으면 히든 레이어를 통해 출력 레이블이 추정됩니다. 기본적인 RNN 구조에서는 순환 구조가 있어, 스스로 가중치를 갱신할 수 있습니다. 즉, RNN 아키텍처에서는 히든 레이어의 가중치가 현재 입력뿐 아니라 이전 히든 상태에 따라 업데이트됩니다.
이러한 개념은 다음 수식으로 표현됩니다. 현재 시점 T에서의 히든 상태는, 현재 입력과 이전 히든 상태의 상호작용으로 결정됩니다. 이때 입력에도 시점 t가 존재합니다. 이런 특성 덕분에 RNN은 연속된 시퀀스 입력 X를 처리할 수 있습니다.
RNN의 핵심 개념 중 하나는 모든 시점에서 동일한 함수와 동일한 파라미터 집합을 사용한다는 점입니다. 이 구조에는 세 가지 주요 파라미터가 있습니다:
- 입력과 히든 레이어 간 가중치
- 히든 레이어와 출력 간 가중치
- 이전 히든 상태와 현재 히든 상태 간 가중치
이 세 가지 파라미터는 모든 시점에서 반복적으로 사용됩니다.
일반적으로 RNN에서는, 현재 입력과 이전 히든 상태의 가중합에 tanh 활성화 함수를 적용해 히든 상태를 계산합니다. 출력은 히든 상태와 출력 레이어 간의 가중치를 통해 결정되며, 과제(task)에 따라 출력층에 적용할 활성화 함수는 다르게 설정할 수 있습니다.
이제 RNN의 구조를 시간 축으로 펼쳐보면, 각 시점에서의 계산 흐름이 보입니다. 시점 t에서는 현재 입력 x와 이전 히든 상태를 기반으로 현재 히든 상태가 계산됩니다. 그 다음 현재 히든 상태를 이용해 출력이 산출됩니다. 이 히든 상태는 다음 시점의 히든 상태 계산에 사용됩니다. 앞서 말했듯이, RNN은 모든 시점에서 동일한 가중치를 사용합니다. 이것이 바로 RNN의 순방향 전달(forward propagation)입니다.
순방향 전달 후에는, 각 시점에서 추정된 출력과 실제 출력 간 오차(loss)를 계산할 수 있고, 모든 시점의 loss를 누적하여 전체 loss를 계산합니다.
이제 역전파(backpropagation)를 살펴보겠습니다. 전체 오차를 계산한 후, 오차는 시퀀스를 따라 이전 레이어로 역전파되며, 가중치 갱신을 위한 그래디언트를 계산합니다. 특히, 히든 레이어에서는 오차가 이전 히든 상태까지 전달되므로, 이 과정을 시간 역전파(BPTT, Backpropagation Through Time)라 부릅니다.
다음은 RNN의 수학적 순방향/역방향 전달 요약입니다:
- 각 시점의 히든 상태는 입력과 이전 히든 상태의 가중합(tanh 적용)으로 결정됩니다.
- 출력은 히든 상태와 출력 가중치의 곱으로 계산됩니다.
- 각 시점의 loss를 계산한 뒤, 전체 loss는 이들을 합산한 값으로 정의됩니다.
역전파에서는, 각 가중치에 대한 loss의 기울기를 계산합니다. 파라미터 U, W에 대한 그래디언트를 구할 수 있으며, V에 대한 기울기는 일반적인 신경망의 역전파와 동일합니다.
- U에 대한 그래디언트는 모든 시점의 기울기를 합한 것입니다.
- 체인 룰(chain rule)을 통해, 각 시점에서의 그래디언트를 두 항으로 나누고 계산할 수 있습니다.
- 사용된 오차 함수에 따라 (예: 회귀는 MSE, 분류는 Cross Entropy), 첫 번째 항은 쉽게 계산 가능하며, 두 번째 항도 체인 룰로 풀 수 있습니다.
이후 W에 대한 그래디언트를 계산할 때도, 마찬가지로 체인 룰을 이용해 항을 나눠서 계산합니다. 이때 중요한 점은, W는 이전 히든 상태와 현재 히든 상태 간의 연결에 해당하기 때문에, 시간 축의 반복적인 연산이 포함된다는 점입니다.
이 과정이 RNN에서 가장 중요한 역전파 단계 중 하나이며, 장기적인 의존성 학습에서 핵심적인 역할을 합니다.
이전 강의에서는 RNN의 구조와 순전파 및 역전파 과정을 살펴보았습니다. 이번에는 가중치 W에 대한 그래디언트를 계산하는 방법을 알아보겠습니다.
우리는 이 항을 W에 대해 편미분해야 합니다. 여기서 이 항은 W와 관계가 없으므로 제거할 수 있고, 나머지 항만 고려하면 됩니다. 만약 h가 W와 무관하다면, 단순하게 편미분할 수 있습니다. 하지만 문제는 h 자체가 W를 포함한다는 점입니다. h는 이전 레이어로부터 계산되며, W에 의존적인 재귀 구조를 가지고 있기 때문에, 하나의 파라미터에 대해 두 개의 함수가 연결된 꼴이 되어 곱의 미분 법칙(product rule)을 사용해야 합니다.
이 과정을 통해 우리는 첫 번째 시점까지 되돌아가며 누적 미분을 수행해야 하며, 이 수식은 그러한 구조를 나타냅니다. 이 두 식은 h에 대한 편미분의 곱 규칙을 따릅니다. 여기서 이 항은 활성화 함수의 미분에서 유도되며, 이 항만 고려합니다. 다시 말해, 현재 h에 대한 그래디언트뿐만 아니라, h가 W에 의존하고 있으므로 이전 시점에 대한 추가적인 그래디언트도 고려해야 합니다.
결과적으로 이 그래디언트 항은 이전 시점들에 대해 반복적으로 누적됩니다. 이를 통해 각 시점의 가중치에 대한 오차의 그래디언트를 계산하고, 역전파 과정에서 모든 가중치를 업데이트할 수 있습니다.
다양한 RNN 구조
RNN은 작업(task)에 따라 다양한 구조를 가질 수 있습니다.
1. 기본 RNN 구조
- 입력층 → 은닉층 → 출력층
- 시계열 데이터에 대해 기본적인 순방향 구조를 가짐
2. One-to-Many 구조
- 하나의 입력에서 여러 개의 출력을 생성
- 대표적인 예: 이미지 캡셔닝
(한 장의 이미지를 입력받아 설명 문장을 생성)
3. Many-to-One 구조
- 여러 개의 입력을 받아 하나의 출력 생성
- 예시: 감정 분류 (sentiment classification)
문장을 입력하면, RNN이 해당 문장의 감정을 분류
4. Many-to-Many 구조
- 입력과 출력이 모두 시퀀스로 구성
- 예시: 기계 번역 (machine translation)
한국어 문장을 입력하면 영어 문장으로 변환
이 경우 입력 시퀀스와 출력 시퀀스는 비동기(asynchronized)이며, RNN의 앞부분은 인코더로, 뒷부분은 디코더로 작동합니다.
5. 동기화된 입력-출력 구조
- 예: 프레임 단위 비디오 분류
각 프레임을 입력하면 각 프레임별로 결과 출력
6. 다층 RNN (Stacked RNN)
- 여러 개의 은닉층을 쌓아 더 복잡한 표현 학습 가능
7. 양방향 RNN (Bidirectional RNN)
- 기존 RNN은 한 방향(과거 → 미래) 정보만 반영
- 양방향 RNN은 과거 + 미래 정보를 동시에 활용
- 순방향 흐름 + 역방향 흐름을 모두 고려하여 출력 계산
그래디언트 소실 문제와 요약
이 그림은 순방향 전달 시 은닉층에서의 흐름을 나타냅니다. 입력 x_t와 이전 은닉 상태 h_{t-1}를 사용해 현재 은닉 상태 h_t를 계산하며, tanh 함수를 사용합니다.
그러나 역전파 과정에서는 시간이 거슬러 올라갈수록 W를 계속 곱하게 되며, W가 1보다 작을 경우 반복적인 곱셈으로 인해 값이 0에 수렴하는 문제가 발생합니다. 이것이 바로 기울기 소실(vanishing gradient) 문제입니다. 이로 인해 기본 RNN은 장기 의존성(long-term dependency)을 학습하기 어렵습니다.
9강 - LSTM
| RNN 구조 복습 | - 은닉 상태는 이전 상태와 현재 입력으로 계산 - 시퀀스 데이터 입력 가능 - 시간에 따른 역전파(BPTT) 사용 - 긴 시퀀스 학습 시 기울기 소실 문제 발생 |
| LSTM 등장 배경 | - 기존 RNN의 Vanishing Gradient 문제 해결 - 장기 의존성(long-term dependency) 학습 가능 |
| LSTM 내부 구성 | 셀 상태(Cell state) + 3가지 게이트로 구성 |
| 🔹 Forget Gate (망각 게이트) | - 입력: 이전 은닉 상태 + 현재 입력 - 시그모이드 함수 → 0~1 값 - 이전 셀 정보를 어느 정도 유지할지 결정 |
| 🔹 Input Gate (입력 게이트) | - 시그모이드 + tanh 조합 - 새 입력 정보를 얼마나 셀에 저장할지 결정 |
| 🔹 Output Gate (출력 게이트) | - 셀의 정보를 tanh로 가공 후 시그모이드로 가중치 부여 - 현재 은닉 상태로 얼마나 보낼지 결정 |
| Gradient 흐름의 차이점 | - 셀 상태를 통해 가중치 없이 기울기 전달 - 연쇄 곱셈 없음 → 기울기 소실 방지 |
| 요약 구조도 | - Forget: 이전 정보 유지 여부 결정 - Input: 새로운 정보 저장 여부 결정 - Output: 셀 정보를 은닉 상태로 출력 |
| 응용 사례 | - 📘 소설 생성: 훈련을 통해 읽을 수 있는 문장 생성 - 📖 교과서 생성: 문장과 수식 생성 가능 - 🧠 코드 생성: 실행 가능한 코드 생성도 가능 - 🖼️ 이미지 캡셔닝: CNN으로 이미지 → RNN으로 설명 - ❓ 시각 질문 응답 (VQA): 이미지 + 질문 → 답변 생성 |
| 성능 향상 요소 | - Attention 기법을 CNN과 결합 시 더 정교한 설명 가능 |
📘 LSTM (Long Short-Term Memory) 강의 한글 번역
00:00:01
지난 강의에서는 순환 신경망(RNN)에 대해 배웠습니다. 이번 강의에서는 RNN의 고급 형태인 LSTM(Long Short-Term Memory)에 대해 배워보겠습니다.
먼저 지난 강의를 되짚어보면, RNN은 은닉 상태를 이전 상태와 현재 입력으로부터 계산하며, 순환 구조 덕분에 시퀀스 데이터를 입력으로 받을 수 있습니다. 순방향 전파를 통해 시점마다 손실을 계산하고, 역전파를 통해 시퀀스 전체를 거꾸로 따라가며 손실을 전달하고 가중치를 업데이트하는 구조를 가지고 있었습니다. 이를 시간에 따른 역전파(BPTT: Backpropagation Through Time)라고 합니다.
우리는 다양한 형태의 RNN도 배웠습니다.
- One-to-Many: 이미지 캡셔닝
- Many-to-One: 감정 분류
- Many-to-Many (비동기형): 기계 번역
- Many-to-Many (동기형): 프레임 단위 비디오 분류
또한, 여러 은닉층을 쌓거나 양방향 RNN 구조도 학습했습니다.
하지만 RNN은 기울기 소실(Vanishing Gradient) 문제로 인해 긴 시퀀스 학습이 어렵다는 한계를 지니고 있었고, 이를 해결하기 위해 LSTM이 제안되었습니다.
LSTM 내부 구조
02:35
LSTM의 은닉층 내부에는 세 가지 게이트가 존재합니다.
먼저, 셀(Cell)이라는 개념을 이해해야 합니다. 셀은 은닉 정보를 저장하거나 다시 불러오는 장치입니다.
- Forget Gate (망각 게이트)
- 입력: 이전 은닉 상태와 현재 입력
- 시그모이드 함수를 통해 0~1 사이 값 출력
- 이 값이 이전 셀 상태에 곱해져 일부 정보를 유지하거나 잊음
- 값이 0이면 정보 제거, 1이면 정보 완전 유지
- Input Gate (입력 게이트)
- 시그모이드 함수와 tanh 함수 사용
- 현재 입력과 이전 은닉 상태를 기반으로 새 정보를 생성하고 가중치를 곱해 셀에 저장
- 일반 RNN의 순전파 구조에 가중치 제어를 추가한 형태
- Output Gate (출력 게이트)
- 셀로부터 정보를 tanh 함수로 변형한 뒤 시그모이드 값으로 가중치를 주어 출력
- 셀에 저장된 정보를 얼마나 은닉 상태로 보낼지를 결정
이처럼 LSTM은 셀을 통해 정보를 저장하고 게이트를 통해 선택적으로 업데이트하며, RNN보다 훨씬 안정적으로 긴 시퀀스를 처리할 수 있게 됩니다.
LSTM의 기울기 흐름 (Vanishing Gradient 해결)
09:19
기존 RNN에서는 은닉 상태를 거치며 가중치 WW를 반복적으로 곱하게 되어 기울기가 점차 사라지는 문제가 있었습니다.
하지만 LSTM은 셀 간 직접 연결을 통해 가중치 없이 기울기를 전달하므로 기울기 소실 없이 학습이 가능합니다.
게이트 내부에서만 가중치가 존재하기 때문에, 셀의 흐름 자체는 방해받지 않습니다.
📌 LSTM 응용 예시
- 소설 쓰기 (Text Generation)
- 초기엔 엉터리 문장을 생성하지만, 훈련이 거듭될수록 점점 자연스러운 문장을 생성함
- AI가 소설, 교과서, 코드까지 작성 가능
- 예: RNN으로 생성된 C 코드가 실제 실행 가능
- 이미지 캡셔닝 (Image Captioning)
- CNN으로 이미지의 특징을 임베딩 벡터로 추출
- 해당 벡터를 입력으로 받아 RNN이 문장을 생성
- 정확한 설명 가능하지만, 가끔은 오류 발생 (예: 아이폰을 마우스로 잘못 인식)
- 시각 질문 응답 (Visual Question Answering)
- 이미지와 질문을 입력받아 답변 생성
- CNN은 이미지 특징을 이해하고, RNN은 질문 문장을 처리함
- CNN+RNN 하이브리드 모델로 정답 예측
10강 - GCN
| 그래프(Graph) | 노드(Node)와 엣지(Edge)로 구성된 데이터 구조. 관계 기반 데이터를 표현 |
| 노드 정보 | 각 노드는 고유한 feature 벡터를 가짐 |
| 인접 행렬 (Adjacency Matrix) |
노드 간의 연결 여부를 나타내는 행렬 (self-loop 포함) |
| 그래프 종류 | Directed (방향 그래프), Undirected (무방향 그래프) |
| CNN vs. GCN 비교 | CNN은 격자 구조의 이미지에, GCN은 임의의 그래프 구조에 적용됨. CNN의 필터가 이웃 픽셀을 고려하듯, GCN은 이웃 노드를 고려함 |
| GCN Layer 연산 | 1. 노드 피처 , 가중치 , 인접 행렬 A을 곱함 2. 정규화된 인접 행렬 Â 사용: Â = D^(-1/2) · A · D^(-1/2) 3. 결과에 비선형 함수(예: ReLU) 적용 |
| 필터 특징 | CNN처럼 동일한 필터(weight)를 모든 노드에 공유하여 학습 |
| GCN 구조 | 여러 GCN 레이어 + (선택적) Skip Connection |
| Readout (출력 생성) |
모든 노드의 임베딩을 하나로 합치는 단계 (예: 평균, 합, 정렬된 concat 등) |
| Graph Pooling | 복잡한 그래프를 요약해 단순한 형태로 압축 |
| 활용 분야 | 소셜 네트워크 분석, 화학 분자 구조 분석, 지식 그래프 분류, 추천 시스템 등 |
이번 강의에서는 그래프 합성곱 신경망(Graph Convolutional Neural Networks, GCN)에 대해 배웁니다.
먼저, 그래프(graph)가 무엇인지 알아봅시다. 그래프는 서로 관계를 가지는 객체들의 집합으로, 객체는 노드(node) 또는 정점(vertex)이라 부르며, 이들 간의 관계는 엣지(edge)로 표현됩니다.
그래프는 크게 두 가지 유형이 있습니다:
- 방향 그래프(directed graph): 노드 간에 방향성과 인과관계가 있음
- 무방향 그래프(undirected graph): 노드 간 단순한 관계만 표현
이미지와 그래프의 차이
이미지는 사실 일종의 잘 정렬된 그래프입니다. 각 픽셀은 인접한 픽셀과 명확한 관계를 가집니다.
반면 일반적인 그래프는 구조가 더 유연하며, 예를 들어 소셜 네트워크에서는 물리적 거리보다 사회적 거리가 엣지를 정의합니다.
이미지를 표현하려면 각 픽셀의 행(row), 열(column) 위치와 RGB 채널만 필요하지만,
그래프는 각 노드의 피처(feature) 정보뿐 아니라 인접 행렬(adjacency matrix)이 필요합니다. 이 인접 행렬은 노드 간의 연결 여부를 표현합니다.
CNN과 GCN의 비교
CNN에서 합성곱 필터는 주변 픽셀의 정보를 기반으로 다음 층의 픽셀 특성을 계산합니다.
GCN의 필터도 동일하게 작동합니다. 다음 층의 노드 피처는 주변 노드의 피처를 기반으로 계산됩니다.
GCN 작동 원리
- 예시 그래프는 5개의 노드로 구성됩니다.
- 각 노드는 고유의 피처 벡터를 가지며, 엣지는 인접 행렬로 표현됩니다.
- 인접 행렬의 각 원소는 노드 간 연결 여부를 나타냅니다 (예: 노드 1과 3이 연결되어 있으면 값은 1).
- 대각 원소는 자기 연결(self-loop)을 의미하며, 무방향 그래프에서는 행렬이 대칭을 이룹니다.
GCN 필터와 연산
- 노드 피처 행렬(X)
- 가중치 행렬(W)
- 인접 행렬(A)
이 세 개의 행렬을 곱한 후 비선형 함수(activation function)를 적용하면 다음 층의 노드 피처가 계산됩니다.
- 예: H = σ(A · X · W)
- 이때 각 노드는 자신과 연결된 이웃 노드의 정보를 반영하여 업데이트됩니다.
- 일반적으로는 정규화된 인접 행렬 Â = D^(-1/2) · A · D^(-1/2) 을 사용합니다.
GCN 아키텍처 구성 요소
| GCN Layer | 여러 층을 쌓을 수 있고, skip connection 사용 가능 |
| Readout Layer | 모든 노드의 임베딩을 합쳐 하나의 벡터로 변환 |
| Pooling | 복잡한 그래프를 요약하는 단계 (그래프 풀링) |
| Output Layer | Readout 결과를 통해 최종 출력 계산 |
11강 - 생성형 1
| 주제 | 확률 밀도 기반 생성 모델 (Explicit Density Estimation) |
| 목표 | 훈련 데이터의 확률 분포 p(x) 를 추정하고, 이를 기반으로 새로운 샘플 생성 |
| 핵심 개념 | Chain Rule을 통해 p(x1, x2, ..., xn) = ∏p(x_i∣x_{<i}) 형태로 분해 |
| PixelRNN | - 각 픽셀을 시퀀스처럼 처리 - RNN (LSTM 등)을 활용해 이전 픽셀 기반으로 다음 픽셀 확률 예측 - 양방향 RNN 구성 가능 |
| PixelCNN | - CNN 구조 사용 - CNN 커널에서 미래 픽셀을 마스킹하여 순서성 부여 - 현재 픽셀을 이전 이웃 픽셀들로부터 예측 |
| 입력 순서 지정 | 좌상단 → 우하단 등의 순서 지정 필요 (픽셀 간 시퀀스 구성) |
| 샘플 생성 방법 | 첫 번째 픽셀부터 조건부 확률 기반으로 한 픽셀씩 순차 생성 |
| 장점 | - 확률 분포를 명시적으로 계산 가능 - 생성 과정이 해석 가능하고 수학적으로 명확 |
| 단점 | - 한 픽셀씩 생성하므로 속도 매우 느림 - 실시간 응용에는 부적합 |
| 활용 예시 | - 손글씨 이미지 생성 (MNIST) - 얼굴 이미지, 사물 이미지 등 생성 |
| 다음 학습 주제 | 변분 오토인코더(VAE)를 활용한 확률 분포 근사 방법 |
이번 강의에서는 비지도 학습(unsupervised learning)에 대해 배웁니다. 시작하기에 앞서, 지도 학습(supervised learning)과 비지도 학습의 차이를 다시 떠올려 봅시다.
지도 학습의 목표는 입력과 출력 데이터가 모두 주어진 상황에서 예측 모델을 학습하는 것입니다. 즉, 이미지나 시퀀스 데이터를 입력으로 넣으면, 모델은 이에 알맞은 출력을 예측하게 됩니다. 예를 들어 이미지 데이터를 다루는 CNN이나, 시퀀스 데이터를 처리하는 RNN이 이에 해당합니다. 출력이 범주(label)일 경우는 분류(classification), 연속값일 경우는 회귀(regression) 문제라고 할 수 있습니다.
반면, 비지도 학습의 목표는 출력(label) 없이 입력 데이터만 가지고 그 구조나 패턴을 이해하고 해석하는 것입니다. 대표적인 예로는 클러스터링(clustering)을 통한 그룹화와 차원 축소(dimensionality reduction)를 통한 구조 해석이 있습니다.
지도 학습에서는 입력과 출력 쌍을 통해 학습하며, 학습된 모델은 입력을 출력으로 매핑(mapping)하는 역할을 수행합니다. 앞선 강의에서 다음과 같은 지도 학습 응용을 다루었습니다:
- 분류(Classification): 입력 이미지 X로부터 라벨을 예측
- 객체 탐지(Object Detection): 객체의 위치와 라벨 모두 예측
- 시맨틱 분할(Semantic Segmentation): 픽셀 단위로 각 클래스에 속하는지 판단
- 이미지 캡셔닝(Image Captioning): 이미지와 문장을 매핑하는 모델
비지도 학습에서는 레이블 없이 입력 데이터만 활용하여, 내재된 숨은 구조를 파악하는 것이 주 목표입니다. 이 때 활용되는 대표 기법은 다음과 같습니다:
- 클러스터링(Clustering): 데이터 샘플을 일정 기준에 따라 그룹화
- 차원 축소(Dimensionality Reduction): 고차원 데이터를 저차원으로 요약하여 구조 파악
- 특징 학습(Feature Learning): 데이터의 핵심 특성을 자동 추출
예를 들어, 오토인코더(Autoencoder)는 이미지 입력을 받아 인코더 단계에서 중요한 특징을 추출하고(차원 축소), 디코더에서 이를 복원합니다. 손실은 원래 입력 이미지와 복원된 이미지 간의 차이이며, 이를 최소화함으로써 모델은 핵심 정보를 요약해내게 됩니다. 이 과정에서 인코더는 효과적인 차원 축소기로 사용될 수 있습니다.
또한, 확률 밀도 추정(density estimation)도 비지도 학습의 주요 응용 중 하나입니다. 이 기법은 데이터를 설명하는 확률 분포를 모델링하여, 다음과 같은 다른 응용들과도 깊은 관련이 있습니다:
- 차원 축소를 통해 요약된 정보를 특징(feature)으로 활용
- 클러스터링을 위해 데이터의 분포 기반 특성 사용
- 생성 모델에서도 샘플 생성을 위해 확률 분포 추정이 필요
이제 본격적으로 생성 모델(Generative Model)에 대해 알아보겠습니다. 생성 모델의 목표는 학습 데이터와 유사한 새로운 샘플을 생성하는 것입니다. 이 목표를 위해 먼저 학습 데이터를 이해하고, 그 확률 분포를 추정합니다. 그리고 이 분포로부터 새로운 데이터를 샘플링합니다. 이는 비지도 학습의 핵심 문제인 밀도 추정(density estimation)을 다루는 것입니다.
예시로, 수많은 자동차 이미지를 수집해 그 분포를 완벽히 알 수 있다면 가장 이상적입니다. 그러나 실제로는 일부 샘플만 수집할 수 있으므로, 이 부분 집합으로 전체 분포를 추정해야 합니다. 이렇게 모델이 분포를 근사하여 학습하면, 해당 분포로부터 실제와 유사한 새로운 이미지를 생성할 수 있습니다.
생성 모델은 크게 두 가지 접근 방식으로 나뉩니다:
- 명시적 밀도 기반(Explicit Density):
- 데이터의 확률 분포를 명시적으로 정의
- 직접적인 확률 계산이 가능하면 tractable density (예: PixelCNN)
- 매개변수로 근사하면 approximate density (예: VAE)
- 암시적 밀도 기반(Implicit Density):
- 분포를 직접 정의하지 않지만, 샘플링을 통해 데이터 분포를 모델링
- 대표 예: GAN
이번에는 암시적 밀도 기반 접근 방식(implicit density approach)에 대해 설명합니다. 이 접근법에서는 확률 분포를 명시적으로 측정하지 않아도 되며, 모델 내부에서 간접적으로 확률 분포를 이용합니다.
우선, PixelRNN 및 PixelCNN과 같은 방법을 통해 픽셀 기반으로 확률 밀도를 직접 측정하는 방식을 배웁니다. 이후에는 변분 오토인코더(VAE)를 기반으로 확률 분포를 근사하는 방법도 학습하고, 마지막으로 확률 분포를 추정하지 않고도 샘플을 생성하는 방법까지 살펴봅니다.
PixelRNN 및 PixelCNN의 개념
앞서 말했듯이 이들은 명시적 밀도 추정(explicit density estimation) 모델에 포함됩니다. 생성 모델의 핵심 목표는 훈련 데이터 X 의 확률 분포 p(X) 를 이해하는 것입니다. 이를 위해 우리는 Chain Rule을 사용하여 p(X)를 다음과 같이 분해합니다:
예를 들어, 시퀀스 데이터 x_0, x_1, x_2, ..., x_n 이 있다고 가정합시다.
- 먼저 p(x_0) 를 계산합니다.
- 그리고 p(x_1 | x_0), p(x_2 | x_0, x_1), ..., p(x_n | x_0, ..., x_{n-1}) 순서로 조건부 확률을 계산합니다.
이런 방식으로 각 픽셀의 조건부 확률을 모두 곱하면 전체 샘플의 확률 분포를 구할 수 있습니다.
이미지의 경우 각 픽셀 값을 하나의 시퀀스처럼 간주하고, 해당 픽셀 이전 값들을 기반으로 다음 픽셀의 확률을 모델링합니다. 이 과정을 RNN 또는 CNN 구조를 통해 수행하는 것이 PixelRNN과 PixelCNN입니다.
PixelRNN
PixelRNN은 RNN 계열(LSTM 등)을 이용하여 픽셀 순서에 따라 정보를 전달하며, 각 픽셀의 확률을 추정합니다. 예를 들어:
- 좌상단 픽셀을 시작점으로 삼고, 오른쪽과 아래 방향으로 시퀀스를 따라가며 정보를 전달할 수 있습니다.
- 또는 우하단에서 시작해 좌상단 방향으로도 시퀀스를 구성할 수 있습니다.
- 양방향(bidirectional) RNN을 사용하는 것도 가능합니다.
PixelCNN
PixelCNN은 CNN 기반 구조를 사용하여, 중심 픽셀의 값을 주변 픽셀 정보로부터 추정합니다.
단, 이전 순서의 픽셀 정보만 사용하도록 커널을 마스킹(masking) 합니다.
- 예: CNN 커널에서 미래 픽셀 위치를 마스킹하여 해당 위치의 정보가 사용되지 않도록 설계
이런 방식으로 PixelCNN은 현재 픽셀을 이전 픽셀들의 정보로부터 조건부 확률적으로 생성할 수 있게 됩니다.
학습 및 샘플 생성
PixelRNN과 PixelCNN을 학습한 후, 학습된 확률 분포를 기반으로 새로운 샘플을 생성할 수 있습니다.
- 실제 존재하지 않지만 실제와 유사한 이미지를 생성하는 것이 가능합니다.
장점과 한계
- 장점: 훈련 데이터의 확률 분포를 정확하게 계산 가능하며, 생성 과정이 해석 가능함
- 한계: 시퀀스를 하나씩 생성해야 하므로 속도가 매우 느림. 대규모 데이터에선 시간 소모가 큼
12강 - 생성형 2
| VAE의 목적 | 입력 데이터 x의 확률 분포 p(x)를 근사하여 유사한 새로운 데이터 샘플 생성 |
| 접근 방식 | 명시적 밀도 추정 중 근사 확률 접근(Approximate Density Approach) |
| 기본 구조 | 오토인코더 기반의 확률 생성 모델로, 인코더 + 디코더 구성 |
| 인코더 (Encoder) | 입력 x를 잠재 변수 z의 확률 분포 |
| 디코더 (Decoder) | 샘플링된 z로부터 입력 x의 조건부 분포 |
| 잠재 변수 z | 일반적으로 표준 정규분포 p(z) = N(0, I)로 가정 |
| 학습 목표 | 직접적인 p(x) 최대화는 불가능하므로, 우도 하한(ELBO)를 최대화 |
| 장점 | - 확률 기반 생성 모델 - 특징 추출, 샘플 생성, 분포 기반 인퍼런스 가능 - 원칙 기반 학습 가능 |
| 한계 | - p(x) 직접 추정 불가 - 샘플 품질이 GAN에 비해 낮을 수 있음 |
| 활용 | - 이미지 생성 - 특징 압축 및 표현 학습 - 지도 학습 모델 초기화 등 |
이전 강의에 이어 이번 강의에서는 생성 모델을 다룹니다. 이번 시간에는 Variational Autoencoder (VAE)에 대해 배웁니다. 이전 강의에서 생성 모델에는 두 가지 접근 방식이 있다고 했습니다. 하나는 명시적 밀도(Explicit Density) 접근이고, 다른 하나는 암시적 밀도(Implicit Density) 접근입니다. 명시적 접근에서는 데이터의 확률 밀도 함수를 직접 측정하거나 근사합니다. VAE는 이 중에서 근사 밀도 접근에 해당하는 방법입니다.
먼저, tractable(계산 가능한) 확률 밀도 접근과 approximate(근사적) 확률 밀도 접근을 비교해보겠습니다. 이전 강의에서 다룬 PixelRNN과 PixelCNN은 tractable한 모델이었습니다. 이 방법은 조건부 확률을 이용해 확률 분포 p(x) 를 정의하고, RNN/CNN을 이용해 훈련 데이터의 우도를 직접 최적화합니다.
반면 VAE는 계산이 어려운 확률 함수(intractable function) 를 정의하고, 그 안에 잠재 변수 z 를 포함하여 다음과 같이 확률 분포를 구성합니다:
- p(z): 잠재 변수의 사전 분포
- p(x∣z): 잠재 변수로부터 실제 데이터를 생성하는 조건부 분포
하지만 이 식 전체의 적분은 계산 불가능하므로, 하한(lower bound) 을 최적화하는 방식을 사용합니다. 이것이 VAE의 핵심 원리입니다.
이제 VAE의 최적화 과정을 설명하기 전에, 먼저 오토인코더(autoencoder) 가 무엇인지 살펴보겠습니다. 오토인코더는 비지도 학습 방식으로 라벨이 없는 데이터에서 저차원 특징을 추출하는 데 사용됩니다.
오토인코더 구조는 다음과 같습니다:
- 인코더: 입력 데이터를 받아 저차원 특징 벡터로 압축
- 디코더: 특징 벡터로부터 입력 데이터를 재구성
- 손실 함수(loss): 원본 입력과 재구성된 입력 간의 거리로 정의
이 구조를 통해 입력 데이터를 잘 설명할 수 있는 핵심 특징을 추출할 수 있습니다. 예를 들어 이미지 재구성에 사용되면, 이미지를 구성하는 기본적인 시각적 특징들을 추출할 수 있습니다. 또한, 학습된 인코더는 지도 학습 모델의 초기화에 사용될 수 있습니다.
그러면 질문이 생깁니다.
“오토인코더는 입력 데이터를 복원하는 데 사용되는데, 그 구조로 새로운 데이터를 생성할 수는 없을까?”
이를 해결하기 위해 제안된 것이 바로 Variational Autoencoder (VAE)입니다.
VAE의 핵심 아이디어:
- VAE는 오토인코더에 확률적 개념을 도입합니다.
- 인코더는 입력 데이터를 잠재 공간(latent space)의 확률 분포로 인코딩하고,
- 디코더는 잠재 벡터를 샘플링하여 데이터를 생성합니다.
여기서,
- z는 잠재 변수(latent variable)이고,
- x는 실제 데이터입니다.
- z ∼ p(z): 사전 분포에서 z를 샘플링
- x ∼ p(x∣z): z로부터 x를 생성
그러나 이 때 p(x) = ∫ p(z) p(x∣z) dz 는 계산이 어렵습니다. 따라서,
- q(z∣x) 라는 근사 분포를 정의하고,
- 이를 통해 증분 우도(evidence lower bound, ELBO) 를 최적화합니다.
VAE는 다음 두 개의 신경망으로 구성됩니다:
- 인코더 네트워크 (encoder): q(z∣x)를 근사. 입력 x 를 받아 z의 평균 μ 와 분산 σ^2 를 출력
- 디코더 네트워크 (decoder): p(x∣z)를 모델링. 잠재 변수 z 로부터 데이터를 복원
이 때 샘플링을 위해 가우시안 분포를 사용합니다:
- 인코더 출력: μ(x),σ(x)
- 샘플링: z ∼ N(μ(x), σ^2(x))
이제 우리는 질문에 답할 수 있습니다:
- 오토인코더 구조를 통해 새로운 데이터를 생성할 수 있는가?
- → VAE는 이를 가능하게 합니다. 왜냐하면 잠재 공간으로부터 샘플링한 벡터로부터 데이터를 복원할 수 있기 때문입니다.
이제 디코더 부분을 살펴보겠습니다. 이 디코더는 P(x∣z) 를 모델링합니다. 만약 x 또한 가우시안 분포를 따른다고 가정하면, x 역시 평균 μ와 표준편차 σ 두 개의 파라미터를 갖게 됩니다.
이때, 인코더 네트워크로부터 샘플링된 z는 디코더 네트워크의 입력으로 사용됩니다. 디코더는 이 z를 기반으로 또 다른 확률 분포를 생성하며, 이 분포로부터 샘플 x를 다시 생성할 수 있습니다. 즉, 이렇게 인코더–디코더 구조를 통해 학습된 모델은 입력 데이터 x의 확률 분포를 따르는 새로운 샘플 데이터를 생성할 수 있게 됩니다.
Variational Autoencoder(VAE)의 최적화 수식
VAE의 목표는 p(x) 를 최대화하는 것입니다. 앞서 말한 것처럼, 우리는 다음과 같이 p(x)를 표현할 수 있습니다:
p(x) = ∫ p(z) ⋅ p(x∣z) dz
이 적분식은 계산 불가능(intractable)하기 때문에, 우리는 Bayes 정리를 활용해 다음과 같은 형태로 바꿔줍니다:
logp(x) = log ( {p(z) p(x∣z)} / p(z∣x) ⋅ p(z∣x) / p(z∣x))
이 식에 인코더 네트워크가 근사한 분포 q(z∣x) 를 삽입하여 다음과 같이 재구성할 수 있습니다:
logp(x) = Eq(z∣x)[logp(x∣z)] − KL(q(z∣x) || p(z)) + KL(q(z∣x) || p(z∣x))
이때 마지막 항 KL(q(z|x) || p(z|x)) 은 여전히 계산이 불가능합니다. 하지만 이 KL Divergence는 항상 0 이상의 값을 가지므로, 앞의 두 항은 logp(x)의 하한 (Lower Bound) 으로 작용합니다.
ELBO (Evidence Lower Bound) 최적화
따라서 VAE의 학습 목표는 다음과 같은 ELBO를 최대화하는 것으로 바뀝니다:
- 첫 번째 항: Eq(z∣x)[logp(x∣z)]
- → 디코더 학습 (입력 x와 출력 x^의 재구성 정확도 향상)
- 두 번째 항: KL(q(z∣x)∣∣p(z))
- → 인코더 학습 (근사 posterior 분포 q(z∣x)가 prior 분포 p(z)에 가까워지도록)
그래서 다음과 같은 의미를 가집니다:
| 항목 | 의미 | 학습 대상 |
| 첫 번째 항 | xx를 재구성하는 정도 | 디코더 학습 |
| 두 번째 항 | 잠재 분포가 사전 분포와 얼마나 가까운지 | 인코더 학습 |
VAE의 요약 및 장단점
- 핵심 아이디어: 오토인코더에 확률적 추론을 결합하여 새로운 샘플 생성 가능
- 장점:
- 생성 모델을 위한 원칙 기반 학습 가능
- 다양한 잠재 변수 분포에 대한 유연한 근사 가능
- q(z∣x)를 통해 특징 추출 및 다른 작업에 활용 가능
- 단점:
- p(x)를 직접 계산하지 못하고, 우도의 하한만을 최적화
- 샘플 품질이 GAN보다 떨어지는 경우 있음
지금까지 우리는 pixel RNN, pixel CNN, 그리고 Variational Autoencoder처럼 명시적 밀도 추정을 기반으로 한 생성 모델을 배웠습니다.
다음 강의에서는 암시적 확률 모델(Implicit Density Models) 기반의 Generative Adversarial Networks (GAN) 을 다룰 예정입니다.
13강 - 생성형 3
| 모델명 | GAN (Generative Adversarial Network) |
| 모델 목적 | 실제와 유사한 신규 샘플 생성 (비지도 학습 내 밀도 추정 문제 해결) |
| 접근 방식 | 암시적 분포 학습 (Implicit Density Estimation) – 분포 p(x) 를 직접 추정하지 않음 |
| 핵심 구조 | - Generator (G): 노이즈 → 가짜 데이터 생성 - Discriminator (D): 입력이 진짜인지 가짜인지 판별 |
| 학습 목표 | - G: D를 속일 수 있는 데이터 생성 - D: 진짜와 가짜를 정확히 구분 |
| 손실 함수 구성 | - D: 진짜는 1, 가짜는 0으로 분류하도록 우도 최대화 - G: D가 가짜를 1로 인식하게 하도록 오차 최소화 (혹은 −logD(G(z)) 최대화) |
| 학습 방식 | Minimax 게임 구조 → Generator는 loss 최소화, Discriminator는 최대화 |
| 학습 알고리즘 흐름 | ① 진짜 샘플과 노이즈로 학습 데이터 준비 ② D 업데이트 → G 업데이트 ③ 반복 (서로 경쟁하며 성능 향상) |
| 문제점 & 개선 | - G 초기 학습 시 gradient vanishing 문제 → 목적함수 변형 (−logD(G(z))) 으로 해결 |
| 생성 결과 | - MNIST, CIFAR, 얼굴 데이터 등 실제 유사 이미지 생성 - 품질 향상을 위해 DCGAN (CNN 기반) 제안 |
| 특징 | - 분포 추정 없이 샘플 생성 가능 - 잠재 공간 zz 해석 가능 (interpolation, 벡터 연산 등) - 이미지 속성 제어 가능 (예: 미소, 안경 등) |
| 활용 사례 | 이미지 생성, 스타일 전이, 얼굴 합성, 텍스트 생성 등 다양한 생성 AI 분야 |
| 대표 확장 모델 | DCGAN, StyleGAN, CycleGAN, BigGAN 등 |
이전 강의에 이어 이번 강의에서는 생성 모델에 대해 살펴보겠습니다. 생성 모델의 목표는 주어진 훈련 데이터의 분포를 기반으로 유사한 새로운 샘플을 생성하는 것입니다. 이는 비지도 학습의 핵심 문제인 밀도 추정(density estimation) 을 다루는 것입니다. 목표는 실제 데이터의 확률 분포 p(x) 와 유사한 분포를 모델이 학습하도록 하는 것입니다. 이렇게 잘 추정된 분포를 통해 우리는 훈련 데이터와 유사한 새로운 샘플을 생성할 수 있습니다.
생성 모델에는 여러 가지 분류가 존재합니다. 먼저 명시적 밀도 추정(explicit density estimation) 방식에서는 p(x) 를 직접 계산하거나 근사합니다. 앞서 배운 Pixel RNN, Pixel CNN은 직접 계산 가능한 tractable density 모델이고, VAE(Variational Autoencoder)는 근사 가능(approximate) 한 분포를 학습하는 방법이었습니다.
Pixel RNN/CNN의 경우 p(x) 를 조건부 확률의 곱으로 직접 계산하며, VAE는 잠재 변수 z 를 도입하고, p(x) = ∫p(x∣z) p(z) dz 형태의 비가용(intractable) 분포를 하한(ELBO) 으로 근사합니다.
이번 강의에서는 명시적 분포를 추정하지 않고도 샘플을 생성할 수 있는 암시적 밀도 추정(implicit density estimation) 방식 중 하나인 GAN (Generative Adversarial Network) 을 학습합니다.
GAN의 기본 개념
GAN은 게임 이론 기반의 2인 플레이어 게임으로 구성되며, 분포 함수 p(x) 를 직접 추정하지 않습니다.
- 생성자(Generator): 가짜 데이터를 생성해 진짜처럼 보이게 만듭니다.
- 판별자(Discriminator): 입력이 진짜(real)인지 가짜(fake)인지 판단합니다.
이 둘은 경쟁하면서 동시에 발전합니다. 생성자는 판별자를 속이기 위해 더 진짜같은 데이터를 만들고, 판별자는 생성자의 데이터를 구별하려고 노력합니다.
네트워크 구성 및 학습 목표
- Generator: 랜덤 노이즈 벡터 z 를 입력 받아 샘플 이미지를 생성
- Discriminator: 실제 이미지와 생성된 이미지 모두를 입력 받아 진짜/가짜를 판단
목적함수 구성:
- Discriminator의 목적:
- 진짜 이미지는 1에 가깝게, 가짜 이미지는 0에 가깝게 분류하도록 우도 최대화
- Generator의 목적:
- 생성된 이미지를 판별자가 진짜로 오인하게(값을 1로 출력하게) 만드는 것 → 판별자 속이기
전체 목적함수는 min-max 게임 형태로 구성되며,
Discriminator는 목적함수를 최대화, Generator는 최소화 하도록 학습됩니다.
초기 학습 문제 및 해결 방법
초기 Generator의 출력은 품질이 낮아 판별자가 쉽게 구별할 수 있습니다.
이로 인해 gradient vanishing 문제가 발생하며 학습이 느려집니다.
이를 해결하기 위해 Generator의 손실 함수를 변경하여 초기 학습 속도를 높이는 구조를 사용합니다.
- 원래는 log(1 − D(G(z))) 를 최소화했지만
- 변경 후 logD(G(z)) 를 최대화함으로써 그래디언트가 더 커지도록 만듭니다.
학습 과정 요약
- 진짜 데이터와 노이즈 샘플 z 준비
- 판별자 학습: 진짜는 1로, 가짜는 0으로 분류하도록 학습
- 생성자 학습: 가짜 샘플이 판별자에게 진짜로 분류되도록 학습
- 위 두 과정을 번갈아 가며 반복
결과 및 한계
- 생성된 샘플은 손글씨(MNIST), 얼굴 데이터(CelebA), CIFAR 이미지 등에서 실제와 유사한 품질을 가짐
- 하지만 일부 생성 결과는 여전히 부정확하거나 품질이 낮음
이를 해결하기 위해 DCGAN (Deep Convolutional GAN) 이 등장합니다.
DCGAN은 생성자/판별자 네트워크에 CNN 구조를 적용하여 이미지 생성 성능을 개선합니다.
잠재공간 z 의 해석 가능성 (Interpolation & Vector Arithmetic)
- 잠재공간에서의 선형 보간(interpolation) 으로 생성 이미지가 부드럽게 변화
- 벡터 연산을 통해 이미지의 속성을 조작 가능:
예) 미소 + 중립 남성 = 미소짓는 남성
예) 안경 벡터 + 안경 없는 여성 = 안경 낀 여성
→ GAN의 잠재 공간 z 는 수학적으로 해석 가능한 의미 있는 공간임을 시사
정리
| 모델명 | GAN (Generative Adversarial Network) |
| 접근 방식 | Implicit density estimation (분포를 직접 추정하지 않음) |
| 구성 요소 | Generator vs. Discriminator (2인 미니맥스 게임) |
| 학습 목표 | G: 가짜 데이터를 진짜처럼 만들기 / D: 진짜와 가짜 구분 |
| 손실 함수 | Minimax 형태, 변형된 Generator 손실로 학습 안정화 |
| 특징 | 데이터 생성 품질 우수, 잠재공간 해석 가능성 |
| 확장형 | DCGAN, StyleGAN 등 고도화된 버전 다수 존재 |
'인공지능 > 공부' 카테고리의 다른 글
| 인공지능 기초 학습 코드 + 개념 (4) | 2025.07.29 |
|---|---|
| Collator란? (4) | 2025.07.29 |
| 딥러닝 공부하기 3 (4) | 2025.07.03 |
| 딥러닝 공부하기 2 (1) | 2025.07.02 |
| 딥러닝 공부하기 1 (1) | 2025.07.01 |