Воспроизводимость в научном программировании - PullRequest
17 голосов
/ 29 апреля 2010

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

Ответы [ 8 ]

13 голосов
/ 29 апреля 2010
  • Опубликуйте исходные необработанные данные в Интернете и сделайте их свободно доступными для загрузки.
  • Сделать базу с открытым исходным кодом и доступной для скачивания онлайн.
  • Если в оптимизации используется рандомизация, то повторите оптимизацию несколько раз, выбирая наилучшее полученное значение или используйте фиксированное случайное начальное число, чтобы повторить те же результаты.
  • Перед выполнением анализа вы должны разбить данные на набор данных "обучение / анализ" и набор данных "тестирование / проверка". Выполните свой анализ набора данных «Training» и убедитесь, что полученные результаты все еще сохраняются в наборе данных «validation», чтобы убедиться, что ваш анализ действительно обобщаем, а не просто запоминает особенности рассматриваемого набора данных.

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

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

Что касается рандомизации ... многие алгоритмы полагаются на рандомизацию для достижения своих результатов. Стохастические методы и методы Монте-Карло довольно распространены, и, хотя было доказано, что они сходятся в определенных случаях, все же возможно получить разные результаты. Чтобы гарантировать, что вы получите те же результаты, в вашем коде должен быть цикл, который запускает вычисления несколько раз и выбирает лучший результат. Если вы используете достаточно повторений, вы можете ожидать найти глобальные или почти глобальные оптимумы вместо того, чтобы застрять в локальных оптимумах. Другая возможность состоит в том, чтобы использовать предопределенное начальное число, хотя это, на мой взгляд, не очень хороший подход, поскольку вы можете выбрать начальное число, которое заставит вас застрять в локальных оптимах. Кроме того, нет гарантии, что генераторы случайных чисел на разных платформах будут генерировать одинаковые результаты для этого начального значения.

9 голосов
/ 29 апреля 2010

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

  1. Поместите все под контроль версий: исходный код, наборы входных данных, файлы сборки и т. Д.
  2. При сборке исполняемых файлов: мы встраиваем директивы компилятора всами исполняемые файлы, мы помечаем журнал сборки UUID и помечаем исполняемый файл тем же UUID, вычисляем контрольные суммы для исполняемых файлов, автоматически собираем все и автоматически обновляем базу данных (ОК, на самом деле это простой файл) с деталями сборки и т. д.
  3. Мы используем ключевые слова Subversion для включения номеров ревизий (и т. Д.) В каждый фрагмент исходного кода, и они записываются в любые сгенерированные выходные файлы.
  4. Мы проводим множество (полу) автоматических регрессионных тестов дляУбедитесь, что новые версии кода или новые варианты сборки дают одинаковые (или достаточно похожие) результаты, и я работаю над кучей программ для количественной оценки происходящих изменений.
  5. Мои коллеги-геофизики делаютанализ чувствительности программ к изменениям входных данных.Я анализирую их (коды, а не геос) чувствительность к настройкам компилятора, к платформе и тому подобное.

В настоящее время мы работаем над системой рабочего процесса, которая будет записывать детали каждого запуска задания: входные наборы данных (включая версии), выходные наборы данных, используемые программы (включая версию и вариант), параметры и т. Д. -- что обычно называют провенансом.После запуска и запуска единственным способом публикации результатов будет использование системы рабочего процесса.Любые выходные наборы данных будут содержать подробности их собственного происхождения, хотя мы еще не выполнили детальную разработку этого.

Мы довольно (возможно, слишком) расстроены воспроизведением числовых результатов в наименее значащую цифру.Наука, лежащая в основе нашей работы, и ошибки, присущие измерениям наших фундаментальных наборов данных, не поддерживают достоверность любого из наших численных результатов, превышающих 2 или 3 sf

Мы, конечно, не будем публиковать ни код, ниДанные для экспертной оценки, мы в нефтяном бизнесе.

8 голосов
/ 29 апреля 2010

