Anatoly Levenchuk (ailev) wrote,
Anatoly Levenchuk
ailev

Жми, господь!

Важность абстрагирования/сжатия информации при моделировании как ключевое свойство для компьютерного мышления и творчества я совсем недавно поминал в пункте два поста "за пределами инженерии и менеджмента" (https://ailev.livejournal.com/1411106.html).

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

Увы, поскольку мы не знаем, что мы хотим извлечь из уже имеющихся знаний о мире (входных прямо от всех наших сенсоров, или накопленных тяжким научным трудом в виде, например, текстов научных статей или даже Википедии), мы должны очень осторожно их сжимать. Напомню, что в изначальном IBM Watson, который выиграл Jeopardy!, не делалось никаких попыток закодировать текст википедии и прочие справочные текстовые базы в форме "онтологии". Аргумент там был такой: "при любом сжатии информации мы теряем информацию: если мы вытаскиваем какую-то модель из текста, мы теряем возможность отвечать на какие-то вопросы. А вопросы в Jeopardy! могут быть самые разные -- от включающих в себя учёта игры слов до требующих логических рассуждений. Так что мы не извлекаем "граф знаний" из текстов, а работаем каждый раз со всем текстом сразу. А поскольку это требует гигантских вычислительных затрат, то мы используем суперкомпьютер. IBM Watson это как раз суперкомпьютер прежде всего". Для чего они использовали онтологии? Они использовали очень небольшие онтологии для типизации ответов (Форд -- президент или машина), при этом очень грубой типизации, и это на десяток процентов снижало число ошибок.

Priors как-то выражены, они коммуницируются, поэтому для меня они -- сжатая информация, перенесённая к нам в момент принятия решений из каких-то прошлых ситуаций. Эти priors -- хорошие начальные "словарные" значения для вычисления смыслов в конкретных ситуациях с их прагматикой в привязке к целям и времени -- этот перенос акцента с работы на уровне тасовки priors в разных их видах как "знания в консервах" на последующие довычисления/мышление отражает текущий повсеместный переход от семантики/онтологии к прагматике/эпистемологии. Уважаем priors, но не останавливаемся на них. И всё-таки хотим иметь их, не вычислять/мыслить каждый раз с полного нуля.

Вот тут показывается, что с грамотно выбранными человеками innate priors получается лучше -- и это, скорее всего, магистральный путь, вместо "давай запустим на ночь эволюционную машинку, и она изобретёт нам сетевую круть немеренную с нуля" используется "давай возьмём лучшие на сегодня элементы архитектуры, и запустим эволюционную машинку, начиная с них": https://research.googleblog.com/2018/03/using-evolutionary-automl-to-discover.html. И этот "эволюционный путь" вычисления innate priors, показывает, что всё что угодно мы просто объявляем priors и продолжаем для текущей ситуации вычислять дальше, получая posteriors.

Интересно, что обсуждается вопрос про составные блоки нейросетей -- какими они должны быть, чтобы хорошо работала нейроэволюция? Должны ли затем мы использовать найденные цивилизацией priors как начальные значения (скажем, лучшие сегодняшние архитектуры сеток, "эволюция гомо сапиенса"), или зарядить эволюцию "из первичного бульона", из каких-то совсем элементарных структур, в надежде, что "зародится жизнь" и высокоэффективные архитектуры нейросеток появятся сами собой?

Получается так, что innate priors в форме архитектуры нейросетки тоже можно делать компактными, быстрыми, эффективными -- и совсем тем самым неуниверсальными, ибо free lunch theorem (что нет универсальных оптимизаторов/солверов) никто не отменял. Жать нужно, терять универсальность нужно, иначе вычислительно не выжить. Просто потеря универсальности должна быть а) контролируемой, должен быть какой-то критерий и найден оптимум и б) неокончательной -- потом должны быть ещё вычисления, продолжающие оптимизировать неуниверсальное решение для текущей ситуации (после любых priors должны вычисляться posteriors).

Эволюция тут даётся просто как один из универсальных алгоритмов поиска оптимума, помним про Master Algorithm и Free Lunch Theorem -- все эти алгоритмы помогают улучшать/настраивать друг друга. Скажем, эволюционные алгоритмы будут настраивать нейроалгоритмы. Вот тут даже делается громкое заявление "Evolution is the New Deep Learning", ибо придуманы улучшения самих алгоритмов эволюции -- чтобы запускать эволюцию не было так мучительно больно и страшно по части вычислительных ресурсов, как честно написано в работе по предыдущей ссылке: https://www.sentient.ai/blog/evolution-is-the-new-deep-learning/.

А дальше говорим о любых priors, не только innate priors из текущих архитектур deep learning, которые я упомянул в тексте по первой ссылке. Например, все классические онтологии и онтики это как раз такие priors. Меня натолкнул на эту мысль Nando de Freitas в начале 2016 года, https://ailev.livejournal.com/1240509.html и далее я повторил эту линию рассуждений в программном тексте про "онтологии и бибинарная модель мышления" в конце 2016 году -- https://ailev.livejournal.com/1305176.html. В какой-то мере я пишу сейчас про сжатие, поминая многие тезисы того текста. Единственное новое -- я говорю, что сжатие многоуровнево, иерархично, то есть системно. Оно идёт на многих уровнях интеллект-стека.

