Proyecto Final - Turinmachin
Recreación del minijuego de matemáticas de Brain-Age usando redes neuronales
Loading...
Searching...
No Matches
optimizer.h
Go to the documentation of this file.
1#ifndef PROG3_NN_FINAL_PROJECT_V2025_01_OPTIMIZER_H
2#define PROG3_NN_FINAL_PROJECT_V2025_01_OPTIMIZER_H
3
4#include <cmath>
5#include "interfaces.h"
6
7namespace utec::neural_network {
13 template <typename T>
14 class SGD final : public IOptimizer<T> {
16 T learning_rate;
17
18 public:
24 explicit SGD(T learning_rate = 0.01)
25 : learning_rate(learning_rate) {}
26
33 void update(algebra::Tensor<T, 2>& params, const algebra::Tensor<T, 2>& grads) override {
34 params = params - grads * learning_rate;
35 }
36 };
37
43 template <typename T>
44 class Adam final : public IOptimizer<T> {
46 T learning_rate;
47
49 T beta1;
50
52 T beta2;
53
55 T epsilon;
56
59
62
64 std::size_t t = 0;
65
66 public:
75 explicit Adam(T learning_rate = 0.001, T beta1 = 0.9, T beta2 = 0.999, T epsilon = 1e-8)
76 : learning_rate(learning_rate),
77 beta1(beta1),
78 beta2(beta2),
79 epsilon(epsilon) {}
80
89 void update(algebra::Tensor<T, 2>& params, const algebra::Tensor<T, 2>& grads) override {
90 if (m.shape() != grads.shape()) {
91 m.reshape(grads.shape());
92 v.reshape(grads.shape());
93 }
94
95 step();
96 m = beta1 * m + (T{1} - beta1) * grads;
97 v = beta2 * v + (T{1} - beta2) * grads * grads;
98
99 const algebra::Tensor<T, 2> m_hat = m / (T{1} - std::pow(beta1, t));
100 const algebra::Tensor<T, 2> v_hat = v / (T{1} - std::pow(beta2, t));
101
102 params -= m_hat * learning_rate /
103 (v_hat.apply([](const T x) { return std::sqrt(x); }) + epsilon);
104 }
105
111 void step() override {
112 t += 1;
113 }
114 };
115} // namespace utec::neural_network
116
117#endif
return p * x
Definition catch_amalgamated.cpp:321
Representa un tensor de tipo T y rango Rank.
Definition tensor.h:63
auto shape() const noexcept -> const std::array< size_t, Rank > &
Definition tensor.h:179
constexpr auto apply(auto fn) const -> Tensor< T, Rank >
Aplica una funcion a todos los elementos del tensor.
Definition tensor.h:548
void step() override
Incrementa el contador de pasos. Es importante para las correcciones de sesgo de Adam....
Definition optimizer.h:111
Adam(T learning_rate=0.001, T beta1=0.9, T beta2=0.999, T epsilon=1e-8)
Constructor de Adam con parámetros configurables.
Definition optimizer.h:75
void update(algebra::Tensor< T, 2 > &params, const algebra::Tensor< T, 2 > &grads) override
Actualiza los parámetros del modelo usando el algoritmo de Adam.
Definition optimizer.h:89
void update(algebra::Tensor< T, 2 > &params, const algebra::Tensor< T, 2 > &grads) override
Actualiza los parámetros en función del gradiente.
Definition optimizer.h:33
SGD(T learning_rate=0.01)
Constructor del optimizador.
Definition optimizer.h:24
Capa de activación de Rectified Linear Unit (ReLU). Los valores negativos del input se convierten en ...
Definition activation.h:14
Interfaz para definir un optimizador (ej. SGD, Adam, ...). Un optimizador se encarga de actualizar lo...
Definition interfaces.h:26