梯度下降法拟合指数修正高斯(EMG)的实现相关问题咨询
我正尝试实现梯度下降法来拟合EMG模型,相关论文给出了两种形式的EMG方程:
- 当$z < 0$时使用:
$$F(t)= \frac{h\cdot\sigma}{\tau}\sqrt{\frac{\pi}{2}}e{(\frac{\mu-t}{\tau}+\frac{\sigma2}{2\tau^2})}\cdot erfc(\frac{1}{\sqrt{2}}(\frac{\mu-t} {\sigma}+\frac{\sigma}{\tau}))$$ - 当$z \geq 0$时使用:
$$F(t)= h\cdot e{\frac{-(\mu-t)2}{2\sigma^2}}\cdot \frac{\sigma}{\tau}\sqrt{\frac{\pi}{2}} \cdot erfcx(\frac{1}{\sqrt{2}}(\frac{\mu-t}{\sigma}+\frac{\sigma}{\tau}))$$
其中z的定义为:
$$z = \frac{1}{\sqrt{2}}(\frac{\mu-t}{\sigma}+\frac{\sigma}{\tau})$$
分分支计算的目的是避免函数数值爆炸。
我参考批量梯度算法框架实现了对应逻辑,仅目标函数替换为上述EMG方程。设置待优化参数为:
$$\theta_j = [\mu, h, \sigma, \tau]$$
梯度更新公式为:
$$\theta_j^{k+1} = \theta_j^{k} - \frac{1}{m}\alpha\sum_{i=0}^{m} (F(t_i) - y_i)\frac{\partial F(t_i)}{\partial \theta_j^{k}}$$
所有偏导数通过Wolfram Alpha求解得到。总样本量超过4000,因此采用300样本的小批量梯度下降加速计算。目前的问题是需要非常精细调整初始参数才能得到最优结果,否则会出现梯度爆炸。
论文中还给出了EMG峰值时间坐标的求解公式:
$$t_0 = \mu + y \cdot \sigma \cdot \sqrt{2}-\frac{\sigma^2}{\tau}$$
其中y满足:
$$erfcx(y) = \frac{\tau}{\sigma}\sqrt{\frac{2}{\pi}}$$
我目前有两个核心疑问:
- 针对该非线性方程的梯度下降流程搭建是否存在错误?
- 峰值时间坐标的求解对该算法有什么帮助?
问题解答
1. 梯度下降流程合理性说明
你当前的流程逻辑本身没有错误,梯度爆炸的问题主要来自细节处理缺失,核心可优化点如下:
- 参数约束缺失:$\sigma$和$\tau$属于物理意义上恒为正的参数,梯度更新时如果没有添加正约束,一旦迭代中出现负值,代入公式会直接触发数值爆炸。建议每次更新后对两个参数做截断处理,强制其大于预设的极小正阈值。
- 偏导数数值稳定性未处理:你只对目标函数F(t)做了分分支的数值优化,但Wolfram Alpha输出的偏导表达式默认没有做分支适配,在z的正负边界附近很容易出现数值溢出,建议对应偏导也按照z的正负做等价变形优化。
- 梯度波动无抑制:小批量梯度下降本身梯度波动大于全量梯度下降,建议添加梯度裁剪(限制单步梯度的最大范数)、学习率衰减策略,避免迭代步长过大跳出合理参数区间。
2. 峰值时间坐标的作用
这个公式的核心价值是帮你快速生成合理的初始参数,从根源降低梯度爆炸概率:
你可以直接从实测数据中提取峰值的实际出现时间$t_{0}^{real}$、峰值高度$h_{real}$,再结合你研究场景下$\sigma$和$\tau$的经验取值范围,代入上述峰值公式即可反推出$\mu$的合理初始值,不需要随机猜测初始参数。从这种和真实数据匹配的初始点开始迭代,不仅能避免初始参数不合理导致的梯度爆炸,还能大幅加快收敛速度,降低陷入局部最优的概率。
内容的提问来源于stack exchange,提问作者Mitch Anthony

