Сравнительный анализ: когда я могу прекратить измерения?

У меня есть ряд функций, которые предназначены для выполнения одной и той же задачи. Одни и те же входы производят одни и те же результаты, но время, необходимое для их выполнения, зависит от функции. Я хочу определить, какой из них «самый быстрый», и я хочу быть уверенным, что мое измерение «статистически значимо».

Просматривая Википедию и интернет-сайты, я понял, что статистическая значимость означает, что измерение или группа измерений отличаются от нулевой гипотезы порогом p-значения. Как это применимо здесь? Какова нулевая гипотеза о том, что функция A быстрее, чем функция B?

Как только я определил всю эту настройку, как мне понять, когда прекратить измерение? Обычно я вижу, что тест выполняется три раза, а затем сообщается среднее значение; почему три раза, а не пять или семь? Согласно этой странице о статистической значимости (которую я честно признаю, я не совсем понимаю), Фишер использовал 8 как количество образцов, которое ему понадобилось для измерения чего-либо с достоверностью 98%; почему 8?


person mmr    schedule 07.09.2009    source источник


Ответы (5)


Вы задаете два вопроса:

  1. Как выполнить проверку статистической значимости того, что среднее время функции A больше, чем среднее время функции B?
  2. Если вы хотите быть уверенным в своем ответе, сколько образцов вы должны взять?

Наиболее распространенный ответ на первый вопрос заключается в том, что вы либо хотите вычислить доверительный интервал, либо выполнить t-test. Это ничем не отличается от любого другого научного эксперимента со случайными вариациями. Чтобы вычислить 95-процентный доверительный интервал среднего времени отклика для функции A, просто возьмите среднее значение и добавьте 1,96-кратную стандартную ошибку к любой стороне. Стандартная ошибка — это квадратный корень из дисперсии, деленный на N. То есть

95% CI = mean +/- 1.96 * sqrt(sigma2/N))

где sigma2 — это дисперсия скорости для функции A, а N — это количество прогонов, которые вы использовали для расчета среднего значения и дисперсии.

Ваш второй вопрос касается статистического анализа мощности и планирования экспериментов. Вы описываете последовательную настройку, в которой вы спрашиваете, продолжать ли выборку. Планирование последовательных экспериментов на самом деле представляет собой очень сложную проблему в статистике, поскольку в целом вам не разрешается вычислять доверительные интервалы или p-значения, а затем брать дополнительные выборки при условии, что вы не достигнете желаемой значимости. Если вы хотите сделать это, было бы разумнее настроить байесовскую модель и рассчитать апостериорную вероятность того, что скорость A больше, чем скорость B. Это, однако, огромное излишество.

В вычислительной среде, как правило, довольно тривиально получить очень маленький доверительный интервал как потому, что легко рисовать большие N, так и потому, что дисперсия, как правило, мала — одна функция явно выигрывает.

Учитывая, что Википедия и большинство онлайн-источников по-прежнему ужасны, когда речь идет о статистике, я рекомендую купить Вводная статистика с R. Вы изучите как статистику, так и инструменты для применения того, что вы узнали.

person Tristan    schedule 07.09.2009
comment
Спасибо за ссылку! Но давайте предположим, что я уже взял N образцов. Могу ли я рассчитать CI для любых трех запусков, выбранных из N, а затем любых 4, а затем любых 5 и т. д., вплоть до N, чтобы определить, достиг ли я уже порогового значения к тому времени, когда я доберусь до N? Из того, что вы говорите, вам не разрешено рассчитывать доверительные интервалы или p-значения... но если я уже собрал данные, это нормально? Почему я не могу просто проверить данные, которые у меня есть, чтобы понять, нужно ли мне продолжать? - person mmr; 07.09.2009
comment
Совершенно нормально делать все, что вы хотите, с некоторыми данными предварительного тестирования. Вы можете поиграть и посмотреть, что N дает вам тип доверительного интервала, который вы хотите. Однако, когда вы вычисляете свой окончательный доверительный интервал, вы не можете основывать его на выборке, где N является функцией характеристик этой конкретной выборки (т.е. среднее значение N-1 предыдущих наблюдений). Следует иметь в виду вопрос: приведет ли процедура, которую я использую для выбора N, к результату, эквивалентному N случайным розыгрышам? Например, увеличение N до тех пор, пока CI не станет меньше 1, всегда создает CI меньше 1, тогда как случайная выборка N не будет. - person Tristan; 07.09.2009

