在进行梯度下降时溢出和尖峰

时间:2016-03-30 23:59:22

标签: optimization wolfram-mathematica mathematical-optimization gradient-descent

我试图找到一个函数h(r),它通过一个非常简单的梯度下降算法最小化函数H(h)。 H(h)的结果是单个数字。 (基本上,我在太空中有一个场配置,我正在努力减少由于这个场而产生的能量)。该场在空间中离散化,并且所使用的梯度是H相对于空间中每个离散点处的场值的导数。我在Mathematica上这样做,但我认为对于Mathematica的非用户来说代码很容易理解。

函数哈密顿函数采用场值矢量,点间距d和点数imax,并给出能量值。 EderhSym是一个函数,它给出了每个点的导数的值表。我手动编写了派生函数以节省计算时间。 (这两个函数的细节可能与问题无关)。

Hamiltonian[hvect_, d_, imax_] := 
       Sum[(i^2/2)*d*(hvect[[i + 1]] - hvect[[i]])^2, {i, 1, imax - 1}] + 
       Sum[i^2*d^3*Potential[hvect[[i]]], {i, 1, imax}]

EderhSym[hvect_,d_,imax_]:=Join[{0},Table[2 i^2 d hvect[[i]]-i(i+1)d hvect[[i+1]]
-i(i-1)d hvect[[i-1]]+i^2 d^3 Vderh[hvect[[i]]], {i, 2, imax - 1}], {0}]

下面的代码显示了梯度下降的单次迭代。 hvect1是我用物理原理猜测的一些起始配置。

Ederh = EderhSym[hvect1, d, imax];

hvect1 = hvect1 - StepSize*Ederh;

问题是我在衍生表中得到随机峰值。尖峰一直在增长,直到溢出。我试过改变步长,我尝试过使用移动平均线,低通滤波器,高斯滤波器等。我仍然会出现导致溢出的尖峰。有没有遇到过这个?这是我设置梯度下降的方式的问题吗?

除此之外 - 我正在测试我的渐变下降代码,因为我将不得不将其调整为不同的多变量汉密尔顿函数,我这样做是为了找到一个鞍点:(n是一个适当选择的小数,在我的情况下为10)< / p>

For[c = 1, c <= n, c++,
  Ederh = EderhSym[hvect1, \[CapitalDelta], imax];
  hvect = hvect - \[CapitalDelta]\[Tau]*Ederh;
  ];

Ederh = EderhSym[hvect1, \[CapitalDelta], imax];
hvect1 = hvect1 + n \[CapitalDelta]\[Tau]*Ederh;

编辑:它的步长似乎比我之前尝试的小得多(尽管收敛速度很慢)。我认为这是问题所在,但我不明白为什么分歧在特定点被本地化。

0 个答案:

没有答案