Adaptive Momentum Estimation 은 모멘텀 최적화와 RMSProp 의 아이디어를 합친 것,
모멘텀 최적화처럼 지난 그레이디언트의 지수 감소 평균 (exponential decaying average) 를 따르고
RMSProp 처럼 지난 그레이디언트 제곱의 지수 감소된 평균을 따른다.
모멘텀과 적응적 학습률을 결합한 방식,
과거의 기울기 값을 지수적으로 가중합하여 기울기 계산
C++ 코드
class Adam {
public:
Adam(double learning_rate, double beta1 = 0.9, double beta2 = 0.999, double epsilon = 1e-8)
: learning_rate(learning_rate), beta1(beta1), beta2(beta2), epsilon(epsilon), t(0) {}
std::vector<double> update(std::vector<double>& weights, const std::vector<double>& gradients) {
t += 1;
for (size_t i = 0; i < weights.size(); ++i) {
m[i] = beta1 * m[i] + (1.0 - beta1) * gradients[i];
v[i] = beta2 * v[i] + (1.0 - beta2) * gradients[i] * gradients[i];
double m_hat = m[i] / (1.0 - std::pow(beta1, t));
double v_hat = v[i] / (1.0 - std::pow(beta2, t));
weights[i] -= learning_rate * m_hat / (std::sqrt(v_hat) + epsilon);
}
return weights;
}
private:
double learning_rate;
double beta1;
double beta2;
double epsilon;
int t;
std::map<size_t, double> m; // 1st moment vector
std::map<size_t, double> v; // 2nd moment vector
};
'dev_AI_framework' 카테고리의 다른 글
C++ 백엔드 수정, 리스트 입력이 아닌 numpy array 입력 (0) | 2024.09.04 |
---|---|
loss_function 의 구현, (0) | 2024.09.03 |
Dense 층의 call 연산을 보며 weight 가 어느 layer 에 저장해야 할지, 그 연산의 방법 과정을 어떻게 구현할지 고민 (0) | 2024.09.02 |
pyd, py, c++ 파일간 관계, import 과정의 차이 (0) | 2024.09.02 |
vector_add.cpp, Python 벡엔드 호출의 구현 성공~ (0) | 2024.09.02 |