Я бы не стал применять принципы статистики к результатам сравнительного анализа. В общем, термин «статистическая значимость» относится к вероятности того, что ваши результаты были получены случайно, и не представляют собой точную оценку истинных значений. В статистике в результате простой вероятности вероятность достижения результата случайно уменьшается по мере увеличения числа измерений. При бенчмаркинге компьютерного кода тривиальным вопросом является увеличение количества испытаний («n» в статистике) так, чтобы вероятность случайного результата была ниже любого произвольного порога, который вы хотите определить («альфа» или уровень). статистической значимости).

Для упрощения: сравните, запуская свой код огромное количество раз, и не беспокойтесь о статистических измерениях.

Примечание для потенциальных противников этого ответа: этот ответ несколько упрощает вопрос, предназначенный для доступной иллюстрации концепций. Комментарии вроде «вы явно не разбираетесь в статистике» приведут к жестокому избиению. Не забывайте быть вежливым.

person MusiGenesis    schedule 07.09.2009
comment
Но насколько уменьшается вероятность случайного достижения результата при увеличении числа измерений? Где приемлемая точка зрения, когда можно сказать: «Хорошо, вероятность сейчас довольно низкая — назовем это вероятностью 0,5%, что мои результаты будут хорошими?» Или что эта подпрограмма на Х% быстрее другой подпрограммы, и моя уверенность в Х% составляет 99%? - person mmr; 07.09.2009
comment
@mmr: если у вас есть две подпрограммы (A и B), и вы запускаете их каждую 1 000 000 раз, а среднее время для A составляет 1 мс, а среднее время для B составляет 2 мс, то вопрос статистики: учитывая предположение, что A и B в действительности занимают одинаковое количество времени, какова вероятность того, что B чисто случайно измерил в два раза больше времени, чем A? Ответ таков: настолько близко к 0, что с таким же успехом можно было бы сказать 0. - person MusiGenesis; 07.09.2009
comment
@mmr: статистические методы в целом предназначены для аппроксимации измерений несчетно больших популяций путем измерения относительно небольших выборок и экстраполяции оттуда. В бенчмаркинге компьютерного кода вы практически не ограничены измерением небольших выборок, поэтому статистические методологии не нужны. - person MusiGenesis; 07.09.2009
comment
@MusiGeneis: Конечно, но вы только что запускали его миллион раз. Может быть, вы могли бы сделать такое же заявление о том, что вы «чертовски близки к нулю» после 1000 пробежек. Где этот порог? И что такое «чертовски близко к нулю»? 0,001? - person mmr; 07.09.2009
comment
@MusiGenesis #2: Почему это не нужно? Почему это не похоже на любое другое научное измерение? - person mmr; 07.09.2009
comment
@mmr: стандартные альфа-значения в статистике — 0,05 и 0,01. Я говорю скорее о 0,00000001, что на несколько порядков ниже любого разумного значения альфа. - person MusiGenesis; 07.09.2009
comment
@mmr: как я упоминал ранее, статистические методологии были разработаны для оценки свойств популяций, которые слишком велики, чтобы их можно было подсчитать напрямую. Компьютерный код не страдает от этой проблемы. - person MusiGenesis; 07.09.2009
comment
@MusiGenesis: Теперь мы подошли к тому, что я хочу знать :) Что такое альфа-значение? Как вы это определяете? А что касается «не страдать от этой проблемы», моя проблема в том, что эти подпрограммы выполняются порядка нескольких часов (это какой-то тяжелый код обработки изображений, который я пытаюсь оптимизировать), поэтому я не могу разумно запустить код миллион раз и все равно закончу в этом месяце. - person mmr; 07.09.2009
comment
@mmr: значение alpha в основном показывает, насколько вы готовы совершить ошибку типа I, то есть насколько вы готовы отвергнуть нулевую гипотезу, которая на самом деле верна. В моем примере A и B выше выбор альфа 0,05 будет означать, что при выполнении сравнительных тестов, подобных этому, вы готовы ошибаться (другими словами, сказать, что B медленнее, чем A, хотя на самом деле это не так) 5% времени. - person MusiGenesis; 07.09.2009
comment
@mmr: если выполнение каждой процедуры занимает несколько часов, это совсем другое дело. Я предполагаю, что ваша процедура на самом деле включает в себя один или несколько небольших фрагментов кода, которые вызываются снова и снова. Если это так, вам лучше настроить эталонные тесты этих небольших подпрограмм и сравнить их. - person MusiGenesis; 07.09.2009
comment
Чтобы еще больше усложнить эту проблему, поскольку вы хотите знать, какие методы лучше при выполнении на различных машинах/средах, ваше n должно относиться к количеству разных машин, на которых вы его запускаете, в чтобы правильно обобщить ваши результаты. При запуске только на вашей машине вы действительно оцениваете только относительные скорости на этой машине. - person MusiGenesis; 07.09.2009
comment
@MusiGenesis: Итак, если есть ошибка типа I, какова нулевая гипотеза сравнения двух функций? Что у них одинаковая скорость? Или что A быстрее, чем B? Независимо от времени выполнения, я все же хочу иметь возможность сказать (по политическим причинам, длинным и скучным), что A быстрее, чем B, или наоборот, с некоторым числовым доверительным описанием. Когда я смотрю на ошибки типа I в Википедии, я до сих пор не понимаю, сколько измерений мне потребуется, что является основным вопросом здесь. - person mmr; 07.09.2009
comment
@mmr: в этом случае нулевая гипотеза состоит в том, что две функции имеют одинаковую скорость. Если вы затем использовали односторонний статистический тест, вы могли бы сказать, что B быстрее, чем A (с 0,01 альфа или что-то еще), или если вы использовали двусторонний статистический тест, вы могли бы сказать, что B был отличается от A (быстрее или медленнее). Вы, вероятно, использовали бы односторонний тест только в том случае, если бы у вас была априорная причина полагать, что B будет быстрее, а не просто другим. - person MusiGenesis; 07.09.2009
comment
@mmr: вы можете видеть, учитывая количество доступных вам вариантов для чего-то подобного, как это обычно бывает, что обобщаемость статистических результатов часто сильно завышена (не говоря уже о том, как легко ими можно манипулировать для получения желаемого выводы). - person MusiGenesis; 07.09.2009
comment
@mmr: один дополнительный момент - формулы для расчета статистической значимости всегда включают дисперсию в измерениях. Если дисперсия высока (это означает, что измерения различаются, например, 2, 1, 7, 25, 8, 50 и т. д.), то нулевую гипотезу отвергнуть труднее. Если дисперсия низкая (например, 2, 2, 2, 3, 2, 2), легче отклонить нуль. С точки зрения непрофессионала, большая согласованность данных указывает на большую надежность оценки. - person MusiGenesis; 07.09.2009
comment
@mmr: вот почему вы не можете просто сказать, что вам нужно произвольное количество измерений (например, 8) для достижения заданного уровня достоверности. Необходимое значение n зависит от выборочной дисперсии. - person MusiGenesis; 07.09.2009
comment
@mmr: последнее замечание (на этот раз по-настоящему) - измерения компьютерных тестов обычно имеют невероятно низкую дисперсию. Заданный набор инструкций занимает почти одинаковое время каждый раз, когда они выполняются. Таким образом, в дополнение к тому, что компьютеры могут легко генерировать большое n, им нужно только маленькое n. - person MusiGenesis; 07.09.2009

