如果使用两层线性模块,为什么线性回归收敛较慢?

时间:2019-06-12 18:53:18

标签: neural-network linear-regression pytorch

我用pytorch使用三种不同的方法测试了1d输入和1d输出的线性回归。

  • 一个正在使用线性代数的公式

  • 另一个正在使用nn.Linear(1,1)。这两个总是给出相同的解决方案。

  • 但是,当我使用两层时:对于第三种方法,依次使用nn.Linear(1,2)和nn.Linear(2,1),结果一开始并不收敛。在我将学习率设置为小得多,将纪元设置为大得多之后,它终于显示出它的收敛性。

理论上,由于线性变换的组成又是线性变换,因此无论一层还是两层,它们都应给出相同的答案。 凭直觉,我认为更多的神经元和层可以使事情更有效。但这表明了相反的事实,我不明白。

代码在github中。请直接跳到最后一个shell,以获取第三种方法。 笔记本中的第一种和第二种方法都给出了预期的结果。

2 个答案:

答案 0 :(得分:0)

我还没有测试过您的代码,但是第二级0.00003似乎太小,而且学习时间更长。

您唯一要做的就是标准化数据:

enter image description here

然后像第一个示例中那样的学习速度使我能够快速学习。

enter image description here

答案 1 :(得分:0)

这并不奇怪。如您所知,具有2个Linear层,可以有效地表达单个Linear层的功能,因此您引入了一堆冗余的自由度-对这两个层的值的不同分配在相同的有效转化中。因此,优化器可以“走动”不同的解决方案,这些解决方案在损失函数方面看起来是相同的(因为它们在数学上是相同的),而不会收敛到一个。换句话说,如果有无限数量的解决方案,而这些解决方案在您看来都一样,那么您就无法收敛到解决方案。