JL Julia  ·  25 вопросов  ·  ~70 мин  ·  ⏱ Таймер 10:00  ·  Средний  · 

Автоматическое дифференцирование

Практические задания по теме «Автоматическое дифференцирование» требуют сопоставить несколько решений, найти источник ошибки и оценить последствия выбранного подхода. Вопросы требуют читать код, находить границу применимости, выбирать проверяемую правку и отличать свойства Julia от поведения конкретного пакета. В тесте 25 вопросов: 15 заданий с кодом и 10 заданий с математической записью. Все формулировки рассчитаны на Julia 1.12.6; для сторонних библиотек используется явно названный API.

Отвечено: 0 из 25
⏱ --:--
0%
💡 Инструкция: Выберите один ответ из пяти. На работу отведено 70 минут. После завершения откроются правильные ответы, объяснения и результаты по темам.
Вопрос 1 из 25
Какое объяснение для `J = ForwardDiff.jacobian(f, x)` выдержит проверку на другом допустимом входе?
J_f(x)\in\mathbb{R}^{m\times n}
JuliaJulia · Прямой режим дифференцирования
using ForwardDiff
f(x) = [sin(x[1]) + x[2]^2, x[1]*x[2]]
x = [0.3, 2.0]
J = ForwardDiff.jacobian(f, x)
@show J
Вопрос 2 из 25
Какой эксперимент отличит настоящий механизм `J = ForwardDiff.jacobian(f, x)` от случайного результата одного запуска?
JuliaJulia · Прямой режим дифференцирования
using ForwardDiff
f(x) = [sin(x[1]) + x[2]^2, x[1]*x[2]]
x = [0.3, 2.0]
J = ForwardDiff.jacobian(f, x)
@show J
Вопрос 3 из 25
Что должно остаться истинным после рефакторинга участка с `J = ForwardDiff.jacobian(f, x)`?
JuliaJulia · Прямой режим дифференцирования
using ForwardDiff
f(x) = [sin(x[1]) + x[2]^2, x[1]*x[2]]
x = [0.3, 2.0]
J = ForwardDiff.jacobian(f, x)
@show J
Вопрос 4 из 25
Какой результат приёмочного теста подтвердит корректность участка с `J = ForwardDiff.jacobian(f, x)`?
J_f(x)\in\mathbb{R}^{m\times n}
Вопрос 5 из 25
Что следует сообщить пользователю библиотеки о поведении `J = ForwardDiff.jacobian(f, x)`?
Вопрос 6 из 25
Как нужно интерпретировать `loss(w, x, y) = sum(abs2, w .* x .- y)`, не добавляя к коду лишних гарантий?
\bar{x}=J_f(x)^{\mathsf T}\bar{y}
JuliaJulia · Обратный режим дифференцирования
using Zygote
loss(w, x, y) = sum(abs2, w .* x .- y)
w = [1.0, 2.0, 3.0]
x = [2.0, 2.0, 2.0]
y = [1.0, 4.0, 8.0]
g = gradient(w -> loss(w, x, y), w)[1]
@show g
Вопрос 7 из 25
Какой эксперимент отличит настоящий механизм `loss(w, x, y) = sum(abs2, w .* x .- y)` от случайного результата одного запуска?
JuliaJulia · Обратный режим дифференцирования
using Zygote
loss(w, x, y) = sum(abs2, w .* x .- y)
w = [1.0, 2.0, 3.0]
x = [2.0, 2.0, 2.0]
y = [1.0, 4.0, 8.0]
g = gradient(w -> loss(w, x, y), w)[1]
@show g
Вопрос 8 из 25
Какое требование к `loss(w, x, y) = sum(abs2, w .* x .- y)` важнее удобной детали текущей реализации?
JuliaJulia · Обратный режим дифференцирования
using Zygote
loss(w, x, y) = sum(abs2, w .* x .- y)
w = [1.0, 2.0, 3.0]
x = [2.0, 2.0, 2.0]
y = [1.0, 4.0, 8.0]
g = gradient(w -> loss(w, x, y), w)[1]
@show g
Вопрос 9 из 25
Две реализации участка с `loss(w, x, y) = sum(abs2, w .* x .- y)` совпадают на обычных данных. Что необходимо проверить перед выпуском?
\bar{x}=J_f(x)^{\mathsf T}\bar{y}
Вопрос 10 из 25
Что следует сообщить пользователю библиотеки о поведении `loss(w, x, y) = sum(abs2, w .* x .- y)`?
Вопрос 11 из 25
Что именно следует из фрагмента с `y = Float64(x)`?
x+\varepsilon\dot{x}
JuliaJulia · Дуальные числа
using ForwardDiff
function bad_scale(x)
    y = Float64(x)
    return y^3
end
function good_scale(x)
    return x^3