Исследование, которое вы размещаете, больше похоже на строго контролируемую среду. Это чисто практический ответ, который снова и снова доказывает свою эффективность для тестирования производительности.

Если вы выполняете бенчмаркинг кода в современной, многозадачной, многоядерной вычислительной среде, количество итераций, необходимых для достижения полезного бенчмарка, увеличивается по мере того, как сокращается продолжительность измеряемой операции.

Итак, если у вас есть операция, которая занимает около 5 секунд, вам, как правило, потребуется от 10 до 20 итераций. Пока отклонение на итерациях остается довольно постоянным, ваши данные достаточно надежны, чтобы делать выводы. Вы часто захотите выбросить первую итерацию или две, потому что система обычно прогревает кэши и т. д.

Если вы тестируете что-то в диапазоне миллисекунд, вам понадобятся десятки тысяч итераций. Это устранит шум, вызванный запуском других процессов и т. д.

Как только вы достигнете диапазона менее миллисекунды — десятков наносекунд — вам понадобятся миллионы итераций.

Не совсем научно, но и не тестирование «в реальном мире» на современной вычислительной системе.

Сравнивая результаты, учитывайте разницу в скорости выполнения в процентах, а не в абсолютном выражении. Все, что меньше 5% разницы, довольно близко к шуму.

person bbum    schedule 07.09.2009
comment
а почему 10 на 20? Откуда берутся эти цифры? Есть какая-то формула или вы просто догадываетесь? Почему 5% за шум, а не, скажем, что-то связанное со стандартными отклонениями скорости? - person mmr; 07.09.2009

Вас действительно волнует статистическая значимость или простая старая значимость? В конечном итоге вам, вероятно, придется составить мнение о читабельности и производительности, и статистическая значимость на самом деле вам не поможет.

