# How is differentiation of implicit parameters implemented in Flux.jl?

**URL:** <https://discourse.julialang.org/t/how-is-differentiation-of-implicit-parameters-implemented-in-flux-jl/56656>\
**Category:** Internals & Design\
**Tags:** question, differentiation\
**Created:** [March 7, 2021, 6:16am UTC](https://discourse.julialang.org/t/how-is-differentiation-of-implicit-parameters-implemented-in-flux-jl/56656 "2021-03-07T06:16:53Z")\
**Posts on this page:** 1\
**Page:** 1

<div class="post-metadata">

**Author:** ![wujinq](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/wujinq/32/22221_2.png) [@wujinq](https://discourse.julialang.org/u/wujinq)\
**Post date:** [March 7, 2021, 6:16am UTC](https://discourse.julialang.org/t/how-is-differentiation-of-implicit-parameters-implemented-in-flux-jl/56656/1 "2021-03-07T06:16:54Z")

</div>

In the document of Flux.jl an example of differentiation of implicit parameters is given as follows:

```julia
julia> x = [2, 1];

julia> y = [2, 0];

julia> gs = gradient(params(x, y)) do
         f(x, y)
       end
Grads(...)

julia> gs[x]
2-element Array{Int64,1}:
 0
 2

julia> gs[y]
2-element Array{Int64,1}:
  0
 -2

```

I just wonder how is this implemented. My main question is, how can we know what global variables does a function use?
