Огляд коду моделі Фергюсона

від Сью Джин (не справжнє ім’я автора)

[Зверніть увагу: подальший аналіз тепер доступний тут.]

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

Моє походження. Я пишу програмне забезпечення вже 30 років. Я працював у Google між 2006 і 2014 роками, де працював старшим інженером-програмістом, працюючи над Картами, Gmail та захистом облікового запису. Останні п’ять років я провів у американській/британській фірмі, де серед інших робіт та проектів розробляв продукт бази даних компанії. Я також був незалежним консультантом пару років. Очевидно, що я даю лише власну професійну думку і не виступаю за свого нинішнього роботодавця.

Кодекс. Це не код, який проводив Фергюсон, щоб випустити свій знаменитий Звіт 9. Те, що було випущено на GitHub, - це сильно модифікована його похідна, після того, як команда з Microsoft та інших осіб її більше місяця оновлювала. Ця переглянута кодова база розбита на декілька файлів для читабельності та написана на C ++, тоді як оригінальною програмою був "єдиний 15000-рядовий файл, над яким працювали впродовж десятиліття" (це вважається надзвичайно поганою практикою). Запит на оригінальний код було зроблено 8 днів тому, але проігноровано, і, ймовірно, знадобиться якийсь юридичний примус, щоб змусити їх випустити його. Очевидно, що компанія Imperial занадто збентежена державою, щоб коли-небудь звільнити її за власним бажанням, що неприпустимо, враховуючи, що вона була сплачена платником податків і належить їм.

Модель. Те, що він робить, найкраще описати як "SimCity без графіки". Він намагається імітувати домогосподарства, школи, офіси, людей та їх пересування тощо. Я не буду вдаватися далі до основних припущень, оскільки це добре досліджено в інших місцях.

Недетерміновані результати. Через помилки код може давати дуже різні результати при однакових вхідних даних. Вони зазвичай поводяться так, ніби це неважливо.

Ця проблема робить код непридатним для наукових цілей, враховуючи, що ключовою частиною наукового методу є можливість реплікації результатів. Без тиражування висновки можуть бути зовсім не реальними - оскільки область психології з'ясовує свою вартість. Навіть якщо їх оригінальний код був випущений, очевидно, що з них не можуть вийти ті самі цифри, що й у Звіті 9.

Недетерміновані результати можуть мати певне пояснення, оскільки це не те, що раніше хтось використовував як можливість.

У документації сказано:

Модель стохастична. Щоб побачити середню поведінку, слід проводити багаторазові пробіги з різними насінням.

"Стохастичний" - це просто науково звучаче слово для "випадкового". Це не проблема, якщо випадковість є навмисною псевдовипадковістю, тобто випадковість походить від вихідного "насіння", яке повторюється для отримання випадкових чисел. Така випадковість часто використовується в техніках Монте-Карло. Це безпечно, оскільки насіння можна записати і з нього в майбутньому виробляти ті самі (псевдо) випадкові числа. Будь-яка дитина, яка грала в Minecraft, знайома з псевдовипадковістю, тому що Minecraft дає вам насіння, які він використовує для генерування випадкових світів, тому, ділившись насінням, ви можете ділитися світами.

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

Дослідження виявляє істину: код дає критично різні результати, навіть для однакових вихідних насіння та параметрів.

Проілюструю кількома помилками. У випуску 116 британська «червона команда» в Единбурзькому університеті повідомляє, що вони намагалися використовувати режим, який зберігає таблиці даних в більш ефективному форматі для швидшого завантаження, і виявили - на їх подив - що передбачувані прогнози варіювали приблизно на 80 000 смертей після 80 днів:

огляду

Цей режим нічого не змінює у світі, що імітується, тому це, очевидно, була помилка.

Відповідь Імперської команди така це не має значення: вони "знають про деякі незначні недетермінізми", але "це історично вважалося прийнятним через загальну стохастичну природу моделі". Зверніть увагу на формулювання тут: Imperial знає, що в їх коді є такі помилки, але поводяться так, ніби це властива випадковості Всесвіту, а не результат аматорського кодування. Очевидно, що в епідеміології різниця в 80 000 смертей - це "невеликий недетермінізм".

Imperial порадив Единбургу, що проблема зникає, якщо ви запускаєте модель в однопоточному режимі, як це роблять вони. Це означає, що вони пропонують використовувати лише одне ядро ​​центрального процесора, а не безліч ядер, які будь-яка відеоігра вдало використовувати. Для моделювання країни використання лише одного ядра процесора, очевидно, є серйозною проблемою - настільки далеко, наскільки це можливо. Тим не менше, саме так Imperial використовує код: вони знають, що він ламається, коли намагається запустити його швидше. З прочитання коду стає зрозуміло, що в 2014 році Imperial намагався змусити код використовувати кілька процесорів для його пришвидшення, але ніколи не змушував його працювати надійно. Відомо, що таке програмування є складним і зазвичай вимагає досвідчених інженерів для отримання хороших результатів. Результати, які випадково змінюються від запуску до запуску, є загальним наслідком помилок безпеки потоків. Більш розмовно, вони відомі як "гайзенбуги".

Але Единбург повернувся і повідомив, що - навіть у однопотоковому режимі - вони все ще бачать проблему. Тож розуміння проблеми Імперіалом неправильне. Нарешті, Imperial визнає, що є помилка, посилаючись на зроблену ними зміну коду, яка її виправляє. Пояснення пояснюється таким чином: "Схоже, що історично в цей момент використовувалася друга пара насіння для того, щоб зробити пробіги однаковими незалежно від того, як була створена мережа, але що це було змінено під час здійснення скидання насіння". Іншими словами, в процесі зміни моделі вони зробили її невідтворюваною і ніколи не помічали.

