Funções de Perda (Loss)#

As funções de perda (ou funções de custo) atuam como o “juiz” durante o treinamento da rede neural. Elas quantificam matematicamente a discrepância entre as previsões feitas pelo modelo e os rótulos reais (ground truth) dos dados.

O objetivo central de todo o processo de aprendizado de máquina é minimizar o valor escalar retornado por esta função através do cálculo de seus gradientes (Backpropagation) e do reajuste iterativo dos pesos.

Abaixo, detalhamos a arquitetura base e as implementações específicas da biblioteca Turing.

Interface Base (Loss)#

class Loss#

Classe base abstrata para todas as funções de perda (Loss / Cost Functions).

  • A função de perda atua como a métrica de erro objetivo da rede neural. Ela quantifica a discrepância entre as previsões feitas pelo modelo e os rótulos reais (ground truth). O objetivo de qualquer otimizador é minimizar este valor.

  • De forma generalizada, para um lote (batch) de \(N\) amostras, a perda agregada \(L\) entre as previsões \(\hat{Y}\) e os alvos reais \(Y\) é dada por:

    \[L = \frac{1}{N} \sum_{i=1}^{N} \ell(y_i, \hat{y}_i)\]
    Onde \(\ell\) representa a função de erro individual (como Erro Quadrático Médio ou Entropia Cruzada).

Subclassed by CategoricalCrossEntropy

Public Functions

Loss() = default#

Construtor padrão da classe base de perda.

virtual ~Loss() = default#

Destrutor virtual padrão. Garante a liberação correta de memória caso funções de perda filhas instanciem estruturas de dados próprias no futuro.

virtual void Forward(const Eigen::MatrixXf &predictions, const Eigen::MatrixXf &targets, float &loss) = 0#

Computa o valor escalar da perda (forward pass).

  • Avalia o erro total do lote (batch) reduzindo as matrizes a um único valor escalar.

    \[L = f(\hat{Y}, Y)\]

Parameters:
  • predictions – Matriz constante contendo as previsões geradas pelo modelo \(\hat{Y}\). Suas dimensões geralmente são $(batch_size \times num_classes)$.

  • targets – Matriz constante contendo os rótulos reais \(Y\) correspondentes aos dados de entrada.

  • loss – Referência para a variável escalar float onde o valor final calculado da perda \(L\) será armazenado.

virtual void Backward(const Eigen::MatrixXf &predictions, const Eigen::MatrixXf &targets, Eigen::MatrixXf &grad) = 0#

Computa o gradiente da função de perda (backward pass).

  • Este método é o ponto de partida exato do algoritmo de Backpropagation. Ele calcula a derivada da função de perda em relação a cada elemento da previsão do modelo, gerando a matriz Jacobiana que será propagada para a última camada da rede:

    \[\nabla_{\hat{Y}} L = \frac{\partial L}{\partial \hat{Y}}\]

Parameters:
  • predictions – Matriz constante contendo as previsões do modelo \(\hat{Y}\).

  • targets – Matriz constante contendo os rótulos reais \(Y\).

  • grad – Matriz passada por referência que armazenará o gradiente calculado \(\frac{\partial L}{\partial \hat{Y}}\). Terá exatamente as mesmas dimensões de \(\hat{Y}\).

Entropia Cruzada Categórica (CCE)#

class CategoricalCrossEntropy : public Loss#

Implementa a função de perda Entropia Cruzada Categórica (Categorical Cross-Entropy).

  • Amplamente utilizada em problemas de classificação multiclasse (junto à ativação Softmax). Ela mede a divergência entre a distribuição de probabilidade prevista pelo modelo e a distribuição real dos dados (geralmente representada em one-hot encoding).

  • A perda média para um lote (batch) de $N$ amostras e \(C\) classes é dada por:

    \[L = -\frac{1}{N} \sum_{i=1}^{N} \sum_{c=1}^{C} Y_{i,c} \log(\hat{Y}_{i,c} + \epsilon)\]
    Onde:

  • \(Y\) é a matriz de alvos reais (targets).

  • \(\hat{Y}\) é a matriz de previsões (predictions).

  • \(\epsilon\) é um valor infinitesimal somado para garantir estabilidade numérica.

Public Functions

CategoricalCrossEntropy() = default#

Construtor padrão da função de perda Entropia Cruzada Categórica.

virtual ~CategoricalCrossEntropy() = default#

Destrutor padrão.

inline virtual void Forward(const Eigen::MatrixXf &predictions, const Eigen::MatrixXf &targets, float &loss) override#

Computa o valor escalar da perda (forward pass).

  • Aplica o logaritmo natural elemento a elemento nas previsões, pondera pelos alvos reais, e calcula a média ao longo de todo o lote (batch size).

Note

Adicionamos \(\epsilon = 10^{-7}\) ( \(\text{1e-7f}\)) dentro do logaritmo para evitar a indefinição matemática e falha computacional ($\text{NaN}$) ao calcular \(\log(0)\).

Parameters:
  • predictions – Matriz constante contendo as probabilidades previstas \(\hat{Y}\).

  • targets – Matriz constante contendo os rótulos reais $Y$.

  • loss – Referência para a variável escalar onde o erro médio $L$ será armazenado.

inline virtual void Backward(const Eigen::MatrixXf &predictions, const Eigen::MatrixXf &targets, Eigen::MatrixXf &grad) override#

Computa o gradiente da Entropia Cruzada Categórica (backward pass).

  • Calcula a derivada da função de perda em relação a cada previsão feita pelo modelo. A matriz resultante representa o ponto de partida do algoritmo de backpropagation. A derivada matemática vetorizada (incluindo o fator de média do batch) é:

    \[\frac{\partial L}{\partial \hat{Y}} = -\frac{1}{N} \left( \frac{Y}{\hat{Y} + \epsilon} \right)\]

Parameters:
  • predictions – Matriz constante contendo as previsões do modelo \(\hat{Y}\).

  • targets – Matriz constante contendo os rótulos reais \(Y\).

  • grad – Matriz passada por referência que armazenará o gradiente calculado \(\frac{\partial L}{\partial \hat{Y}}\).

Exemplo de Aplicação#

Abaixo está um exemplo completo de como instanciar e treinar uma rede utilizando a entropia cruzada categórica como função de perdar:

 1    Model model;
 2
 3    // Camada Oculta: 784 entradas (pixels 28x28) para 128 neurônios
 4    model.AddLayer(new DenseLayer(784, 128));
 5    model.AddLayer(new ReLU());
 6
 7    // Camada de Saída: 128 entradas para 10 neurônios (classes de 0 a 9)
 8    model.AddLayer(new DenseLayer(128, 10));
 9    model.AddLayer(new Softmax());
10
11    /*
12     * 3. Configurando a função de perda e o otimizador
13     */
14
15    CategoricalCrossEntropy loss_function;
16    NAG optimizer(0.01f, 0.01f);
17
18    /*
19     * 4. Configurando os parâmetros de treinamento do modelo
20     */
21
22    int epochs = 20;
23    int batch_size = 64;
24
25    model.Fit(epochs, batch_size, X_train, Y_train, loss_function, optimizer);
26
27    /*