Недавно меня пригласили выступить на TEDx, я постарался популярно рассказать о современном положении дел в ИИ, и помимо этого изложил суть тех нейронных сетей, над которыми мы сейчас работаем (см. видео).
Поскольку доклад был сугубо популярный, никаких подробностей я там не представил, но модель обладает интересными свойствами, о которых я хочу рассказать детальнее.
За основу была взята широкоизвестная сеть Хопфилда, но в нее помимо основных связей от каждого нейрона к каждому (которые технически можно считать связями с задержкой в один такт), были добавлены дополнительные связи с задержками более 1го такта (практически исследовались задержки на 2-8 тактов).
Эти дополнительные связи шли также от каждого нейрона к каждому, более того, присутствовало несколько блоков таких связей одновременно — в частности на видео есть связи от каждого к каждому, задержанные на 2, 3, 4, 5 и 6 тактов.
Таким образом, для сети из N нейронов, создается не N^2 связей, а (k+1)*N^2 связей, где k — количество блоков задержанных связей.
Вообще задача, которую хотелось бы в перспективе решить такой сетью — это самообучение динамическим образам (т.е. грубо говоря, умение выделять и запоминать часто встречающиеся подпоследовательности в какой-то непрерывной последовательности образов на входе).
Но для начала мы решили более простую задачу — есть несколько известных последовательностей (а именно, слов, составленных из последовательно показываемых букв), они подаются в зашумленном виде на вход (причем показ может начаться с любой буквы в слове, не обязательно с первой), а сеть должна как можно быстрее понять, какое именно слово сейчас на входе (это возможно определить не сразу — у слов есть общие буквы и даже слоги).
Параметры модельной задачи такие: 6 слов по 7 букв в каждом, каждая буква — картина в 100 пикселей, степень зашумления — порядка 20% (т.е. при каждом показе каждой буквы 20% случайно выбранных пикселей инвертируются).
Сеть вполне успешно решила задачу — практически на уровне человека, при такой степени зашумления, когда на глаз не всегда можно понять какая именно буква сейчас показывается, за несколько полных показов слова сеть может достаточно уверенно сказать, какое именно из слов демонстрируется. При малой степени зашумления слово узнается после показа первых 2-4 букв.
Результат хороший, но вполне достижимый другими методами.
Наиболее интересным оказалось поведение сети после того, как ей предъявили какую-то последовательность на входе, а потом «выключили» вход, но продолжили вычислять ее состояния. Оказалось, что сеть при этом последовательно переходит в состояния, которые внешне в основном напоминают буквы (что естественно — по алгоритму обучения именно буквы должны быть устойчивыми состояниями сети), но во-первых не всегда, а во-вторых, эти буквы складываются в последовательности, которые чем-то напоминают слоги запомненных слов, но не идентичны им, меняются в другом ритме (некоторые буквы долго повторяются, пока состояние не сменится, другие проходят быстро), и имеют длину цикла значительно превышающую исходные слова (запоминались слова из 7 букв, а полученные в результате этого процесса слова могут составлять более 50 букв до зацикливания).
Причем при показе разных слов на входе перед его выключением, и при выключении в разные моменты, получаемые в итоге слова были различными.
Т.е. можно утверждать, что состояние сети крайне нетривиально зависит от ее предыдущих состояний. Если позволить себе вольную интерпретацию происходящего, то можно провести аналогию со сновидениями — они выстраиваются в сложные сюжеты, отображая в каком-то роде предыдущий опыт, но не повторяют его напрямую.
В общем модель обладает интересным поведением, которое безусловно заставляет задуматься. На видео я позволил себе довольно смелую интерпретацию такого поведения, но если она и неверна, то все равно можно надеяться что в обозримом будущем все же получится объяснить основные механизмы мышления пусть и в грубом, но принципиально верном приближении.
P.S. Дискуссия крайне приветствуется — я сейчас не могу придумать как решить проблему обучения в случае, когда последовательности не задаются извне, а должны быть извлечены из входного потока, и буду очень рад любым мыслям по теме и не только.
Поскольку доклад был сугубо популярный, никаких подробностей я там не представил, но модель обладает интересными свойствами, о которых я хочу рассказать детальнее.
Структура сети
За основу была взята широкоизвестная сеть Хопфилда, но в нее помимо основных связей от каждого нейрона к каждому (которые технически можно считать связями с задержкой в один такт), были добавлены дополнительные связи с задержками более 1го такта (практически исследовались задержки на 2-8 тактов).
Эти дополнительные связи шли также от каждого нейрона к каждому, более того, присутствовало несколько блоков таких связей одновременно — в частности на видео есть связи от каждого к каждому, задержанные на 2, 3, 4, 5 и 6 тактов.
Таким образом, для сети из N нейронов, создается не N^2 связей, а (k+1)*N^2 связей, где k — количество блоков задержанных связей.
Постановка задачи
Вообще задача, которую хотелось бы в перспективе решить такой сетью — это самообучение динамическим образам (т.е. грубо говоря, умение выделять и запоминать часто встречающиеся подпоследовательности в какой-то непрерывной последовательности образов на входе).
Но для начала мы решили более простую задачу — есть несколько известных последовательностей (а именно, слов, составленных из последовательно показываемых букв), они подаются в зашумленном виде на вход (причем показ может начаться с любой буквы в слове, не обязательно с первой), а сеть должна как можно быстрее понять, какое именно слово сейчас на входе (это возможно определить не сразу — у слов есть общие буквы и даже слоги).
Параметры модельной задачи такие: 6 слов по 7 букв в каждом, каждая буква — картина в 100 пикселей, степень зашумления — порядка 20% (т.е. при каждом показе каждой буквы 20% случайно выбранных пикселей инвертируются).
Решение исходной задачи
Сеть вполне успешно решила задачу — практически на уровне человека, при такой степени зашумления, когда на глаз не всегда можно понять какая именно буква сейчас показывается, за несколько полных показов слова сеть может достаточно уверенно сказать, какое именно из слов демонстрируется. При малой степени зашумления слово узнается после показа первых 2-4 букв.
Результат хороший, но вполне достижимый другими методами.
Эффект рефлексии
Наиболее интересным оказалось поведение сети после того, как ей предъявили какую-то последовательность на входе, а потом «выключили» вход, но продолжили вычислять ее состояния. Оказалось, что сеть при этом последовательно переходит в состояния, которые внешне в основном напоминают буквы (что естественно — по алгоритму обучения именно буквы должны быть устойчивыми состояниями сети), но во-первых не всегда, а во-вторых, эти буквы складываются в последовательности, которые чем-то напоминают слоги запомненных слов, но не идентичны им, меняются в другом ритме (некоторые буквы долго повторяются, пока состояние не сменится, другие проходят быстро), и имеют длину цикла значительно превышающую исходные слова (запоминались слова из 7 букв, а полученные в результате этого процесса слова могут составлять более 50 букв до зацикливания).
Причем при показе разных слов на входе перед его выключением, и при выключении в разные моменты, получаемые в итоге слова были различными.
Т.е. можно утверждать, что состояние сети крайне нетривиально зависит от ее предыдущих состояний. Если позволить себе вольную интерпретацию происходящего, то можно провести аналогию со сновидениями — они выстраиваются в сложные сюжеты, отображая в каком-то роде предыдущий опыт, но не повторяют его напрямую.
В общем модель обладает интересным поведением, которое безусловно заставляет задуматься. На видео я позволил себе довольно смелую интерпретацию такого поведения, но если она и неверна, то все равно можно надеяться что в обозримом будущем все же получится объяснить основные механизмы мышления пусть и в грубом, но принципиально верном приближении.
P.S. Дискуссия крайне приветствуется — я сейчас не могу придумать как решить проблему обучения в случае, когда последовательности не задаются извне, а должны быть извлечены из входного потока, и буду очень рад любым мыслям по теме и не только.