展开常量的参数

时间:2015-03-09 10:20:56

标签: c++ gradient-descent

我想为C ++上有5个参数的函数编写一个简单的梯度下降。现在我偶然发现了一个实现模型问题:我是否应该牺牲速度来在vector / arrays中折叠我的参数。这就是我的意思。我可以像这样实现函数值和梯度计算:

double function(double arg1, double arg2, ..., double arg5);
double functionGradient1(double arg1, double arg2, ..., double arg5);
double functionGradient2(double arg1, double arg2, ..., double arg5);
...
double functionGradient5(double arg1, double arg2, ..., double arg5);

或:

double function(double * args);
double functionGradientAt(double * args, int i);

最后一个更容易实现,但是如果我要不断分配/释放内存,我恐怕会失去很多速度。

我的问题是:

  1. 你选哪一个?
  2. 如果你曾经实施过梯度下降,你是如何处理这个案子的?

2 个答案:

答案 0 :(得分:1)

  

你会挑选哪一个?

我会选择:

double function(const vector<double> &args);

或者如果必须来自您的示例,那么:

double function(double * args);

原因是我不相信展开这样的论点会增加任何明显的加速,但它确实使代码看起来很难看。

  

如果你曾经实施过梯度下降,你是如何处理这种情况的?

我用矢量处理它。

梯度下降的速度可能更多地取决于你所做的迭代次数,而不是你如何传递这些参数。如果你想尽可能快,我建议不要自己实现它,而是找到一个实现它的库。 This question对此有很多好的建议。

答案 1 :(得分:0)

在这两种情况下: double functionGradient5(double arg1,double arg2,...,double arg5); 以及 双重功能(double * args); 你可能需要分配相同数量的内存。第一个解决方案是在堆中分配内存,在第二个你必须自己处理它,所以对你来说不太方便,但是你可以在另一方面迭代参数,所以在某些情况下它可以更好。