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

Mini-Batch Gradient Descent

Train a linear model by updating the weights after every small batch of samples instead of the whole dataset.

배우게 될 내용

  • Split data into batches
  • Update weights after each batch
  • Compare batch, mini-batch and stochastic training

문제

번역본 보기

Mini-batch gradient descent is how almost every neural network is trained: split the data into small batches and update the weights after each one.

Train y = w × x + b on the mean squared error, starting from w = 0 and b = 0. In each epoch, split the samples in order into batches of batch_size (the last batch may be smaller). For each batch of size n:

  1. errorᵢ = w × xᵢ + b - yᵢ for each sample in the batch
  2. dw = (2 / n) × Σ errorᵢ × xᵢ and db = (2 / n) × Σ errorᵢ
  3. w ← w - learning_rate × dw and b ← b - learning_rate × db

Implement train_mini_batch(xs, ys, batch_size, learning_rate, epochs).

Input

xs, ys: The data points (same length).

batch_size: Samples per batch.

learning_rate, epochs: The step size and the number of passes over the data.

Output

Return [w, b] after training.

제약 조건

1 ≤ number of points ≤ 1,000, 1 ≤ batch_size ≤ number of points, 0 ≤ epochs ≤ 1,000

0 < learning_rate ≤ 1

-100 ≤ each value ≤ 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};

설명

Batch 1 is x = [1, 2]: errors -2 and -4, dw = -10, db = -6, so w = 1 and b = 0.6. Batch 2 is x = [3] alone: error 1×3 + 0.6 - 6 = -2.4, dw = 2 × (-2.4) × 3 = -14.4 and db = -4.8, so w = 2.44 and b = 1.08. Result: [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};

설명

A batch as big as the dataset is ordinary batch gradient descent: one update per epoch. Result: [1.75, 0.6].

접근 방법

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

힌트 1

Process the samples in the given order, updating the parameters after every batch instead of after every single point.

힌트 2

For each batch, compute prediction errors first, then use their averages with x values to get the two gradients.

힌트 3

The last batch may be smaller than the others, so its gradient scaling must use that batch's size.

예상 복잡도

O(epochs × n) time, O(1) extra space

참고 자료

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

다른 사람의 풀이 보기

커뮤니티 솔루션

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