end
@show ForwardDiff.derivative(good_scale, 2.0)
# ForwardDiff.derivative(bad_scale, 2.0) теряет dual-компонент
Вопрос 12 из 25
Какую проверку стоит добавить для участка с `y = Float64(x)`?
JuliaJulia · Дуальные числа
using ForwardDiff
function bad_scale(x)
    y = Float64(x)
    return y^3
end
function good_scale(x)
    return x^3
end
@show ForwardDiff.derivative(good_scale, 2.0)
# ForwardDiff.derivative(bad_scale, 2.0) теряет dual-компонент
Вопрос 13 из 25
Какое решение устраняет риск вокруг `y = Float64(x)`, не меняя поведение на допустимых данных?
JuliaJulia · Дуальные числа
using ForwardDiff
function bad_scale(x)
    y = Float64(x)
    return y^3
end
function good_scale(x)
    return x^3
end
@show ForwardDiff.derivative(good_scale, 2.0)
# ForwardDiff.derivative(bad_scale, 2.0) теряет dual-компонент
Вопрос 14 из 25
Две реализации участка с `y = Float64(x)` совпадают на обычных данных. Что необходимо проверить перед выпуском?
x+\varepsilon\dot{x}
Вопрос 15 из 25
Какое ограничение стоит прямо указать в документации к участку с `y = Float64(x)`?
Вопрос 16 из 25
Какое утверждение точнее всего объясняет участок с `cube(x) = x^3`?
\mathrm{rrule}(f,x)=(y,\mathcal{B})
JuliaJulia · Правила производных
using ChainRulesCore
cube(x) = x^3
function ChainRulesCore.rrule(::typeof(cube), x)
    y = cube(x)
    pullback(ȳ) = (NoTangent(), ȳ * 3x^2)
    return y, pullback
end
@show cube(2.0)
Вопрос 17 из 25
Какой тест точнее всего зафиксирует границу поведения `cube(x) = x^3`?
JuliaJulia · Правила производных
using ChainRulesCore
cube(x) = x^3
function ChainRulesCore.rrule(::typeof(cube), x)
    y = cube(x)
    pullback(ȳ) = (NoTangent(), ȳ * 3x^2)
    return y, pullback
end
@show cube(2.0)
Вопрос 18 из 25
Какую гарантию должна сохранить правка участка с `cube(x) = x^3`?
JuliaJulia · Правила производных
using ChainRulesCore
cube(x) = x^3
function ChainRulesCore.rrule(::typeof(cube), x)
    y = cube(x)
    pullback(ȳ) = (NoTangent(), ȳ * 3x^2)
    return y, pullback
end
@show cube(2.0)
Вопрос 19 из 25
Две реализации участка с `cube(x) = x^3` совпадают на обычных данных. Что необходимо проверить перед выпуском?
\mathrm{rrule}(f,x)=(y,\mathcal{B})
Вопрос 20 из 25
Что следует сообщить пользователю библиотеки о поведении `cube(x) = x^3`?
Вопрос 21 из 25
Что именно следует из фрагмента с `return ccall(:sqrt, Cdouble, (Cdouble,), x)`?
D(f\circ b)=Df\,Db
JuliaJulia · Безопасность данных
using ForwardDiff
function external_boundary(x)
    x > 0 || throw(DomainError(x))
    return ccall(:sqrt, Cdouble, (Cdouble,), x)
end
f(x) = external_boundary(x) + x^2
# Граница ccall требует отдельного правила производной или изоляции.
@show f(4.0)
Вопрос 22 из 25
Какую проверку стоит добавить для участка с `return ccall(:sqrt, Cdouble, (Cdouble,), x)`?
JuliaJulia · Безопасность данных
using ForwardDiff
function external_boundary(x)
    x > 0 || throw(DomainError(x))
    return ccall(:sqrt, Cdouble, (Cdouble,), x)
end
f(x) = external_boundary(x) + x^2
# Граница ccall требует отдельного правила производной или изоляции.
@show f(4.0)
Вопрос 23 из 25
Какую гарантию должна сохранить правка участка с `return ccall(:sqrt, Cdouble, (Cdouble,), x)`?
JuliaJulia · Безопасность данных
using ForwardDiff
function external_boundary(x)
    x > 0 || throw(DomainError(x))
    return ccall(:sqrt, Cdouble, (Cdouble,), x)
end
f(x) = external_boundary(x) + x^2
# Граница ccall требует отдельного правила производной или изоляции.
@show f(4.0)
Вопрос 24 из 25
Как проверить, что новая реализация `return ccall(:sqrt, Cdouble, (Cdouble,), x)` не изменила обещанное пользователю поведение?
D(f\circ b)=Df\,Db
Вопрос 25 из 25
Какой тезис о `return ccall(:sqrt, Cdouble, (Cdouble,), x)` можно честно закрепить в справке?

Ответьте на все 25 вопросов, чтобы получить результат

🔗 Встроить тест на свой сайт (iframe) ▼

Скопируйте код и вставьте в любое место на вашем сайте:

Также доступна прямая ссылка на embed-страницу