Нейросетевые архитектуры — Михаил Бурцев

МЕНЮ


Искусственный интеллект. Новости
Поиск

ТЕМЫ


Внедрение ИИНовости ИИРобототехника, БПЛАТрансгуманизмЛингвистика, обработка текстаБиология, теория эволюцииВиртулаьная и дополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информации

RSS


RSS новости

Авторизация



Новостная лента форума ailab.ru

Нейрофизиолог Михаил Бурцев о глубоких нейронных сетях, механике машинного перевода и нейросетевых моделях seq2seq


ПостНаука продолжает рассказывать о современных технологиях в проекте «Банк знаний», подготовленном совместно с Корпоративным университетом Сбербанка.

Когда рост вычислительных возможностей и широкое распространение графических ускорителей позволили исследователям в области нейросетей обучать сети с большим числом параметров, то первое, что они стали делать, — увеличивать количество слоев, то есть фактически количество этапов обработки информации, которое эта нейросеть может сделать. И это привело к тому, что у нас появилось очень много разных способов, как мы можем эти слои между собой скомбинировать и построить глубокие нейронные сети.

Здесь как раз приведен такой зоопарк разных глубоких и не очень глубоких нейронных сетей. И сверху приведены как раз нейросети, которые не очень глубокие, классические варианты. А если мы посмотрим ниже, то в ходе эволюции видно, что, например, deep convolutional network состоит из каких-то уже двух сложных блоков. Здесь входной сверточный блок, здесь — полносвязный слой и выходной классификатор. Или, например, deep convolutional inverse graphics network: здесь мы видим, что она состоит из двух симметричных частей.

И фактически мы видим, что начался такой кембрийский взрыв различных нейросетевых архитектур. Оказалось, что для реализации тех или иных функций те или иные способы связи нейронов друг с другом подходят лучше, чем для других. И так как мы зачастую решаем комбинированные задачи, то начинаем объединять разные типы нейросетей, комбинируя подсети друг с другом в некоторые целостные нейросетевые архитектуры и получая очень интересные и сложные вещи, как, например, neural Turing machine (нейросетевая машина Тьюринга), которая пытается реализовать некоторое вычисление, используя память, записывая туда и считывая оттуда какие-то значения.

И сегодня каждый год появляется по несколько десятков таких нейросетевых архитектур. И чтобы у вас сложилось какое-то представление о том, что это такое, я бы хотел рассказать об одной из наиболее знаменитых в этой области — о системе, о нейросетевой архитектуре, которая стоит за системой машинного перевода Google. Она называется Google neural machine translation system.

Чтобы понять, откуда она взялась, давайте вообще рассмотрим задачу машинного перевода. Что она собой представляет? У нас есть некоторая входная последовательность слов на одном языке, и нам нужно получить последовательность слов на другом языке. Таким образом, мы должны сначала каким-то образом получить представление всей входной последовательности, а затем начать создавать выходную последовательность. Эти задачи получили название «из последовательности в последовательность» по-русски, а по-английски — sequence-to-sequence (нейросетевые модели seq2seq).

Сначала на вход нашей модели подается последовательность, и она каждый входной токен этой последовательности переносит контекст о других словах при кодировании каждого следующего слова. Токен — это слово или знак препинания, он подается на вход рекуррентного слоя нейросети. А рекуррентный слой рассчитывает свой выход — некоторое скрытое представление нашего токена, учитывая при этом, так как мы подаем последовательность, предыдущие члены последовательности.

Оказывается, что качество кодирования в принципе зависит от того, насколько много информации мы сохраняем. В самых базовых seq2seq-моделях была использована следующая архитектура: подавая токены последовательно, мы учитывали скрытые состояния, накопленные к последнему токену. То есть мы для всего предложения выдавали одно векторное представление, рассчитывая на то, что предыдущие слова внесли вклад за счет обновления скрытого состояния нашего рекуррентного слоя. А затем, подавая на вход нейросети этот вектор — закодированное предложение, — мы его раскодировали, декодировали при помощи другой нейросети, которая генерировала по этому скрытому состоянию слово за словом, отталкиваясь от этого состояния и своего собственного скрытого состояния, полученного при декодировании предыдущего токена.

