[Из песочницы] Стивен Вольфрам: “Внедряя вычисления повсюду”
Перевод доклада Стивена Вольфрама, прочитанного им на фестивале SXSW 2014.Оригинальный текст вы можете найти здесь.
Две недели назад я выступал с речью на конференции SXSW в Остине, Техас. Эта статья является немного доработанными тезисами доклада (это конспект текста, включающий демонстрации, от которых пришлось отказаться в процессе выступления):
Итак, на этот час запланировано довольно много.
В целом, мне бы хотелось рассказать историю, происходящую со мной в течение последних 40 лет, которая начинает приносить удивительные результаты только сейчас. Я имею ввиду что мы практически можем наблюдать эти результаты сегодня. Я хотел бы впервые представить вам весь спектр технологий, являющийся довольно-таки значительным результатом этих сорокалетних трудов. И я думаю что это достаточно важно.
Мне всегда нравилось представлять программы вживую. Но сегодня я собираюсь рискнуть больше обычного и продемонстрировать многие вещи, находящиеся еще на стадии тестирования. Надеюсь, что хотя бы большая часть из них работает.
Итак, основная задача в том чтобы начать относиться к вычислениям серьезно. Понять идею вычислений как таковых, а затем создать технологию, которая позволит внедрить их повсюду — после чего посмотреть к чему это приведет.
Можно сказать, я гонялся за этой идеей 40 лет. Я уже давно балансирую на стыке науки и технологий — создаю все более масштабные строительные блоки и строю из них все более высокую башню. И каждые несколько лет мне удается увидеть куда она будет расти дальше. По-моему, получается здорово. Однако, в последние несколько лет случилось нечто удивительное — своего рода великая унификация, которая ведет к технологическому Кембрийскому взрыву. И сегодня я впервые вам частично её представлю.
Но, для начала, немного истории. 40 лет назад я был 14-летним юнцом, который впервые прикоснулся к компьютеру (он тогда еще был размером со стол). Я не часто использовал его как нечто фундаментальное, но пытался с его помощью понять некоторые вещи из физики, которая меня по-настоящему интересовала. В тот момент я открыл для себя некоторые важные вещи, которыми пользуюсь до сих пор. Но сейчас я понимаю что самая важная вещь, которую я понял тогда относилась вовсе не к физике: чем лучше инструменты, которые мы используем, тем глубже мы сможем копнуть. Мне не очень хорошо давалась «математика на бумаге», а в то время это было серьезной проблемой для тех, кто хотел заниматься физикой. Однако, я осознавал, что расчеты можно делать на компьютере и начал создавать инструменты для этого. Очень скоро я с моими программами был лучше всех в математических расчетах для физики.
Вернемся в 1981-й год. В этом году случилось нечто восхитительное для 21-летнего ученого — я превратил все это в свой первый продукт и свою первую компанию. Важно то, что это заставило меня осознать — программные продукты могут стимулировать интеллектуальное мышление. Предстояло выяснить как создать язык для математических расчетов на компьютере, и мне потребовалось многое понять о вычислениях чтобы достигнуть цели. А потом я снова погрузился в основы науки уже с использованием созданных инструментов.
В итоге, я понял, что в то время как с математикой все хорошо, её фундаментальная концепция нуждается в обобщении. Я начал изучать всю вселенную всевозможных формальных систем, которая по сути является всеобщей вычислительной вселенной возможных программ. Я ставил небольшие эксперименты — как бы направлял свой вычислительный телескоп на части этой вселенной и смотрел что там было. То что я увидел, было потрясающе. Ниже я покажу вам несколько простых программ.Некоторые делают очень простые вещи, но есть и такие, которые при кажущейся простоте делают удивительно сложные вещи.
Эта — моя любимая программа, потому что ее я увидел первой в данном классе программ. Она называется правило 30, и 30 лет спустя она все еще на обороте моих визиток. (См. примечание 1 в конце.)
Простейшая программа. Простейшее начальное условие. Но она делает нечто безумное. Она создает сложные структуры из ничего, что является довольно интересным феноменом. Мне кажется, она отражает великий секрет того как работает природа. И да, я потратил много лет на изучение этого — безумно интересное занятие.
Но в процессе изучения этих вещей я понял, что мне необходимы более совершенные инструменты, чем те, которые были у меня. И, в основном поэтому, я создал Mathematica. Немного иронично, что названием программы является слово «математика». Потому что она изначально задумывалась чтобы расширить границы классической математики. Основная сверхидея в том, чтобы докопаться до самой сути математики и отыскать ее вычислительный фундамент, на котором все будет строиться. Мне удалось это сделать в языке системы Mathematica. За многие годы он отлично себя показал, а мы постоянно его дополняли и дорабатывали. (См. примечание 2 в конце.)
На самом деле, Mathematica в прошлом году праздновала свою 25-летнюю годовщину. За 25 лет ее использовали для изобретения, открытия и изучения бесчисленного количества вещей в огромном количестве университетов, больших компаний и подобных организаций по всему миру. Мне самому удалось около 10 лет поработать с Mathematica для собственных научных исследований. Я открыл много интересного в области науки, технологий и философии и написал об этом книгу, которая называется «Новый вид науки» (A New Kind of Science). (См. примечание 3 в конце.)
Но давайте снова вернемся в прошлое: когда я был подростком, меня по-настоящему интересовала одна вещь — систематизация информации. И мне казалось, что наступит день, когда человек сможет создать систему, способную автоматически отвечать на вопросы практически обо всем. К тому моменту я выяснил многое о том, как автоматизировать процесс ответа на вопросы, связанные с математикой. Но мне хотелось как-нибудь обобщить эту возможность для ответа на любые вопросы. Нашему миру необходимо что-то вроде универсального искусственного интеллекта подобного мозгу человека. И вот эта задача уже казалась очень сложной.
Каждые 10 лет или около того, я возвращаюсь к этой идее и прихожу к выводу, что, да — это все еще очень сложно. Но пока я проводил свои исследования, я понял кое-что важное: иногда исполнение даже очень простой программы может производить структуры, схожие по сложности с человеческим мозгом.
На самом деле нет большой разницы между мозго-подобным интеллектом и этими структурами. Последствиями такого мышления являются дилемма между свободой воли и предопределенностью, а так же, поиск внеземного разума. Однако, такие программы заставили меня осознать что для ответа на многие различные вопросы не обязательно создавать искусственный интеллект подобный мозгу. Может быть хватит обычных вычислений, наподобие тех, которые лежат в основе системы Mathematica.
Я не был уверен что сейчас подходящее десятилетие и даже подходящий век для этого, но преимущества владения небольшой компанией позволили мне провести эксперимент. Теперь я счастлив констатировать, что, как выяснилось, задача оказалась не настолько сложной — мы создали Wolfram|Alpha.
Вы вводите что-нибудь туда на естественном языке, а система использует всю мощь вложенных в нее данных, знаний, методов и алгоритмов чтобы просто сгенерировать отчет о том что вы спросили. Да, кстати, если вы пользуетесь Wolfram|Alpha, вы должно быть заметили, что вчера веб-интерфейс Wolfram|Alpha приобрел новый элегантный вид. Wolfram|Alpha знает очень о многом. Тысячи областей знаний и квинтильоны частичек данных покрывают по истине огромную область имеющихся у человечества знаний.
И на самом деле, каждый день много миллионов людей спрашивают систему о самых разных вещих — напрямую на сайте, через мобильные приложения и через такие технологии как Siri, которая тоже умеет обращаться к Wolfram|Alpha.
Итак, что мы имеем: Mathematica, ставшая фундаментом для языка описания и выполнения любых технических вычислений. А еще у нас есть Wolfram|Alpha, которая знает все о нашем мире и взаимодействие с которой происходит с помощью крайне неоднозначного естественного языка. Ну, Mathematica росла более 25 лет, а Wolfram|Alpha всего 5. Мы непрерывно изобретаем новые пути для расширения основных направлений этих систем все дальше и дальше. Но сейчас случилось нечто поистине глобальное и невероятное. И лично для меня катализатором этого стала совсем другая область: облачные технологии.
Тогда мне казалось, что Облако не несет чего-то качественно нового — я думал, что это просто практично. Но я ошибся. Теперь я, наконец, понимаю, что это та самая деталь, позволяющая объединить два глобальных подхода к вычислениям (Mathematica и Wolfram|Alpha), чтобы сделать из этого нечто значительно более глобальное.
Сейчас я должен признаться, что результат всего этого обладает немалой интеллектуальной сложностью. Однако, он крайне практичен. Мне всегда нравились ситуации, когда большие идеи ведут к по-настоящему полезным инновационным продуктам, как это и происходит в Wolfram Research. Мы взяли одну сверхидею и делаем множество (надеюсь, полезных) продуктов. На каком-то уровне описать каждый продукт довольно просто, однако самое захватывающее — то, что они представляют из себя вместе. И вот об этом мне хотелось бы поговорить сегодня. Но, скажу наперед — хотя мне эта история кажется крайне важной, ее совсем не просто рассказать.
Но, главное — начать. В основе всего лежит то, что мы называем Языком Wolfram. Мы только сейчас начинаем понемногу его выпускать. (См. примечание 4 в конце.)
Ядро Языка Wolfram «выращивалось» в Mathematica более 25 лет. Там оно было отлично испытано, а теперь мы добавляем туда все новые идеи и технологии из Wolfram|Alpha и из Облака. Это позволяет нам перейти на новый качественный уровень. Я в полном восторге от этого.
Идея в том, чтобы создать язык, ориентированный на знания. Язык, в который встроен огромный объем знаний о вычислениях и о нашем мире. Дело в том, что большинство языков программирования ориентируются на основные машинные операции. Они предоставляют множество отличных путей для управления исполняемым кодом. Иногда у них бывают библиотеки для специфических вещей.
Но наша идея Языка Wolfram прямо противоположна — создать язык, в который встроено столько, сколько возможно. Где язык сам может выполнить столько, сколько возможно. Где все автоматизировано настолько, насколько это возможно.
Ок, давайте посмотрим на то как он работает.
Вы можете использовать язык Wolfram полностью в интерактивном режиме используя интерфейс ноутбука который мы создали для Mathematica.
Ок, здесь все понятно. Давайте сделаем что-нибудь немного посложнее:
Да… это большое число. Выглядит почти как куча случайных цифр, подобная, скажем, 60 тысячам точек, взятых с некоторого сенсора.
Каким образом мы можем проанализировать их? Всё, что может потребоваться уже встроено в язык Wolfram.
Так, скажем, мы можем вычислить среднее значение точно и приближенно:
Можем вычислить коэффициент асимметрии:
Или сотни других статистических величин, тестов или визуализаций.
Эта зависимость выглядит немного странно на самом деле. Но позвольте мне сейчас не вдаваться в подробности, объясняя этот эффект.
Хорошо. Вот нечто совсем другое. Давайте позволим языку Wolfram обратиться к учётной записи некоторого пользователя Facebook и извлечь граф его друзей:
Хорошо, мы получили граф, что дальше? Язык Wolfram знает как работать с графами и сетями. Скажем, давайте вычислим его разбиение на сообщества:
Давайте попробуем что-то иное. Сейчас мы получим изображение с моей маленькой камеры:
Итак, мы его получили. Теперь давайте сделаем что-нибудь с ним. Мы можем просто взять это изображение и поместить его в некоторую функцию:
Мы получили изображение, разбитое на мелкие кусочки. Давайте сделаем это же интерактивным:
Теперь повернем каждый из фрагментов на некий угол:
Теперь, давайте ещё отсортируем их по цвету. Мы можем сделать таким образом некоторое забавное приложение, на выходе выдающее таблицу фрагментов:
Ок, это весьма забавно. Почему бы нам не написать об этом в нашем Твиттере?
Ок. На самом деле все дело в том, что язык Wolfram просто по своей сути знает очень много. Он умеет анализировать графы и сети. Он знает, как работать с изображениями, выполняет самые замысловатые алгоритмы их обработки. Язык Wolfram также знает об окружающем мире. Например, мы могли бы спросить его когда взошло солнце сегодня утром в том месте, где мы находимся:
Или время между восходом и закатом сегодня:
Или мы могли бы получить текущую температуру воздуха там, где мы сейчас:
Или график зависимости температуры от времени за прошедший день:
Этот язык на самом деле очень большой объект и на основе того, что мы сделали для Wolfram|Alpha, он также может отвечать на многие вопросы в форме естественного языка. И что действительно мощно, это то что мы можем использовать его для обозначения предметов в реальном мире.
Давайте просто введём «Ctrl» + «Shift» + »=» + «nyc» (первые три клавиши нужны просто для запуска интерфейса свободного ввода):
И эта конструкция преобразуется в объект «город Нью-Йорк». Так что, теперь мы можем найти разницу температур там где мы находимся и в Нью-Йорке:
Ок. Давайте сделаем что-нибудь более сложное, найдем страны, граничащие с Украиной:
Теперь найдем длины границ этих стран:
И создадим из полученных данных таблицу:
Или, может быть сделаем облако названий стран, причем свяжем размер каждого из названий с длиной соответствующей границы:
Или мы можем найти все бывшие республики СССР:
И отобразить их флаги:
Теперь давайте найдем флаг какой из стран наиболее близок к французскому:
Довольно просто, не так ли?
Или давайте возьмем первые несколько бывших советских республик и создадим карты их столиц, на которых отметим круг с радиусом 10 миль:
Я думаю, что это довольно удивительно, что вы можете делать такого рода вещи прямо внутри языка программирования, с помощью всего одной строки кода.
И, вы знаете, есть огромное количество областей знаний, встроенных в язык Wolfram. Мы создавали все это более чем четверть века.
В языке есть знания как о алгоритмах, так и о мире.
В нем существует два больших принципа. Во-первых, максимальная автоматизация — автоматизировать как можно больше. Вы задаёте то, что вы хотите, чтобы язык сделал, и он сам выясняет, как это сделать. Могут быть сотни алгоритмов для выполнения чего-то в различных случаях. Но то, что мы хотим сделать — это мета-алгоритм, который сам выбирает наилучший способ сделать это. Таким образом, все что человек должен сделать — определить свои цели, после этого дело за системой, которая будет стремиться решить задачу наиболее быстрым, точным и красивым способом.
Например, есть функция Classify которая классифицирует данные, осуществляя классическую задачу машинного обучения. Вы просто набираете Classify и помещаете в нее небольшой обучающий набор прописных цифр (изображений) и значений, им соответствующих:
На выходе вы получаете классификатор.
Мы можем применить его к тому, что мы только что нарисовали:
Хорошо, ну вот еще одна важная вещь о языке Wolfram: это согласованность и единообразие всего. Мы стремимся, чтобы всё в языке сочеталось друг с другом. Даже при том, что это огромная система, если вы делаете в ней что-то с географическими данными, мы делаем так, чтобы она идеально подходила и тому, что вы делаете с графами и сетями.
Я потратил приличную часть последних 25 лет моей жизни, создавая строгий дизайн системы, который требуется для реализации этих концепций. Это было увлекательно, но это была тяжелая работа. Тратить все это время на то, чтобы сделать вещи очевидными, такими, чтобы язык был легким для изучения, запоминания и того, чтобы догадаться о какой-то функции, если вы даже не знаете, есть ли она. Но знаете, благодаря тому, что все имеющиеся строительные блоки языка так хорошо подходят друг к другу, мы наблюдаем появление новых мощных алгоритмов. И мы прекрасно провели время, изобретая тысячи и тысячи новых алгоритмов, которые стали возможны только в нашем языке, в котором мы имеем все эти различные области соединенными друг с другом.
И на самом деле существует одна действительно фундаментальная идея, благодаря которой мы смогли осуществить такого рода интеграцию. Она заключается в том, что язык Wolfram имеет главную фундаментальную особенность — он является символьным языком. Если вы просто введёте х в язык, он не выдаст ошибки, что x не определен. x — это просто что-то, символ x — то с чем язык может работать. Конечно, это очень хорошо для математики.
Но, к моему удивлению, одним из больших открытий идеи символьного языка является то, что эта же концепция может применяться к бесчисленному множеству других объектов и областей знаний. Все в нашем языке является символьным объектом. Будь то математические выражения:
или объекты, такие как Austin, TX (Остин, штат Техас):
Или же, скажем графические примитивы, скажем вот сфера:
А вот коллекция цилиндров:
Так как все это является просто символьными выражениями, то мы можем взять любое из них и сделать, если хотим, некоторую морфологическую обработку изображения, например — поиск границ объектов:
Вы знаете, все является просто символьным выражением. Еще один пример — это графические интерфейсы. Вот символьный слайдер:
Вот коллекция слайдеров:
Знаете, так как всё является символьным выражением, то это дает вам огромную свободу. Вот последовательное применение функции f к выражению:
Вот последовательное применение функции под названием Framed, которая на выходе обрамляет выражение рамкой:
А вот уже полностью аналогичная символьная конструкция уже на основе простейшего графического интерфейса:
Ах… Боже мой… это фрактальный интерфейс!
Вы знаете, раз все объекты являются символьными, то действительно легко сделать все что угодно. Скажем, вот трехмерный график параметрически заданной функции:
Теперь, в одно движение, сделаем его интерактивным:
Вы можете сделать то же самое с чем угодно:
Ок. Еще одним класс объектов, которые являются символьными — документы.
Документ, в котором я сейчас набираю текст — это еще одно символьное выражение. И вы можете создать в нём все, что вы хотите символьно.
Скажем, вот некоторый текст. Если мы хотим, можем вращать его на произвольный угол:
Все является просто символьным выражением.
Ок. Есть ещё одна вещь, которая является символьным выражением — это код. Каждый фрагмент кода в языке Wolfram является просто символьным выражением, которое можно взять и работать с ним как угодно и где угодно. Это чрезвычайно важно для программирования, так как это означает, что вы можете в создавать вещи модульным способом.
Это также важно и по другой причине: это отличный способ работы с Облаком, которое можно рассматривать как своего рода гигантское активное хранилище для частей символьных вычислений. Фактически мы уже создали всю эту инфраструктуру, которую я собираюсь здесь сегодня впервые демонстрировать. (См. примечание 5 в конце.)
Скажем, у нас есть символьное выражение:
Теперь мы можем просто поместить его в Облако:
Мы получили символьный объект CloudObject с адресом URL по которому мы можем перейти к этому объекту из любой точки мира. Мы перешли по ней и вот мы получили наш объект.
Теперь давайте сделаем вместо этого неизменного объекта некоторую программу. В интернете к ней будет удобно обращаться с помощью API. Благодаря нашей символьной концепции всего, эта операция тоже может быть легко представлена таким образом.
Теперь мы можем поместить эту программу в Облако:
Таким образом мы получили прямой API. Теперь мы можем просто дописать в конце ссылки параметр API, скажем, ? size=150 и получим ответ, причем совершенно не важно из какого места в Интернете мы посылали запрос:
И каждый раз, когда вы будете делать это, вы будете на самом деле вызывать этот небольшой код на Языке Wolfram в Wolfram Cloud и получать в ответ результат вычислений.
Есть еще кое-что, что можно сделать — создать форму для ввода пользователем. Просто измените APIFunction на FormFunction:
Теперь то что мы получили является уже формой ввода:
Давайте добавим еще одно поле ввода, которое позволит поворачивать введенный текст на произвольный угол:
Теперь давайте введём некоторые значения в форму ввода:
Когда мы нажмем на кнопку Submit (Отправить), мы получим результат:
Ок. Давайте попробуем другой пример. Вот форма, которая берёт названия двух городов, и рисует карту с отображением кратчайшего пути между ними:
Давайте поместим эту функцию в Облако:
Теперь заполним форму:
И когда мы нажимаем на Submit (Отправить), вот что мы получим:
Всего одна строка кода и мы фактически получили готовое небольшое, но мощное, веб-приложение! Внутри него скрыта весьма мощная новая технология. Вы видите эти поля ввода — они то, что мы называем «умными полями ввода», так как они способны понимать естественный язык:
Если вы указываете то, что не является городом, то вот что произойдет:
Когда вы вводите название города, система автоматически интерпретирует ввод как объект из множества городов. Позвольте я покажу вам, что происходит внутри. Давайте зададим форму, которая просто возвращает список введенных объектов:
Теперь, если мы вводим названия городов, то просто получаем символьные объекты Языка Wolfram, которые, конечно, могут затем участвовать в вычислениях:
Ладно, давайте попробуем что-нибудь другое.
Давайте я вам покажу пример популярного сегодня типа программирования. Давайте сделаем забавное приложение, которое показывает нам изображения глазами кошки или собаки. Ок, давайте создадим простейшую основу кода:
Теперь давайте создадим алгоритм, который преобразует изображение в соответствии с тем, как его видела бы собака, преобразуем цветовые каналы и учтем остроту зрения.
Хорошо, давайте теперь создадим приложение на основе этого кода:
Теперь мы можем распространять это приложение. Но сперва создадим для него иконку:
А сейчас давайте сделаем из него публичное приложение:
Теперь перейдем в приложение Wolfram Cloud для iPad:
И в нем мы уже видим приложение, которое только что опубликовали:
Нажмем на иконку приложения. То что мы увидим — уже готовое мобильное приложение, созданное с помощью Языка Wolfram в Облаке.
Мы можем использовать камеру iPad для того, чтобы сделать фото и затем посмотреть на результат его обработки нашим приложением:
Довольно неплохо, не правда ли?
Ок, но это еще не все. Позвольте я расскажу вам о первом продукте, выходящем из нашего стека технологий Языка Wolfram. Он будет доступен в ближайшее время. Мы называем его Wolfram Programming Cloud (Облако Программирования Wolfram)
Все вещи, которые я вам сейчас показываю, происходят в Облаке. В том числе и программирование. Конечно существует также и настольная версия — система Wolfram Mathematica.
Ок, итак вот Облако Программирования Wolfram:
Вы можете создавать приложения непосредственно в Облаке. Создадим функцию и просто используем CloudDeploy[]:
Или используем GUI (графический интерфейс пользователя):
Еще можно взять CDF и поместить его в Облако.
Давайте возьмем некоторый код с сайта Wolfram Demonstrations Project. На самом деле, так получилось, что это была самая первая Демонстрация, которую я сделал, когда сайт еще создавался.
Вот готовое приложение Cloud CDF.
Для него потребуется лишь браузер и, поскольку он работает с помощью Wolfram Engine в Облаке, оно обладает произвольной интерактивностью.
Ок, используя эту технологию, мы создаем другой продукт — Data Science Platform.
Идея заключается в следующем: информация поступает из разнообразных источников, а мы имеем все способы ее автоматизированного анализа, используя своего рода гигантский мета-алгоритм, равно как и знания о современном мире, которые у нас имеются.
Таким образом, вы можете запрограммировать что угодно с помощью Языка Wolfram и в конечном счете вы можете создать отчет. По вашему требованию, как от API или приложения. Или просто по расписанию. Вы также можете использовать символьные документы CDF для создания этих отчетов.
Например, вот шаблон отчета количества входящих сообщений на моем почтовом ящике. Он создан в виде простого символьного документа, так что я могу его легко редактировать.
А потом программно генерировать отчеты с его помощью:
Знаете, есть действительно захватывающие вещи, которые мы можем сделать с информацией, используя весь наш стек технологий символьного языка. Мы совсем недавно осознали, что мы можем его использовать для создания объединения и обобщения SQL и NoSQL баз данных. И мы реализовали это на четырех различных, взаимно прозрачных друг для друга, уровнях: памяти, файлах, базах данных и рассредоточенной информации.
Ок. С другой стороны у нас есть действительно хороший способ представления отдельных фрагментов данных. Мы называем его WDF — Wolfram Data Framework (Структура Данных Wolfram).
В основном WDF — это своего рода алгоритмическая онтология, которую мы создали для Wolfram|Alpha — мы знаем, что он