Много хороших предложений уже. Я добавлю (оба из горького опыта --- до публикации , к счастью!),

1) Проверьте ваши результаты на стабильность:

  • попробуйте несколько разных подмножеств данных
  • переберите ввод
  • восстановить вывод
  • настроить интервал сетки
  • попробуйте несколько случайных семян (если применимо)

Если это не стабильно, вы еще не сделали.

Опубликуйте результаты вышеуказанного тестирования (или, по крайней мере, сохраните доказательства и упомяните, что вы это сделали).

2) Выборочная проверка промежуточных результатов

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

Опять любые сюрпризы, и вам нужно вернуться и сделать это снова.

И, опять же, сохраните и / или опубликуйте это.


Уже упоминалось, что мне нравится включать

  • Контроль источника --- вам все равно это нужно для себя.
  • Регистрация среды сборки. Публикация же хороша.
  • План по обеспечению доступности кода и данных.

Еще один, о котором никто не упомянул:

3) Документируйте код

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

Не мешало бы собрать немного README с инструкциями по сборке и рекламой "Как запустить". Если вы собираетесь сделать код доступным, люди будут спрашивать об этом материале ... Плюс, для меня, проверка с ним помогает мне идти в ногу.

6 голосов
/ 29 апреля 2010

опубликуйте код программы, сделайте его доступным для просмотра.

Это не направлено против вас, но вот моя напыщенная речь:

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

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

4 голосов
/ 29 апреля 2010

Я думаю, что многие из предыдущих ответов пропустили часть вашего вопроса, касающуюся "научных вычислений", и на них были даны общие сведения, относящиеся к любой науке (сделайте данные и метод общедоступными, специализирующимися на КС).

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

Например (на оборудовании Intel) вы могли бы использовать библиотеку, которая использует 80-разрядные числа с плавающей запятой FPU, выполнить обновление O / S, и теперь эта библиотека может теперь использовать только 64-разрядные двойные числа, и ваши результаты могут быть радикальными изменить, если ваша проблема была наименее плохо обусловлена.

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

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

Ничто из этого не видно из исходного кода или данных.

2 голосов
/ 29 апреля 2010

Почтовый индекс, данные и результаты в Интернете. Напишите URL в статье.

Кроме того, отправьте ваш код на "конкурсы". Например, в поиске музыкальной информации есть MIREX .

1 голос
/ 29 апреля 2010

Записать параметры конфигурации каким-либо образом (например, если вы можете установить для определенной переменной определенное значение). Это может быть в выводе данных или в управлении версиями.

Если вы все время меняете свою программу (я!), Обязательно запишите, какую версию вашей программы вы используете.

0 голосов
/ 23 июля 2015

Возможно, это немного не по теме, но для того, чтобы следовать руководству @Jacques Carette в отношении специфики научных вычислений, может быть полезно обратиться к литературе по верификации и валидации ("V & V") для некоторых конкретных вопросов, особенно тех, которые стирают грань между воспроизводимостью и правильность. Теперь, когда облачные вычисления становятся все более подходящим вариантом для решения больших задач моделирования, воспроизводимость случайного ассортимента случайных процессоров станет более серьезной проблемой. Кроме того, я не знаю, возможно ли полностью отделить «правильность» от «воспроизводимости» ваших результатов, потому что ваши результаты вытекают из вашей вычислительной модели. Несмотря на то, что ваша модель работает на вычислительном кластере A, но не работает на кластере B, вам необходимо следовать некоторым рекомендациям, чтобы гарантировать, что ваш рабочий процесс для создания этой модели будет надежным. Что касается воспроизводимости, в сообществе V & V есть некоторый шум, чтобы включить ошибку воспроизводимости в общую неопределенность модели (я позволю читателю исследовать это самостоятельно).

Например, для работы по вычислительной гидродинамике (CFD) золотым стандартом является руководство ASME V & V . Для людей, применяющих прикладное мультифизическое моделирование и моделирование, особенно (с его общими концепциями, применимыми к большему научному компьютерному сообществу), это важный стандарт для усвоения.

...