Воспроизводимость в научном программировании

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

17
задан Andrew Grimm 29 April 2010 в 01:07
поделиться

7 ответов

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

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

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

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

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

9
ответ дан 30 November 2019 в 11:08
поделиться

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

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

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

Если он нестабилен, вы не закончили.

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

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

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

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

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


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

  • Управление исходным кодом - оно вам в любом случае понадобится.
  • Ведение журнала среды сборки. Публикация же хороша.
  • Запланируйте, как сделать код и данные доступными.

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

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

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

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

8
ответ дан 30 November 2019 в 11:08
поделиться
  • Опубликуйте исходные необработанные данные в Интернете и сделайте их свободно доступными для загрузки.
  • Сделайте исходный код базы кода открытым и доступным для загрузки в Интернете.
  • Если при оптимизации используется рандомизация, то повторите оптимизацию несколько раз, выбирая наилучшее полученное значение, или используйте фиксированное случайное начальное число, чтобы повторялись одни и те же результаты.
  • Перед выполнением анализа вы должны разделить данные на набор данных «обучение / анализ» и набор данных «тестирование / проверка». Выполните анализ «обучающего» набора данных и убедитесь, что результаты, которые вы получаете, все еще удерживаются на «проверочном» наборе данных, чтобы гарантировать, что ваш анализ действительно является обобщаемым, а не просто запоминанием особенностей рассматриваемого набора данных. {{ 1}}

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

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

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

13
ответ дан 30 November 2019 в 11:08
поделиться

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

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

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

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

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

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

5
ответ дан 30 November 2019 в 11:08
поделиться

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

Также отправьте свой код на «конкурсы». Например, при поиске музыкальной информации используется MIREX .

2
ответ дан 30 November 2019 в 11:08
поделиться

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

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

1
ответ дан 30 November 2019 в 11:08
поделиться

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

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

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

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

6
ответ дан 30 November 2019 в 11:08
поделиться
Другие вопросы по тегам:

Похожие вопросы: