# Types and gradients, including Forward.gradient

**URL:** <https://discourse.julialang.org/t/types-and-gradients-including-forward-gradient/946>\
**Category:** General Usage\
**Created:** [December 14, 2016, 3:34pm UTC](https://discourse.julialang.org/t/types-and-gradients-including-forward-gradient/946 "2016-12-14T15:34:49Z")\
**Posts on this page:** 1\
**Page:** 2

<div class="post-metadata">

**Author:** ![Patrik\_Waldmann](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/patrik_waldmann/32/11154_2.png) [@Patrik\_Waldmann](https://discourse.julialang.org/u/Patrik_Waldmann)\
**Post date:** [December 20, 2016, 10:55am UTC](https://discourse.julialang.org/t/types-and-gradients-including-forward-gradient/946/21 "2016-12-20T10:55:09Z")

</div>

That looks promising. Here’s a working example of the lasso:

```julia
using ReverseDiff: compile_gradient

# simulated data
nind = 1000
nvar = 5000
x = randn(nind,nvar)'
y = sum(x[1:5,:],1) .+ randn(nind)'*0.1
oneind = ones(nind)
x = vcat(oneind',x) # add mean indicator
p = size(x,1)
n = size(x,2)
w = 0.0001*randn(1,p)
output = similar(w)

# squared error loss function
loss(w) = sum(abs2.(y - w * x)) / size(y, 2)
loss∇! = compile_gradient(loss, randn(1,p))

# proximal gradient descent function with soft thresholding
function train(w, output, x, y,lambda ; lr=.1)
        loss∇!(output, w)
        w -= lr * output
        w[(w.<(lr * lambda))&(w.>-(lr * lambda))] = 0
    return w
end

# iterator that collects the weights, and prints the loss
niter = 25
lambda = 1.0
for i=1:niter; w = train(w, output, x, y, lambda);
  println(loss(w)); end

```

[Previous page](https://discourse.julialang.org/t/types-and-gradients-including-forward-gradient/946.md?page=1)
