Mortal Computers
А теперь шутки в сторону и поговорим про фронтир, но не такой как обычно.
Я долго откладывал чтение статьи Джеффри Хинтона про алгоритм обучения
Forward-Forward, или
FF, (
https://arxiv.org/abs/2212.13345). Если вкратце, то это альтернатива бэкпропу, где делается два контрастных форвардпропа, один с позитивными данными, на которых модификацией весов надо максимизировать goodness, другой с негативными, где goodness надо уменьшить. Goodness может определяться по-разному, например, это может быть сумма квадратов активаций.
Этот алгоритм хорош тем, что он локальный, не требует бэкпропа через всю систему, и что особенно важно, может работать с чёрными ящиками, не требуя полного понимания вычислений (и соответственно не имея возможности посчитать от них производную (хотя конечно её можно было бы оценить, но вычислительно это тяжёлая история, особенно для больших сетей)).
По дизайну FF имеет много отсылок к разным вещам типа RBM, GAN, контрастному обучению типа SimCLR/BYOL (оба разбирали в канале), к Хинтоновскому же GLOM. Он более-менее работает на малых сетях и примерах типа MNIST и CIFAR10, на больших это скорее TBD. Возможно, по этому алгоритму и его развитиям мы пройдёмся как-нибудь отдельно (но это не точно), но чтобы не ждать, можете посмотреть кейноут самого Хинтона (
https://www.youtube.com/watch?v=_5W5BvKe_6Y) или его рассказ в Eye on AI (
https://www.youtube.com/watch?v=NWqy_b1OvwQ), если неохота читать статью.
Так вот, возвращаясь к статье, самая интересная часть там не про алгоритм как таковой. Самое интересное — это пара маленьких разделов в конце про аналоговое железо и
mortal computation. В этой теме слилось воедино множество направлений, которыми занимался Хинтон в последние годы, и она важнее, чем FF. Честно говоря, я даже сомневаюсь, что он продолжит работу над FF (хотя там большой раздел про Future Work, и он тоже важный), потому что то, что открылось и кристаллизовалось в итоге, важнее.
Про что речь.
Классические вычисления и computer science построены на том, что компьютеры сделаны для надёжного и точного выполнения инструкций. Благодаря этому, нам не надо заботиться о физическом уровне и об электротехнике; благодаря этому мы можем довольно спокойно отделить железо от софта и изучать последний; благодаря этому программа переносима и потенциально бессмертна -- со смертью железа она не умирает и может быть запущена где-то ещё (ну если админ бэкапы делал и проверял, конечно).
Эта точность и надёжность вычислений даётся довольно дорогой ценой: нужны мощные (по сравнению с нейронами) транзисторы, нужно цифровое кодирование сигналов, нужны алгоритмы для обработки этих сигналов. То же перемножение двух n-битных чисел -- это O(n^2) операций с битами, в то время как в физической системе это можно было бы посчитать параллельно для произвольного количества активаций и весов, если первые задать напряжением, а вторые проводимостью, их произведение даст заряд, который автоматом просуммируется. Даже если устройства не супер быстрые, за счёт такого параллелизма можно быть очень крутым.
Сложность с аналоговыми вычислениями в том, что они очень зависят от конкретных элементов со всеми их несовершенствами, и их точные свойства неизвестны (бэкпроп через неизвестную функцию тоже так себе делать, нужна точная модель форвард пасса). Зато если бы был алгоритм обучения не требующий бэкпропа (а мы знаем, что он есть, на примере мозга), то можно было бы выращивать “железо” даже с неизвестными параметрами и связями, и как бонус иметь устройства с очень низким энергопотреблением. И вместо прецизионного изготовления железа в 2D (ну ок, немного уже в 3D умеем) на заводах стоимостью в пиллиарды долларов, можно было бы дёшево выращивать железо в 3D.
Как антибонус -- устройства становятся смертными, программа теперь неотделима от железа, по крайней мере просто. Недостаточно сделать копию весов, надо как-то обучать (но не бэкпропом). Заранее продолжая аналогию, копию сознания сделать будет проблематично.