Эта нейросетевая архитектура получила название «архитектура энкодер-декодер»: у нас есть первая часть, делающая энкодинг (кодирование) входного предложения, и декодер, из этого векторного зашифрованного представления расшифровывающий его уже на другом языке.

Но оказалось, что если мы просто в лоб применим эту архитектуру к задаче машинного перевода, то качество будет не очень высоким. Что стали делать, для того чтобы повысить качество? Для начала было использовано двунаправленное кодирование. Это что значит? Это значит, что мы проходимся одной рекуррентной нейросетью в одну сторону, подавая слова в том порядке, в котором они идут в предложении. А затем в другую нейросеть мы подаем те же слова, но в обратном порядке, начиная с конца предложения и двигаясь к началу. И таким образом мы получаем представление о предложении, прочитанном вперед и прочитанном назад. И это позволяет нам лучше учесть в целом все предложение, так как информация о тех словах, которые находятся в начале последовательности, постепенно затухает к концу. Затем мы берем и складываем эти два вектора, объединяем. Эта операция называется конкатенацией. Конкатенируем эти два вектора. И теперь у нас есть вектор в два раза большей длины, и уже по этому вектору мы пытаемся дешифровать, декодировать нашу последовательность. Оказалось, что это позволило повысить качество декодирования.

Следующим этапом стало еще большее уточнение локальной информации о словах. Оказывается, если мы кодируем все предложение в одном и другом направлении, то почему бы нам не взять скрытые представления для каждого из слов, для каждого из токенов? Мы можем кодировать в одну сторону и для каждого токена будем получать выход нашей нейросети. Это будет являться нашим скрытым представлением слова. Мы идем в другом направлении и тоже получаем скрытое представление слова для каждого слова. При этом это представление слова именно в контексте данной последовательности. Потому что если то же самое слово мы встретим в другом предложении, то для него это скрытое состояние будет другое, потому что наша рекуррентная нейросеть помнит свои предыдущие входы. Затем мы для каждого слова объединяем эти два кода для прохода в прямом направлении и для прохода в обратном направлении. И такое скрытое векторное представление есть для каждого слова набор векторов. И уже по этому набору векторов мы пытаемся, подавая на вход декодера, предсказывать следующие слова. А декодер получает на вход это представление и то слово, которое он уже декодировал на предыдущем такте. Такая схема получила название «двунаправленное кодирование». То есть мы в одном и другом направлении их кодируем.

Но оказалось, что при декодировании на самом деле не все слова входной последовательности для нас играют одинаково важную роль. То есть при переводе одного слова какое-то слово в исходной последовательности может быть более важно, чем другие слова. Поэтому нам хотелось бы добавить в нашу нейросетевую архитектуру какой-то механизм, который позволял бы выделять те слова в исходной последовательности, которые наиболее релевантны при декодировании каждого конкретного слова.

И это было сделано при помощи введения специальной нейросети, которая реализовывала функцию, получившую название функции внимания. Это как бы наше внутреннее внимание, позволяющее нам сконцентрироваться на том или ином слове при декодировании. Что получает на вход эта нейросеть, реализующая функцию внимания? С одной стороны, она получает на вход всю закодированную исходную последовательность, а с другой стороны, то, что мы декодировали на предыдущем такте. И она по этой информации генерирует нам, грубо говоря, веса, с которыми мы должны учесть вклад того или иного слова при декодировании. То есть она трансформирует нашу память таким образом, чтобы выделить там важное.

