Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

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

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

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

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

И снова сохраните и/или опубликуйте это.


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

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

Другой никто не упомянул:

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

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

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

Ответ 4

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

Это не направлено на вас каким-либо образом, но вот мой разбор:

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

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

Ответ 5

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

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

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

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

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

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

Ответ 6

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

Также отправьте свой код на "конкурсы". Например, при поиске музыки, MIREX.

Ответ 7

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

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

Ответ 8

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

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