В идеале мы бы определили пользовательское присоединение для quantile
, чтобы это работало «из коробки». (Не стесняйтесь, чтобы открыть выпуск , чтобы напомнить нам сделать это.)
В то же время есть быстрый обходной путь. Это на самом деле сортировка, которая вызывает проблемы здесь, так что если вы сделаете quantile(xs, p, sorted=true)
, это будет работать. Очевидно, что для получения правильных результатов требуется сортировка xs
, поэтому вам может потребоваться использовать quantile(sort(xs), ...)
.
В зависимости от версии Zygote вам также может потребоваться сопряжение для sort
. Это довольно просто:
julia> using Zygote: @adjoint
julia> @adjoint function sort(x)
p = sortperm(x)
x[p], x̄ -> (x̄[invperm(p)],)
end
julia> gradient(x -> quantile(sort(x), 0.5, sorted=true), [1, 2, 3, 3])
([0.0, 0.5, 0.5, 0.0],)
Мы сделаем это встроенным в следующем выпуске Zygote, но сейчас, если вы добавите это в свой скрипт, он заработает ваш код.