Чому вони не помітили? Оскільки їх код настільки глибоко пронизаний подібними помилками, і вони так сильно намагалися їх виправити, що у них з’явилася звичка просто усереднювати результати багаторазових запусків, щоб прикрити це ... і врешті-решт ця поведінка нормалізувалася в команді.

У випуску №30 хтось повідомляє, що модель видає різні результати, залежно від того, на якому комп’ютері вона працює (незалежно від кількості процесорів). Знову ж таки, пояснення полягає в тому, що, хоча ця нова проблема "просто додасть питань" ... "Це не проблема запуску моделі в повному обсязі, оскільки вона так чи інакше стохастична".

Незважаючи на те, що вченим у цих темах є не Ніл Фергюсон, він добре знає, що код заповнений помилками, які створюють випадкові результати. У зміні № 107, автором якої він є, він зауважує: «Він включає виправлення InitModel для забезпечення детермінованих запусків з увімкненими святами». У зміні № 158 він описує зміни лише як «Багато невеликих змін, деякі критичні для визначеності».

Imperial намагаються отримати свій торт і з'їсти його. Звіти про випадкові результати відхиляються з відповідями на кшталт "це не проблема, просто запустіть її багато разів і візьміть середнє значення", але в той же час вони виправляють такі помилки, коли знаходять їх. Вони знають, що їх код не витримує перевірки, тому приховували його, поки професіонали не мали можливості це виправити, але збитки від більш ніж десятиліття аматорського програмування хобі настільки великі, що навіть Microsoft не змогла зробити так, щоб він працював правильно.

Ніяких тестів. Під час обговорення виправлення першої помилки Імперський зазначив, що раніше код був детермінованим у цьому місці, але вони зламали його, не помітивши при зміні коду.

Такі регресії є типовими при роботі над складним програмним забезпеченням, саме тому промислові команди інженерів програмного забезпечення пишуть автоматизовані регресійні тести. Це програми, які запускають програму з різними входами, а потім перевіряють результати, які очікуються. Кожне запропоноване зміна запускається проти кожного тесту, і якщо будь-яке тестування не вдається, зміни можуть не вноситися.

Здається, імперський код не має робочих регресійних тестів. Вони намагалися, але ступінь випадкової поведінки в їх коді залишила їх переможеними. 4 квітня вони сказали: “Однак, у нас не було часу розробити масштабований та ремонтопридатний спосіб проведення регресійного тесту таким чином, щоб допускати незначні зміни, але не давати цифрам змінюватися з часом ".

Окрім очевидно неможливої ​​природи цієї специфічної кодової бази, прогнозування моделей тестування стикається з фундаментальною проблемою, оскільки автори не знають, що таке "правильна" відповідь, ще довгий час після цього, і до того часу код знову змінився, таким чином, зміна набору помилок у ньому. Тож незрозуміло, що регресійні тести насправді означають для таких моделей - навіть якщо вони працювали.

Недокументовані рівняння. Значна частина коду складається з формул, для яких не вказано жодної мети. Джон Кармак (легендарний програміст відеоігор) припустив, що деякі з кодів могли бути автоматично перекладені з FORTRAN кілька років тому.

Наприклад, у рядку 510 SetupModel.cpp є цикл над усіма “місцями”, про які знає моделювання. Здається, цей код намагається обчислити R0 для “місць”. Під час цієї перепустки готелі без пояснення причин виключені.

Цей фрагмент коду висвітлює проблему, яку обговорював Касуел Блай у коментарях вашого сайту: R0 не є реальною характеристикою вірусу. R0 - це і вхідні дані, і вихідні дані цих моделей, і вони регулярно коригуються для різних середовищ та ситуацій. Моделі, які використовують власні результати як вхідні дані, є проблемою, добре відомою приватному сектору - це може призвести до швидких розбіжностей та неправильного прогнозування. Ця проблема обговорюється у розділі 2.2 статті Google, “Машинне навчання: кредитна картка з високими відсотками технічного боргу”.

Постійний розвиток. Незважаючи на усвідомлення серйозних проблем у своєму коді, які вони «не встигли» виправити, команда Імператора продовжує додавати нові функції; наприклад, модель намагається імітувати вплив програм цифрового відстеження контактів.

Додавання нових функцій до кодової бази з такими проблемами якості просто призведе до їх ускладнення та погіршення. Якби я побачив це в компанії, для якої я консультувався, я б негайно порадив їм зупинити розробку нових функцій, поки не буде проведено ретельне тестування регресії та покращена якість коду.

Висновки. Усі документи, що базуються на цьому коді, слід негайно відкликати. Спроби моделювання Imperial слід відновити за допомогою нової команди, яка не працює під керівництвом професора Фергюсона і яка зобов’язується відтворювати результати з опублікованим кодом з першого дня.

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

Моя особа. Сью Джин не справжня людина (прочитайте). Я вирішив залишитися анонімним, частково через інтенсивні бої, що оточують блокування, але є також глибша причина. Ця ситуація виникла через нестримний акредитаціонізм, і я втомився від цього. Як демонструє широке розчарування програмістів, якби хтось із SAGE чи уряду показав код працюючому інженеру програмного забезпечення, якого вони випадково знали, тривожні дзвінки прозвучали б негайно. Натомість в уряді домінують вчені, які, мабуть, відчували неможливість поставити під сумнів щось, зроблене колегою професором. Тим часом пересічним громадянам, як я, кажуть, що ми ніколи не повинні ставити під сумнів “експертизу”. Незважаючи на те, що я довів свою роботу в Google Тобі, ця ментальність завдає шкоди і повинна закінчитися: будь-ласка, оцініть претензії, які я висунув для себе, або попросіть програміста, якого ви знаєте і довіряєте, оцінити їх для вас.