Todos os desafios
Médio 0 resolvidos 0% de aceitação

Descida de gradiente em mini-lotes

Treine um modelo linear atualizando os pesos após cada lote pequeno, em vez de após todo o conjunto de dados.

O que você vai aprender

  • Dividir os dados em lotes
  • Atualizar os pesos após cada lote
  • Comparar treinamento em lote, mini-lote e estocástico

Problema

Ver original (inglês)

A descida de gradiente em mini-lotes é como quase toda rede neural é treinada: divida os dados em lotes pequenos e atualize os pesos após cada um.

Treine y = w × x + b no erro quadrático médio, começando com w = 0 e b = 0. A cada época, divida os exemplos em ordem em lotes de batch_size (o último lote pode ser menor). Para cada lote de tamanho n:

  1. errorᵢ = w × xᵢ + b - yᵢ para cada exemplo do lote
  2. dw = (2 / n) × Σ errorᵢ × xᵢ e db = (2 / n) × Σ errorᵢ
  3. w ← w - learning_rate × dw e b ← b - learning_rate × db

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

Entrada

xs, ys: Os pontos de dados (mesmo comprimento).

batch_size: Exemplos por lote.

learning_rate, epochs: O tamanho do passo e o número de passagens pelos dados.

Saída

Retorne [w, b] após o treinamento.

Restrições

1 ≤ número de pontos ≤ 1.000, 1 ≤ batch_size ≤ número de pontos, 0 ≤ epochs ≤ 1.000

0 < learning_rate ≤ 1

-100 ≤ cada valor ≤ 100

Exemplos

Exemplo 1
Entrada:
xs = [1.0, 2.0, 3.0]
ys = [2.0, 4.0, 6.0]
epochs = 1
batch_size = 2
learning_rate = 0.1

Saída esperada:
expected = [2.44, 1.08]
Entrada:
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;

Saída esperada:
std::vector<double> expected = {2.44, 1.08};
Entrada:
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;

Saída esperada:
double[] expected = new double[] {2.44, 1.08};

Explicação

O lote 1 é x = [1, 2]: erros -2 e -4, dw = -10, db = -6, então w = 1 e b = 0.6. O lote 2 é x = [3] sozinho: erro 1×3 + 0.6 - 6 = -2.4, dw = 2 × (-2.4) × 3 = -14.4 e db = -4.8, então w = 2.44 e b = 1.08. Resultado: [2.44, 1.08].

Exemplo 2
Entrada:
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

Saída esperada:
expected = [1.75, 0.6]
Entrada:
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;

Saída esperada:
std::vector<double> expected = {1.75, 0.6};
Entrada:
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;

Saída esperada:
double[] expected = new double[] {1.75, 0.6};

Explicação

Um lote do tamanho do conjunto de dados é a descida de gradiente em lote comum: uma atualização por época. Resultado: [1.75, 0.6].

Referências

Este desafio foi adaptado para o CodeUtility. Siga o enunciado e as restrições acima.

Aprenda com outros

Soluções da comunidade

Ainda não há soluções publicadas. Resolva este desafio para compartilhar a primeira.