Несколько эмпирических правил, которые я использую:

  • По возможности проводите тестирование в течение достаточного времени, чтобы быть уверенным, что небольшие ошибки (например, что-то еще, прерывающее тест на короткое время) не будут иметь большого значения. Обычно я считаю, что для этого достаточно 30 секунд, хотя это зависит от вашего приложения. Чем дольше вы тестируете, тем надежнее будет тест, но, очевидно, ваши результаты будут отложены :)

  • Запуск теста несколько раз может быть полезным, но если вы рассчитываете достаточно долго, то это не так важно, IMO. Это устранило бы другие виды ошибок, из-за которых весь тест занимал больше времени, чем следовало бы. Если результат теста выглядит подозрительно, обязательно повторите его. Если вы видите существенно отличающиеся результаты для разных прогонов, запустите его еще несколько раз и попытайтесь определить закономерность.

person Jon Skeet    schedule 07.09.2009
comment
Меня действительно волнует статистическая значимость; Я хочу заявить с числовой уверенностью, что эта функция или подход быстрее, чем тот подход при данной настройке компьютера. Для ваших тестов, почему 30 секунд? Откуда это число? Интуиция, основанная на опыте? А вы говорите: «прогони еще несколько раз» — сколько еще раз? Есть ли какая-то формула или просто предварительный расчет? - person mmr; 07.09.2009
comment
Если разница не абсолютно очевидна, просто используйте более удобочитаемую версию. Это почти всегда лучший способ. Насчет 30 секунд - да, интуиция на основе опыта. А сколько еще раз - до тех пор, пока у вас не будет набора цифр, которые выглядят разумными. Все основано исключительно на интуиции. - person Jon Skeet; 07.09.2009
comment
+1 по поводу совершенно очевидных отличий. В статистике мы назвали это тестом межглазной перкуссии (он же удар прямо между глаз). - person MusiGenesis; 08.09.2009

Фундаментальный вопрос, на который вы пытаетесь ответить, заключается в том, насколько вероятно, что то, что вы наблюдаете, могло произойти случайно? Честна ли эта монета? Бросьте один раз: ГОЛОВЫ. Нет, это несправедливо, это всегда падает орлом. Плохой вывод! Бросьте его 10 раз и получите 7 орлов, что вы теперь сделаете? 1000 раз и 700 голов?

Для простых случаев мы можем представить, как выяснить, когда прекратить тестирование. А у вас немного другая ситуация - вы действительно проводите статистический анализ?

Насколько вы контролируете свои тесты? Добавляет ли их повторение какую-либо ценность? Ваш компьютер детерминирован (возможно). Определение безумия, данное Эйнштейном, состоит в том, чтобы повторять что-то и ожидать другого результата. Итак, когда вы запускаете свои тесты, вы получаете повторяющиеся ответы? Я не уверен, что статистический анализ поможет, если вы делаете достаточно хорошие тесты.

Что касается того, что вы делаете, я бы сказал, что в первую очередь нужно убедиться, что вы действительно измеряете то, что думаете. Запускайте каждый тест достаточно долго, чтобы любые эффекты запуска или завершения работы были скрыты. По этой причине полезные тесты производительности, как правило, выполняются в течение довольно продолжительных периодов времени. Убедитесь, что на самом деле вы не измеряете время в своей тестовой программе, а не в своем коде.

У вас есть две основные переменные: сколько итераций вашего метода нужно выполнить в одном тесте? Сколько тестов запустить?

Википедия говорит об этом

В дополнение к выражению изменчивости населения стандартное отклонение обычно используется для измерения достоверности статистических выводов. Например, предел погрешности в данных опроса определяется путем вычисления ожидаемого стандартного отклонения результатов, если один и тот же опрос будет проводиться несколько раз. Сообщаемая погрешность обычно примерно в два раза превышает стандартное отклонение.

Следовательно, если ваша цель состоит в том, чтобы убедиться, что одна функция работает быстрее, чем другая, вы можете запустить несколько тестов каждой, вычислить средние значения и стандартные отклонения. Я ожидаю, что если ваше количество итераций в любом тесте велико, то стандартное отклонение будет низким.

Если мы примем это определение предела погрешности, вы сможете увидеть, отличаются ли два средних значения дальше, чем их общий предел погрешности.

person djna    schedule 07.09.2009
comment
Каждый раз, когда я запускаю тест, я получаю несколько разные значения скорости. Именно так и происходит бенчмаркинг - современная компьютерная среда не контролируется, как уже указывал кто-то другой. Таким образом, выполнение одного и того же теста дважды даст разные ответы по скорости, но не разные результаты. - person mmr; 07.09.2009
comment
Я обновил ответ, чтобы предложить посмотреть стандартное отклонение. - person djna; 07.09.2009