Сжатие это (поиск онтик, в концептах которых мы хотим хранить наши priors) можно делать мокрыми нейронными сетками -- находить фичи усилием человеческой мысли. Но круче, конечно, это выучивать (например, deep learning). Для "непонятной предметной области" нужно просто выучить viewpoint, с которым работать дальше -- выучить без учителя, конечно. Вот пример того, как это делается в музыке: распознавание паттернов/фич/viewpoints/latent space как "палитры", из которой потом генерируются самые разные морфинги между мелодиями/views (морфинги -- это чтобы показать, что речь идёт о каких-то вычисленных правильных ортогональных характеристиках, которые могут по-разному сочетаться и давать всё разнообразие мелодий предметной области) -- https://magenta.tensorflow.org/music-vae.

Можно дальше думать: это или а) мы получили какие-то priors и дальше можно уточнять, "из чего состоит музыка" в каждом конкретном случае, или б) мы получили "значения" и дальше мы с ними работаем, забыв про priors, что это было "сжатие".

Мой пойнт тут в том, что вышесказанное сжатие с попытками сохранить универсальность происходит на всех уровнях интеллект-стека (я писал про этот стек более-менее подробно последний раз в "болванах для искусственного интеллекта", https://ailev.livejournal.com/1356016.html). Вверху жмём, вводя какую-то вероятностную онтику предметной области (иначе теряем возможность коммуницировать с окружающим миром), на среднем уровне жмём архитектурой сетки (коннективистской структурой), на самом нижнем уровне жмём уже математическими операциями, буквально сокращаем число бит в числах для вычислений: получаем опять-таки не слишком универсальные (не все числа можем выразить, ибо сурово квантуем), но зато очень маленькие по памяти и быстрые по скорости вычисления.

В очень интересном обзоре методов сжатия данных (лекция Геннадия Пехименко) рассказано о том, как обойти барьеры доступа в память GPU и кэшировать побольше данных в хардверных кэшах разного уровня: https://habrahabr.ru/company/yandex/blog/350896/. Трудоёмкость вычисления там измеряется в энергоэффективности: операция с целым примерно 1pJ, плавающим - 20pJ, а доступ к памяти -- 1200pJ. Это верно для практически любой памяти. Отсюда мечты о мемристорах. Отсюда перегрев современных чипов: греются они не от собственно операций, процессорные ресурсы простаивают. Греются чипы от доступов к памяти. Оказывается, доступность вероятностного вывода/машинное мышления зависит от того, сколько и какой памяти нам нужно затронуть нашими вычислениями -- если памяти немного, то мы можем позволить себе вычислять, а если памяти много, то либо чипы перегреются, либо придётся снизить скорость вычислений, чтобы не было перегрева.

Поэтому нужно пытаться жать и сами числа (даже не "данные"!), чтобы снизить нагрузку/затраты энергии на хардверную память (это ещё ниже уровнем, чем коннективистская архитектура нейросети). Низкоразрядные (1-8 бит на число) вычисления очень интересны: они решают задачу бутылочного горлышка доступа к памяти с одной стороны (хранимые значения очень малы) и скорости вычислений с другой стороны (разрядов-то мало, что там вычислять?!). Их можно сделать до чёртиков, компенсируя неточность каждого из них. Вот некоторая подборка ссылок на низкоразрядные вычисления в deep learning из обзора по использованию GPU (https://blog.inten.to/hardware-for-deep-learning-part-3-gpu-8906c1644664): there are many works on binarization of neural networks (replacing float weights by binary 0/1 connections): “Binarized Neural Networks: Training Deep Neural Networks with Weights and Activations Constrained to +1 or -1”, “XNOR-Net: ImageNet Classification Using Binary Convolutional Neural Networks” and XNOR.AI, ”How to Train a Compact Binary Neural Network with High Accuracy?”, “FINN: A Framework for Fast, Scalable Binarized Neural Network Inference”, and so on. Here is a short overview and more references on binary deep learning. И добавим ещё из свеженького HALP: High-Accuracy Low-Presision Training -- http://dawn.cs.stanford.edu/2018/03/09/low-precision/. И помним, что в этой области ещё много-много разных других ходов. Я писал ещё пару лет назад, что нужно "думать о мощности аппроксимаций: переход к bitwise сеткам (начиная, например, с обзора в http://arxiv.org/abs/1603.01025 -- где обсуждаются пятибитные и трёхбитные логарифмические разрядные представления для весов и активаций в свёрточных сетях)".

Это уже почти самый низ интеллект-стека, но не нужно забывать, что есть и другие ходы --уход от архитектуры GPU или TPU и, например, использование нейроморфных архитектур процессоров или вообще мемристоров, физических вычислителей на оптике и т.п. На этом уровне жмём уже на уровне вещества, а не каких-то логических представлений информации.

UPDATE: Обсуждение в фейсбуке -- https://www.facebook.com/ailevenchuk/posts/10212554447390219, ВКонтакте -- https://vk.com/wall-44016343_19033

UPDATE: можно ещё почитать вот это, про information bottleneck и deep learning -- https://www.quantamagazine.org/new-theory-cracks-open-the-black-box-of-deep-learning-20170921/
Subscribe
  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

  • 1 comment