idea不work,对我来说是科研过程中遇到的最大困难。假设到了这一步,一般idea的逻辑已经理清楚了,代码也实现出来了(当然这两步也经常出问题),但代码结果并不像你预想的那样work,这时候,可能的原因就比较多了;这里仅仅整理深度学习情境下(用torch实现),可能的原因
- 可能陷入局部最优解(非全局最优)
torch.manual_seed(0)
np.random.seed(0)
可以将上面的随机种子换一换(这里假设只用到了torch和numpy的随机),将0改成其他值就可以
- 反向传播不顺利
这里是说,在网络的forward中,可能使用了一些不可导的操作,那么就需要重写,但也不是所有看起来不可导的函数都需要重写,这篇文章提供了几种直接不可导、见解可导的情形
判断是否是可导的,直接对目标变量:
print(x.requires_grad)
但不得不说,如果硬要把本身不可导的变成可导的,需要付出的精力非常多,建议如果遇到这种问题,直接换个解决思路(基于本人是一坨科研垃圾,所以提出此建议)
- 方法不合适
这个原因比较宽泛了,是说实现idea的方式不够好,不能算错,但就是离目标差得很远
比如我想通过线性插值来扩张某概率密度函数的分布,但原分布维度是100数量级的,后来的分布维度是10000数量级的,这种情形下,得到的效果一定不好,因为线性插值很少能完成这么大的维度跨越
再比如,我想获得两个自变量的概率密度函数,正常的做法是,对他们进行参数估计或者非参数估计,但是这两种方式在torch中都不可导,所以只好把两个自变量放入fc层,但这种方式得到的概率密度,很难具有分布的一些特性(比如平滑、可微等等)