Выделила все же три-четыре часа, чтобы полистать Розенблатта ( https://safari.ethz.ch/digitaltechnik/spring2018/lib/exe/fetch.php?media=neurodynamics1962rosenblatt.pdf ) и понять смысл его версии backprop'а (см. 307 стр. в pdf). Суть такова:
В главах 4 и 5 данного труда автор рассматривает трехслойные сети, называемые S-A-R перцептронами. Каждый слой состоит из одного или нескольких юнитов (нейронов).
Первый слой принимает на вход монохромную картинку (или другое простое представление каких-то "внешних сигналов"), называется "S" и состоит из т.н. "Sensory Units". Каждый Sensory Unit выдает 1, если некоторая функция от значений пикселей превосходит порог, а иначе выдает 0. Насколько я поняла, эти функции заданы жестко и не настраиваются в процессе обучения. Далее идет скрытый слой, обозначенный "A" (Association Units). Юниты этого слоя - по сути, обычные нейроны с функцией активации "ступенька" (hard limit), имеющие бинарный выход - 1 / 0. Выходной слой назван "R" и содержит один Responce Unit, который также является обычным нейроном с бинарным выходом 1 / -1 и таким образом способен осуществлять бинарную классификацию.
Матрицы весов обозначаются G (Generalization Coefficients) и имеют целочисленные коэффициенты, потому что все это считалось на ламповых компьютерах, где Floating Point Operations только-только начали реализовываться и были очень медленными.
Допустим, Response Unit ошибся на каком-то примере - например, выдал -1, когда нужно было выдать +1. Тогда ко всем тем его весам, которые умножались на положительные выходы предыдущего слоя, с некоторой вероятностью прибавляется единица. Те веса, которые умножались на нулевые выходы предыдущего слоя, также увеличиваются на 1, но с меньшей вероятностью. Цель данной процедуры - увеличить получающуюся сумму и таким образом "подтолкнуть" Response Unit к правильному решению - выдать +1 на данном примере в следующий раз. Если же R-Unit выдал +1, когда нужно было выдать -1, делается все то же самое, но единица отнимается, а не прибавляется. Кто-то из читателей мог уже встречать такую процедуру под названием "Правило обучения перцептрона" в детерминированном варианте.
Ошибка "передается" на Association Units следующим образом. Если выход данного A-Unit'а был ненулевым и шел на R-Unit с положительным коэффициентом, мы считаем что этот A-Unit сделал ту же ошибку, что и R-Unit и "обучаем" его так же, как R-Unit. Если с отрицательным - считаем, что A-Unit сделал противоположную ошибку и меняем его веса по противоположному правилу. Если же А-Unit выдавал ноль, мы просто возмущаем его веса с небольшой вероятностью.
Таким образом, вместо градиента ошибки на скрытый слой передается бинарная информация - "помог" ли данный юнит или "помешал" принять правильное решение выходному юниту.
Нетрудно догадаться, что вся эта конструкция очень тяжело масштабируется (хотя автор и пробовал делать 4-слойный вариант), численно нестабильна (когда-то давно я пробовала реализовывать детерминированную версию этого алгоритма для одного нейрона, и коэффициенты быстро улетали в небеса) и требует ручной подгонки.
В целом она не создает впечатление чего-то принципиально иного, чем мы используем сейчас. Скорее это можно рассмотреть как простейшее возможное вероятностное приближение к градиентному спуску и современному backprop'у с бинарными нейронами. Видимо, к именно такому приближению подталкивали чрезвычайно жесткие технические ограничения тогдашних компьютеров.
Розенблатт придумывал и другие варианты перцептронов, в т.ч. четырехслойные, многоклассовые, экспериментировал с разной топологией связей (принудительно зануляя элементы в матрицах весов), пробовал по-разному подходить к возмущению связей с помощью своего вероятностного метода, но не все из смог реализовать на практике. Тем не менее, видно влияние этих идей на последующих исследователей, которые переложили их на floating point версии нейросетей с градиентным спуском.
У меня сложилось впечатление, что Розенблатт был очень умным и сильно опередил свое время, а все основные недостатки его изобретений происходят от технических ограничений.
#ML_отцов
В главах 4 и 5 данного труда автор рассматривает трехслойные сети, называемые S-A-R перцептронами. Каждый слой состоит из одного или нескольких юнитов (нейронов).
Первый слой принимает на вход монохромную картинку (или другое простое представление каких-то "внешних сигналов"), называется "S" и состоит из т.н. "Sensory Units". Каждый Sensory Unit выдает 1, если некоторая функция от значений пикселей превосходит порог, а иначе выдает 0. Насколько я поняла, эти функции заданы жестко и не настраиваются в процессе обучения. Далее идет скрытый слой, обозначенный "A" (Association Units). Юниты этого слоя - по сути, обычные нейроны с функцией активации "ступенька" (hard limit), имеющие бинарный выход - 1 / 0. Выходной слой назван "R" и содержит один Responce Unit, который также является обычным нейроном с бинарным выходом 1 / -1 и таким образом способен осуществлять бинарную классификацию.
Матрицы весов обозначаются G (Generalization Coefficients) и имеют целочисленные коэффициенты, потому что все это считалось на ламповых компьютерах, где Floating Point Operations только-только начали реализовываться и были очень медленными.
Допустим, Response Unit ошибся на каком-то примере - например, выдал -1, когда нужно было выдать +1. Тогда ко всем тем его весам, которые умножались на положительные выходы предыдущего слоя, с некоторой вероятностью прибавляется единица. Те веса, которые умножались на нулевые выходы предыдущего слоя, также увеличиваются на 1, но с меньшей вероятностью. Цель данной процедуры - увеличить получающуюся сумму и таким образом "подтолкнуть" Response Unit к правильному решению - выдать +1 на данном примере в следующий раз. Если же R-Unit выдал +1, когда нужно было выдать -1, делается все то же самое, но единица отнимается, а не прибавляется. Кто-то из читателей мог уже встречать такую процедуру под названием "Правило обучения перцептрона" в детерминированном варианте.
Ошибка "передается" на Association Units следующим образом. Если выход данного A-Unit'а был ненулевым и шел на R-Unit с положительным коэффициентом, мы считаем что этот A-Unit сделал ту же ошибку, что и R-Unit и "обучаем" его так же, как R-Unit. Если с отрицательным - считаем, что A-Unit сделал противоположную ошибку и меняем его веса по противоположному правилу. Если же А-Unit выдавал ноль, мы просто возмущаем его веса с небольшой вероятностью.
Таким образом, вместо градиента ошибки на скрытый слой передается бинарная информация - "помог" ли данный юнит или "помешал" принять правильное решение выходному юниту.
Нетрудно догадаться, что вся эта конструкция очень тяжело масштабируется (хотя автор и пробовал делать 4-слойный вариант), численно нестабильна (когда-то давно я пробовала реализовывать детерминированную версию этого алгоритма для одного нейрона, и коэффициенты быстро улетали в небеса) и требует ручной подгонки.
В целом она не создает впечатление чего-то принципиально иного, чем мы используем сейчас. Скорее это можно рассмотреть как простейшее возможное вероятностное приближение к градиентному спуску и современному backprop'у с бинарными нейронами. Видимо, к именно такому приближению подталкивали чрезвычайно жесткие технические ограничения тогдашних компьютеров.
Розенблатт придумывал и другие варианты перцептронов, в т.ч. четырехслойные, многоклассовые, экспериментировал с разной топологией связей (принудительно зануляя элементы в матрицах весов), пробовал по-разному подходить к возмущению связей с помощью своего вероятностного метода, но не все из смог реализовать на практике. Тем не менее, видно влияние этих идей на последующих исследователей, которые переложили их на floating point версии нейросетей с градиентным спуском.
У меня сложилось впечатление, что Розенблатт был очень умным и сильно опередил свое время, а все основные недостатки его изобретений происходят от технических ограничений.
#ML_отцов