// Least squares: find w so that x @ w = y.
@grad(wrt: [w])
func loss(
x: &Tensor<f32, [3, 2]>,
y: &Tensor<f32, [3, 1]>,
w: &mut Tensor<f32, [2, 1]>
) -> Tensor<f32, []> {
val r = x @ w - y // [3, 2] @ [2, 1], checked
Tensor::scalar((&r * &r).mean())
}
func main() -> i32 {
val x: Tensor<f32, [3, 2]> =
[[1.0, 2.0], [2.0, 0.0], [3.0, 1.0]]
val y: Tensor<f32, [3, 1]> = [[5.0], [2.0], [5.0]]
mut w: Tensor<f32, [2, 1]> = [[0.0], [0.0]]
for _ in 0..200 {
val l = loss(&x, &y, &mut w)
l.backward() // no tape at run time
w -= 0.05 * w.grad()
w.zero_grad()
}
println("w = [{w[0, 0]:.2}, {w[1, 0]:.2}]")
return 0
}
// Least squares: find w so that x @ w = y.
@grad(wrt: [w])
func loss(
x: &Tensor<f32, [3, 2]>,
y: &Tensor<f32, [3, 1]>,
w: &mut Tensor<f32, [2, 1]>
) -> Tensor<f32, []> {
val r = x @ w - y // [3, 2] @ [2, 1], checked
Tensor::scalar((&r * &r).mean())
}
func main() -> i32 {
val x: Tensor<f32, [3, 2]> =
[[1.0, 2.0], [2.0, 0.0], [3.0, 1.0]]
val y: Tensor<f32, [3, 1]> = [[5.0], [2.0], [5.0]]
mut w: Tensor<f32, [2, 1]> = [[0.0], [0.0]]
for _ in 0..200 {
val l = loss(&x, &y, &mut w)
l.backward() // no tape at run time
w -= 0.05 * w.grad()
w.zero_grad()
}
println("w = [{w[0, 0]:.2}, {w[1, 0]:.2}]")
return 0
}