sgd_optimizer.cc 2.2 KB
Newer Older
D
dzhwinter 已提交
1 2 3 4 5 6 7 8 9 10 11 12 13 14
/* Copyright (c) 2016 PaddlePaddle Authors. All Rights Reserve.

   Licensed under the Apache License, Version 2.0 (the "License");
   you may not use this file except in compliance with the License.
   You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

   Unless required by applicable law or agreed to in writing, software
   distributed under the License is distributed on an "AS IS" BASIS,
   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
   See the License for the specific language governing permissions and
   limitations under the License. */

15
#include "sgd_optimizer.h"
D
dzhwinter 已提交
16
#include "serialization.h"
17 18 19 20

namespace paddle {
namespace optimizer {

D
dzhwinter 已提交
21 22 23
void SGDOptimizer::Update(const Tensor *gradient) {
  num_sample_passed_ += 1;
  double learning_rate = lr_policy_->LearningRate(num_sample_passed_);
24
  float velocity = 0.0;
D
dzhwinter 已提交
25
  Tensor &param = *parameter_;
26 27 28
  const Tensor &grad = *gradient;
  Tensor &m = *momentums_;
  for (size_t i = 0; i < param.size(); ++i) {
D
dzhwinter 已提交
29 30
    if (momentum_ == 0.0) {
      velocity = -learning_rate * grad[i] - learning_rate * decay_ * param[i];
31
    } else {
D
dzhwinter 已提交
32 33
      m[i] = momentum_ * m[i] - learning_rate * grad[i] -
             learning_rate * decay_ * param[i];
34
      velocity = m[i];
35
    }
D
dzhwinter 已提交
36 37
    if (nesterov_) {
      param[i] += momentum_ * velocity - learning_rate * grad[i];
38
    } else {
39
      param[i] += velocity;
40 41 42 43
    }
  }
}

44
std::string SGDOptimizer::SerializeState() {
D
dzhwinter 已提交
45
  SGDOptimizerState state;
D
dzhwinter 已提交
46
  state.set_num_sample_passed(num_sample_passed_);
47
  std::string lr_str = this->lr_policy_->SerializeState();
D
dongzhihong 已提交
48
  state.mutable_lr_state()->ParseFromString(lr_str);
D
dongzhihong 已提交
49
  TensorToProto(*parameter_, state.mutable_parameter());
D
dzhwinter 已提交
50
  if (momentum_ != 0.0) TensorToProto(*momentums_, state.mutable_momentums());
51
  return state.SerializeAsString();
52 53
}

D
dzhwinter 已提交
54 55
void SGDOptimizer::DeserializeState(const std::string &str) {
  SGDOptimizerState state;
56
  state.ParseFromString(str);
D
dongzhihong 已提交
57 58
  auto lr_state = state.lr_state();
  this->lr_policy_->DeserializeState(lr_state.SerializeAsString());
D
dzhwinter 已提交
59 60
  num_sample_passed_ = state.num_sample_passed();
  ProtoToTensor(state.parameter(), parameter_);
61
  if (momentum_ != 0.0) ProtoToTensor(state.momentums(), momentums_);
62 63
}

64 65
}  // namespace optimizer
}  // namespace paddle