Программирование
Конец программирования
Близится конец классической компьютерной науки, и большинство из нас — динозавры, ожидающие падения метеорита.
Все изображения в этом посте были созданы DALL-E 2.
Я достиг совершеннолетия в 1980-х, программируя дома персональные компьютеры, такие как Commodore VIC-20 и Apple IIe. Продолжая изучать компьютерные науки в колледже, в конце концов я получил докторскую степень в Беркли. Основная часть моей профессиональной подготовки была связана с тем, что я буду называть «классической» компьютерной наукой: программированием, алгоритмами, структурами данных, системами, языками программирования. В классической компьютерной науке (Classical Computer Science) конечная цель — свести идею к программе, написанной человеком — исходному коду на таком языке, как Java, C++ или Python. Каждая идея в Classical CS — независимо от того, насколько она сложна или изощренна — от алгоритма соединения с базой данных до умопомрачительно бестолкового консенсусного протокола Paxos — может быть выражена в виде удобочитаемой и понятной человеку программы.
Когда я учился в колледже в начале 90-х, мы все еще находились в разгаре ИИ-зимы, и в области ИИ доминировали классические алгоритмы. Моей первой исследовательской работой в Корнелле была работа с Дэном Хаттенлохером, лидером в области компьютерного зрения (а теперь деканом Школы вычислительной техники Массачусетского технологического института). В курсе Дэна по компьютерному зрению для докторов наук в 1995 году или около того мы ни разу не обсуждали что-то похожее на глубокое обучение или нейронные сети — все это были классические алгоритмы, такие как обнаружение границ Кэнни, оптический поток и хаусдорфовы расстояния. Глубокое обучение находилось в зачаточном состоянии, оно еще не считалось основой ИИ, не говоря уже о CS.
Конечно, это было 30 лет назад, и с тех пор многое изменилось, но одна вещь, которая на самом деле не изменилась, это то, что информатика преподается как дисциплина, в основе которой лежат структуры данных, алгоритмы и программирование. Я буду поражен, если через 30 или даже 10 лет мы все еще будем думать о CS таким же образом. На самом деле, я думаю, что CS как отрасль ждут довольно серьезные потрясения, к которым немногие из нас действительно готовы.
Программирование устареет
Я считаю, что общепринятая идея «написания программ» находится на грани исчезновения, и действительно, для всех, кроме очень специализированных приложений, большая часть программного обеспечения в том виде, в каком мы его знаем, будет заменена системами ИИ, которые обучаются, а не программируются. В ситуациях, когда нужна «простая» программа (в конце концов, не все должно требовать моделей в сотни миллиардов параметров, работающих на кластере графических процессоров), эти программы сами будут генерироваться ИИ, а не программироваться вручную.
Я не считаю эту идею безумной. Несомненно, самые ранние пионеры компьютерных наук, вышедшие из (относительно) примитивной пещеры электротехники, полагали, что всем будущим ученым-компьютерщикам потребуется глубокое понимание полупроводников, двоичной арифметики и проектирования микропроцессоров, чтобы понимать программное обеспечение. Перенесемся в сегодняшний день, и я готов поспорить на хорошие деньги, что 99% людей, которые пишут программное обеспечение, почти не имеют ни малейшего представления о том, как на самом деле работает процессор, не говоря уже о физике, лежащей в основе конструкции транзистора. Более того, я считаю, что компьютерщики будущего будут настолько далеки от классических определений «программного обеспечения», что им будет трудно развернуть связанный список или сделать быструю сортировку (черт, я сам не уверен, что помню, как реализовать быструю сортировку самостоятельно).
Помощники по программированию на основе ИИ, такие как CoPilot, лишь поверхностно касаются того, о чем я говорю. Мне кажется совершенно очевидным, что все программы в будущем, в конечном счете, будут написаны ИИ, а людям отведена в лучшем случае контролирующая роль. Любому, кто сомневается в этом прогнозе, достаточно взглянуть на очень быстрый прогресс, достигнутый в других аспектах создания контента ИИ, таких как создание изображений. Разница в качестве и сложности между DALL-E v1 и DALL-E v2, о которых было объявлено всего 15 месяцев спустя, ошеломляет. Если я чему-то и научился за последние несколько лет работы в области ИИ, так это тому, что очень легко недооценить силу все более крупных моделей искусственного интеллекта. Вещи, которые еще несколько месяцев назад казались фантастикой, быстро становятся реальностью.
Так что я говорю не только о том, что CoPilot заменит программистов. Я говорю о замене всей концепции написания программ обучающими моделями. В будущем студентам компьютерных наук не нужно будет изучать такие рутинные навыки, как добавление узла в двоичное дерево или программирование на C++. Такое образование устареет, как обучение студентов технических специальностей использованию логарифмической линейки.
Инженеры будущего в несколько нажатий клавиш запустят экземпляр модели с четырьмя квинтиллионами параметров, которая уже кодирует весь объем человеческих знаний (и может даже больше), готовый к любой задаче, требуемой от машины. Основная часть интеллектуальной работы, направленной на то, чтобы заставить машину делать то, что нужно, будет заключаться в том, чтобы придумать правильные примеры, правильные данные для обучения и правильные способы оценки процесса обучения. Достаточно мощные модели, способные делать обобщения всего за несколько шагов, потребуют лишь нескольких хороших примеров для выполнения задачи. Массивные наборы данных, созданные человеком, в большинстве случаев больше не понадобятся, и большинство людей, «обучающих» модель ИИ, не будут запускать циклы градиентного спуска в PyTorch или что-то в этом роде. Они будут учить на собственном примере, а все остальное сделает машина.
В этой Новой Компьютерной Науке — если мы вообще назовем ее Компьютерной Наукой — машины будут настолько мощными и уже будут знать, как делать так много вещей, что эта область будет выглядеть не столько как инженерное предприятие, сколько как образовательное — понимание того, как лучше всего обучать машину, мало будет чем отличаясь от науки о том, как лучше всего обучать детей в школе. Однако, в отличие от (человеческих) детей, эти системы ИИ будут управлять нашими самолетами, управлять нашими энергосистемами и, возможно, даже управлять целыми странами. Я бы сказал, что подавляющее большинство классических CS станут неактуальным, когда мы фокусируемся на обучении интеллектуальных машин, а не на их непосредственном программировании. Программирование в общепринятом смысле фактически умрет.
Как все это меняет наше представление о компьютерных науках?
Новая атомарная вычислительная единица становится не процессором, памятью и системой ввода-вывода, реализующей машину фон Неймана, а массивной, предварительно обученной, высокоадаптивной моделью ИИ. Это огромный сдвиг в том, как мы думаем о вычислениях — не как о предсказуемом статическом процессе, управляемом наборами инструкций, системами типов и понятиями разрешимости. Вычисления на основе ИИ уже давно перешли Рубикон, поддающийся статическому анализу и формальным доказательствам. Мы быстро движемся к миру, в котором фундаментальными строительными блоками вычислений являются темпераментные, загадочные, адаптивные агенты.
Этот сдвиг подчеркивается тем фактом, что никто на самом деле не понимает, как работают большие модели ИИ. Люди публикуют исследовательские работы, на самом деле обнаруживая новое поведение существующих больших моделей, даже несмотря на то, что эти системы были «спроектированы» людьми. Большие модели ИИ способны делать то, чему их специально не обучали, что должно напугать до усрачки Ника Бострома и всех, кто беспокоится (и справедливо) о сверхразумном ИИ, выходящем из-под контроля. В настоящее время у нас нет другого способа, кроме эмпирического исследования, определить пределы существующих ИИ-систем. Что касается будущих моделей ИИ, которые на порядки больше и сложне… Блин — удачи в этом!
Смещение акцента с программ на модели должно быть очевидным для любого, кто читал современные статьи по машинному обучению. В этих документах почти не упоминается код или системы, лежащие в основе их инноваций. Строительные блоки ИИ-систем — это абстракции гораздо более высокого уровня, такие как уровни внимания, токенизаторы и наборы данных. Путешественнику во времени, перенесшему к нам из 90-ых, было бы трудно понять даже три предложения в описании (75 страниц!) GPT-3, описывающем фактическое программное обеспечение, созданное для модели:
Мы используем ту же модель и архитектуру, что и GPT-2 [RWC+19], включая описанные здесь модифицированную инициализацию, предварительную нормализацию и обратимую токенизацию, за исключением того, что мы используем чередующиеся плотные и локально распределенные разреженные паттерны внимания в слоях трансформера, похожего на Разряженный трансформер [CGRS19]. Чтобы изучить зависимость производительности машинного обучения от размера модели, мы обучаем модели 8 различных размеров, варьирующиеся по трем порядкам величины от 125 миллионов параметров до 175 миллиардов параметров, последней из которых является модель, которую мы называем GPT-3. Предыдущая работа [KMH+20] предполагает, что при наличии достаточного количества данных для обучения масштабирование потерь при проверке должно приблизительно соответствовать плавным степенным законом в зависимости от размера; обучающие модели самых разных размеров позволяют нам проверить эту гипотезу как на предмет потери достоверности, так и на последующих языковых задачах.
Этот сдвиг в базовом определении вычислений представляет огромные возможности и множество огромных рисков. Тем не менее, я думаю, пришло время признать, что это очень вероятное будущее, и соответствующим образом изменить наше мышление, а не просто сидеть здесь и ждать, пока метеорит упадет.