"新神经 "是MetaTrader 5平台的一个开源神经网络引擎项目。 - 页 39

 

我们应该建立径向基线网络吗?

他们有一个强大的错误,虽然他们学习得很快,但他们对未知数据的预测很差。

 
Urain

u- 激活器输入

y- 额外的功率因素。

凡是有指数的地方,应该避免计算正数的指数,以免得到超过32位的大数。例如,要计算西格玛,最好按以下方法计算

双倍x=-y*u。

双重e=exp(-|x|)。

如果(x<=0)返回(1./(1.+e))

if(x>0)return(e/(1.+e))。

这些公式的推导非常简单。如果指数参数为负数,我们不改变公式。如果是正数,我们将分子和分母乘以相同参数的指数,但要加负号。

 
维宁

你是那个有djvu 浏览器的人。我所有的书都可以阅读。
 
gpwr:

凡是有指数的地方,应该避免计算正数的指数,以免得到超过32位的大数。例如,以这种方式计算西格玛比较好

双倍x=-y*u。

双重e=exp(-|x|)。

如果(x<=0)返回(1./(1.+e))

if(x>0)return(e/(1.+e))。

这些公式的推导非常简单。如果指数参数为负数,我们不改变公式。如果是正数,我们就用分子和分母乘以相同参数的指数,但要加负号。

奇怪的是,即使是大的负输入,sigmoid本身也能正常工作,但hyertangent函数却失败了,所以除了经典算法外,我还增加了一个移位的sigmoid。该函数的工作极限与正切相同,但速度更快,而且没有#IND问题。

同样的道理,随着攻角的调整(对于小的y系数值),高切不会达到-1;1,移位的sigmoid不会有这样的问题。

一般来说,谁都想最终确定高切,但我认为这个函数是没有前途的,不仅如此,我还要保存结果,因为指数用了两次,所以还需要检查,加上调整攻击时达不到极限的问题。

我的结论是,下切线是不可能的,移位的乙字形才是规则。

 
Urain

我的结论是,下切线是不可能的,移位的乙字形才是规则。

附议。
 
joo:
附议。

有可能在[-1;1]的限度内对sigmoid做一个更简单的实现

double sigma(double u,double y=1.)// [-1;1]
  {   
   return(exp(-y*u));
  }

但这个实现也有一个#IND的问题,所以与其写大量的检查,不如增加几个简单的操作

这里我们加上+ - / ,所以额外的3个操作与大量的检查。

double sigmah(double u,double y=1.)// [-1;1] сдвинутый сигмоид
  {
   return((2./(1.+exp(-y*u)))-1.);
  }
 
Urain
double sigmah(double u,double y=1.)// [-1;1] сдвинутый сигмоид
  {
   return((2./(1.+exp(-y*u)))-1.);
  }

这是最好的选择,无论是从工作范围[-1;1]的便利性还是从操作速度来看。定义区是整个数字行。

这正是我最近一直在使用的激活函数,我已经尝试了许多替代方案,并测试了它们的执行速度

 

而在回声格中,我最喜欢这个。

class RSDNFunction
{
public:
        static const NeuronType Type = ETYPE_RSDN;
public:
        double F(double x)
        {
                // coeffs were added to adjust this function to bisigmoid for values from -5 to 5
                return 5*x/(5*sqrt(abs(5*x) ) + 5);
        }

        double dF(double x)
        {
                double root = sqrt(5*abs(5*x) ) + 1;

                return (root + 1)/(2*root*root); // derived function 
        }
};
 

顺便说一下。

需要一个sigmoid函数。

要求是函数本身及其导数的正常形式(不难计算)和反函数及其导数的正常形式。