💡 Инструкция: Выберите один ответ из пяти. На работу отведено 70 минут. После завершения откроются правильные ответы, объяснения и результаты по темам.
Вопрос 2 из 25
Какой эксперимент отличит настоящий механизм `@show Optim.minimizer(result) Optim.minimum(result) Optim.converged(result)` от случайного результата одного запуска?
Julia Julia · Целевая функция Копировать
using Optim
loss(θ) = (θ[1]-2)^2 + 4(θ[2]+1)^2
result = optimize(loss, [0.0, 0.0], BFGS())
@show Optim.minimizer(result) Optim.minimum(result) Optim.converged(result)
Проверить на отдельном примере, что на практике обычно хватает взять большой коэффициент штрафа, чтобы получить поведение строгого ограничения без заметного влияния на обусловленность задачи.
Проверить на отдельном примере, что градиент должен соответствовать функции и типам данных; его проверяют конечными разностями или другим независимым способом на нескольких точках.
Проверить на отдельном примере, что векторный результат целевой функции интерпретируется оптимизатором как набор компонент, из которого он сам строит скалярное направление улучшения.
Проверить на отдельном примере, что целевая функция должна возвращать скаляр с понятным направлением оптимизации и быть определена на всей допустимой области, включая неудачные параметры.
Проверить на отдельном примере, что повторный запуск не должен случайно использовать изменённые глобальные массивы или кэш предыдущей задачи; состояние оптимизации передают и сбрасывают явно.
Вопрос 7 из 25
Какой эксперимент отличит настоящий механизм `θ = exp.(Optim.minimizer(result))` от случайного результата одного запуска?
Julia Julia · Ограничения Копировать
using Optim
raw_loss(z) = (exp(z[1]) - 3)^2
result = optimize(raw_loss, [0.0], BFGS())
θ = exp.(Optim.minimizer(result))
@show θ
Проверить на отдельном примере, что градиент должен соответствовать функции и типам данных; его проверяют конечными разностями или другим независимым способом на нескольких точках.
Проверить на отдельном примере, что целевая функция должна возвращать скаляр с понятным направлением оптимизации и быть определена на всей допустимой области, включая неудачные параметры.
Проверить на отдельном примере, что на практике обычно хватает взять большой коэффициент штрафа, чтобы получить поведение строгого ограничения без заметного влияния на обусловленность задачи.
Проверить на отдельном примере, что ограничения лучше выражать средствами решателя или параметризацией; большой штраф может ухудшить масштаб и не гарантирует допустимого решения.
Проверить на отдельном примере, что векторный результат целевой функции интерпретируется оптимизатором как набор компонент, из которого он сам строит скалярное направление улучшения.
Вопрос 11 из 25
Как нужно интерпретировать `g = ForwardDiff.gradient(loss, θ)`, не добавляя к коду лишних гарантий?
\nabla f(x)
Julia Julia · Градиенты Копировать
using ForwardDiff
loss(θ) = sum(abs2, θ .- [1.0, 2.0, 3.0])
θ = [0.5, 1.5, 2.5]
g = ForwardDiff.gradient(loss, θ)
function fd(f, x, i; h=1e-6)
e = zeros(length(x)); e[i] = h
(f(x+e)-f(x-e))/(2h)
end
@show g [fd(loss, θ, i) for i in eachindex(θ)]
Целевая функция должна возвращать скаляр с понятным направлением оптимизации и быть определена на всей допустимой области, включая неудачные параметры.
Векторный результат целевой функции интерпретируется оптимизатором как набор компонент, из которого он сам строит скалярное направление улучшения.
Ограничения лучше выражать средствами решателя или параметризацией; большой штраф может ухудшить масштаб и не гарантирует допустимого решения.
Градиент должен соответствовать функции и типам данных; его проверяют конечными разностями или другим независимым способом на нескольких точках.
Градиент, полученный AD, не нуждается в независимой проверке, потому что механическое дифференцирование исключает ошибки модели.
Вопрос 12 из 25
Какой контрольный тест лучше всего проверит правило, связанное с `g = ForwardDiff.gradient(loss, θ)`?
Julia Julia · Градиенты Копировать
using ForwardDiff
loss(θ) = sum(abs2, θ .- [1.0, 2.0, 3.0])
θ = [0.5, 1.5, 2.5]
g = ForwardDiff.gradient(loss, θ)
function fd(f, x, i; h=1e-6)
e = zeros(length(x)); e[i] = h
(f(x+e)-f(x-e))/(2h)
end
@show g [fd(loss, θ, i) for i in eachindex(θ)]
Проверить на отдельном примере, что ограничения лучше выражать средствами решателя или параметризацией; большой штраф может ухудшить масштаб и не гарантирует допустимого решения.
Проверить на отдельном примере, что целевая функция должна возвращать скаляр с понятным направлением оптимизации и быть определена на всей допустимой области, включая неудачные параметры.
Проверить на отдельном примере, что градиент должен соответствовать функции и типам данных; его проверяют конечными разностями или другим независимым способом на нескольких точках.
Проверить на отдельном примере, что векторный результат целевой функции интерпретируется оптимизатором как набор компонент, из которого он сам строит скалярное направление улучшения.
Проверить на отдельном примере, что градиент, полученный AD, не нуждается в независимой проверке, потому что механическое дифференцирование исключает ошибки модели.
Вопрос 13 из 25
Что должно остаться истинным после рефакторинга участка с `g = ForwardDiff.gradient(loss, θ)`?
Julia Julia · Градиенты Копировать
using ForwardDiff
loss(θ) = sum(abs2, θ .- [1.0, 2.0, 3.0])
θ = [0.5, 1.5, 2.5]
g = ForwardDiff.gradient(loss, θ)
function fd(f, x, i; h=1e-6)
e = zeros(length(x)); e[i] = h
(f(x+e)-f(x-e))/(2h)
end
@show g [fd(loss, θ, i) for i in eachindex(θ)]
Сохранить в реализации правило: Ограничения лучше выражать средствами решателя или параметризацией; большой штраф может ухудшить масштаб и не гарантирует допустимого решения.
Сохранить в реализации правило: Градиент должен соответствовать функции и типам данных; его проверяют конечными разностями или другим независимым способом на нескольких точках.
Сохранить в реализации правило: Целевая функция должна возвращать скаляр с понятным направлением оптимизации и быть определена на всей допустимой области, включая неудачные параметры.
Сохранить в реализации правило: Векторный результат целевой функции интерпретируется оптимизатором как набор компонент, из которого он сам строит скалярное направление улучшения.
Сохранить в реализации правило: Градиент, полученный AD, не нуждается в независимой проверке, потому что механическое дифференцирование исключает ошибки модели.
Вопрос 14 из 25
При переносе кода с `g = ForwardDiff.gradient(loss, θ)` в библиотеку какой критерий нельзя заменять впечатлением «пример работает»?
\nabla f(x)
Приёмка должна подтвердить, что векторный результат целевой функции интерпретируется оптимизатором как набор компонент, из которого он сам строит скалярное направление улучшения.
Приёмка должна подтвердить, что градиент должен соответствовать функции и типам данных; его проверяют конечными разностями или другим независимым способом на нескольких точках.
Приёмка должна подтвердить, что градиент, полученный AD, не нуждается в независимой проверке, потому что механическое дифференцирование исключает ошибки модели.
Приёмка должна подтвердить, что ограничения лучше выражать средствами решателя или параметризацией; большой штраф может ухудшить масштаб и не гарантирует допустимого решения.
Приёмка должна подтвердить, что целевая функция должна возвращать скаляр с понятным направлением оптимизации и быть определена на всей допустимой области, включая неудачные параметры.
Вопрос 16 из 25
Какой механизм Julia определяет поведение строки `@show start Optim.converged(r) Optim.minimum(r) norm(Optim.gradient(r))`?
\lVert\nabla f(x^*)\rVert\approx0
Julia Julia · Проверка сходимости Копировать
using Optim, LinearAlgebra
loss(x) = (x[1]-1)^4 + 1e-8(x[2]-10)^2
for start in ([0.0,0.0], [5.0,50.0])
r = optimize(loss, start, BFGS())
@show start Optim.converged(r) Optim.minimum(r) norm(Optim.gradient(r))
end
Градиент, полученный AD, не нуждается в независимой проверке, потому что механическое дифференцирование исключает ошибки модели.
Градиент должен соответствовать функции и типам данных; его проверяют конечными разностями или другим независимым способом на нескольких точках.
Флаг завершения решателя означает найденный глобальный оптимум и делает ненужной проверку разных стартов.
Статус остановки, невязки, градиент и чувствительность к начальному приближению важнее сообщения «решатель завершён».
Ограничения лучше выражать средствами решателя или параметризацией; большой штраф может ухудшить масштаб и не гарантирует допустимого решения.
Вопрос 17 из 25
Какой эксперимент отличит настоящий механизм `@show start Optim.converged(r) Optim.minimum(r) norm(Optim.gradient(r))` от случайного результата одного запуска?
Julia Julia · Проверка сходимости Копировать
using Optim, LinearAlgebra
loss(x) = (x[1]-1)^4 + 1e-8(x[2]-10)^2
for start in ([0.0,0.0], [5.0,50.0])
r = optimize(loss, start, BFGS())
@show start Optim.converged(r) Optim.minimum(r) norm(Optim.gradient(r))
end
Проверить на отдельном примере, что градиент, полученный AD, не нуждается в независимой проверке, потому что механическое дифференцирование исключает ошибки модели.
Проверить на отдельном примере, что ограничения лучше выражать средствами решателя или параметризацией; большой штраф может ухудшить масштаб и не гарантирует допустимого решения.
Проверить на отдельном примере, что градиент должен соответствовать функции и типам данных; его проверяют конечными разностями или другим независимым способом на нескольких точках.
Проверить на отдельном примере, что статус остановки, невязки, градиент и чувствительность к начальному приближению важнее сообщения «решатель завершён».
Проверить на отдельном примере, что флаг завершения решателя означает найденный глобальный оптимум и делает ненужной проверку разных стартов.
Вопрос 18 из 25
Какой контракт следует закрепить при переработке строки `@show start Optim.converged(r) Optim.minimum(r) norm(Optim.gradient(r))`?
Julia Julia · Проверка сходимости Копировать
using Optim, LinearAlgebra
loss(x) = (x[1]-1)^4 + 1e-8(x[2]-10)^2
for start in ([0.0,0.0], [5.0,50.0])
r = optimize(loss, start, BFGS())
@show start Optim.converged(r) Optim.minimum(r) norm(Optim.gradient(r))
end
Сохранить в реализации правило: Градиент должен соответствовать функции и типам данных; его проверяют конечными разностями или другим независимым способом на нескольких точках.
Сохранить в реализации правило: Градиент, полученный AD, не нуждается в независимой проверке, потому что механическое дифференцирование исключает ошибки модели.
Сохранить в реализации правило: Флаг завершения решателя означает найденный глобальный оптимум и делает ненужной проверку разных стартов.
Сохранить в реализации правило: Статус остановки, невязки, градиент и чувствительность к начальному приближению важнее сообщения «решатель завершён».
Сохранить в реализации правило: Ограничения лучше выражать средствами решателя или параметризацией; большой штраф может ухудшить масштаб и не гарантирует допустимого решения.
Вопрос 19 из 25
После обновления Julia или пакета поведение участка с `@show start Optim.converged(r) Optim.minimum(r) norm(Optim.gradient(r))` изменилось. Какой критерий приёмки остаётся корректным?
\lVert\nabla f(x^*)\rVert\approx0
Приёмка должна подтвердить, что флаг завершения решателя означает найденный глобальный оптимум и делает ненужной проверку разных стартов.
Приёмка должна подтвердить, что ограничения лучше выражать средствами решателя или параметризацией; большой штраф может ухудшить масштаб и не гарантирует допустимого решения.
Приёмка должна подтвердить, что градиент, полученный AD, не нуждается в независимой проверке, потому что механическое дифференцирование исключает ошибки модели.
Приёмка должна подтвердить, что статус остановки, невязки, градиент и чувствительность к начальному приближению важнее сообщения «решатель завершён».
Приёмка должна подтвердить, что градиент должен соответствовать функции и типам данных; его проверяют конечными разностями или другим независимым способом на нескольких точках.
Вопрос 21 из 25
Что именно следует из фрагмента с `scratch .= x`?
x_{k+1}=\Phi(x_k,s_k)
Julia Julia · Контроль состояния Копировать
using Optim
scratch = zeros(2)
function loss(x)
scratch .= x
scratch[1] -= 1
scratch[2] += 2
return sum(abs2, scratch)
end
r1 = optimize(loss, [0.0, 0.0])
r2 = optimize(loss, [10.0, 10.0])
@show Optim.minimizer(r1) Optim.minimizer(r2) scratch
На практике обычно хватает взять большой коэффициент штрафа, чтобы получить поведение строгого ограничения без заметного влияния на обусловленность задачи.
Повторный запуск целевой функции может безопасно использовать изменённые глобальные массивы и кэш прошлого старта, пока их размеры не изменились.
Целевая функция должна возвращать скаляр с понятным направлением оптимизации и быть определена на всей допустимой области, включая неудачные параметры.
Векторный результат целевой функции интерпретируется оптимизатором как набор компонент, из которого он сам строит скалярное направление улучшения.
Повторный запуск не должен случайно использовать изменённые глобальные массивы или кэш предыдущей задачи; состояние оптимизации передают и сбрасывают явно.
Вопрос 22 из 25
Какой эксперимент отличит настоящий механизм `scratch .= x` от случайного результата одного запуска?
Julia Julia · Контроль состояния Копировать
using Optim
scratch = zeros(2)
function loss(x)
scratch .= x
scratch[1] -= 1
scratch[2] += 2
return sum(abs2, scratch)
end
r1 = optimize(loss, [0.0, 0.0])
r2 = optimize(loss, [10.0, 10.0])
@show Optim.minimizer(r1) Optim.minimizer(r2) scratch
Проверить на отдельном примере, что повторный запуск целевой функции может безопасно использовать изменённые глобальные массивы и кэш прошлого старта, пока их размеры не изменились.
Проверить на отдельном примере, что на практике обычно хватает взять большой коэффициент штрафа, чтобы получить поведение строгого ограничения без заметного влияния на обусловленность задачи.
Проверить на отдельном примере, что повторный запуск не должен случайно использовать изменённые глобальные массивы или кэш предыдущей задачи; состояние оптимизации передают и сбрасывают явно.
Проверить на отдельном примере, что целевая функция должна возвращать скаляр с понятным направлением оптимизации и быть определена на всей допустимой области, включая неудачные параметры.
Проверить на отдельном примере, что векторный результат целевой функции интерпретируется оптимизатором как набор компонент, из которого он сам строит скалярное направление улучшения.
Вопрос 24 из 25
Какой результат приёмочного теста подтвердит корректность участка с `scratch .= x`?
x_{k+1}=\Phi(x_k,s_k)
Приёмка должна подтвердить, что векторный результат целевой функции интерпретируется оптимизатором как набор компонент, из которого он сам строит скалярное направление улучшения.
Приёмка должна подтвердить, что повторный запуск не должен случайно использовать изменённые глобальные массивы или кэш предыдущей задачи; состояние оптимизации передают и сбрасывают явно.
Приёмка должна подтвердить, что повторный запуск целевой функции может безопасно использовать изменённые глобальные массивы и кэш прошлого старта, пока их размеры не изменились.
Приёмка должна подтвердить, что целевая функция должна возвращать скаляр с понятным направлением оптимизации и быть определена на всей допустимой области, включая неудачные параметры.
Приёмка должна подтвердить, что на практике обычно хватает взять большой коэффициент штрафа, чтобы получить поведение строгого ограничения без заметного влияния на обусловленность задачи.