scorch icon indicating copy to clipboard operation
scorch copied to clipboard

loss explosion after slight overfit

Open doofin opened this issue 4 years ago • 0 comments

/**linear regression*/
object lrTest {
  import botkop.numsca.Tensor
  import scorch.autograd.Variable
  import scorch.supervised.Linear
  import scorch.optim.{Adam, SGD}
  import botkop.{numsca => ns}
  val f1: Tensor => Tensor = { t: Tensor =>
    t * 3 + 1.0
  }

  def run = {
    val fc1 = Linear(1, 1) // an affine operation: y = Wx + b

    val optimizer = SGD(fc1.parameters, lr = 0.001)
    //todo bug!  overfit to inf
    (1 to 1000) foreach { i =>
      val x = ns.array(i)
      val vx = Variable(x)
      val y = Variable(f1(x))

      val ypred = fc1(vx)

      val loss = scorch.mean((ypred - y) ** 2)

      println(s"loss: ${loss.data}, x: $x, y: ${y.data}, ypred: ${ypred.data}")

      optimizer.zeroGrad()
      loss.backward()
      optimizer.step()
    }
  }
}

after convergence,it gives : ` loss: 0.00, x: 42.00, y: 127.00, ypred: 127.00 loss: 0.00, x: 43.00, y: 130.00, ypred: 130.02 loss: 0.00, x: 44.00, y: 133.00, ypred: 132.98 loss: 0.01, x: 45.00, y: 136.00, ypred: 136.09 loss: 0.06, x: 46.00, y: 139.00, ypred: 138.75 loss: 0.69, x: 47.00, y: 142.00, ypred: 142.83 loss: 8.30, x: 48.00, y: 145.00, ypred: 142.12 loss: 113.17, x: 49.00, y: 148.00, ypred: 158.64 loss: 1,703.49, x: 50.00, y: 151.00, ypred: 109.73 loss: 28,391.16, x: 51.00, y: 154.00, ypred: 322.50 loss: 521,611.12, x: 52.00, y: 157.00, ypred: -565.23 loss: 10,538,231.00, x: 53.00, y: 160.00, ypred: 3,406.26 loss: 233,496,688.00, x: 54.00, y: 163.00, ypred: -15,117.60 loss: 5,660,134,912.00, x: 55.00, y: 166.00, ypred: 75,399.87 loss: 149,761,097,728.00, x: 56.00, y: 169.00, ypred: -386,820.78

`

doofin avatar Feb 09 '21 14:02 doofin