nadam的详细知识就不详细介绍了,前人之述备矣。在之前的bp神经网络上进行了优化,将更新方法独立出来。先展示一下最终测试程序吧,下面这个程序用来根据x^3+2*x+1的值计算x。分别试了adam和nadam,基本上adam能在1500次左右训练成功,nadam稍微快一些,大概800次左右能得到结果。
int main(int argc, char** argv)
{
int i_loop_num = 1;
using net_type = net<nadam, 1, 100, 1>; // 用nadam优化的bp神经网络类型定义
net_type n;
net_type::ret_type& mt_delta = n.get_delta(); // 引用,这样就永远不需要复制了
int i_max_repeat_count = 0;
double d_pre_max = 0.0;
double d_max = -1 * DBL_MAX;
for (double i = 0; ; i+=1)
{
double d_max_error_j = 0.1;
for (double j = 0.1; j < 0.6; j+=.01)
{
double d_out = j;
net_type::ret_type mt_expected({ d_out }); // 期望返回值
net_type::input_type mt_input = { j * j * j + 2. * j + 1 };
auto mt_out = n.forward(mt_input);
n.backward(mt_expected);
if (d_max < mt_delta.max_abs())
{
d_max_error_j = j;
}
d_max = d_max < mt_delta.max_abs() ? mt_delta.max_abs() : d_max;
}
for (int k = 0; k < 3; ++k) // 最大误差项进行加强训练
{
double d_out = d_max_error_j;
net_type::ret_type mt_expected({ d_out }); // 期望返回值
net_type::input_type mt_input = { d_max_error_j * d_max_error_j * d_max_error_j + 2. * d_max_error_j + 1 };
auto mt_out = n.forward(mt_input);
n.backward(mt_expected);
}
std::cout << d_max << std::endl;
i_loop_num++;
if (d_max < 1e-2/* || abs(d_pre_max - d_max) < 1e-11 */)
{
i_max_repeat_count++;
std::cout << "-------" << d_max <<