챌린지 목록으로 돌아가기
보통 0명 해결 정답률 0%

미니배치 경사 하강법

전체 데이터가 아니라 작은 배치마다 가중치를 갱신해 선형 모델을 학습시킵니다.

배우게 될 내용

  • 데이터를 배치로 나누기
  • 배치마다 가중치 갱신하기
  • 배치, 미니배치, 확률적 학습 비교하기

문제

원문 보기 (영어)

미니배치 경사 하강법은 거의 모든 신경망을 학습시키는 방법입니다. 데이터를 작은 배치로 나누고 배치마다 가중치를 갱신합니다.

평균 제곱 오차로 y = w × x + b를 학습시키며, w = 0, b = 0에서 시작합니다. 각 에포크마다 샘플을 순서대로 batch_size개씩 배치로 나눕니다(마지막 배치는 더 작을 수 있음). 크기가 n인 각 배치에 대해:

  1. 배치의 각 샘플에 대해 errorᵢ = w × xᵢ + b - yᵢ
  2. dw = (2 / n) × Σ errorᵢ × xᵢ, db = (2 / n) × Σ errorᵢ
  3. w ← w - learning_rate × dw, b ← b - learning_rate × db

train_mini_batch(xs, ys, batch_size, learning_rate, epochs)를 구현하세요.

입력

xs, ys: 데이터 점들 (같은 길이).

batch_size: 배치당 샘플 수.

learning_rate, epochs: 학습률과 데이터를 몇 번 반복할지.

출력

학습 후 [w, b]를 반환하세요.

제약 조건

1 ≤ 점의 수 ≤ 1,000, 1 ≤ batch_size ≤ 점의 수, 0 ≤ epochs ≤ 1,000

0 < learning_rate ≤ 1

-100 ≤ 각 값 ≤ 100

예시

예시 1
입력:
xs = [1.0, 2.0, 3.0]
ys = [2.0, 4.0, 6.0]
epochs = 1
batch_size = 2
learning_rate = 0.1

예상 출력:
expected = [2.44, 1.08]
입력:
std::vector<double> xs = {1.0, 2.0, 3.0};
std::vector<double> ys = {2.0, 4.0, 6.0};
long long epochs = 1;
long long batch_size = 2;
double learning_rate = 0.1;

예상 출력:
std::vector<double> expected = {2.44, 1.08};
입력:
double[] xs = new double[] {1.0, 2.0, 3.0};
double[] ys = new double[] {2.0, 4.0, 6.0};
long epochs = 1;
long batch_size = 2;
double learning_rate = 0.1;

예상 출력:
double[] expected = new double[] {2.44, 1.08};

설명

배치 1은 x = [1, 2]: 오차 -2와 -4, dw = -10, db = -6이므로 w = 1, b = 0.6. 배치 2는 x = [3] 하나: 오차 1×3 + 0.6 - 6 = -2.4, dw = 2 × (-2.4) × 3 = -14.4, db = -4.8이므로 w = 2.44, b = 1.08. 결과: [2.44, 1.08].

예시 2
입력:
xs = [1.0, 2.0, 3.0, 4.0]
ys = [3.0, 5.0, 7.0, 9.0]
epochs = 1
batch_size = 4
learning_rate = 0.05

예상 출력:
expected = [1.75, 0.6]
입력:
std::vector<double> xs = {1.0, 2.0, 3.0, 4.0};
std::vector<double> ys = {3.0, 5.0, 7.0, 9.0};
long long epochs = 1;
long long batch_size = 4;
double learning_rate = 0.05;

예상 출력:
std::vector<double> expected = {1.75, 0.6};
입력:
double[] xs = new double[] {1.0, 2.0, 3.0, 4.0};
double[] ys = new double[] {3.0, 5.0, 7.0, 9.0};
long epochs = 1;
long batch_size = 4;
double learning_rate = 0.05;

예상 출력:
double[] expected = new double[] {1.75, 0.6};

설명

데이터셋 전체만큼 큰 배치는 일반적인 배치 경사 하강법으로, 에포크마다 한 번 갱신합니다. 결과: [1.75, 0.6].

접근 방법

먼저 스스로 풀어 본 뒤 힌트를 하나씩 열어 보세요.

힌트 1

주어진 순서대로 샘플을 처리하고, 매 점마다가 아니라 매 batch마다 parameter를 업데이트하세요.

힌트 2

각 batch에서는 먼저 prediction error를 구한 뒤, 그 평균과 x 값으로 두 gradient를 계산하세요.

힌트 3

마지막 batch는 더 작을 수 있으니, gradient scaling은 그 batch의 크기를 사용해야 합니다.

예상 복잡도

시간 O(epochs × n), 추가 공간 O(1)

참고 자료

이 문제는 CodeUtility에 맞게 수정되었습니다. 위의 설명과 제한 조건을 따르세요.

다른 사람의 풀이 보기

커뮤니티 솔루션

아직 공개된 풀이가 없습니다. 문제를 풀고 첫 풀이를 공유하세요.