💡 Инструкция: Выберите один ответ из пяти. На работу отведено 70 минут. После завершения откроются правильные ответы, объяснения и результаты по темам.
Вопрос 2 из 25
Какой эксперимент отличит настоящий механизм `J = ForwardDiff.jacobian(f, x)` от случайного результата одного запуска?
Julia Julia · Прямой режим дифференцирования Копировать
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
Проверить на отдельном примере, что приведение двойственное число к `Float64` сохраняет производную в скрытом поле и влияет только на печать.
Проверить на отдельном примере, что двойственное число несёт значение и компонент производной; код, который жёстко приводит всё к `Float64`, уничтожает эту информацию.
Проверить на отдельном примере, что прямой режим вычисляет производные вместе со значением и выгоден при небольшом числе входов относительно выходов.
Проверить на отдельном примере, что прямой режим быстрее обратный режим при любом числе параметров, потому что не хранит граф обратного прохода.
Проверить на отдельном примере, что обратный режим не сохраняет промежуточные значения и потому требует меньше памяти, чем прямой режим.
Вопрос 4 из 25
Какой результат приёмочного теста подтвердит корректность участка с `J = ForwardDiff.jacobian(f, x)`?
J_f(x)\in\mathbb{R}^{m\times n}
Приёмка должна подтвердить, что двойственное число несёт значение и компонент производной; код, который жёстко приводит всё к `Float64`, уничтожает эту информацию.
Приёмка должна подтвердить, что приведение двойственное число к `Float64` сохраняет производную в скрытом поле и влияет только на печать.
Приёмка должна подтвердить, что прямой режим вычисляет производные вместе со значением и выгоден при небольшом числе входов относительно выходов.
Приёмка должна подтвердить, что прямой режим быстрее обратный режим при любом числе параметров, потому что не хранит граф обратного прохода.
Приёмка должна подтвердить, что обратный режим не сохраняет промежуточные значения и потому требует меньше памяти, чем прямой режим.
Вопрос 6 из 25
Как нужно интерпретировать `loss(w, x, y) = sum(abs2, w .* x .- y)`, не добавляя к коду лишних гарантий?
\bar{x}=J_f(x)^{\mathsf T}\bar{y}
Julia Julia · Обратный режим дифференцирования Копировать
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
Обратный режим не сохраняет промежуточные значения и потому требует меньше памяти, чем прямой режим.
Пользовательское правило производной обычно хватает проверить в одной точке, поскольку форма и особенности типов не меняют его контракт.
Нестандартную производную задают через согласованный интерфейс ChainRules и проверяют независимо; правило должно учитывать форму, комплексность и невычислимые касательные.
Обратный режим распространяет сопряжённые величины назад и обычно выгоден для скалярной цели с большим числом параметров, но требует хранения промежуточного состояния.
Мутация, внешние библиотеки и чувствительные данные могут быть несовместимы с выбранным механизмом AD; границу нужно изолировать и документировать, а не скрывать отключённым градиентом.
Вопрос 7 из 25
Какой эксперимент отличит настоящий механизм `loss(w, x, y) = sum(abs2, w .* x .- y)` от случайного результата одного запуска?
Julia Julia · Обратный режим дифференцирования Копировать
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
Проверить на отдельном примере, что обратный режим распространяет сопряжённые величины назад и обычно выгоден для скалярной цели с большим числом параметров, но требует хранения промежуточного состояния.
Проверить на отдельном примере, что нестандартную производную задают через согласованный интерфейс ChainRules и проверяют независимо; правило должно учитывать форму, комплексность и невычислимые касательные.
Проверить на отдельном примере, что мутация, внешние библиотеки и чувствительные данные могут быть несовместимы с выбранным механизмом AD; границу нужно изолировать и документировать, а не скрывать отключённым градиентом.
Проверить на отдельном примере, что пользовательское правило производной обычно хватает проверить в одной точке, поскольку форма и особенности типов не меняют его контракт.
Проверить на отдельном примере, что обратный режим не сохраняет промежуточные значения и потому требует меньше памяти, чем прямой режим.
Вопрос 8 из 25
Какое требование к `loss(w, x, y) = sum(abs2, w .* x .- y)` важнее удобной детали текущей реализации?
Julia Julia · Обратный режим дифференцирования Копировать
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
Сохранить в реализации правило: Пользовательское правило производной обычно хватает проверить в одной точке, поскольку форма и особенности типов не меняют его контракт.
Сохранить в реализации правило: Мутация, внешние библиотеки и чувствительные данные могут быть несовместимы с выбранным механизмом AD; границу нужно изолировать и документировать, а не скрывать отключённым градиентом.
Сохранить в реализации правило: Обратный режим распространяет сопряжённые величины назад и обычно выгоден для скалярной цели с большим числом параметров, но требует хранения промежуточного состояния.
Сохранить в реализации правило: Обратный режим не сохраняет промежуточные значения и потому требует меньше памяти, чем прямой режим.
Сохранить в реализации правило: Нестандартную производную задают через согласованный интерфейс ChainRules и проверяют независимо; правило должно учитывать форму, комплексность и невычислимые касательные.
Вопрос 9 из 25
Две реализации участка с `loss(w, x, y) = sum(abs2, w .* x .- y)` совпадают на обычных данных. Что необходимо проверить перед выпуском?
\bar{x}=J_f(x)^{\mathsf T}\bar{y}
Приёмка должна подтвердить, что пользовательское правило производной обычно хватает проверить в одной точке, поскольку форма и особенности типов не меняют его контракт.
Приёмка должна подтвердить, что нестандартную производную задают через согласованный интерфейс ChainRules и проверяют независимо; правило должно учитывать форму, комплексность и невычислимые касательные.
Приёмка должна подтвердить, что обратный режим распространяет сопряжённые величины назад и обычно выгоден для скалярной цели с большим числом параметров, но требует хранения промежуточного состояния.
Приёмка должна подтвердить, что обратный режим не сохраняет промежуточные значения и потому требует меньше памяти, чем прямой режим.
Приёмка должна подтвердить, что мутация, внешние библиотеки и чувствительные данные могут быть несовместимы с выбранным механизмом AD; границу нужно изолировать и документировать, а не скрывать отключённым градиентом.
Вопрос 12 из 25
Какую проверку стоит добавить для участка с `y = Float64(x)`?
Julia Julia · Дуальные числа Копировать
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-компонент
Проверить на отдельном примере, что прямой режим вычисляет производные вместе со значением и выгоден при небольшом числе входов относительно выходов.
Проверить на отдельном примере, что пользовательское правило производной обычно хватает проверить в одной точке, поскольку форма и особенности типов не меняют его контракт.
Проверить на отдельном примере, что приведение двойственное число к `Float64` сохраняет производную в скрытом поле и влияет только на печать.
Проверить на отдельном примере, что двойственное число несёт значение и компонент производной; код, который жёстко приводит всё к `Float64`, уничтожает эту информацию.
Проверить на отдельном примере, что прямой режим быстрее обратный режим при любом числе параметров, потому что не хранит граф обратного прохода.
Вопрос 16 из 25
Какое утверждение точнее всего объясняет участок с `cube(x) = x^3`?
\mathrm{rrule}(f,x)=(y,\mathcal{B})
Julia Julia · Правила производных Копировать
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)
Пользовательское правило производной обычно хватает проверить в одной точке, поскольку форма и особенности типов не меняют его контракт.
Нестандартную производную задают через согласованный интерфейс ChainRules и проверяют независимо; правило должно учитывать форму, комплексность и невычислимые касательные.
Обратный режим распространяет сопряжённые величины назад и обычно выгоден для скалярной цели с большим числом параметров, но требует хранения промежуточного состояния.
Двойственное число несёт значение и компонент производной; код, который жёстко приводит всё к `Float64`, уничтожает эту информацию.
Мутация, внешние библиотеки и чувствительные данные могут быть несовместимы с выбранным механизмом AD; границу нужно изолировать и документировать, а не скрывать отключённым градиентом.
Вопрос 17 из 25
Какой тест точнее всего зафиксирует границу поведения `cube(x) = x^3`?
Julia Julia · Правила производных Копировать
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)
Проверить на отдельном примере, что двойственное число несёт значение и компонент производной; код, который жёстко приводит всё к `Float64`, уничтожает эту информацию.
Проверить на отдельном примере, что пользовательское правило производной обычно хватает проверить в одной точке, поскольку форма и особенности типов не меняют его контракт.
Проверить на отдельном примере, что обратный режим распространяет сопряжённые величины назад и обычно выгоден для скалярной цели с большим числом параметров, но требует хранения промежуточного состояния.
Проверить на отдельном примере, что мутация, внешние библиотеки и чувствительные данные могут быть несовместимы с выбранным механизмом AD; границу нужно изолировать и документировать, а не скрывать отключённым градиентом.
Проверить на отдельном примере, что нестандартную производную задают через согласованный интерфейс ChainRules и проверяют независимо; правило должно учитывать форму, комплексность и невычислимые касательные.
Вопрос 18 из 25
Какую гарантию должна сохранить правка участка с `cube(x) = x^3`?
Julia Julia · Правила производных Копировать
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)
Сохранить в реализации правило: Двойственное число несёт значение и компонент производной; код, который жёстко приводит всё к `Float64`, уничтожает эту информацию.
Сохранить в реализации правило: Обратный режим распространяет сопряжённые величины назад и обычно выгоден для скалярной цели с большим числом параметров, но требует хранения промежуточного состояния.
Сохранить в реализации правило: Мутация, внешние библиотеки и чувствительные данные могут быть несовместимы с выбранным механизмом AD; границу нужно изолировать и документировать, а не скрывать отключённым градиентом.
Сохранить в реализации правило: Пользовательское правило производной обычно хватает проверить в одной точке, поскольку форма и особенности типов не меняют его контракт.
Сохранить в реализации правило: Нестандартную производную задают через согласованный интерфейс ChainRules и проверяют независимо; правило должно учитывать форму, комплексность и невычислимые касательные.
Вопрос 19 из 25
Две реализации участка с `cube(x) = x^3` совпадают на обычных данных. Что необходимо проверить перед выпуском?
\mathrm{rrule}(f,x)=(y,\mathcal{B})
Приёмка должна подтвердить, что обратный режим распространяет сопряжённые величины назад и обычно выгоден для скалярной цели с большим числом параметров, но требует хранения промежуточного состояния.
Приёмка должна подтвердить, что двойственное число несёт значение и компонент производной; код, который жёстко приводит всё к `Float64`, уничтожает эту информацию.
Приёмка должна подтвердить, что нестандартную производную задают через согласованный интерфейс ChainRules и проверяют независимо; правило должно учитывать форму, комплексность и невычислимые касательные.
Приёмка должна подтвердить, что мутация, внешние библиотеки и чувствительные данные могут быть несовместимы с выбранным механизмом AD; границу нужно изолировать и документировать, а не скрывать отключённым градиентом.
Приёмка должна подтвердить, что пользовательское правило производной обычно хватает проверить в одной точке, поскольку форма и особенности типов не меняют его контракт.
Вопрос 21 из 25
Что именно следует из фрагмента с `return ccall(:sqrt, Cdouble, (Cdouble,), x)`?
D(f\circ b)=Df\,Db
Julia Julia · Безопасность данных Копировать
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)
Мутация, внешние библиотеки и чувствительные данные могут быть несовместимы с выбранным механизмом AD; границу нужно изолировать и документировать, а не скрывать отключённым градиентом.
Обратный режим распространяет сопряжённые величины назад и обычно выгоден для скалярной цели с большим числом параметров, но требует хранения промежуточного состояния.
Внешний вызов обычно хватает исключить из автоматического дифференцирования и вернуть нулевой градиент; за пределами поддерживаемого участка результат модели останется корректным.
Пользовательское правило производной обычно хватает проверить в одной точке, поскольку форма и особенности типов не меняют его контракт.
Нестандартную производную задают через согласованный интерфейс ChainRules и проверяют независимо; правило должно учитывать форму, комплексность и невычислимые касательные.
Вопрос 22 из 25
Какую проверку стоит добавить для участка с `return ccall(:sqrt, Cdouble, (Cdouble,), x)`?
Julia Julia · Безопасность данных Копировать
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)
Проверить на отдельном примере, что пользовательское правило производной обычно хватает проверить в одной точке, поскольку форма и особенности типов не меняют его контракт.
Проверить на отдельном примере, что внешний вызов обычно хватает исключить из автоматического дифференцирования и вернуть нулевой градиент; за пределами поддерживаемого участка результат модели останется корректным.
Проверить на отдельном примере, что мутация, внешние библиотеки и чувствительные данные могут быть несовместимы с выбранным механизмом AD; границу нужно изолировать и документировать, а не скрывать отключённым градиентом.
Проверить на отдельном примере, что обратный режим распространяет сопряжённые величины назад и обычно выгоден для скалярной цели с большим числом параметров, но требует хранения промежуточного состояния.
Проверить на отдельном примере, что нестандартную производную задают через согласованный интерфейс ChainRules и проверяют независимо; правило должно учитывать форму, комплексность и невычислимые касательные.
Вопрос 23 из 25
Какую гарантию должна сохранить правка участка с `return ccall(:sqrt, Cdouble, (Cdouble,), x)`?
Julia Julia · Безопасность данных Копировать
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)
Сохранить в реализации правило: Мутация, внешние библиотеки и чувствительные данные могут быть несовместимы с выбранным механизмом AD; границу нужно изолировать и документировать, а не скрывать отключённым градиентом.
Сохранить в реализации правило: Нестандартную производную задают через согласованный интерфейс ChainRules и проверяют независимо; правило должно учитывать форму, комплексность и невычислимые касательные.
Сохранить в реализации правило: Внешний вызов обычно хватает исключить из автоматического дифференцирования и вернуть нулевой градиент; за пределами поддерживаемого участка результат модели останется корректным.
Сохранить в реализации правило: Обратный режим распространяет сопряжённые величины назад и обычно выгоден для скалярной цели с большим числом параметров, но требует хранения промежуточного состояния.
Сохранить в реализации правило: Пользовательское правило производной обычно хватает проверить в одной точке, поскольку форма и особенности типов не меняют его контракт.
Вопрос 24 из 25
Как проверить, что новая реализация `return ccall(:sqrt, Cdouble, (Cdouble,), x)` не изменила обещанное пользователю поведение?
D(f\circ b)=Df\,Db
Приёмка должна подтвердить, что мутация, внешние библиотеки и чувствительные данные могут быть несовместимы с выбранным механизмом AD; границу нужно изолировать и документировать, а не скрывать отключённым градиентом.
Приёмка должна подтвердить, что пользовательское правило производной обычно хватает проверить в одной точке, поскольку форма и особенности типов не меняют его контракт.
Приёмка должна подтвердить, что нестандартную производную задают через согласованный интерфейс ChainRules и проверяют независимо; правило должно учитывать форму, комплексность и невычислимые касательные.
Приёмка должна подтвердить, что внешний вызов обычно хватает исключить из автоматического дифференцирования и вернуть нулевой градиент; за пределами поддерживаемого участка результат модели останется корректным.
Приёмка должна подтвердить, что обратный режим распространяет сопряжённые величины назад и обычно выгоден для скалярной цели с большим числом параметров, но требует хранения промежуточного состояния.