-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathoptimizer.hpp
More file actions
39 lines (38 loc) · 1.51 KB
/
Copy pathoptimizer.hpp
File metadata and controls
39 lines (38 loc) · 1.51 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <map>
#include <vector>
#include "autograd.hpp"
#pragma once
class AdamOptimizer {
double learning_rate_;
double beta1_;
double beta2_;
double epsilon_;
std::map<VarPtr, std::pair<std::vector<double>, std::vector<double>>> moments_; // first: m, second: v
public:
AdamOptimizer(double learning_rate=0.001, double beta1=0.9, double beta2=0.999, double epsilon=1e-8)
: learning_rate_(learning_rate), beta1_(beta1), beta2_(beta2), epsilon_(epsilon) {}
void set_parameter_nodes(std::vector<VarPtr> params) {
for (const auto& param : params) {
if (param->has_grad()) {
moments_[param] = {std::vector<double>(param->size(), 0.0), std::vector<double>(param->size(), 0.0)};
}
}
}
void update(VarPtr& var) {
if (!var->has_grad()) {
throw std::runtime_error("Variable does not have gradients for Adam update");
}
auto it = moments_.find(var);
if (it == moments_.end()) {
throw std::runtime_error("Variable not found in Adam optimizer moments");
}
auto& [m, v] = it->second;
for (size_t i = 0; i < var->size(); ++i) {
m[i] = beta1_ * m[i] + (1 - beta1_) * var->grad()[i];
v[i] = beta2_ * v[i] + (1 - beta2_) * var->grad()[i] * var->grad()[i];
double m_hat = m[i] / (1 - beta1_);
double v_hat = v[i] / (1 - beta2_);
var->Item(i) -= learning_rate_ * m_hat / (std::sqrt(v_hat) + epsilon_);
}
}
};