Бумажное моделирование – популярное и увлекательное хобби не только среди детей, многие взрослые люди увлекаются сборкой сложных, реалистичных поделок. Процесс превращения обычного листа в настоящую трехмерную фигуру позволяет почувствовать себя творцом, а создавать из бумаги движущиеся игрушки вдвойне интересно.
Сделанный своими руками робот трансформер из бумаги, который может по-настоящему менять форму, станет для ребенка поводом для гордости и поможет поверить в собственные силы. Такая игрушка, особенно если она была создана вместе с родителями, будет ценнее и дороже, чем любая купленная в магазине.
Для знакомства детей с бумажным творчеством лучше всего подойдет создание его любимых персонажей фильмов или комиксов – героя, который нравится, ребенок будет собирать с удовольствием, одновременно, незаметно для себя приобретая новые навыки и знания.
Новая информация лучше всего усваивается в игровой форме, поэтому время сборки игрушки вместе с ребенком можно не только объяснять ему как сделать из бумаги трансформера, но и постепенно знакомить малыша с основными понятиями механики и физики.
Сложная бумажная модель Бамблби, развертки и описание работы над которой находятся ниже.
Герои комикса из бумаги в стиле Cubecraft. Фанат сериала может создать для себя настоящую кубическую вселенную трансформеров.
Трансформирующаяся модель лидера автоботов высотой 1,2 метра, собранная из плотной бумаги и картона.
Трансформер-самолет из металлизированной бумаги в технике оригами.
Еще одна версия оригами робота-самолета.
Бамблби из готовых распечатанных разверток. Если добавить такой фигурке шарниры из резинок или ниточек, то персонаж сможет двигать руками и ногами.
Хотя изготовление движущихся игрушек кажется сложным, на самом деле собрать модель любимого героя может каждый, выбрав сложность поделки в зависимости от своего возраста и навыков, главное внимательно читать описание работы и аккуратно вырезать и собирать детали.
Бумага – недорогой материал, поэтому ребенок спокойно может браться и за сборку сложных для него поделок. Даже если игрушка не получится, всегда можно попробовать еще раз, одновременно совершенствуя свое мастерство, и приучая себя не отступать перед трудностями.
Модель лидера автоботов из бумаги может двигать всеми конечностями, а также складываться в грузовую машину, как реальный прототип персонажа.
Для создания игрушки своими руками понадобится:
Печатать схему рекомендуется на матовом листе, но, чтобы готовый Оптимус блестел, как металлический, можно использовать и глянцевый. В таком случае перед распечаткой нужно заранее проверить, как будет вести себя бумага в работе: если сгибы получаются аккуратными, и глянцевое покрытие на них не осыпается, то такой материал подходит для сборки игрушки.
К созданию итоговой фигурки приступают только после того, как все ее составные части хорошо просохнут.
Бумажные модели персонажей из кино и мультфильмов не только помогут ребенку развивать мелкую моторику и творческое мышление, но и станут любимыми героями его игр.
Подвижная модель Оптимуса Прайма полностью готова.
Эта модель робота трансформера из бумаги на первый взгляд кажется сложной в сборке, но на самом деле, если аккуратно вырезать все детали и точно следовать инструкции, то создать самого доброго персонажа из Вселенной трансформеров очень легко.
Перед началом работы следует приготовить:
Чтобы готовая модель была долговечнее и не боялась влаги, можно после сборки и полного высыхания игрушки покрыть ее лаком.
Вырезать детали лучше по мере необходимости, и сразу склеивать их в объемные части игрушки, чтобы ничего не потерять и не запутаться в мелких кусочках.
Готовую игрушку трансформер из бумаги можно приклеить на подставку и хранить как коллекционную модель, или же оставить как есть, и использовать в детских играх.
Чертежи для создания cubecraft-трансформеров. Можно сделать модель одного любимого персонажа или собрать всю коллекцию героев комикса.
Оптимус Прайм.
Бамблби.
Чейз.
Хитвейв.
Мегатрон.
Гальватрон.
Саундвейв.
Для создания этой забавной модели робота-самолета понадобится квадратный лист бумаги (можно использовать цветную, окрашенную с обоих сторон) и фломастеры для дорисовки желаемых деталей.
Видео мастер-класс сборки:
Продолжительность видеоурока примерно 10 минут, но сама сборка оригами трансформера займет около получаса, в зависимости от квалификации оригамиста.
Робот оригами хорошо будет смотреться, если выполнить его из металлизированной или глянцевой бумаги.
Видеоуроки по созданию бумажных моделей автоботов в технике оригами. Готовые поделки могут трансформироваться в такие же машинки, как и у их реальных прототипов. Для работы понадобится бумага, ножницы и фломастеры для раскрашивания готовой игрушки.
Видео сборки Бамблби:
Для более качественного продавливания линий сгиба можно использовать пластиковую карту.
Пошаговый видео мастер-класс создания Оптимуса:
Маленькие любители трансформеров, которые пока не умеют создавать объемные бумажные модели, могут сделать аппликацию по представленным шаблонам или просто раскрасить понравившуюся картинку.
Готовые шаблоны можно распечатать или приложить к экрану компьютера тонкий лист офисной бумаги и перевести по контурам.
Умение создавать вещи с нуля своими руками пригодится ребенку и во взрослой жизни. В процессе работы совершенствуются внимательность, моторика и координация движений, а также находчивость и способность доводить до конца начатое дело.
Подготовьте 8 квадратов цветной бумаги 10х10 см. Из каждой нужно сложить модуль, следуя пошаговой инструкции:
Сборка поделки:
Рекомендуется делать трансформер из ярких разноцветных квадратов.
Получилось?
ДаНет
Подготовьте 3 зеленых квадрата и 3 красных, оранжевых или розовых. Размер 10х10.
Сборка оранжевых модулей:
Сборка зеленых модулей:
Сборка трансформера:
Поделка превращается из розочки в куб и наоборот. Для этого нужно приглаживать лепестки или высвобождать их. Бумагу для такого трансформера лучше брать плотную и гладкую.
Подготовьте 8 квадратов, к примеру, 4 желтых и 4 розовых.
Пошаговая инструкция:
В данной статье поговорим о преобразовании одной поделки в другую, используя введённое понятия — ядро трансформации поделки из бумаги. Ваш ребёнок поняв принцип преобразований сможет, менять своими руками форму той или иной поделки, представляя себе игру в трансформер из бумаги, и развиивать своё мышление.
Если вы решили сделать свой трансформер из бумаги постараемся в начале понять, что это такое. Если подходить буквально к пониманию данного понятия, то трансформер — это нечто преобразующее. Поэтому если спросить современного малыша, то наверняка он скажет, что трансформер, - это робот способный преобразовываться, например в автомобиль, космический корабль, и заново возвращать первоначальный вид. Таким образам, идею о трансформера из бумаги можно с лёгкостью донести своему малышу.
Если мы делали не малое количество поделок из бумаги, то наверняка замечали, что на определённой стадии изготовления бумажной поделки получается заготовка многофункционального назначения, то есть из которой могут делаться разнообразные бумажные изделия. Эту заготовку можно и назвать — ядро трансформера из бумаги, ведь в общем смысле трансформер, — это не что преобразующее свою форму из одной в другую, а ядро трансформера, — это будет исходная точка преобразования поделки из бумаги.
Можно сказать, что возможности конкретной поделки из бумаги трансформироваться в формы других поделок зависят от сложности своего ядра и фантазии конкретного человека. Простота своего ядра несёт меньшие возможности преобразований одной формы поделки в другую.
Так например, из кораблика из бумаги можно сделать голову вороны или гадалку. Что бы заметить ядро трансформера возвратимся в статью — как сделать кораблик из бумаги пошаговая схема, и заметим что в описании пункта десять имеется ядро трансформации поделки. На данном этапе можно сделать, выбор поделки из бумаги, кораблик или голову вороны. Как сделать кораблик из бумаги рассказывается в этой статье, и не упоминается о голове вороны. Весь секрет кроется в том, что при разворачивании заготовки в кораблик, если не давать разворачиваться к верху парусу, то получится у нас форма напоминающая голову от вороны.Чтобы трансформировать голову вороны в кораблик мы просто поднимем к верху будущий парус, который подвернут к одному боку в внутри формы вороны.
В статье, как сделать пароход из бумаги под номером один схемы показано ядро трансформации. Начиная с этого места можно сделать или курицу из бумаги либо пароход. Что бы пароход трансформировать в курицу, возвращаем нашу поделку — пароход в заготовку для курицы и делаем курицу.Что бы из курицы сделать пароход из бумаги проделываем то же самое в обратном порядке.
Из заготовки ядра трансформации бумажной поделки - кораблик из бумаги, можно делать так же и бумажную гадалку. Как она делается?
Берём заготовку бумажного кораблика и вместо того чтобы делать трубы и его борта, приподнимаем внутренние угры и просовываем туда пальцы. Когда пальца просунуты соединяем их в месте, аккуратно расправляем не ровности, и у нас получается гадалка из бумаги. Как трансформировать гадалку в пароходик или курицу вы наверное уже поняли.
Теперь думается, что вы сможете самостоятельно показать ребёнку идею трансформации одной поделки из бумаги в другую, и он сделав своими руками ту или иную поделку сможет, изменяя её формы и представляя, что играет в трансформер из бумаги, развивать своё мышление и фантазию.
Тем, кто любит головоломки, задачи на смекалку и поделки просто необходимо обратить внимание на куб-трансформер из бумаги. Многие его называют гексаэдр, что значит — многогранник из множества одинаковых квадратов. Его можно найти в магазинах, а можно сделать своими руками. Можно создать не только саму геометрическую фигуру, но также и ее разновидности.
Что значит развертка? Это схема, с помощью которой можно сделать ту или иную поделку из бумаги или другого материала, например, картона. Прежде чем приступить к работе с трансформером, необходимо уметь делать развертку. Для ее создания понадобится:
Как говорилось выше, куб состоит из нескольких квадратов, у которого абсолютно все стороны друг другу равны. Вначале необходимо нарисовать большой квадрат посередине листочка. Стоит помнить о том, что у квадратов углы равны 90°. И также для тех кто забыл, куб имеет 6 граней. Из этого следует, что на листе должно быть именно шесть квадратов. Помимо этих, у нас остался один лишний и его нужно просто изобразить сбоку от какого-то квадрата. Теперь осталось нарисовать припуски (0,5−1 см) на трех квадратах сбоку и отрезать от них уголки под углом в 45°. Примерно такой результат должен быть:
Теперь нужно аккуратно отрезать все лишнее, согнуть грани, склеить специальные припуски и получить фигуру.
Чтобы сделать кубик-трансформер своими руками в стиле оригами, необходимо вспомнить о том, как делаются модули. Именно благодаря модулям можно скрепить кубик без помощи клея, а сама игрушка получится очень интересной и необычной. Перейдем более подробно к вопросу о том, как сделать из бумаги куб-трансформер из оригами.
Таким образом, получился модуль. Для куба таких модулей понадобится шесть штук. Все шесть модулей нужно делать аналогично. Обратите внимание, что в каждом из них присутствуют карманы, в которые и нужно будет вкладывать другие модули. Теперь остается только соединить все части оригами для создания фигуры. Делайте это по схеме, чтобы не ошибиться:
Кубик-трансформер из оригами готов. Чтобы ваша поделка былее красивой, можно сделать каждую грань разными цветами или текстурами.
Кроме квадратных поделок из бумаги, можно сделать и такое волшебное растение, как роза. Многие задаются вопросом о том, как сделать из бумаги розу-куб, если цветок имеет круглые нежные лепестки. Все очень просто, если знать схему или видеть перед собой шаблон. Итак, для изготовления розы понадобится всего лишь цветная бумага. Цвет розы можно выбрать самостоятельно, в примере указана розовая розочка. Для начала нужно приготовить розовую и зеленую бумагу. Необходимо три розовых и три зеленых квадрата размером 15×15 см.
Работаем с зеленой бумагой аналогично тому, что мы делали с розовыми листами. Важно не ошибиться в последнем этапе, иначе куб получится неправильным.
Пришло время складывать наше красивое растение воедино. И начнем мы с зеленых модулей, у которых один уголок острее и больше другого. Именно острым и большим уголочком нужно соединить один модуль с другим, вкладывая треугольник в кармашек. В итоге должен получиться небольшой кубик.
Теперь переходим к бутону цветка и как вы заметили, все модули симметричны друг другу, поэтому их мы можем вставлять любой стороной в карман модуля. Важно помнить о том, что вставлять углы в кармашек нужно так, чтобы изгибы листа были направлены в середину. Длинные уголки розового вкладываем в кармашки зеленого модуля. Теперь распрямляем зеленый модуль и аккуратно опускает книзу уголки бутона.
Таким образом, мы получили красивую розочку в стиле оригами. Если вы вдруг захотите сложить ее обратно в куб, то проделайте все с точностью до наоборот и получится зелено-розовый куб.
Кроме таких поделок, можно сделать множество других интересных фигур, которые пришли к нам родом из Японии, где еще наши предки придумывали способы создания кубов и трансформеров. Кстати, маску для трансформера можно не только рисовать, но и делать отдельно, прикрепляя их к игрушке.
Originally posted 2018-03-19 09:58:55.
Автор admin На чтение 2 мин. Просмотров 75 Опубликовано Обновлено
Сегодня мы сделаем простую и увлекательную поделку оригами трансформер из бумаги. Используя только 8 квадратов, получим кольцо, которое может трансформироваться.
Для изготовления такой игрушки мы приготовим 8 квадратов одинакового размера. В нашей поделке они будут двух цветов – розового и желтого. По желанию такое кольцо можно сделать радужным, используя соответствующие цвета.
Каждый из этих квадратов мы будем складывать определенным образом, а потом соединим все вместе в кольцо без использования клея. Намечаем диагональный сгиб, складываем квадрат в виде треугольника.
Затем выполним еще один сгиб по диагонали.
Следующим этапом будет складывание квадрата в двух поперечных направлениях. Такие сгибы должны быть на заготовке перед тем, как перейти к следующему этапу.
Полностью расправляем квадрат и загибаем к средней линии только верхние уголки. Фото 6.
Затем складываем заготовку пополам.
Со стороны сгиба требуется выполнить складку внутрь.
Так выглядит наш первый модуль для изготовления трансформера.
Всего для создания кольца мы должны сделать 8 одинаковых заготовок.
Теперь приступим к их соединению. Для этого берем 2 модуля разного цвета. Уголок одного из них вставляем в складку другого.
Выступающие уголки розовой заготовки загибаем внутрь с обеих сторон.
Выравниваем края двух модулей, они должны свободно двигаться.
Добавляем следующий модуль, не забываем, что цвета в нашей поделке чередуются.
Загибаем внутрь уголки желтого модуля.
Так поочередно соединяем все 8 заготовок.
Затем скрепляем между собой крайние модули. Такой оригами трансформер кольцо получилось.
А так оно может трансформироваться.
Описание трансформатора** Transformer ** - это модельная архитектура, которая избегает повторения и вместо этого полностью полагается на [механизм внимания] (https://paperswithcode.com/methods/category/attention-mechanisms-1) для построения глобальных зависимостей между вводом и выводом. . До Transformers модели преобразования доминирующей последовательности основывались на сложных рекуррентных или сверточных нейронных сетях, которые включали кодировщик и декодер.Transformer также использует кодировщик и декодер, но устранение повторения в пользу [механизмов внимания] (https://paperswithcode.com/methods/category/attention-mechanisms-1) позволяет значительно расширить распараллеливание, чем такие методы, как [RNN] ( https://paperswithcode.com/methods/category/recurrent-neural-networks) и [CNNs] (https://paperswithcode.com/methods/category/convolutional-neural-networks).
.Может ли Трансформер стать еще одним гвоздем в гроб для RNN?
Избавившись от неуклюжих циклов for, он находит способ позволить целым предложениям одновременно входить в сеть группами. Чудо; НЛП теперь использует преимущества высокоэффективных библиотек линейной алгебры Python. Эту экономию времени можно потратить на развертывание дополнительных слоев в модели.
Пока кажется, что результатом является более быстрая сходимость и лучшие результаты.Что не любить?
Мой личный опыт очень многообещающий. Он обучил 2 миллиона пар французско-английских предложений создать сложного переводчика всего за три дня.
Вы можете сами поиграть с моделью в задачах языкового перевода, если зайдете к моей реализации на Github здесь. Также ознакомьтесь с моим следующим постом, в котором я рассказываю о своем пути создания переводчика и его результатах.
Или, наконец, вы можете построить его сами. Вот руководство о том, как это сделать и как это работает.
В этом руководстве объясняется только, как кодировать модель и запускать ее, для получения информации о том, как получить данные и обработать их для seq2seq, см. Мое руководство здесь .
На схеме выше показан обзор модели трансформатора. Входными данными для кодировщика будет английское предложение, а «Outputs», поступающее в декодер, будет французским предложением.
Фактически, есть пять процессов, которые нам необходимо понять, чтобы реализовать эту модель:
Встраивание слов стало стандартной практикой в NMT, обеспечивая сеть гораздо большим количеством информации о словах, чем одно горячее кодирование.Подробнее об этом читайте в моем сообщении здесь.
Встраивание выполняется просто в pytorch:
class Embedder (nn.Module):
def __init __ (self, vocab_size, d_model):
super () .__ init __ ()
self.embed = nn.Embedding (vocab_size, d_model) )
def forward (self, x):
return self.embed (x)
Когда каждое слово загружается в сеть, этот код выполняет поиск и извлекает его вектор внедрения. Эти векторы затем будут изучены моделью как параметры, настраиваемые с каждой итерацией градиентного спуска.
Чтобы модель могла понять предложение, ей необходимо знать две вещи о каждом слове: что это слово означает? И какова его позиция в приговоре?
Вектор внедрения для каждого слова узнает значение, поэтому теперь нам нужно ввести что-то, что сообщает сети о положении слова.
Васмари и др. ответили на эту проблему, используя эти функции для создания константы значений, зависящих от позиции:
Эта константа представляет собой 2-мерную матрицу. Pos относится к порядку в предложении, а i относится к положению вдоль измерения вектора внедрения. Затем каждое значение в матрице pos / i вычисляется с использованием приведенных выше уравнений.
Матрица позиционного кодирования - это константа, значения которой определяются приведенными выше уравнениями. При добавлении к матрице внедрения каждое вложение слова изменяется в зависимости от его положения.Интуитивно понятный способ кодирования нашего позиционного энкодера выглядит так:
class PositionalEncoder (nn.Module):
def __init __ (self, d_model, max_seq_len = 80):
super () .__ init __ ()
self.d_model = d_model# создать постоянную матрицу 'pe' со значениями, зависящими от
# pos и i
pe = torch.zeros (max_seq_len, d_model)
для pos в диапазоне (max_seq_len):
для i в диапазоне (0, d_model, 2):
pe [pos, i] = \
math.sin (pos / (10000 ** ((2 * i) / d_model)))
pe [pos, i + 1] = \
math.cos (pos / (10000 ** ((2 * (i + 1)) / d_model)))pe = pe.unsqueeze (0)
self.register_buffer ('pe', pe)def forward (self, x):
# сделать вложения относительно большими
x = x * math.sqrt (self.d_model)
# добавить константу во встраивание
seq_len = x.size ( 1)
x = x + Variable (self.pe [:,: seq_len], \
requires_grad = False) .cuda ()
return x
Вышеупомянутый модуль позволяет нам добавить позиционное кодирование к вектору внедрения, обеспечивая информация о структуре к модели.
Причина, по которой мы увеличиваем значения внедрения перед добавлением, состоит в том, чтобы сделать позиционное кодирование относительно меньшим.Это означает, что исходное значение вектора внедрения не будет потеряно, когда мы сложим их вместе.
Маскировка играет важную роль в трансформаторе. Он служит двум целям:
Создать маску для ввода просто:
batch = next (iter (train_iter))
input_seq = batch.English.transpose (0,1)
input_pad = EN_TEXT.vocab.stoi [''] # создает маску с нулями везде, где есть заполнение на входе
input_msk = (input_seq! = Input_pad) .unsqueeze (1)
Для target_seq мы делаем то же самое, но затем создаем дополнительный шаг:
# создаем маску как раньше target_seq = batch.French.transpose (0,1)
target_pad = FR_TEXT.vocab.stoi ['']
target_msk = (target_seq! = target_pad) .unsqueeze (1) size = target_seq.size (1) # получить seq_len для matrixnopeak_mask = np . триу (np . штук (1, размер, размер),
k = 1) . astype ('uint8')
nopeak_mask = Variable (torch . from_numpy (nopeak_mask) == 0) target_msk = target_msk & nopeak_mask
Первым вводом в декодер будет целевая последовательность (французский перевод). Декодер предсказывает каждое выходное слово, используя все выходные данные кодировщика и французское предложение только до точки каждого предсказываемого слова.
Следовательно, нам нужно предотвратить отображение первых выходных прогнозов в предложении. Для этого мы используем nopeak_mask:
. Когда маска применяется в нашей функции внимания, каждое предсказание сможет использовать предложение только до того слова, которое оно предсказывает.Если мы позже применим эту маску к оценкам внимания, значения там, где вход находится впереди, не смогут участвовать при вычислении выходов.
Когда у нас есть внедренные значения (с позиционным кодированием) и маски, мы можем приступить к построению слоев нашей модели.
Вот обзор многоголового уровня внимания:
Многоголовый слой внимания, каждый вход разделен на несколько заголовков, что позволяет сети одновременно уделять внимание различным подразделам каждого внедрения.V, K и Q обозначают «ключ», «значение» и «запрос». Эти термины используются в функциях внимания, но, честно говоря, я не думаю, что объяснение этой терминологии особенно важно для понимания модели.
В случае энкодера V, K и G будут просто идентичными копиями вектора внедрения (плюс позиционное кодирование).У них будут размеры Batch_size * seq_len * d_model.
В мультиголовом внимании мы разбиваем вектор внедрения на N голов, так что они будут иметь размеры batch_size * N * seq_len * (d_model / N).
Это последнее измерение (d_model / N) мы будем называть d_k.
Давайте посмотрим код для модуля декодера:
class MultiHeadAttention (nn.Module):Уравнение для вычисления внимания Диаграмма из бумаги, иллюстрирующая шаги уравнения
def __init __ (self, Heads, d_model, dropout = 0.1):
super () .__ init __ ()self.d_model = d_model
self.d_k = d_model // головки
self.h = головкиself.q_linear = nn.Linear (d_model, d_model)
self.v_linear = nn.Linear (d_model, d_model)
self.k_linear = nn.Linear (d_model, d_model)
self.dropout = nn.Dropout (dropout)
self.out = nn.Linear (d_model, d_model)def вперед (self, q, k, v, mask = None):
bs = q.size (0)
# выполнить линейную операцию и разбить на h головы
k = self.k_linear (k) .view (bs, -1, self.h, self.d_k)
q = self.q_linear (q) .view (bs, -1, self.h, self.d_k)
v = self.v_linear (v) .view (bs, -1, self. h, self.d_k)# транспонировать для получения размеров bs * h * sl * d_model
k = k.transpose (1,2)
# вычислить внимание с помощью функции, мы определим следующие
q = q.transpose (1,2)
v = v.transpose ( 1,2)
баллов = внимание (q, k, v, self.d_k, mask, self.dropout)# объединить головы и пропустить через последний линейный слой
concat = scores. транспонировать (1,2).contiguous () \
.view (bs, -1, self.d_model)output = self.out (concat)
return output
Это единственное другое уравнение, которое мы мы будем рассматривать сегодня, и эта диаграмма из бумаги делает большую работу по объяснению каждого шага.
Каждая стрелка на диаграмме отражает часть уравнения.
Сначала мы должны умножить Q на транспонирование K. Затем это «масштабируется» путем деления результата на квадратный корень из d_k.
Шаг, который не показан в уравнении, - это операция маскирования. Перед тем, как выполнить Softmax, мы применяем нашу маску и, следовательно, уменьшаем значения там, где ввод является заполнением (или в декодере, также когда ввод находится перед текущим словом).
Еще один непоказанный шаг - это выпадение, которое мы применим после Softmax.
Наконец, последний шаг - это скалярное произведение между полученным результатом и V.
Вот код функции внимания:
def Внимание (q, k, v, d_k, mask = None, dropout = Нет):балла = факел.matmul (q, k.transpose (-2, -1)) / math.sqrt (d_k)
, если маска не равна None:
mask = mask.unsqueeze (1)
score = scores.masked_fill (mask == 0, -1e9) scores = F.softmax (scores, dim = -1), если отсев нет Нет:
балл = отсев (баллы)output = torch.matmul (scores, v)
return output
Ok, если вы уже поняли, похлопайте себя по плечу, поскольку мы добрались до последнего слоя, и здесь все довольно просто!
Этот уровень состоит только из двух линейных операций с промежуточными операциями relu и dropout.
class FeedForward (nn.Module):
def __init __ (self, d_model, d_ff = 2048, dropout = 0.1):
super () .__ init __ ()
# Мы устанавливаем d_ff по умолчанию на 2048
self.linear_1 = nn.Linear (d_model, d_ff)
self.dropout = nn.Dropout (dropout)
self.linear_2 = nn.Linear (d_ff, d_model)
def вперед (self, x):
x = self.dropout (F. relu (self.linear_1 (x)))
x = self.linear_2 (x)
return x
Слой прямой связи просто углубляет нашу сеть, используя линейные слои для анализа паттернов на выходе слоев внимания.
Нормализация очень важна в глубоких нейронных сетях. Это предотвращает слишком сильное изменение диапазона значений в слоях, что означает, что модель обучается быстрее и имеет лучшую способность к обобщению.
Мы будем нормализовать наши результаты между каждым слоем в кодировщике / декодере, поэтому перед построением нашей модели давайте определим эту функцию:
class Norm (nn.Module):
def __init __ (self, d_model, eps = 1e-6 ):
super () .__ init __ ()self.size = d_model
# создать два обучаемых параметра для калибровки нормализации
self.alpha = nn.Parameter (torch.ones (self.size))
self.bias = nn.Parameter (torch.zeros (self.size))
self.eps = eps
def forward (self, x):
norm = self.alpha * (x - x.mean (dim = -1, keepdim = True)) \
/ (x.std (dim = -1, keepdim = True) + self.eps) + self.bias
return norm
Если вы понимаете детали выше, теперь вы понимаете модель. Остальное просто ставит все на свои места.
Давайте еще раз взглянем на общую архитектуру и начнем строить:
Последняя переменная: Если вы внимательно посмотрите на диаграмму, вы увидите «Nx» рядом с архитектурами кодировщика и декодера.В действительности кодер и декодер на схеме выше представляют один уровень кодера и один из декодера. N - это переменная количества слоев. Например. если N = 6, данные проходят через шесть уровней кодера (с архитектурой, показанной выше), затем эти выходные данные передаются в декодер, который также состоит из шести повторяющихся уровней декодера.
Теперь мы создадим модули EncoderLayer и DecoderLayer с архитектурой, показанной в модели выше. Затем, когда мы построим кодировщик и декодер, мы можем определить, сколько из этих слоев нужно иметь.
# построить слой кодировщика с одним слоем внимания с несколькими головками и одним слоем с прямой связью class EncoderLayer (nn.Module):
def __init __ (self, d_model, Head, dropout = 0.1):
super () .__ init __ ( )
self.norm_1 = Norm (d_model)
self.norm_2 = Norm (d_model)
self.attn = MultiHeadAttention (головы, d_model)
self.ff = FeedForward (d_model)
self.dropout_1 = nn.Dropout (выпадение)
self.dropout_2 = nn.Dropout (выпадение)def forward (self, x, mask):
x2 = self.norm_1 (x)
x = x + self.dropout_1 (self.attn (x2, x2, x2, mask))
x2 = self.norm_2 (x)
x = x + self.dropout_2 (self.ff (x2) )
return x# построить слой декодера с двумя слоями внимания с несколькими головами и
class DecoderLayer (nn.Module):
# одним слоем прямой связи
def __init __ (self, d_model, Heads, dropout = 0.1):
super () .__ init __ ()
self.norm_1 = Norm (d_model)
self.norm_2 = Norm (d_model)
self.norm_3 = Norm (d_model)self.dropout_1 = nn.Dropout (выпадение)
self.dropout_2 = nn.Dropout (выпадение)
self.dropout_3 = nn.Dropout (выпадение)self.attn_1 = MultiHeadAttention (головы, d_model)
def forward (self, x, e_outputs, src_mask, trg_mask):
self.attn_2 = MultiHeadAttention (головы, d_model)
self.ff = FeedForward (d_model) .cuda ()
x2 = self.norm_1 (x)
x = x + self.dropout_1 (self.attn_1 (x2 , x2, x2, trg_mask))
x2 = self.norm_2 (x)
x = x + self.dropout_2 (self.attn_2 (x2, e_outputs, e_outputs,
src_mask))
x2 = self.norm_3 (x)
x = x + self.dropout_3 (self.ff (x2))
return x # Затем мы можем создать удобную функцию клонирования, которая может генерировать несколько слоев: def get_clones (module, N):
return nn.ModuleList ([copy.deepcopy (модуль) для i в диапазоне (N)])
Теперь мы готовы создать кодировщик и декодер:
class Encoder (nn.Module):
def __init __ (self, vocab_size, d_model , N, головок):
super () .__ init __ ()
self.N = N
self.embed = Embedder (vocab_size, d_model)
self.pe = PositionalEncoder (d_model)
self.layers = get_clones (EncoderLayer (d_model, Head), N)
self.norm = Norm (d_model)
def forward (self, src, mask):
x = self.embed (src )
x = self.pe (x)
для i в диапазоне (N):
x = self.layers [i] (x, mask)
return self.norm (x)class Decoder (nn.Module):
def __init __ (self, vocab_size, d_model, N, головы):
super () .__ init __ ()
self.N = N
self.embed = Embedder (vocab_size, d_model)
self.pe = PositionalEncoder (d_model)
я.Layers = get_clones (DecoderLayer (d_model, Head), N)
self.norm = Norm (d_model)
def forward (self, trg, e_outputs, src_mask, trg_mask):
x = self.embed (trg)
x = self .pe (x)
for i in range (self.N):
x = self.layers [i] (x, e_outputs, src_mask, trg_mask)
return self.norm (x)
И, наконец… Преобразователь !
Трансформатор класса(nn.Module):
def __init __ (self, src_vocab, trg_vocab, d_model, N, Heads):
super () .__ init __ ()
self.encoder = Encoder (src_vocab, d_model, N, Heads)
self.decoder = Decoder (trg_vocab, d_model, N, Head)
self.out = nn.Linear (d_model, trg_vocab)
def forward (self, src, trg, src_mask, trg_mask):
e_outputs = self.encoder (src, src_mask)
d_output = self.decoder (trg, e_outputs, src_mask, trg_mask)
output = self.out (d_output)
soft return output # мы не выполняем soft return output # на выходе, так как это будет обработано
# автоматически нашей функцией потерь.
После того, как преобразователь построен, все, что остается, - это обучить этого придурка на наборе данных EuroParl.Кодирование довольно безболезненно, но будьте готовы подождать около 2 дней, чтобы эта модель начала сходиться!
Давайте сначала определим некоторые параметры:
d_model = 512
голов = 8
N = 6
src_vocab = len (EN_TEXT.vocab)
trg_vocab = len (FR_TEXT.vocab) model = Transformer (src_vocab, trg_modelocab, , Heads) для p в model.parameters ():
if p.dim ()> 1:
nn.init.xavier_uniform_ (p) # этот код очень важен! Он инициализирует параметры с диапазоном значений
#, который предотвращает затухание или чрезмерное усиление сигнала.
# См. Математическое объяснение в этом блоге. Optim = torch.optim.Adam (model.parameters (), lr = 0.0001, beta = (0.9, 0.98), eps = 1e-9)
И теперь все хорошо для обучения:
def train_model (epochs, print_every = 100):Пример результатов тренировки: после нескольких дней тренировок я, казалось, сошёл на потерю около 1.3model.train ()
start = time.time ()
temp = starttotal_loss = 0
для эпох в диапазоне (эпох):
для i, партия в enumerate (train_iter):
src = batch.English.transpose (0,1)
trg = batch.French.transpose (0,1) # во французском предложении, которое мы вводим, есть все слова, кроме
# последнего, так как каждое слово используется для предсказания следующегоtrg_input = trg [:,: -1]
# слова, которые мы пробуем для прогнозирования
target = trg [:, 1:]. contiguous (). view (-1)
# создать функцию для создания масок с использованием кода маски выше
src_mask, trg_mask = create_masks (src, trg_input)
preds = модель (src, trg_input, src_mask, trg_mask)
optim.zero_grad ()
loss = F.cross_entropy (preds.view (-1, preds.size (-1)),
loss.backward ()
результатов, ignore_index = target_pad)
optim.step ()total_loss + = loss.data [0]
if ( i + 1)% print_every == 0:
loss_avg = total_loss / print_every
print ("time =% dm, epoch% d, iter =% d, loss =% .3f,
% ds на% d iters"% ( (time.time () - start) // 60,
эпоха + 1, i + 1, loss_avg, time.time () - temp,
print_every))
total_loss = 0
temp = time.time ()
Мы можем использовать приведенную ниже функцию для перевода предложений. Мы можем кормить его предложениями прямо из наших пакетов или вводить собственные строки.
Переводчик работает, выполняя цикл. Начнем с кодирования английского предложения. Затем мы передаем декодеру индекс токена
def translate (model, src, max_len = 80, custom_string = False):model.eval ()
if custom_sentence == True:
src = tokenize_en (src)
предложение = \
Variable (torch.LongTensor ([ [EN_TEXT.vocab.stoi [tok] для tok
в предложении]])). Cuda () src_mask = (src! = Input_pad) .unsqueeze (-2)
e_outputs = model.encoder (src, src_mask)output = torch.zeros (max_len) .type_as (src.data)
для i в диапазоне (1, max_len):
output [0] = torch.LongTensor ([FR_TEXT.vocab.stoi ['']]) trg_mask = np.triu (np.ones ((1, i, i),
k = 1) .astype ('uint8')
trg_mask = Variable (torch.from_numpy (trg_mask) == 0) .cuda ()out = модель .out (model.decoder (output [: i] .unsqueeze (0),
e_outputs, src_mask, trg_mask))
out = F.softmax (out, dim = -1)
val, ix = out [:, - 1] .data.topk (1)выводит [i] = ix [0] [0]
return '' .join (
if ix [0] [0] == FR_TEXT.vocab.stoi ['']:
break
[FR_TEXT.vocab.itos [ix] для ix в выходах [: i]]
)
И все.Смотрите мой Github здесь, где я написал этот код как программу, которая будет принимать два параллельных текста в качестве параметров и тренировать на них эту модель. Или практикуйте знания и применяйте сами!
.Трансформаторы - это тип архитектуры нейронной сети, который набирает популярность. Трансформеры недавно использовались OpenAI в своих языковых моделях, а также недавно использовались DeepMind для AlphaStar - своей программы, чтобы победить лучшего профессионального игрока в Starcraft. Преобразователи
были разработаны для решения задачи преобразования последовательности , или нейронных машин. Это означает любую задачу, которая преобразует входную последовательность в выходную последовательность. Сюда входит распознавание речи, преобразование текста в речь и т. Д.
Преобразование последовательности. Входные данные представлены зеленым цветом, модель - синим, а выход - фиолетовым. GIF от 3Для моделей, выполняющих преобразование последовательности , необходимо иметь какую-то память. Например, предположим, что мы переводим следующее предложение на другой язык (французский):
«Трансформеры» - японская [[хардкор-панк]] группа.Группа была образована в 1968 году, в разгар истории японской музыки »
В этом примере слово« группа »во втором предложении относится к группе« Трансформеры », представленной в первом предложении. Когда вы читаете о группе во втором предложении, вы знаете, что это относится к группе «Трансформеры». Это может быть важно для перевода. Есть много примеров, когда слова в некоторых предложениях относятся к словам в предыдущих предложениях.
Для перевода подобных предложений модель должна определять такого рода зависимости и связи.Рекуррентные нейронные сети (RNN) и сверточные нейронные сети (CNN) были использованы для решения этой проблемы из-за их свойств. Давайте рассмотрим эти две архитектуры и их недостатки.
Рекуррентные нейронные сети содержат петли, позволяющие информации сохраняться.
Вход представлен как x_tНа рисунке выше мы видим часть нейронной сети, A, , обрабатывающую некоторый вход x_t и выводящую h_t. Цикл позволяет передавать информацию от одного шага к другому.
Петли можно мыслить иначе. Рекуррентную нейронную сеть можно представить как несколько копий одной и той же сети, A , каждая из которых передает сообщение своему преемнику. Рассмотрим, что произойдет, если мы развернем цикл:
Развернутая рекуррентная нейронная сетьЭта цепочечная природа показывает, что рекуррентные нейронные сети явно связаны с последовательностями и списками. Таким образом, если мы хотим перевести какой-то текст, мы можем установить каждый ввод как слово в этом тексте.Рекуррентная нейронная сеть передает информацию из предыдущих слов в следующую сеть, которая может использовать и обрабатывать эту информацию.
На следующем рисунке показано, как обычно работает модель от последовательности к последовательности с использованием рекуррентных нейронных сетей. Каждое слово обрабатывается отдельно, и результирующее предложение генерируется путем передачи скрытого состояния на этап декодирования, который затем генерирует выходные данные.
GIF от 3Рассмотрим языковую модель, которая пытается предсказать следующее слово на основе предыдущих.Если мы пытаемся предсказать следующее слово предложения «облака в небе» , нам не нужен дальнейший контекст. Совершенно очевидно, что следующим словом будет небо.
В этом случае, когда разница между релевантной информацией и местом, которое необходимо, невелика, RNN могут научиться использовать прошлую информацию и выяснить, какое слово будет следующим в этом предложении.
Изображение из 6Но есть случаи, когда нам нужно больше контекста. Например, предположим, что вы пытаетесь угадать последнее слово текста: «Я вырос во Франции… Я говорю свободно…». Недавняя информация предполагает, что следующим словом, вероятно, является язык, но если мы хотим сузить, какой язык, нам нужен контекст Франции, который находится дальше по тексту.
Изображение из 6RNN становится очень неэффективным, когда разрыв между релевантной информацией и точкой, где она необходима, становится очень большим. Это связано с тем, что информация передается на каждом шаге, и чем длиннее цепочка, тем более вероятно, что информация будет потеряна по цепочке.
Теоретически RNN могут изучить эту долговременную зависимость.На практике они, кажется, не изучают их. LSTM, особый тип RNN, пытается решить эту проблему.
При составлении календаря на день мы расставляем по приоритетам встречи. Если есть что-то важное, мы можем отменить некоторые встречи и согласовать то, что важно.
RNN этого не делают. Всякий раз, когда он добавляет новую информацию, он полностью преобразует существующую информацию, применяя функцию. Изменяется вся информация, и не учитывается, что важно, а что нет.
LSTM вносят небольшие изменения в информацию путем умножения и сложения. С LSTM информация проходит через механизм, известный как состояния ячеек. Таким образом, LSTM могут выборочно запоминать или забывать важные и не очень важные вещи.
Внутри LSTM выглядит следующим образом:
Изображение из 6Каждая ячейка принимает в качестве входных данных x_t (слово в случае перевода предложения в предложение), предыдущее состояние ячейки и выход предыдущей ячейки .Он манипулирует этими входными данными и на их основе генерирует новое состояние ячейки и выходные данные. Я не буду вдаваться в подробности о механике каждой ячейки. Если вы хотите понять, как работает каждая ячейка, я рекомендую сообщение в блоге Кристофера:
С состоянием ячейки информация в предложении, которая важна для перевода слова, может передаваться от одного слова к другому при переводе.
Та же проблема, что обычно случается с RNN, случается с LSTM, т.е.е. когда предложения слишком длинные, LSTM все равно не работают. Причина в том, что вероятность сохранения контекста для слова, которое находится далеко от текущего обрабатываемого слова, экспоненциально уменьшается с увеличением расстояния от него.
Это означает, что когда предложения длинные, модель часто забывает содержание удаленных позиций в последовательности. Другая проблема с RNN и LSTM заключается в том, что трудно распараллелить работу по обработке предложений, поскольку вам нужно обрабатывать слово за словом.Не только это, но еще и не существует модели зависимостей дальнего и ближнего действия. Подводя итог, можно сказать, что LSTM и RNN представляют 3 проблемы:
Для решения некоторых из этих проблем исследователи создали техника обращения внимания на конкретные слова.
При переводе предложения я обращаю особое внимание на слово, которое сейчас перевожу.Когда я расшифровываю аудиозапись, я внимательно слушаю отрывок, который активно записываю. И если вы попросите меня описать комнату, в которой я сижу, я буду оглядываться на предметы, которые описываю, в процессе.
Нейронные сети могут достичь того же поведения, используя внимание , сосредотачиваясь на части подмножества информации, которую они предоставляют. Например, RNN может следить за выходом другой RNN. На каждом временном шаге он фокусируется на разных позициях в другой RNN.
Для решения этих проблем Attention - это метод, который используется в нейронной сети. Для RNN вместо кодирования всего предложения в скрытом состоянии каждое слово имеет соответствующее скрытое состояние, которое полностью передается на этап декодирования. Затем скрытые состояния используются на каждом этапе RNN для декодирования. На следующем гифке показано, как это происходит.
Шаг , зеленый, , называется этапом кодирования , , а фиолетовый этап - этапом декодирования . GIF от 3Идея заключается в том, что в каждом слове предложения может содержаться релевантная информация. Таким образом, чтобы декодирование было точным, оно должно учитывать каждое слово ввода, используя внимания.
Чтобы привлечь внимание к RNN при преобразовании последовательности, мы разделим кодирование и декодирование на 2 основных этапа. Одна ступенька обозначена зеленым цветом , а другая фиолетовым. Шаг , зеленый, , называется этапом кодирования , , а фиолетовый этап - этапом декодирования .
GIF из 3Шаг, выделенный зеленым цветом, отвечает за создание скрытых состояний на входе. Вместо того, чтобы передавать декодерам только одно скрытое состояние, как мы делали до использования внимание , мы передаем все скрытые состояния, генерируемые каждым «словом» предложения, на этап декодирования. Каждое скрытое состояние используется на этапе декодирования , чтобы выяснить, на что сеть должна обратить внимание .
Например, при переводе предложения « Je suis étudiant» на английский язык требуется, чтобы на этапе декодирования при переводе учитывались разные слова.
На этой гифке показано, какой вес придается каждому скрытому состоянию при переводе предложения Je suis étudiant на английский язык. Чем темнее цвет, тем большее значение придается каждому слову. GIF из 3Или, например, когда вы переводите предложение «L’accord sur la zone économique européenne a été signé en août 1992». с французского на английский и сколько внимания уделяется каждому входу.
Перевод предложения «L’accord sur la zone économique européenne a été signé en août 1992." на английский. Изображение из 3Но некоторые из проблем, которые мы обсуждали, все еще не решены с помощью RNN, использующих внимание . Например, параллельная обработка входных данных (слов) невозможна. Для большого объема текста это увеличивает время, затрачиваемое на перевод текста.
Сверточные нейронные сети помогают решить эти проблемы. С их помощью мы можем
Некоторые из самых популярных нейронных сетей для преобразования последовательностей, Wavenet и Bytenet, являются сверточными нейронными сетями.
Wavenet, модель представляет собой сверточную нейронную сеть (CNN). Изображение из 10Причина, по которой сверточные нейронные сети могут работать параллельно, заключается в том, что каждое слово на входе может обрабатываться одновременно и не обязательно зависит от предыдущих слов, которые нужно перевести. Более того, «расстояние» между выходным словом и любым входом для CNN составляет порядка log (N) - это размер высоты дерева, сгенерированного от выхода к входу (вы можете увидеть это на гифке выше.Это намного лучше, чем расстояние между выходом RNN и входом, которое составляет порядка N .
Проблема в том, что сверточные нейронные сети не обязательно помогают с проблемой выяснения проблемы зависимостей при переводе предложений. Именно поэтому были созданы Transformers , они представляют собой сочетание обоих CNN с вниманием.
Чтобы решить проблему распараллеливания, Transformers пытаются решить эту проблему, используя сверточные нейронные сети вместе с моделями внимания . «Внимание» увеличивает скорость перевода модели из одной последовательности в другую.
Давайте посмотрим, как работает Transformer . Трансформер - это модель, которая использует внимание для увеличения скорости. В частности, он использует самовнимания.
Трансформатор. Image from 4Внутри Transformer имеет такую же архитектуру, что и предыдущие модели, представленные выше. Но Transformer состоит из шести кодеров и шести декодеров.
Изображение из 4Все кодировщики очень похожи друг на друга. Все кодеры имеют одинаковую архитектуру. Декодеры обладают одним и тем же свойством, то есть они очень похожи друг на друга. Каждый кодировщик состоит из двух уровней: Самовнимание, и нейронной сети прямого распространения.
Изображение из 4Входы кодировщика сначала проходят через слой самовнимания . Это помогает кодировщику смотреть на другие слова во входном предложении при кодировании определенного слова. В декодере есть оба этих уровня, но между ними есть уровень внимания, который помогает декодеру сосредоточиться на соответствующих частях входного предложения.
Изображение из 4Примечание: Этот раздел взят из записи блога Джея Алламара
Давайте начнем с рассмотрения различных векторов / тензоров и того, как они перемещаются между этими компонентами, чтобы превратить входные данные обученной модели в выходные. Как и в случае с приложениями НЛП в целом, мы начинаем с преобразования каждого входного слова в вектор с помощью алгоритма встраивания.
Изображение взято из 4Каждое слово вложено в вектор размером 512. Мы представим эти векторы этими простыми рамками.
Встраивание происходит только в самый нижний кодировщик. Абстракция, которая является общей для всех кодировщиков, заключается в том, что они получают список векторов, каждый из которых имеет размер 512.
В нижнем кодировщике это будет слово embeddings, но в других кодировщиках это будет выход кодировщика, который прямо внизу. После встраивания слов в нашу входную последовательность каждое из них проходит через каждый из двух уровней кодировщика.
Изображение из 4Здесь мы начинаем видеть одно ключевое свойство преобразователя, а именно то, что слово в каждой позиции проходит по своему собственному пути в кодировщике.Между этими путями на уровне самовнимания есть зависимости. Однако уровень прямой связи не имеет этих зависимостей, и, таким образом, различные пути могут выполняться параллельно при прохождении через слой прямой связи.
Затем мы заменим пример более коротким предложением и посмотрим, что происходит на каждом подуровне кодировщика.
Давайте сначала посмотрим, как вычислить самовнимание с помощью векторов, а затем перейдем к рассмотрению того, как это на самом деле реализовано - с использованием матриц.
Выявление связи слов в предложении и уделение ему внимания . Изображение из 8Первый шаг в вычислении самовнимания состоит в том, чтобы создать три вектора из каждого из входных векторов кодировщика (в данном случае - вложение каждого слова). Итак, для каждого слова мы создаем вектор запроса, вектор ключа и вектор значения. Эти векторы создаются путем умножения вложения на три матрицы, которые мы обучили в процессе обучения.
Обратите внимание, что эти новые векторы меньше по размерности, чем вектор внедрения.Их размерность составляет 64, в то время как векторы ввода / вывода встраивания и кодировщика имеют размерность 512. Они НЕ ДОЛЖНЫ быть меньше, это выбор архитектуры, позволяющий сделать вычисление многогранного внимания (в основном) постоянным.
Изображение взято из 4Умножение x1 на весовую матрицу WQ дает q1, вектор «запроса», связанный с этим словом. В итоге мы создаем проекцию «запроса», «ключа» и «значения» для каждого слова во входном предложении.
Что такое векторы «запроса», «ключа» и «значения»?
Это абстракции, которые полезны для вычисления внимания и размышлений о нем.Когда вы перейдете к чтению того, как рассчитывается внимание ниже, вы будете знать почти все, что вам нужно знать о роли каждого из этих векторов.
Второй шаг в вычислении самовнимания - это подсчет баллов. Допустим, мы рассчитываем самовнимание для первого слова в этом примере - «мышление». Нам нужно сопоставить каждое слово входного предложения с этим словом. Оценка определяет, сколько внимания следует уделять другим частям входного предложения, когда мы кодируем слово в определенной позиции.
Оценка рассчитывается как скалярное произведение вектора запроса на ключевой вектор соответствующего слова, которое мы оцениваем. Итак, если мы обрабатываем самовнимание для слова в позиции №1, первая оценка будет скалярным произведением q1 и k1. Вторая оценка будет скалярным произведением q1 и k2.
Изображение из 4На третьем и четвертом шагах баллы делятся на 8 (квадратный корень из размерности ключевых векторов, используемых в статье - 64. Это приводит к получению более стабильных градиентов.Здесь могут быть другие возможные значения, но это значение по умолчанию), затем передайте результат с помощью операции softmax. Softmax нормализует оценки, так что все они положительные и в сумме составляют 1.
Изображение из 4Эта оценка softmax определяет, насколько каждое слово будет выражено в этой позиции. Очевидно, что слово в этой позиции будет иметь наивысший балл softmax, но иногда полезно обратить внимание на другое слово, имеющее отношение к текущему слову.
Пятый шаг - это умножение каждого вектора значений на показатель softmax (при подготовке к их суммированию).Интуиция здесь состоит в том, чтобы сохранить неизменными значения слов, на которых мы хотим сосредоточиться, и заглушить не относящиеся к делу слова (например, умножив их на крошечные числа, такие как 0,001).
Шестой этап предназначен для суммирования векторов взвешенных значений. Это дает результат слоя самовнимания в этой позиции (для первого слова).
Изображение из 4На этом расчет самовнимания завершен. Результирующий вектор - это тот, который мы можем отправить в нейронную сеть с прямой связью.Однако в реальной реализации этот расчет выполняется в матричной форме для более быстрой обработки. Итак, давайте посмотрим на это теперь, когда мы увидели интуитивное вычисление на уровне слов.
Трансформаторы в принципе так и работают. Есть еще несколько деталей, которые улучшают их работу. Например, вместо того, чтобы обращать внимание друг на друга только в одном измерении, Трансформеры используют концепцию многоголового внимания.
Идея заключается в том, что всякий раз, когда вы переводите слово, вы можете уделять каждому слову разное внимание в зависимости от типа вопроса, который вы задаете.На изображениях ниже показано, что это значит. Например, когда вы переводите «ударом ногой» в предложении «Я ударил по мячу», вы можете спросить «Кто ударил ногой». В зависимости от ответа перевод слова на другой язык может измениться. Или задайте другие вопросы, например, «Что сделал?» И т. Д.
.