И оказалось, что это введение позволило поставить нейросетевые системы машинного перевода вровень с нейросетевыми системами машинного перевода, которые уже были к тому времени. Но и это оказалось еще не все. Так как у нас обучение глубокое, нам нужно добавить глубины. Нам нужно к этим двум рекуррентным слоям, которые у нас стоят на входе сети, добавить еще сколько-то рекуррентных слоев, для того чтобы сделать более качественные представления, которые будут использованы как раз в функции внимания для обработки. В системе машинного перевода от Google используется восемь рекуррентных слоев в энкодере, для того чтобы закодировать предложение, и восемь выходных рекуррентных слоев в декодере, чтобы декодировать. Действительно, у нас общая глубина сетей — это где-то шестнадцать слоев. Это уже достаточно глубокая нейросеть.

Но тут оказалась другая проблема, что если мы берем и так совмещаем слои рекуррентной сети, больше чем три или четыре слоя, то оказывается, что обучить такую сеть очень сложно, потому что, когда мы рассчитываем ошибку, она должна протечь от выходного слоя к входному, а она при протекании перераспределяется и затухает. Для того чтобы решить эту проблему с недообучением, используют так называемые residual connections (обходные связи). У нас есть восемь слоев, и мы при переходе, при передаче информации между слоями не только берем ту информацию, которая у нас рассчитана на предыдущем слое, но и прибавляем к ней информацию, которая была рассчитана на слое минус первой глубины. Мы сокращаем в два раза путь нашей информации. И у нас есть два пути, по которым течет информация: один — шестнадцать переходов, а другой — восемь переходов для всей архитектуры. Оказалось, что это позволяет ускорить обучение, сделать его более устойчивым, стабильным и повысить его качество.

Можно сказать, что это архитектура энкодер-декодер с вниманием, двунаправленным кодированием входной последовательности и использованием residual connections, для того чтобы повысить качество обучения. И именно использование такой сложной нейроархитектуры и привело к тому, что фактически эта система машинного перевода, которая сейчас используется Google в своем машинном переводчике, стала лучше, чем все другие системы машинного перевода, и уже приближается вплотную к человеку. Возможно, в ближайшем будущем нам грозит массовый кризис на рынке труда переводчиков, потому что машинный перевод станет практически неотличим от перевода человеком.

Но если мы будем рассматривать задачу построения, например, диалогового или разговорного агента, то понятно, чего там не хватает. Нам, например, очень не хватает функции планирования, которая позволяла бы нашему диалоговому агенту рассматривать разные варианты продолжения диалога и выбирать из них тот, который будет наиболее адекватен. Поэтому то, над чем работают сегодня ведущие компании и исследовательские лаборатории, — это то, как мы можем нашу нейросетевую архитектуру дополнить чем-то, что бы позволило делать планирование. Потому что фактически, если мы посмотрим на архитектуру энкодер-декодер с вниманием, то мы увидим, что там уже есть память. Фактически наше закодированное предложение на исходном языке — это и есть та память, над которой мы можем работать. А функция внимания — это некоторый контроллер, позволяющий считывать из нее что-то. Но нам нужна хорошая функция записи в эту память, извлечения из этой памяти и операций с этой памятью. Возможно, нейросетевые машины Тьюринга — это один из вариантов решения этой проблемы для задачи планирования.

Один из возможных скачков в нейросетевом искусственном интеллекте как раз связан с развитием и усложнением нейросетевых архитектур. Возможно, такое развитие будет не за счет того, что мы будем как инженеры разрабатывать эти нейросетевые архитектуры. Возможно, это будет происходить за счет использования других автоматических методов, таких как искусственная эволюция, когда мы можем эволюционировать то, из каких блоков состоит наша нейросеть, и отбирать те нейроархитектуры, которые наиболее оптимально решают задачу, — сочетание эволюции с развитийными алгоритмами, например. Потому что мы знаем, что мозг развивается из примитивной структуры во все более и более сложную. Оптимально будет, если мы сможем описать нашу нейросеть некоторым генеративным алгоритмом, который будет разворачивать и строить нейросеть из блоков под конкретную задачу, а потом уже эволюционный алгоритм будет оценивать, насколько хорошо та или иная архитектура работает.

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


Источник: postnauka.ru