Подстройка нлп: Подстройка (Метод НЛП)

Автор: | 13.12.1977

Содержание

Подстройка (Метод НЛП)

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

2. Люди знают, когда они в раппорте или не в раппорте, но не всегда могут установить, как они приходят к раппорту, или что делать, если уровень раппорта меняется.

3. Раппорту наносится урон, когда между твоим и моим миром — конфликт.

4. Раппорт развивается, когда наши внутренние миры объединяются или подходят» друг к другу. Люди устанавливают раппорт легче, если они чувствуют общую почву под ногами.

5. Бихевиоральная подстройка или подстройка к позе, жесту, голосу, тону, темпу и т.д., также, как и к содержанию, может эффективно поднять раппорт на новый уровень.

Некоторые правила корректного отражения:

  • отражать 100% тона, высоты, скорости и объема голоса другого человека, если Вы члены одной культуры

  • отражать на 75% выражение лица другого человека.

  • отражать 50% движений и положения тела другого человека.

  • отражать 100% жестов, когда Вы включаетесь в разговор.

6. Когда мы не «совпадаем» — предлагаем разные позы, жесты, голоса, темпы и тд — мы не можем допустить раппорта или прервать его. Иногда и это нужно — если мы не можем не допустить раппорта или прервать его. Иногда и это нужно — если мы не хотим коммуницировать или есть необходимость радикально изменить ход

Застрявшей» коммуникации.

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

8. Для глубокого раппорта подстраивайтесь к интересам,

убеждениям и ценностям другого человека.

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

Полезные внутренние вопросы, которые помогают нам сохранять ориентацию на раппорт:

  • В раппорте ли я (все еще) ?

  • Что мне нужно сказать или сделать, чтобы создать (еще лучший) раппорт?

  • Почему другой человек изменил позу/голос /дыхание?

Метафора подстройки

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

Подстройка. НЛП. Секретные методики спецслужб

Подстройка

После того, как вы смогли определить параметры калибро?вки вашего собеседника, следующим шагом будет подстро?йка. Подстроить можно несколькими способами в зависимости от вашего желания или ситуации. Цель подстройки – увеличить доверие и достичь состояния раппо?рта.

Раппо?рт, как уже упоминалось раньше, – это состояние единения, которое возникает на высоких уровнях доверия. Вы можете находиться в раппорте только с человеком, с которым общаетесь. Доверять же можно и даже тому, кого нет поблизости или с кем вы никогда в жизни не общались вживую. Причём может быть так, что вы ему доверяете, а он вам – нет. С раппортом иначе: если вы в раппорте с собеседником, то и он тоже в раппорте с вами.

Раппорт связан с подстройкой и ведением. Чем выше уровень подстройки, тем лучше ведение и тем сильнее раппорт. Но может быть и наоборот: подстройка уменьшилось, ведение ухудшилось – раппорт стал меньше.

Когда вы в раппо?рте, вам гораздо легче согласиться с собеседником, найти общее и в поведении, и в суждениях. Вы разговариваете, легко понимая друг друга. Любое дело, которое вы делаете вместе, удаётся. Состояние раппо?рта очень це?нно для обоих собеседников, поэтому они бессознательно стремятся его поддержать, подстраиваясь к друг другу.

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

Любой раппорт начинается с подстройки или присоединения. Существует четыре вида подстройки:

под тело, когда копируются поза, движения, жесты и мимика;

под ритм, в этом случае следует в точности подражать дыханию, морганиям и ритмичным движениям;

под голос, когда считываются тембр, интонация и громкость голоса собеседника;

под речь: стилистическая окраска речи, ключевые слова, характерные выражения.

Самый простой способ – это подстройка под позу. Можно подстраиваться зеркально: ваша правая рука «отражает» левую руку собеседник, левая – правую. Можно подстраиваться буквально: правое соответствует правому, левое – левому. При желании можно комбинировать. Вариантов подстройки может быть очень много. Можно подстроиться только под наклон туловища, положение ног, рук или головы.

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

Чтобы этого избежать, можно уменьшать амплитуду движения. Собеседник сделал широкий жест рукой, подстройтесь к нему движением по более узкой траектории.

Еще можно подстраиваться с запаздыванием, желательно, в сходной ситуации. Скрещенные руки, например, можно отразить с запаздыванием секунд в двадцать. Можно выполнять схожие движения, но с другим смыслом. Например, собеседник потер затылок – поправьте свою прическу. Собеседник положил руку на бедро – положите руку в карман брюк.

Весьма эффективен и практически незаметен способ подстройки по миганию. Собеседник моргнул, и вы моргните. Старайтесь поддерживать такую же частоту моргания. Кроме того, можно подстроиться под дыхание, такая подстройка выглядит совершенно естественно. Чтобы не выглядеть карикатурно, обычно используют один или два вида подстройки. Например, можно принять похожую позу и поймать ритм дыхания или же настроиться под тембр голоса и мимику собеседника.

Помните, что не обязательно полностью подражать движению. Например, при подстройке по дыханию можно улавливать и «отзеркаливать» каждый третий вздох и выдох. Если ваш собеседник любит раскачиваться или вертеться в офисном кресле, скопируйте его движения, вращая шариковую ручку у вас в руках. Собеседник отстукивает пальцами по столу, попробуйте поймать хотя бы каждый пятый или десятый удар и отзеркалить.

Главное, чтобы все ваши действия были естественными. В этом вам поможет ваше подсознание. Доверьтесь ему и вы заметите, что на интуитивном уровне подстраиваться гораздо проще, чем строго контролируя весь процесс. Чем больше вы будете практиковаться, тем проще и быстрее нау?читесь подстраиваться.

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

Кроме этого, важна громкость, с которой вы будете разговаривать. У каждого человека свои предпочтения в громкости, которая для него наиболее комфортна. Слишком тихий голос заставляет напрягаться и прислушиваться. Громкий будет резать слух и отталкивать. Выберите правильную громкость, и вы произведёте впечатление приятного собеседника.

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

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

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

Данный текст является ознакомительным фрагментом.

Продолжение на ЛитРес

Подстройка — НЛП в повседневной жизни

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

Найдется совсем немного людей, которым совсем не нравится подходить к зеркалу. Остальным – нравится. Хоть в какой-то степени. В любом случае, у зеркала мы успели провести достаточно много времени, чтобы научиться воспринимать свое отражение как себя.

На семинаре по НЛП делают самые разные модификации упражнения «зеркало». Это могло быть упражнение на идеальное отзеркаливание «живой скульптуры», где один из участников старался максимально точно отразить позу своего партнера, а еще один – «режиссер» – помогал ему, глядя со стороны.

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

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

Чудеса, да и только!

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

Сознание и тело – части единой системы, и согласованность тел, порождает согласие в сознании. В этом случае действительно проще согласиться с собеседником, принять его точку зрения. Примерить его карту – искать что-то общее.

– Можете объединиться в пары для следующего упражнения, – в группе занимающихся НЛП происходит некоторое движение, и через некоторое время каждый уже нашел себе партнера или партнершу. – Сейчас вы выберете две темы для разговора. По одной из них вы полностью друг с другом согласны, по другой – абсолютно не согласны.

Проходит несколько минут, и группа уже готова слушать дальнейшие инструкции. А инструкции примерно такие: «В следующие несколько минут вы будете, сидя в совершенно разных позах, обсуждать тему, где вы были согласны друг с другом. Через некоторое время – наоборот – позы совпадают, а мнения различаются».

Время пошло.

Ученики честно пытаются следовать инструкциям, но… Разговор не клеится. Вроде бы и согласны во всем… Ан нет – уже не во всем. Поторопились мы видно, выбрав эту тему. Да и как вообще можно говорить с таким человеком, сидит как непонятно что. Сразу видно – спорить собрался.

В других парах немного по-другому. Идет живое обсуждение. Тема действительно настолько животрепещущая! У нас так много общего! Смотришь на такую пару, и понимаешь: «Про задание они уже забыли». Позы, которые должны были быть разными, буквально после нескольких фраз становятся все более и более похожими… Они, конечно, иногда спохватываются и садятся «как положено». Но тема берет свое…

Стоит ли говорить, что как только ученики принялись за вторую фазу упражнения (с одинаковыми позами), спорить совершенно расхотелось. Или позы моментально разладились.

 

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

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

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

  

Метод подстройки в НЛП – Telegraph

Social Engineering

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

Внимание!Поначалу очень часто многие путают подстройку с передразниванием. Поэтому нужно твердо усвоить, что подстройка — это не обезьянничество, не подражание, и не передразнивание, которое очень заметно и оскорбительно. Подстраиваться нужно с уважением. И очень четко и чутко. (Иначе лучше этим приемом совсем не пользоваться, — будет только хуже. ) Приведем аналогию с обычной беседой. Пусть собеседник высказал какой-то довод. Вы можете эпатажно воскликнуть «Да я согласен!!!», всем своим видом и голосом выражая мысль о том, что, мол, еще в общении с дураком остается делать, как не соглашаться. Ясно, что это — обезьянничество. А можно сказать «Да, я согласен» спокойно и без эмоций, что воспринимается, как мы все знаем, совершенно нормально и говорит о том, что два собеседника достигли понимания. Вот подстройка и есть то самое спокойное и безэмоциональное согласие по второму варианту. Только соглашаетесь вы на невербальном уровне.

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

Подстройка с отставанием по фазе

Достаточно эффективный способ подстройки состоит в том, что вы подстраиваетесь не сразу, а спустя некоторое время. Конечно, спустя секунду-две, а не час-второй. Этот прием мы называем подстройкой с отставанием по фазе. Суть в том, что, скажем, движение руки собеседника вы повторяете не сразу, а спустя пару секунд, после того, как он его совершил. Под изменение позы собеседника можно подстраиваться уже спустя более длительное время: через минуту-вторую.

Очень мощным средством является подстройка к частоте дыхания. Если осуществлена грамотная подстройка к дыханию, то, как говорят, «энэлписты» — это признак глубокого раппорта.  Кроме того, подстройка к частоте дыхания является самой незаметной для собеседника.

В терминах НЛП подстройка называется — раппорт. Еще говорят «установить раппорт», что означает «присоединиться» к другому человеку. Раппорт и подстройку еще очень часто называют отзеркаливанием, потому что при раппорте мы как бы зеркально повторяем действия собеседника.

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

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

Подстройка и ведение имеют много различных применений, и не только при ведении переговоров. Так, к примеру, можно успокаивать рассерженных собеседников, слегка подстроившись к их гневу, и потом, постепенно начав успокаивать себя — вслед за вами успокаивается и собеседник. Весьма просто, к примеру, используя комбинацию этих приемов, укладывать детей спать. Это очень нередкая ситуация, когда ребенку вроде бы уже и отдыхать пора, а он все хочет играть, и капризничает, когда родители волевым голосом сообщают ему, что ему уже пора в койку. А можно и по-другому. Играть? Пожалуйста! Начинайте играть вместе с ребенком, постепенно подстраиваясь под него (хотя достаточно и того, что вы просто начали с ним играть). И потом постепенно начинайте зевать, прикрывать глаза, задремывать на пару секунд и, встряхиваясь, просыпаться… Десяти-пятнадцати минут, как правило, достаточно, чтобы ребенка убаюкать. Кстати, этим нехитрым приемом прекрасно убаюкиваются и многие взрослые. Можете на какой-нибудь вечеринке провести такой эксперимент. Подстройтесь под человека и начинайте делать так же, как описано для ситуации с ребенком. Зачастую не надо даже особо подстраиваться, достаточно просто, чтобы те, кого вы хотите убаюкать, занимались одним делом — к примеру, смотрели одну телевизионную передачу. Другой классический пример подстройки и ведения состоит в том, что если ваш собеседник барабанит пальцами по столу (достаточно часто встречающаяся неприятная привычка), начинайте вместе с ним барабанить в том же темпе, постепенно затем снижая скорость постукивания до полного прекращения. Собеседник в 9 случаях из 10 также прекратит постукивать.

Теперь немного об отстройкеЕстественно, если к человеку можно подстроиться, то от него можно и отстроиться. Причем отстройку тоже не нужно понимать как способ поругаться. Наоборот — это достаточно вежливый прием, к примеру, окончания разговора. Скажем, телефонного. В котором вы сначала подстраиваетесь к голосу собеседника, а потом отстраиваетесь, что служит для него сигналом к окончанию разговора.

Social Engineering — Канал посвященный психологии, социальной инженерии, профайлингу, НЛП, Хакингу, Анонимности и безопасности в сети интернет, Даркнету и все что с ним связано. Добро пожаловать 😉


S.E.Book — Литература социального инженера.

Читать «НЛП. Переговоры с манипулятором. Техники влияния и достижения целей» — Пелехатый Михаил — Страница 4

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

Эти слова помогли огромному количеству людей. Если вы произнесете их уверенно и вовремя – вы продемонстрируете свою искреннюю заинтересованность в сотрудничестве.

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

Тодд отправился к соседу и заявил, что он знает о его прошлом и хочет услышать больше о том, что происходило внутри концлагерей. Свое требование он подкрепил важным аргументом – Тодд сказал, что если старик вздумает его убить, то об этом станет известно всем. Для этого мальчик написал подробное письмо, которое оставил в банке на хранении и велел вскрыть письмо только после своей смерти.

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

Через несколько лет старик сказал, что мальчик знает достаточно для того, чтобы его жизнь разбилась вдребезги, – мальчик «завис» во взаимоотношениях с фашистом, и этого было достаточно для появления у Тодда проблем с построением карьеры и социальной жизни в целом. Но это было не все – старик использовал такой же аргумент, как и Тодд несколько лет назад, – описал все в письме и оставил его в банке, велев вскрыть в случае смерти.

Молодой парень был в шоке – старик может умереть в любой момент, ведь ему больше семидесяти лет! В ответ он услышал следующее: «Как же приятно просыпаться по утрам и понимать, что есть на свете человек, который искренне желает тебе жить долго и быть здоровым!»

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

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

Формирование раппорта

Вспоминая определение раппорта (состояние доверия), становится понятно – вам нужно научиться вызывать в человеке доверие.

Ваш партнер должен видеть в вас друга, надежного товарища, если хотите – родственную душу. Если вы сможете сформировать раппорт – считайте, что фундамент для успешных переговоров заложен.

Раппорт – это одно Я на двоих.

Для того чтобы вызвать у собеседника состояние доверия, нужно подстраиваться. О способах подстройки поговорим чуть позже, а сейчас предлагаю немного пофантазировать.

Эксперимент «Зеркало, которому нельзя доверять»

Зеркальное отражение в точности повторяет то, что делаете вы. А представьте, вдруг все станет иначе?

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

Если зеркальное отражение такое, каким вы ожидаете его видеть, – вы чувствуете себя комфортно. Но если что-то идет не по плану – это повод насторожиться, в такой ситуации доверять зеркалу можно с трудом.

Вы привыкли доверять своему отражению в зеркале, потому что оно вас не подводит. Это нормально. Каждый человек по-настоящему доверяет только себе, ведь именно по себе мы проверяем реальность на адекватность. И если вы начнете «отражать» собеседника, то он сможет увидеть в вас себя и будет доверять вам.

Как подстраиваться?

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

Главное – подстраиваться незаметно, человек не должен осознавать, что вы влияете на него. Если вы будете замечены, раппорт не случится, зато может возникнуть конфликт.

Хорошим подспорьем будет информация о том, какие особенности восприятия у вашего Клиента. Когда вы узнаете, кто Клиент – визуал, кинестетик, аудиал или дискрет, вам будет легче выбрать стратегию подстройки.

• Визуал. Основную информацию воспринимает зрением.

• Кинестетик. «Чувствует» окружающий мир, воспринимает его через ощущения (осязание, обоняние, движения).

• Аудиал. «Слышит» мир, воспринимает происходящее через звуки.

• Дискрет. Восприятие основной информации проходит через логическое осмысление с помощью доводов, цифр, знаков. Самый редкий тип.

Объясню, почему лучше знать, как Клиент воспринимает информацию.

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

Варианты подстройки

• По позе, жестам.

Он закинул ногу на ногу, вы сделали то же самое. Он активно жестикулирует правой рукой – вы тоже жестикулируете правой рукой (или левой, если выбрали зеркальную подстройку).

• По голосу.

Можно подстраиваться по темпу речи (как говорит человек – медленно или быстро?), тембру (хриплый, звонкий голос), громкости (тихо или громко?), интонации, произношению (диалект, сленг), высоте голоса (низкий или высокий?), ритму.

• По одежде.

Дресс-код был придуман как раз для того, чтобы каждый чувствовал себя «в своей тарелке».

Если ваш Клиент не носит строгие костюмы, отдавая предпочтение джинсам, – наденьте на переговоры джинсы.

• По интересам и убеждениям.

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

– Я болею за ЦСКА.

– Надо же, я тоже!

Важно: если вы понятия не имеете, что это за команда – ЦСКА, не нужно делать вид, что вы ее самый преданный фанат. Собеседник наверняка начнет вас расспрашивать на эту тему, и можно попасть в глупое положение. Вместо раппорта в этом случае может сформироваться отторжение.

• По мимике.

Вам улыбнулись? Улыбайтесь в ответ! Можно отражать разные эмоции, которые видны по мимике, – гнев, восторг, печаль, радость, отвращение, удивление и т. д.

• По личностным особенностям.

Кто ваш Клиент? Любой человек играет некоторые роли.

Например, семейные роли – чей-то ребенок, чей-то друг, чей-то отец и т. д. Параллельно каждый из нас играет профессиональные роли (служебные) – рабочие, менеджеры, учителя, студенты, тунеядцы, коллеги, подчиненные, начальники. Ролей может быть много – человек является одновременно русским, художником, буддистом, любителем природы, спортсменом.

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

• 

Продолжайте этот список самостоятельно, находите «свои» способы подстройки, тестируйте их и наблюдайте за реакцией собеседника. Если вы найдете элемент, который человек не осознает и который является системообразующим, – вы сможете подстроиться.

Речь в эфире с позиций NLP, или Почему аудитория не всегда понимает СМИ

В рубрику «Гуманитарные технологии» | К списку рубрик  |  К списку авторов  |  К списку публикаций

Речь в эфире с позиций NLP, или Почему аудитория не всегда понимает СМИ

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

Роман Сидоров
Программный директор, радиоканал «Архангельск 102,0 FM

Ведущий — лицо радиостанции

Как показывает опыт региональных вещателей, наиболее остро кадровый голод сказывается в областях России. Учебные программы факультетов и отделений журналистики не могут полностью удовлетворить запросы вещателей относительно квалификации выпускников. Это во многом связано с тем, что коммерческое вещание в России, пожалуй, одно из самых молодых в мире. А потому в нашей стране нет четких традиций коммерческого вещания, образовательных программ, соответствующих современным требованиям квалификации журналистов и ведущих.

Известно, что ведущий эфира (ди-джей) является лицом радиостанции. Именно благодаря его работе реализуется одна из ключевых функций радио как СМИ — коммуникативная. Поэтому от практических навыков и эрудиции ведущего зависит успех коммуникативного процесса, имидж и рейтинг радиостанции.

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

NLP-технологии

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

Основная цель любой NLP-технологии заключается в достижении раппорта: психологического равновесия между участниками коммуникативного процесса. Для этого в распоряжении ведущего есть голос и речь, интонации и слова, они составляют 44% от общего объема доступных людям коммуникативных средств. Речь, выстроенная грамотно не только с точки зрения русского языка, но и психологии, психофизиологии, — залог успеха ведущего и радиостанции в целом.

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

Три основные составляющие

Можно выделить три основные составляющие коммуникативного процесса: анализ психологического состояния позвонившего, подстройка под него, «ведение человека». Как показывает практика, подстройка под голос собеседника очень эффективна. Таким образом ведущий может изменить настроение человека с плохого на хорошее. Для радиоведущего это совсем несложно, а человеку, позвонившему в эфир, будет приятно, и он с большой вероятностью не только позвонит снова, но и расскажет друзьям и знакомым, что в эфире такой-то станции с ведущими очень комфортно и интересно общаться. Подстраиваясь под эмоции человека, важно делать это естественно, а не передразнивать собеседника. Следует помнить о том, что эмоции ведущего должны быть менее интенсивными, чем у слушателя, чтобы не вызвать обострения, например, если человек нервничает и говорит громко. Крайне мощным механизмом взаимодействия с конкретным человеком и аудиторией в целом является дыхание, так как его глубина и интенсивность — важнейшие физиологические показатели. О важности дыхания в работе актера почти 100 лет назад писал князь Волконский.

Естественно, работая с большой аудиторией, подстроиться под дыхание каждого человека невозможно, поэтому еще в 70-е годы прошлого века в Советском Союзе дикторам предписывалось дышать неслышно, через нос. Конечно, дышать в эфире носом сложно и, как показывают наблюдения за ведущими, этот навык мало у кого выработан. В итоге практически после каждого предложения, особенно в новостях, следует короткий и шумный вдох через рот, будто ведущий не новости читает, а бежит стометровку. Такое дыхание не только засоряет эфир, но и негативно действует на психологическое состояние слушателя, потому как он сам с вероятностью 99,9% в этот момент никуда не бежит, а слушает новости в машине, дома или в офисе. В итоге не создается раппорт между ведущим и слушателем. Эффективность усвоения информации значительно снижается, а вот раздражение человека и желание выключить такие новости — увеличивается.

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

По данным Британского журнала социальной и клинической психологии, на голос, тембр, ритм, громкость и эмоции приходится до 37% всей информации, которую получает человек о состоянии собеседника, 7% приходится непосредственно на слова вне эмоционального контекста. Об этих 7% хочется поговорить более подробно.

«Визуалы», «аудиалы» и «кинестетики»

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

— Итак, к нам дозвонилась прекрасная Елена! Елена, здравствуйте!

— Здравствуйте! (грустно)

— Ой! Я слышу ноты грусти в вашем голосе, что вас расстроило?

— Представьте себе, я сегодня собралась на пляж, посмотреть на море, а с утра за окном совершенно не живописная погода — глаза б мои ее не видели!

— Алена, позвольте вам сказать одну вещь: неважно какая на улице погода, не нужно из-за нее отчаиваться и грустить. Зато сегодня перед грозой на улице была отменная тишина, даже птицы не пели… Во всем можно найти прекрасные моменты. Давайте я для вас песню поставлю. Думаю, от ее прослушивания ваше настроение улучшится!

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

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

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

В данной статье я рассмотрел только самые основные приемы работы с аудиторией, известные в NLP. Это тот базис, владеть которым, на мой взгляд, должен каждый ведущий. Как отмечалось выше, коммуникативный процесс состоит из 3 этапов: сбора информации о состоянии человека, подстройки и ведения. Освоив отмеченные выше приемы и правила, человек у микрофона станет не просто говорящей головой, объявляющей песни и время. Он станет именно Ведущим, так как приобретет возможность вести людей за собой, тонко и филигранно манипулируя их эмоциями и состоянием.

Опубликовано: Журнал «Broadcasting. Телевидение и радиовещание» #1, 2007
Посещений: 15338

Статьи по теме

  Автор


Роман  СидоровПрограммный директор, радиоканал «Архангельск 102,0 FM

Всего статей:  1

В рубрику «Гуманитарные технологии» | К списку рубрик  |  К списку авторов  |  К списку публикаций

Подстройка и категории Вирджинии Сатир в НЛП техниках.

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

Наша способность к общению не ограничивается тем, насколько правильно и четко мы выражаем свои мысли. Очень многое зависит также от того, что мы передаем, не используя языковые средства. Данная составляющая общения называется невербальной, и она очень сильно влияет на процесс коммуникации.

Существуют специальные техники НЛП, которые позволяют управлять невербальными процессами. Давайте рассмотрим самые действенные из них.

Присоединение и отзеркаливание

Данные техники НЛП позволяют подстроиться к собеседнику, для более эффективного общения. Чтобы установить невербальную связь, необходимо обратить внимание на движения собеседника — как он держит голову, двигает руками, какие жесты использует. Затем Вы копируете эти движения, используя один из двух способов.

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

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

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

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

Категории Вирджинии Сатир

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

В соответствии с этими категориями людей можно разделить на:

  • обвиняющих;
  • заискивающих;
  • расчетливых;
  • отстраненных;
  • уравновешенных.

Обвиняющие

Обладают ярко выраженной склонностью искать людей, которых можно обвинить, или «поставить на место». Такие люди обычно одиноки.

Заискивающие

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

Расчетливые

Предпочитают скрывать свои чувства и эмоции. Окружающие воспринимают их как холодных и отчужденных собеседников.

Отстраненные

Могут с легкостью переключаться между предыдущими тремя типами людей, быть поочередно обвиняющими, заискивающими или расчетливыми. Стараются действовать так, как им подсказывает ситуация.

Уравновешенные

Максимально адекватны, и основываются только на фактах. При этом они часто говорят правду в глаза, вызывая у людей отрицательные эмоции.

Подстройка к категориям

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

Более подробные сведения Вы можете получить в разделах «Все курсы» и «Полезности», в которые можно перейти через верхнее меню сайта. В этих разделах статьи сгруппированы по тематикам в блоки, содержащие максимально развернутую (насколько это было возможно) информацию по различным темам.

Также Вы можете подписаться на блог, и узнавать о всех новых статьях.
Это не займет много времени. Просто нажмите на ссылку ниже:
    Подписаться на блог: Дорога к Бизнесу за Компьютером

Проголосуйте и поделитесь с друзьями анонсом статьи на Facebook:  

Transfer Learning NLP | Точная настройка Bert для классификации текста

Введение

С развитием глубокого обучения архитектуры нейронных сетей, такие как рекуррентные нейронные сети (RNN и LSTM) и сверточные нейронные сети (CNN), показали приличное улучшение производительности при решении нескольких задач обработки естественного языка (NLP), таких как классификация текста, языковое моделирование. , машинный перевод и др.

Однако производительность моделей глубокого обучения в НЛП бледнеет по сравнению с производительностью глубокого обучения в компьютерном зрении.

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

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

В случае НЛП этого не было до 2018 года, когда модель-трансформер была представлена ​​Google . С тех пор, как трансферное обучение в НЛП помогает решать многие задачи на высочайшем уровне.

В этой статье я объясню, как настроить BERT для классификации текста.

Если вы хотите изучить НЛП с нуля, ознакомьтесь с нашим курсом — Обработка естественного языка (NLP) с использованием Python

Содержание

  1. Трансферное обучение в NLP
  2. Что такое точная настройка модели?
  3. Обзор BERT
  4. Тонкая настройка BERT для классификации спама

Трансферное обучение в НЛП

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

Этот прорыв в трансфертном обучении в компьютерном зрении произошел в 2012-13 годах. Однако с недавними достижениями в НЛП трансферное обучение стало жизнеспособным вариантом и в этом НЛП.

Большинство задач НЛП, таких как классификация текста, языковое моделирование, машинный перевод и т. Д., Представляют собой задачи моделирования последовательности. Традиционные модели машинного обучения и нейронные сети не могут захватывать последовательную информацию, представленную в тексте. Поэтому люди начали использовать рекуррентные нейронные сети (RNN и LSTM), потому что эти архитектуры могут моделировать последовательную информацию, представленную в тексте.

Типичный RNN

Однако у этих повторяющихся нейронных сетей есть свой набор проблем.Одна из основных проблем заключается в том, что RNN не могут быть распараллелены, потому что они принимают по одному входу за раз. В случае текстовой последовательности RNN или LSTM будут принимать в качестве входных данных по одному токену за раз. Таким образом, он будет проходить через токен за токеном. Следовательно, обучение такой модели на большом наборе данных займет много времени.

Итак, потребность в трансферном обучении в НЛП была как никогда высокой. В 2018 году преобразователь был представлен Google в статье «Внимание — это все, что вам нужно», которая стала революционной вехой в НЛП.

The Transformer — Model Architecture
(Источник: https://arxiv.org/abs/1706.03762)

Вскоре для различных задач НЛП начал появляться широкий спектр моделей на базе трансформаторов. Есть несколько преимуществ использования моделей на базе трансформатора, но наиболее важными из них являются:

  • Первое пособие

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

  • 2-е пособие

    Нам не нужны данные с ярлыками для предварительного обучения этих моделей. Это означает, что нам нужно просто предоставить огромное количество немаркированных текстовых данных для обучения модели на основе трансформатора. Мы можем использовать эту обученную модель для других задач НЛП, таких как классификация текста, распознавание именованных сущностей, генерация текста и т. Д. Вот как работает трансферное обучение в НЛП.

BERT и GPT-2 — самые популярные модели на основе трансформаторов, и в этой статье мы сосредоточимся на BERT и узнаем, как мы можем использовать предварительно обученную модель BERT для выполнения классификации текста.

Что такое точная настройка модели?

BERT (представления двунаправленного кодера от трансформаторов) — это большая архитектура нейронной сети с огромным количеством параметров, которые могут варьироваться от 100 миллионов до более 300 миллионов. Таким образом, обучение модели BERT с нуля на небольшом наборе данных приведет к переобучению.

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

Различные методы точной настройки

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

В этом уроке мы будем использовать третий подход.Мы заморозим все слои BERT во время тонкой настройки и добавим в архитектуру плотный слой и слой softmax.

Обзор BERT

Вы слышали о BERT, вы читали о том, насколько он невероятен и как он потенциально меняет ландшафт НЛП. Но что такое BERT в первую очередь?

Вот как исследовательская группа BERT описывает структуру НЛП:

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

Звучит слишком сложно в качестве отправной точки. Но он действительно суммирует то, что делает BERT, так что давайте разберем его.

Во-первых, BERT означает B idirectional E ncoder R epresentations from T ransformer.Каждое слово здесь имеет значение, и мы встретимся с ним одно за другим в этой статье. На данный момент ключевой вывод из этой линейки — BERT основан на архитектуре Transformer. Во-вторых, BERT предварительно обучен работе с большим корпусом немаркированного текста, включая всю Википедию (это 2500 миллионов слов!) И Книжный корпус (800 миллионов слов).

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

В-третьих, BERT — это модель «глубоко двунаправленная» . Двунаправленный означает, что BERT изучает информацию как с левой, так и с правой стороны контекста токена на этапе обучения.

Чтобы узнать больше об архитектуре BERT и ее предварительных обучающих задачах, вы можете прочитать следующую статью:

Тонкая настройка BERT для классификации спама

Теперь мы настроим модель BERT для выполнения классификации текста с помощью библиотеки Transformers.У вас должно быть базовое понимание определения, обучения и оценки моделей нейронных сетей в PyTorch. Если вы хотите быстро освежить в памяти PyTorch, вы можете прочитать статью ниже:

Ссылка на ноутбук Colab

Заявление о проблеме

У нас есть коллекция SMS-сообщений. Некоторые из этих сообщений являются спамом, а остальные — подлинными. Наша задача — построить систему, которая бы автоматически определяла, является ли сообщение спамом.

Набор данных, который мы будем использовать для этого варианта использования, можно загрузить из здесь (щелкните правой кнопкой мыши и выберите «Сохранить ссылку как…»).

Я предлагаю вам использовать Google Colab для выполнения этой задачи, чтобы вы могли использовать графический процессор. Во-первых, активируйте среду выполнения графического процессора в Colab, нажав Runtime -> Change runtime type -> Select GPU .

Установить библиотеку трансформаторов

Затем мы установим библиотеку трансформеров Huggingface. Эта библиотека позволяет импортировать широкий спектр предварительно обученных моделей на основе трансформаторов. Просто выполните приведенный ниже код, чтобы установить библиотеку.

! Трубопроводные трансформаторы 

Импорт библиотек

Загрузить набор данных

Вам нужно будет загрузить загруженный набор данных спама в среду выполнения Colab.Затем прочитайте его в фреймворке pandas.

Выход:

Набор данных состоит из двух столбцов — «метка» и «текст». Столбец «текст» содержит тело сообщения, а «метка» — это двоичная переменная, где 1 означает спам, а 0 означает, что сообщение не является спамом.

Теперь мы разделим этот набор данных на три набора — обучающий, проверочный и тестовый.

Мы проведем точную настройку модели, используя набор поездов и набор проверки, и сделаем прогнозы для набора тестов.

Импорт модели BERT и токенизатора BERT

Мы импортируем базовую модель BERT, которая имеет 110 миллионов параметров. Существует еще более крупная модель BERT, называемая BERT-large, которая имеет 345 миллионов параметров.

Давайте посмотрим, как работает этот токенизатор BERT. Попробуем закодировать пару предложений с помощью токенизатора.

Выход:

{‘input_ids’: [[101, 2023, 2003, 1037, 14324, 2944, 14924, 4818, 102, 0],
[101, 2057, 2097, 2986, 1011, 8694, 1037, 14324, 2944, 102 ]],

‘маска_ внимания’: [[1, 1, 1, 1, 1, 1, 1, 1, 1, 0], [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]] }

Как видите, на выходе получается словарь из двух элементов.

  • «input_ids» содержит целочисленные последовательности входных предложений. Целые числа 101 и 102 — особые токены. Мы добавляем их к обеим последовательностям, а 0 представляет собой маркер заполнения.
  • «маска_ внимания» содержит единицы и нули. Он сообщает модели, чтобы она обращала внимание на токены, соответствующие значению маски, равному 1, и игнорировала остальные.

Обозначить предложения

Поскольку сообщения (текст) в наборе данных имеют разную длину, мы будем использовать заполнение, чтобы все сообщения имели одинаковую длину.Мы можем использовать максимальную длину последовательности для заполнения сообщений. Однако мы также можем посмотреть на распределение длин последовательностей в наборе поездов, чтобы найти правильную длину заполнения.

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

Таким образом, мы установим 25 как длину заполнения.

Итак, мы теперь преобразовали сообщения в наборе для обучения, проверки и тестирования в целочисленные последовательности длиной 25 токенов каждая.

Затем мы преобразуем целочисленные последовательности в тензоры.

Теперь мы создадим загрузчики данных как для обучающего, так и для проверочного набора. Эти загрузчики данных будут передавать пакеты данных поезда и данные проверки в качестве входных данных для модели на этапе обучения.

Определить архитектуру модели

Если вы помните, ранее я упоминал в этой статье, что заморозил бы все слои модели перед ее точной настройкой.Итак, давайте сначала сделаем это.

Это предотвратит обновление весов модели во время точной настройки. Если вы хотите точно настроить даже предварительно обученные веса модели BERT, вам не следует выполнять приведенный выше код.

Теперь давайте определим архитектуру нашей модели.

Мы будем использовать AdamW в качестве оптимизатора. Это улучшенная версия оптимизатора Adam. Чтобы узнать больше об этом, ознакомьтесь с этой статьей.

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

Выход: [0,57743559 3,72848948]

Точная настройка BERT

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

Мы будем использовать следующую функцию для оценки модели. Он будет использовать данные набора проверки.

Теперь мы наконец приступим к доводке модели.

Выход:

 Тренировочная потеря: 0,592
Утрата проверки: 0,567

Эпоха 5/10
Партия 50 из 122.
Партия 100 из 122.

Оценка ...

Потеря тренировки: 0,566
Утрата проверки: 0,543

Эпоха 6/10
Партия 50 из 122.
Партия 100 из 122.

Оценка...

Потеря тренировки: 0,552
Утрата проверки: 0,525

Эпоха 7/10
Партия 50 из 122.
Партия 100 из 122.

Оценка ...

Потеря тренировки: 0,525
Утрата проверки: 0,498

Эпоха 8/10
Партия 50 из 122.
Партия 100 из 122.

Оценка ...

Потери в обучении: 0,507
Утрата проверки: 0,477

Эпоха 9/10
Партия 50 из 122.
Партия 100 из 122.

Оценка ...

Потеря тренировки: 0,488
Потеря валидации: 0.461

Эпоха 10/10
Партия 50 из 122.
Партия 100 из 122.

Оценка ...

Потери при обучении: 0,474
Утрата проверки: 0,454 

Вы можете видеть, что потеря валидации все еще уменьшается в конце 10-й эпохи. Итак, вы можете попробовать большее количество эпох. Теперь давайте посмотрим, насколько хорошо он работает на тестовом наборе данных.

Делайте прогнозы

Чтобы делать прогнозы, мы в первую очередь загрузим лучшие веса модели, которые были сохранены в процессе обучения.

После загрузки весов мы можем использовать настроенную модель, чтобы делать прогнозы на тестовом наборе.

Давайте посмотрим на производительность модели.

Выход:

И отзыв, и точность для класса 1 довольно высоки, что означает, что модель довольно хорошо предсказывает этот класс. Однако нашей целью было обнаружение спам-сообщений, поэтому неправильная классификация образцов класса 1 (спам) является более серьезной проблемой, чем неправильная классификация образцов класса 0.Если вы посмотрите на отзыв для класса 1, он равен 0,90, что означает, что модель смогла правильно классифицировать 90% спам-сообщений. Однако точность немного ниже для класса 1. Это означает, что модель неправильно классифицирует некоторые сообщения класса 0 (не спам) как спам.

Ссылка на ноутбук Colab

Конечные ноты

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

Если вы ищете дорожную карту, чтобы стать экспертом в НЛП, прочтите следующую статью —

Вы можете использовать раздел комментариев, если у вас есть какие-либо мысли или сомнения.

Последние достижения в тонкой настройке языковой модели

Тонкая настройка предварительно обученной языковой модели (LM) стала фактическим стандартом для выполнения трансферного обучения при обработке естественного языка.За последние три года (Ruder, 2018) точная настройка (Howard & Ruder, 2018) заменила использование извлечения признаков из предварительно обученных встраиваний (Peters et al., 2018), в то время как предварительно обученные языковые модели предпочтительнее модели, обученные переводу (McCann et al., 2018), логическому выводу на естественном языке (Conneau et al., 2017) и другим задачам из-за их повышенной эффективности выборки и производительности (Zhang and Bowman, 2018). Эмпирический успех этих методов привел к разработке все более крупных моделей (Devlin et al., 2019; Раффель и др., 2020). Последние модели настолько велики, что могут обеспечить приемлемую производительность без каких-либо обновлений параметров (Brown et al., 2020). Ограничения этой настройки нулевого выстрела (см. Этот раздел), однако, делают вероятным, что для достижения наилучшей производительности или сохранения достаточно эффективной тонкая настройка будет по-прежнему использоваться в качестве метода работы при использовании больших предварительно обученных LM. на практике.

В стандартной настройке трансферного обучения (см. Ниже; см. Этот пост для общего обзора) модель сначала предварительно обучается на больших объемах немаркированных данных с использованием потерь языкового моделирования, таких как моделирование языка с маской (MLM; Devlin et al. al., 2019). Затем предварительно обученная модель настраивается на помеченных данных последующей задачи с использованием стандартной кросс-энтропийной потери.

Стандартное предварительное обучение — настройка тонкой настройки (адаптировано из (Ruder et al., 2019))

Хотя предварительное обучение требует больших вычислительных ресурсов, точную настройку можно выполнить сравнительно недорого. Точная настройка более важна для практического использования таких моделей, поскольку отдельные предварительно обученные модели загружаются — и настраиваются — миллионы раз (см. Репозиторий моделей Hugging Face).Следовательно, тонкая настройка является основным предметом этой статьи. В частности, я выделю самые последние достижения, которые сформировали или могут изменить способ точной настройки языковых моделей, которые можно увидеть ниже.

Обзор методов тонкой настройки, обсуждаемых в этом посте.

Адаптивная тонкая настройка

Несмотря на то, что предварительно обученные языковые модели более устойчивы с точки зрения обобщения вне распределения, чем предыдущие модели (Hendrycks et al., 2020), они по-прежнему плохо оснащены для работы с данными, которые существенно ограничены. отличается от того, на котором они были предварительно обучены.Адаптивная тонкая настройка — это способ преодолеть такой сдвиг в распределении путем точной настройки модели на данных, которые ближе к распределению целевых данных. В частности, адаптивная тонкая настройка включает в себя точную настройку модели на дополнительных данных перед точной настройкой для конкретной задачи, что можно увидеть ниже. Важно отметить, что модель точно настроена с целью предварительного обучения, поэтому для адаптивной точной настройки требуются только немаркированные данные.

Адаптивная точная настройка как часть стандартной настройки передачи обучения.Предварительно обученная модель обучается с потерей до обучения (обычно моделирование замаскированного языка) на данных, которые ближе к целевому распределению.

Формально, учитывая целевую область $ \ mathcal {D} _T $, состоящую из пространства признаков $ \ mathcal {X} $ и предельного распределения вероятностей по пространству признаков $ P (X) $, где $ X = \ {x_1, \ ldots, x_n \} \ in \ mathcal {X} $ (Pan and Yang, 2009; Ruder, 2019), адаптивная тонкая настройка позволяет нам узнать как о пространстве функций $ \ mathcal {X} $, так и о распределении целевые данные $ P (X) $.

Варианты адаптивной тонкой настройки — предметная область, задача и адаптивная к языку тонкая настройка — использовались для адаптации модели к данным целевого домена, целевой задачи и целевого языка соответственно. Дай и Ле (2015) впервые показали преимущества тонкой настройки, адаптирующейся к предметной области. Позднее Ховард и Рудер (2018) продемонстрировали повышенную эффективность выборки за счет точной настройки данных в домене в рамках ULMFiT. Они также предложили адаптивную к задаче тонкую настройку, которая настраивает модель с целью предварительного обучения на данных обучения задания.Поскольку потери до обучения предоставляют более богатую информацию для моделирования целевых данных по сравнению с перекрестной энтропией по меткам одной горячей задачи, адаптивная к задаче тонкая настройка полезна помимо обычной тонкой настройки. В качестве альтернативы адаптивная и регулярная тонкая настройка может выполняться совместно с помощью многозадачного обучения (Chronopoulou et al., 2019).

Тонкая настройка предметной области и задач была недавно применена к последнему поколению предварительно обученных моделей (Logeswaran et al., 2019; Han and Eisenstein, 2019; Mehri et al., 2019). Gururangan et al. (2020) показывают, что адаптация к данным целевого домена и целевой задачи дополняют друг друга. Недавно Pfeiffer et al. (2020) предложили адаптивную к языку тонкую настройку для адаптации модели к новым языкам.

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

Поведенческая тонкая настройка

Хотя адаптивная тонкая настройка позволяет нам специализировать нашу модель на $ \ mathcal {D} _T $, она не учит нас чему-либо напрямую о целевой задаче. Формально целевая задача $ \ mathcal {T} _T $ состоит из пространства меток $ \ mathcal {Y} $, априорного распределения $ P (Y) $, где $ Y = \ {y_1, \ ldots, y_n \} \ в \ mathcal {Y} $ и условное распределение вероятностей $ P (Y | X) $. В качестве альтернативы, мы можем обучить модели способностям, полезным для успешного выполнения целевой задачи, путем точной настройки ее на соответствующие задачи, как показано ниже.Мы будем называть этот параметр тонкой настройкой поведения , поскольку он фокусируется на изучении полезного поведения и отличается от адаптивной тонкой настройки.

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

Один из способов научить модель релевантным возможностям — это настроить ее на релевантных помеченных данных связанной задачи перед точной настройкой конкретной задачи (Phang et al., 2018). Это так называемое промежуточное обучение лучше всего работает с задачами, которые требуют умения делать выводы и рассуждать на высоком уровне (Pruksachatkun et al., 2020; Phang et al., 2020). Тонкая настройка поведения с помощью помеченных данных использовалась для обучения модели информации об именованных объектах (Broscheit, 2019), перефразировании (Arase and Tsujii, 2019), синтаксисе (Glavaš and Vulić, 2020), выборе предложения ответа (Garg et al. , 2020), и ответы на вопросы (Khashabi et al., 2020). Агаджанян и др. (2021) выполните точную настройку около 50 помеченных наборов данных в многозадачной среде и обратите внимание на то, что большой и разнообразный набор задач важен для хорошей производительности передачи.

Поскольку контролируемые данные для таких высокоуровневых задач рассуждения, как правило, трудно получить, мы можем вместо этого обучаться по целям, которые обучают возможностям модели, которые актуальны для последующей задачи, но которые все еще можно изучить самостоятельно. Например, Доу и Нойбиг (2021) уточняют модель выравнивания слов с целью научить ее, среди прочего, определять параллельные предложения. Sellam et al. (2020) тонко настройте BERT для оценки качества с помощью ряда сигналов схожести предложений.В обоих случаях важно разнообразие обучающих сигналов.

Другой эффективный способ — сформулировать целевую задачу как форму моделирования замаскированного языка. С этой целью Ben-David et al. (2020) доработать модель для адаптации предметной области с целью на основе сводных данных. Другие предлагают цели перед тренировкой, которые можно аналогичным образом использовать во время точной настройки: Ram et al. (2021) предварительно обучили модель для обеспечения качества с помощью задачи выбора диапазона, в то время как Bansal et al. (2020) предварительно обучили модель обучению за несколько шагов, автоматически генерируя мультиклассовые задачи классификационного типа.

Различие между адаптивной и поведенческой тонкой настройкой побуждает нас учитывать индуктивные предубеждения, которые мы стремимся привить в нашей модели, и относятся ли они к свойствам области $ \ mathcal {D} $ или задаче $ \ mathcal {T} $ 900 16. Разделение роли предметной области и задачи важно, поскольку информацию о предметной области часто можно получить, используя ограниченные немаркированные данные (Ramponi and Plank, 2020), в то время как приобретение навыков понимания естественного языка высокого уровня с помощью существующих методов обычно требует миллиардов предварительных тренировок. образцы данных (Zhang et al., 2020).

Однако различие между задачей и предметной областью становится нечетким, когда мы формулируем задачи в терминах цели предварительного обучения. Достаточно общая задача предварительного обучения, такая как MLM, может предоставить полезную информацию для изучения $ P (Y | X) $, но, вероятно, не содержит всех сигналов, важных для задачи. Например, модели, предварительно обученные с помощью MLM, борются с отрицаниями моделирования, числами или именованными объектами (Rogers et al., 2020).

Точно так же использование увеличения данных запутывает роли $ \ mathcal {D} $ и $ \ mathcal {T} $, поскольку это позволяет нам кодировать желаемые возможности непосредственно в данных.Например, путем точной настройки модели текста, в которой гендерные слова заменяются словами противоположного пола, модель может быть более устойчивой к гендерным предубеждениям (Zhao et al., 2018; Zhao et al., 2019; Manela et al. др., 2021).

Точная настройка с эффективным использованием параметров

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

Первые подходы в этом направлении работы основаны на адаптерах (Rebuffi et al., 2017), небольших слоях узких мест, которые вставляются между слоями предварительно обученной модели (Houlsby et al., 2019; Stickland and Murray, 2019) с фиксированными параметрами. Адаптеры отображают общие настройки, такие как сохранение нескольких контрольных точек во время обучения, а также более продвинутые методы, такие как усреднение контрольных точек (Измайлов и др., 2018), ансамбль снимков (Huang et al., 2017) и темпоральный ансамбль (Laine and Aila, 2017) гораздо более экономичны. С помощью адаптеров универсальную модель можно эффективно адаптировать ко многим параметрам, например к различным языкам (Bapna and Firat, 2019). Pfeiffer et al. (2020) недавно продемонстрировали, что адаптеры являются модульными и могут быть объединены с помощью стекирования, что позволяет изучать специализированные представления изолированно. Это особенно полезно при работе с ранее обсужденными методами: адаптивно или поведенчески настроенный адаптер может быть оценен без какой-либо тонкой настройки конкретной задачи путем наложения обученного адаптера задач поверх него .Эту настройку можно увидеть ниже, где адаптер задач, обученный распознаванию именованных сущностей (NER), размещается на адаптере английского (слева) или языкового языка Quechua (справа).

Задача и языковые адаптеры, вставленные в блок Transformer в платформе MAD-X (Pfeiffer et al., 2020). Адаптеры изучают инкапсулированные представления и могут быть заменены друг другом, что обеспечивает передачу без выстрела.

В то время как адаптеры изменяют активации модели, не изменяя базовые параметры, другая линия работы напрямую изменяет предварительно обученные параметры.D $. Точно настроенные параметры являются результатом применения перестановок для конкретных задач к предварительно обученным параметрам:
\ begin {Equation}
\ theta _ {\ text {fine-tuned}} = \ theta _ {\ text {предварительно обучено }} + \ theta _ {\ text {задача}}
\ end {формула}

Вместо того, чтобы хранить копию $ \ theta _ {\ text {fine-tuned}} $ для каждой задачи, мы можем хранить одну копию $ \ theta _ {\ text {pre-training}} $ и копию $ \ theta _ {\ text {task}} $ для каждой задачи. Этот параметр будет дешевле, если мы сможем более эффективно параметризовать $ \ theta _ {\ text {task}} $.С этой целью Guo et al. (2020) изучите $ \ theta _ {\ text {task}} $ как разреженный вектор. Агаджанян и др. (2020) set $ \ theta _ {\ text {task}} = \ theta_ \ text {low} \ textbf {M} $, где $ \ theta_ \ text {low} $ — вектор низкой размерности, а $ \ textbf {M } $ — это случайная линейная проекция (в их случае преобразование FastFood (Li et al., 2018)).

В качестве альтернативы мы можем применить изменения только к подмножеству предварительно обученных параметров. Классический метод компьютерного зрения (Donahue et al., 2014) настраивает только последний слой модели.L)
\ end {split}
\ end {формула}

Хотя в НЛП это работает хуже (Howard & Ruder, 2018), существуют и другие подмножества параметров, более эффективные для точной настройки. Например, Ben-Zaken et al. (2020) достичь конкурентоспособных результатов только путем точной настройки параметров смещения модели.

Другая линия работы сокращает параметры предварительно обученной модели во время точной настройки. В таких методах используются разные критерии для отсечения весов, например, на основе информации нулевого или первого порядка о важности веса (Sanh et al., 2020). Поскольку существует ограниченная поддержка разреженных архитектур с текущим оборудованием, в настоящее время предпочтительны подходы, которые являются структурно разреженными, то есть где обновления сосредоточены в ограниченном наборе слоев, матриц или векторов. Например, было показано, что последние несколько слоев предварительно обученных моделей имеют ограниченное использование во время тонкой настройки и могут быть случайным образом повторно инициализированы (Tamkin et al., 2020; Zhang et al., 2021) или даже полностью удалены (Chung и др., 2021).

В то время как методы сокращения нацелены на уменьшение общего количества параметров моделей для конкретных задач, большинство других методов нацелены на уменьшение количества обучаемых параметров — при сохранении копии предварительно обученного $ \ theta _ {\ text { }} $.Самый последний из последних подходов обычно соответствует производительности полной тонкой настройки при обучении около 0,5% параметров модели для каждой задачи (Pfeiffer et al., 2020; Guo et al., 2020; Ben-Zaken et al., 2020 ).

Появляется все больше свидетельств того, что большие предварительно обученные языковые модели изучают представления, которые хорошо сжимают задачи НЛП (Li et al., 2018; Gordon et al., 2020; Aghajanyan et al., 2020). Это практическое доказательство в сочетании с удобством и доступностью (Pfeiffer et al., 2020), а также недавние эмпирические успехи делают эти методы многообещающими как для проведения экспериментов, так и для практических целей.

Тонкая настройка текста в текст

Еще одним достижением в трансферном обучении является переход от языковых моделей с масками, таких как BERT (Devlin et al., 2019) и RoBERTa (Liu et al., 2019), к авторегрессионным моделям язык, такой как T5 (Raffel et al., 2019) и GPT-3 (Brown et al., 2020). Хотя оба набора методов можно использовать для присвоения оценок правдоподобия тексту (Salazar et al., 2020), с авторегрессионными LM легче отобрать. Напротив, маскированные LM обычно ограничиваются настройками заполнения пустых полей, например (Петрони и др., 2019).

Стандартный способ использования маскированных LM для точной настройки — это заменить выходной слой, используемый для MLM, случайно инициализированной головкой для конкретной задачи, которая изучается в целевой задаче (Devlin et al., 2019). В качестве альтернативы, выходной слой предварительно обученной модели можно повторно использовать, преобразовав задачу как MLM в закрытый формат (Talmor et al., 2020; Шик и Шютце, 2021). Аналогично, авторегрессионные LM обычно переводят целевую задачу в текстовый формат (McCann et al., 2018; Raffel et al., 2020; Paolini et al., 2021). В обеих настройках модели могут извлечь выгоду из всех своих предварительно обученных знаний и им не нужно изучать какие-либо новые параметры с нуля, что повышает их эффективность выборки.

В крайнем случае, когда никакие параметры не настроены точно, постановка целевой задачи с точки зрения цели предварительного обучения позволяет обучаться с нулевым или малым выстрелом с использованием подсказки для конкретной задачи и небольшого количества примеров задачи (Браун и др., 2020). Однако, несмотря на то, что такое быстрое обучение возможно, это не самый эффективный способ использования таких моделей (Schick and Schütze, 2020; краткий обзор см. В этом сообщении). Для обучения без обновлений требуется огромная модель, поскольку модель должна полностью полагаться на существующие знания. Объем информации, доступной для модели, также ограничен ее контекстным окном, и подсказки, отображаемые для модели, должны быть тщательно спроектированы.

Расширение поиска (обзор см. В этом посте) можно использовать для разгрузки хранилища внешних знаний, а символические подходы могут использоваться для обучения правилам, специфичным для конкретной задачи модели, подобным (Awasthi et al., 2020). Предварительно обученные модели также станут больше и мощнее, и их можно будет настраивать с точки зрения поведения, чтобы они были хороши при настройке нулевого выстрела. Однако без точной настройки модель в конечном итоге будет ограничена в своей способности адаптироваться к новой задаче.

Следовательно, для большинства практических настроек, возможно, лучший путь вперед — это точная настройка всех или подмножества параметров модели с использованием методов, описанных в предыдущих разделах. Кроме того, мы все чаще будем видеть акцент на генеративных возможностях предварительно обученных моделей. В то время как современные методы обычно ориентированы на изменение ввода естественного языка модели, например, с помощью автоматического проектирования подсказок (Schick and Schütze, 2020; Gao et al., 2020; Shin et al., 2020), наиболее эффективный способ модуляции вывода такие модели, скорее всего, будут действовать непосредственно на свои скрытые представления (Dathathri et al., 2020; см. сообщение Лилиан Венг для обзора методов управляемой генерации).

Смягчение нестабильности тонкой настройки

Практическая проблема с точной настройкой предварительно обученных моделей заключается в том, что производительность может сильно различаться между разными прогонами, особенно на небольших наборах данных (Phang et al., 2018). Додж и др., 2020 обнаружили, что как инициализация весов выходного слоя, так и порядок обучающих данных вносят свой вклад в изменение производительности. Поскольку нестабильность обычно проявляется на ранних этапах тренировки, они рекомендуют останавливать наименее многообещающие пробежки на раннем этапе после 20-30% тренировки. Mosbach et al. (2021) дополнительно рекомендуют использовать небольшие скорости обучения и увеличивать количество эпох при тонкой настройке BERT.

Ряд недавних методов направлен на смягчение нестабильности во время точной настройки, полагаясь на состязательные подходы или подходы на основе доверительного региона (Zhu et al., 2019; Цзян и др., 2020; Агаджанян и др., 2021). Такие методы обычно увеличивают потерю точной настройки с помощью члена регуляризации, который ограничивает расхождение между этапами обновления.

В свете предыдущего раздела мы можем дать еще одну рекомендацию по минимизации нестабильности во время точной настройки: Избегайте использования случайно инициализированного выходного слоя в целевой задаче для небольших наборов данных, создав целевую задачу как форму LM или используйте поведенческие тонкая настройка для точной настройки выходного слоя перед точной настройкой для конкретной задачи. Хотя модели преобразования текста в текст, таким образом, более устойчивы к тонкой настройке на небольших наборах данных, они страдают от нестабильности в настройке с несколькими снимками и чувствительны к быстрым и кратковременным примерам (Zhao et al., 2021).

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

Цитирование

Для указания авторства в академическом контексте, пожалуйста, процитируйте эту работу как:

  @misc {ruder2021lmfine-tuning,
  author = {Рудер, Себастьян},
  title = {{Последние достижения в настройке языковой модели}},
  год = {2021},
  howpublished = {\ url {http: // ruder.io / latest-Advances-lm-fine-tuning}},
}  

Точная настройка предварительно обученных моделей НЛП с помощью Huggingface’s Trainer | Винсент Тан

Шаг 1: Инициализировать предварительно обученную модель и токенизатор

Пример набора данных, на котором основан код

В приведенном выше коде используемые данные представляют собой набор данных настроений фильмов IMDB. Эти данные позволяют нам обучить модель определять тональность обзора фильма: 1 положительный, а 0 — отрицательный. Это задача НЛП по классификации последовательностей, поскольку мы хотим классифицировать каждый обзор (последовательность текста) на положительный или отрицательный.

Существует множество предварительно обученных моделей, которые мы можем использовать для обучения нашей модели анализа настроений. Давайте воспользуемся предварительно обученным BERT в качестве примера. Существует множество вариантов предварительно обученной модели BERT, без корпуса — лишь один из вариантов. Вы можете найти более подготовленную модель для использования на странице Huggingface Models.

 model_name = "bert-base-uncased" 
tokenizer = BertTokenizer.from_pretrained (model_name)
model = BertForSequenceClassification.from_pretrained (model_name, num_labels = 2)

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

Теперь, когда модель и токенизатор инициализированы, мы можем приступить к предварительной обработке данных.

Шаг 2: Предварительная обработка текста с использованием предварительно обученного токенизатора

 X_train_tokenized = tokenizer (X_train, padding = True, truncation = True, max_length = 512) 
X_val_tokenized = tokenizer (X_val, padding = True, truncation = 512, )

Давайте предварительно обработаем текст с помощью инициализированного ранее токенизатора.

Входной текст, который мы используем для токенизатора, представляет собой список строк.

Мы установили padding = True, truncation = True, max_length = 512 , чтобы мы могли получить входные данные одинаковой длины для модели — длинные тексты будут усечены до 512 токенов, в то время как короткие тексты будут иметь дополнительные токены, добавленные для создания это 512 токенов.

512 токенов используется, потому что это максимальная длина токена, которую может принять модель BERT.

После токенизации текста вы получите словарь Python с 3 ключами:

  1. Input_ids
  2. token_type_ids
  3. Внимание_mask

Шаг 3: Создание набора данных torch

Для Trainer API требуется, чтобы модель была в резак .utils.data.Dataset класс. Следовательно, нам нужно будет создать новый класс, унаследованный от класса набора данных torch.

В унаследованном классе нам нужны методы __getitem__ и __len__ , которые позволяют трейнеру создавать пакеты данных и получать длину соответственно.

 class Dataset (torch.utils.data.Dataset): 
def __init __ (self, encodings, labels = None):
self.encodings = encodings
self.label = labels

def __getitem __ (self, idx):
item = {key: torch.tensor (val [idx]) для ключа, val в self.encodings.items ()}
если self.labels:
item [" label "] = torch.tensor (self.labels [idx])
return item

def __len __ (self):
return len (self.encodings [" input_ids "]) train_dataset = Набор данных (X_train_tokenized, y_train)
val_dataset = Набор данных (X_val_tokenized, y_val)

Цель установки параметра меток по умолчанию как None состоит в том, чтобы мы могли повторно использовать класс для прогнозирования невидимых данных, поскольку эти данные не имеют меток.

Метод __getitem__ в основном возвращает словарь значений для каждого текста. Запустив метод, он создает словарь с input_ids , Внимание_mask и token_type_ids для каждого текста, когда данные группируются во время процесса обучения.

Метод __len__ должен возвращать длину входных данных.

Шаг 4: Определение аргументов обучения и средства обучения

 def compute_metrics (p): 
pred, labels = p
pred = np.argmax (пред, ось = 1)
точность = оценка точности (y_true = метки, y_pred = прогноз)
отзыв = оценка_ отзыва (y_true = метки, y_pred = прогноз)
точность = оценка точности (y_true = метки, y_pred = прогноз)
f1 = f1_score (y_true = labels, y_pred = pred) return {"precision": precision, "precision": precision, "вспомнить": вспомнить, "f1": f1} # Define Trainer
args = TrainingArguments (
output_dir = "output" ,
eval_strategy = "steps",
eval_steps = 500,
per_device_train_batch_size = 8,
per_device_eval_batch_size = 8,
num_train_epochs = 3,
seed = 0,
load_best_model_at_end =
model =
model =
model =
trainer args = args,
train_dataset = train_dataset,
eval_dataset = val_dataset,
compute_metrics = compute_metrics,
callbacks = [EarlyStoppingCallback (early_stopping_patience = 3)],)

# Обучить предварительно обученного тренера модели
.train ()

Вот где волшебство функции Trainer. Мы можем определить параметры обучения в классе TrainingArguments и Trainer, а также обучить модель с помощью одной команды.

Нам нужно сначала определить функцию для вычисления показателей набора проверки. Поскольку это проблема двоичной классификации, мы можем использовать точность, точность, отзыв и оценку f1.

Затем мы указываем некоторые параметры обучения, устанавливаем предварительно обученную модель, обучающие данные и данные оценки в классе TrainingArgs и Trainer.

После того, как мы определили параметры, просто запустите trainer.train () для обучения модели.

Пример того, как выглядит обучение с помощью Trainer

Шаг 5: Создание прогноза

 # Токенизация тестовых данных 
X_test_tokenized = tokenizer (X_test, padding = True, truncation = True, max_length = 512) # Создание набора данных torch
test_dataset = Dataset (X_test_tokenized) # Загрузить обученную модель
model_path = "output / checkpoint-50000"
model = BertForSequenceClassification.from_pretrained (model_path, num_labels = 2) # Определить тестовый тренер
test_trainer = Trainer (model) # Сделать прогноз
raw_pred, _, _ = test_trainer.predict (test_dataset) # Предварительно обработать исходные прогнозы
y_pred = np.argmax (raw_pred = np.argmax (raw_pred) 1)

После обучения модели мы повторяем те же шаги для тестовых данных:

  1. Токенизация тестовых данных с предварительно обученным токенизатором
  2. Создать набор данных torch
  3. Загрузить обученную модель
  4. Define Trainer

Чтобы загрузить обученный model из предыдущих шагов, установите model_path равным пути, содержащему веса обученной модели.

Чтобы сделать прогноз, нужна всего одна команда test_trainer.predict (test_dataset) .

Сделав прогноз, вы получите только исходный прогноз. Чтобы преобразовать его в пригодный для использования формат, потребуются дополнительные шаги предварительной обработки.

Поскольку задача представляет собой простую задачу классификации последовательности, мы можем просто получить argmax по оси 1. Обратите внимание, что для других задач NLP могут потребоваться другие способы предварительной обработки необработанных прогнозов.

Тонкая настройка модели BERT | Текст | TensorFlow

В этом примере мы проработаем тонкую настройку модели BERT с помощью пакета PIP tensorflow-models.

Предварительно обученная модель BERT, на которой основано это руководство, также доступна на TensorFlow Hub, чтобы узнать, как ее использовать, см. Приложение

Hub.

Установка

Установите пакет пипсов для сада модели TensorFlow

  • tf-models-official — это стабильный пакет Model Garden. Обратите внимание, что он может не включать последние изменения в репозитории github tensorflow_models . Чтобы включить последние изменения, вы можете установить tf-models-nightly , который представляет собой ночной пакет Model Garden, который создается ежедневно автоматически.
  • pip установит все модели и зависимости автоматически.
  pip install -q -U tenorflow-text 
 
  pip install -q tf-models-official == 2.4.0 
 

Импорт

  импорт ОС

импортировать numpy как np
импортировать matplotlib.pyplot как plt

импортировать тензорный поток как tf

импортировать tensorflow_hub как концентратор
импортировать tenorflow_datasets как tfds
tfds.disable_progress_bar ()

from official.modeling import tf_utils
из официального импорта nlp
от официала.nlp import bert

# Загрузить необходимые подмодули
импорт official.nlp.optimization
импортировать official.nlp.bert.bert_models
импортировать official.nlp.bert.configs
импортировать official.nlp.bert.run_classifier
импорт official.nlp.bert.tokenization
импортировать official.nlp.data.classifier_data_lib
импорт official.nlp.modeling.losses
импортировать official.nlp.modeling.models
импортировать official.nlp.modeling.networks
  
/tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow_addons/utils/ensure_tf_install.py:67: UserWarning & двоеточие; Tensorflow Addons поддерживает использование Python ops для всех версий Tensorflow выше или равных 2.3.0 и строго ниже 2.6.0 (ночные версии не поддерживаются).
 В настоящее время вы используете версию TensorFlow 2.6.0, которая не поддерживается.
Некоторые вещи могут работать, некоторые нет.
Если вы столкнулись с ошибкой, не сообщайте о проблеме.
Если вы хотите убедиться, что используете протестированную и поддерживаемую конфигурацию, измените версию TensorFlow или версию TensorFlow Addons.
Матрицу совместимости можно найти в файле Readme & Colon;
https & col; // github.com / tensorflow / addons
  UserWarning,
 

ресурсов

Этот каталог содержит конфигурацию, словарь и предварительно обученную контрольную точку, используемую в этом руководстве:

  gs_folder_bert = "gs: // cloud-tpu-checkpoints / bert / v3 / uncased_L-12_H-768_A-12"
tf.io.gfile.listdir (gs_folder_bert)
  
['bert_config.json',
 'bert_model.ckpt.data-00000-из-00001',
 'bert_model.ckpt.index',
 'voiceab.txt']
 

Вы можете получить предварительно обученный кодировщик BERT в TensorFlow Hub:

  hub_url_bert = "https: // tfhub.dev / tensorflow / bert_en_uncased_L-12_H-768_A-12/3 "
  

Данные

В этом примере мы использовали набор данных GLUE MRPC из TFDS.

Этот набор данных не настроен таким образом, чтобы его можно было напрямую вводить в модель BERT, поэтому в этом разделе также выполняется необходимая предварительная обработка.

Получить набор данных из наборов данных TensorFlow

The Microsoft Research Paraphrase Corpus (Dolan & Brockett, 2005) — это корпус пар предложений, автоматически извлекаемых из сетевых источников новостей, с человеческими комментариями о том, являются ли предложения в паре семантически эквивалентными.

  • Количество этикеток: 2.
  • Размер обучающего набора: 3668.
  • Размер набора оценочных данных: 408.
  • Максимальная длина последовательности набора данных для обучения и оценки: 128.
  клей, info = tfds.load ('glue / mrpc', with_info = True,
                       # Он маленький, загружаем весь набор данных
                       batch_size = -1)
  
ПРЕДУПРЕЖДЕНИЕ & двоеточие; тензорный поток & двоеточие; Из /home/kbuilder/.local/lib/python3.7/site-packages/tensorflow_datasets/core/dataset_builder.py & двоеточие; 622 & двоеточие; get_single_element (из tensorflow.python.data.experimental.ops.get_single_element) устарел и будет удален в будущей версии.
Инструкции по обновлению & двоеточие;
Используйте tf.data.Dataset.get_single_element ().
2021-08-19 11 & двоеточие; 26 & двоеточие; 56.046711 & двоеточие; I tensorflow / stream_executor / cuda / cuda_gpu_executor.cc & двоеточие; 937] успешное чтение узла NUMA из SysFS имело отрицательное значение (-1), но должен быть хотя бы один узел NUMA, поэтому узел NUMA возвращается ноль
2021-08-19 11 & двоеточие; 26 & двоеточие; 56.055242 & двоеточие; I tensorflow / stream_executor / cuda / cuda_gpu_executor.cc & двоеточие; 937] успешное чтение узла NUMA из SysFS имело отрицательное значение (-1), но должен быть хотя бы один узел NUMA, поэтому узел NUMA возвращается ноль
2021-08-19 11 & двоеточие; 26 & двоеточие; 56.056228 & двоеточие; I tensorflow / stream_executor / cuda / cuda_gpu_executor.cc & двоеточие; 937] успешное чтение узла NUMA из SysFS имело отрицательное значение (-1), но должен быть хотя бы один узел NUMA, поэтому узел NUMA возвращается ноль
2021-08-19 11 & двоеточие; 26 & двоеточие; 56.057937 & двоеточие; I tensorflow / core / platform / cpu_feature_guard.cc & Colon; 142] Этот двоичный файл TensorFlow оптимизирован с помощью библиотеки глубокой нейронной сети oneAPI (oneDNN) для использования следующих инструкций ЦП в критических для производительности операциях & двоеточие; AVX2 AVX512F FMA
Чтобы включить их в других операциях, перестройте TensorFlow с соответствующими флагами компилятора.
2021-08-19 11 & двоеточие; 26 & двоеточие; 56.058570 & двоеточие; I tensorflow / stream_executor / cuda / cuda_gpu_executor.cc & двоеточие; 937] успешное чтение узла NUMA из SysFS имело отрицательное значение (-1), но должен быть хотя бы один узел NUMA, поэтому узел NUMA возвращается ноль
2021-08-19 11 & двоеточие; 26 & двоеточие; 56.059629 & двоеточие; I tensorflow / stream_executor / cuda / cuda_gpu_executor.cc & двоеточие; 937] успешное чтение узла NUMA из SysFS имело отрицательное значение (-1), но должен быть хотя бы один узел NUMA, поэтому узел NUMA возвращается ноль
2021-08-19 11 & двоеточие; 26 & двоеточие; 56.060526 & двоеточие; I tensorflow / stream_executor / cuda / cuda_gpu_executor.cc & двоеточие; 937] успешное чтение узла NUMA из SysFS имело отрицательное значение (-1), но должен быть хотя бы один узел NUMA, поэтому узел NUMA возвращается ноль
2021-08-19 11 & двоеточие; 26 & двоеточие; 56.661471 & двоеточие; I tensorflow / stream_executor / cuda / cuda_gpu_executor.cc & двоеточие; 937] успешное чтение узла NUMA из SysFS имело отрицательное значение (-1), но должен быть хотя бы один узел NUMA, поэтому узел NUMA возвращается ноль
2021-08-19 11 & двоеточие; 26 & двоеточие; 56.662451 & двоеточие; I tensorflow / stream_executor / cuda / cuda_gpu_executor.cc & двоеточие; 937] успешное чтение узла NUMA из SysFS имело отрицательное значение (-1), но должен быть хотя бы один узел NUMA, поэтому узел NUMA возвращается ноль
2021-08-19 11 & двоеточие; 26 & двоеточие; 56.663279 & двоеточие; I tensorflow / stream_executor / cuda / cuda_gpu_executor.cc & двоеточие; 937] успешное чтение узла NUMA из SysFS имело отрицательное значение (-1), но должен быть хотя бы один узел NUMA, поэтому узел NUMA возвращается ноль
2021-08-19 11 & двоеточие; 26 & двоеточие; 56.664195 & двоеточие; I tensorflow / core / common_runtime / gpu / gpu_device.cc & col; 1510] Создано устройство / задание & двоеточие; localhost / replica & двоеточие; 0 / задача & двоеточие; 0 / устройство & двоеточие; GPU & двоеточие; 0 с памятью 14648 МБ и двоеточием; -> устройство и двоеточие; 0, имя & двоеточие; Tesla V100-SXM2-16GB, идентификатор шины pci и двоеточие; 0000 & двоеточие; 00 & двоеточие; 05.0, вычислительные возможности и двоеточие; 7.0
ПРЕДУПРЕЖДЕНИЕ & двоеточие; тензорный поток & двоеточие; Из /home/kbuilder/.local/lib/python3.7/site-packages/tensorflow_datasets/core/dataset_builder.py:622: get_single_element (из tensorflow.python.data.experimental.ops.get_single_element) устарел и будет удален в будущей версии.
Инструкции по обновлению & двоеточие;
Используйте tf.data.Dataset.get_single_element ().
2021-08-19 11 & двоеточие; 26 & двоеточие; 57.012380 & двоеточие; Я tenorflow / compiler / mlir / mlir_graph_optimization_pass.cc & col; 185] Ни один из проходов оптимизации MLIR не включен (зарегистрировано 2)
 
  список (glue.keys ())
  
['поезд', 'проверка', 'тест']
 

Объект info описывает набор данных и его особенности:

  info.features
  
FeaturesDict ({
    'idx' и двоеточие; tf.int32,
    'метка' и двоеточие; ClassLabel (shape = (), dtype = tf.int64, num_classes = 2),
    "предложение1" и двоеточие; Текст (shape = (), dtype = tf.string),
    'предложение2' и двоеточие; Текст (shape = (), dtype = tf.нить),
})
 

Два класса:

  info.features ['label']. Names
  
['not_equivalent', 'эквивалент']
 

Вот один пример из обучающей выборки:

  glue_train = клей ['поезд']

для ключа значение в glue_train.items ():
  print (f "{ключ: 9s}: {значение [0] .numpy ()}")
  
idx & двоеточие; 1680
метка & двоеточие; 0
предложение1 & двоеточие; b'Эти же вездеходы будут действовать как геологи-роботы, ища доказательства наличия воды в прошлом.'
предложение2 & двоеточие; b 'Марсоходы действуют как геологи-роботы, передвигаясь на шести колесах'.
 

Токенизатор BERT

Для точной настройки предварительно обученной модели необходимо убедиться, что вы используете точно такие же токенизацию, словарь и сопоставление индексов, которые вы использовали во время обучения.

Токенизатор BERT, используемый в этом руководстве, написан на чистом Python (он не построен на основе операций TensorFlow). Таким образом, вы не можете просто подключить его к своей модели как keras.layer , как вы можете с предварительной обработкой .ТекстВекторизация .

Следующий код восстанавливает токенизатор, который использовался базовой моделью:

  # Настроить токенизатор для создания набора данных Tensorflow
tokenizer = bert.tokenization.FullTokenizer (
    Vocab_file = os.path.join (gs_folder_bert, "vocab.txt"),
     do_lower_case = True)

print ("Размер словаря:", len (tokenizer.vocab))
  
Размер словаря и двоеточие; 30522
 

Обозначить предложение:

  tokens = tokenizer.tokenize («Привет, TensorFlow!»)
печать (токены)
ids = токенизатор.convert_tokens_to_ids (токены)
печать (идентификаторы)
  
['привет', 'тензор', '## поток', '!']
[7592, 23435, 12314, 999]
 

Предварительная обработка данных

Раздел вручную предварительно обработал набор данных в формате, ожидаемом моделью.

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

Кодировать предложения

Модель ожидает, что два входных предложения будут объединены вместе. Ожидается, что этот ввод будет начинаться с токена [CLS] «Это проблема классификации», и каждое предложение должно заканчиваться токеном [SEP] «Разделитель»:

  tokenizer.convert_tokens_to_ids (['[CLS]', '[SEP]'])
  
[101, 102]
 

Начните с кодирования всех предложений, добавляя токен [SEP] и упаковывая их в рваные тензоры:

  def encode_sentence (s):
   tokens = list (tokenizer.токенизировать (s.numpy ()))
   tokens.append ('[SEP]')
   вернуть tokenizer.convert_tokens_to_ids (токены)

предложение1 = tf.ragged.constant ([
    encode_sentence (s) для s в glue_train ["предложение1"]])
предложение2 = tf.ragged.constant ([
    encode_sentence (s) для s в glue_train ["предложение2"]])
  
  print ("Форма предложения1:", предложение1.shape.as_list ())
print ("Форма предложения2:", предложение2.shape.as_list ())
  
Sentence1 форма и двоеточие; [3668, Нет]
Предложение2 форма и двоеточие; [3668, Нет]
 

Теперь добавьте токен [CLS] и объедините рваные тензоры, чтобы сформировать один тензор input_word_ids для каждого примера. RaggedTensor.to_tensor () устанавливает нулевое значение в самую длинную последовательность.

  cls = [tokenizer.convert_tokens_to_ids (['[CLS]'])] * предложение1.shape [0]
input_word_ids = tf.concat ([cls, предложение1, предложение2], ось = -1)
_ = plt.pcolormesh (input_word_ids.to_tensor ())
  

Маска и тип ввода

Модель предполагает два дополнительных входа:

  • Маска ввода
  • Тип ввода

Маска позволяет модели четко различать контент и отступы.Маска имеет ту же форму, что и input_word_ids , и содержит 1 везде, где input_word_ids не является заполнителем.

  input_mask = tf.ones_like (input_word_ids) .to_tensor ()

plt.pcolormesh (input_mask)
  

 

«Тип ввода» также имеет ту же форму, но внутри области без дополнений содержит 0 или 1 , указывающие, частью какого предложения является токен.

  type_cls = tf.zeros_like (cls)
type_s1 = tf.zeros_like (предложение1)
type_s2 = tf.ones_like (предложение2)
input_type_ids = tf.concat ([type_cls, type_s1, type_s2], axis = -1) .to_tensor ()

plt.pcolormesh (input_type_ids)
  

 

Собери все вместе

Соберите приведенный выше код синтаксического анализа текста в одну функцию и примените его к каждому разделению набора данных glue / mrpc .

  def encode_sentence (s, токенизатор):
   токены = список (tokenizer.tokenize (s))
   tokens.append ('[SEP]')
   вернуть tokenizer.convert_tokens_to_ids (токены)

def bert_encode (glue_dict, токенизатор):
  num_examples = len (glue_dict ["предложение1"])

  предложение1 = tf.ragged.constant ([
      encode_sentence (s, токенизатор)
      для s в np.array (glue_dict ["предложение1"])])
  предложение2 = tf.ragged.constant ([
      encode_sentence (s, токенизатор)
       для s в np.array (glue_dict ["предложение2"])])

  cls = [токенизатор.convert_tokens_to_ids (['[CLS]'])] * предложение1.shape [0]
  input_word_ids = tf.concat ([cls, предложение1, предложение2], ось = -1)

  input_mask = tf.ones_like (input_word_ids) .to_tensor ()

  type_cls = tf.zeros_like (cls)
  type_s1 = tf.zeros_like (предложение1)
  type_s2 = tf.ones_like (предложение2)
  input_type_ids = tf.concat (
      [type_cls, type_s1, type_s2], axis = -1) .to_tensor ()

  input = {
      'input_word_ids': input_word_ids.to_tensor (),
      'input_mask': input_mask,
      'input_type_ids': input_type_ids}

  возврат входов
  
  glue_train = bert_encode (клей ['поезд'], токенизатор)
glue_train_labels = клей ['поезд'] ['ярлык']

glue_validation = bert_encode (клей ['проверка'], токенизатор)
glue_validation_labels = клей ['проверка'] ['метка']

glue_test = bert_encode (клей ['тест'], токенизатор)
glue_test_labels = клей ['тест'] ['метка']
  

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

  для ключа, значение в glue_train.items ():
  print (f '{key: 15s} shape: {value.shape}')

печать (f'glue_train_labels shape: {glue_train_labels.shape} ')
  
input_word_ids форма и двоеточие; (3668, 103)
input_mask форма и двоеточие; (3668, 103)
input_type_ids форма и двоеточие; (3668, 103)
glue_train_labels форма и двоеточие; (3668,)
 

Модель

Постройте модель

Первым шагом является загрузка конфигурации для предварительно обученной модели.

  импорт json

bert_config_file = os.path.join (gs_folder_bert, "bert_config.json")
config_dict = json.loads (tf.io.gfile.GFile (bert_config_file) .read ())

bert_config = bert.configs.BertConfig.from_dict (config_dict)

config_dict
  
{'Внимание_probs_dropout_prob' & двоеточие; 0,1,
 "скрытый_акт" и двоеточие; 'гелу',
 'hidden_dropout_prob' и двоеточие; 0,1,
 "скрытый_размер" и двоеточие; 768, г.
 "диапазон_инициализатора" и двоеточие; 0,02,
 'промежуточный_размер' и двоеточие; 3072, г.
 'max_position_embeddings' и двоеточие; 512,
 'num_attention_heads' и двоеточие; 12,
 'num_hidden_layers' & двоеточие; 12,
 'type_vocab_size' и двоеточие; 2,
 "словарь_размер" и двоеточие; 30522}
 

Конфигурация определяет базовую модель BERT, которая является моделью Keras для прогнозирования выходных данных num_classes из входов с максимальной длиной последовательности max_seq_length .

Эта функция возвращает кодировщик и классификатор.

  bert_classifier, bert_encoder = bert.bert_models.classifier_model (
    bert_config, num_labels = 2)
  

Классификатор имеет три входа и один выход:

  tf.keras.utils.plot_model (bert_classifier, show_shapes = True, dpi = 48)
  

Запустите его на тестовом пакете данных 10 примеров из обучающего набора. На выходе будут логиты для двух классов:

.
  glue_batch = {ключ: значение [: 10] для ключа, значение в glue_train.Предметы()}

bert_classifier (
    glue_batch, training = True
) .numpy ()
  
массив ([[- 0,2307785, 0,144

], [-0,09524915, 0,1295139], [-0,14503807, 0,185], [-0,2493319, 0,29745924], [-0,25108814, -0,09775029], [-0,02554443, -0,07443134], [-0,34417343, 0,00068308], [-0,13155738, 0,10524555], [-0,39608416, -0,14741066], [-0.2702508, -0.02493864]], dtype = float32)

TransformerEncoder в центре классификатора выше - это bert_encoder .

Осматривая энкодер, мы видим его стек из слоев Transformer , подключенных к тем же трем входам:

  tf.keras.utils.plot_model (bert_encoder, show_shapes = True, dpi = 48)
  

Восстановление веса энкодера

При построении кодировщик инициализируется случайным образом. Восстановить веса энкодера с КПП:

  контрольная точка = tf.train.Checkpoint (encoder = bert_encoder)
checkpoint.read (
    os.path.присоединиться (gs_folder_bert, 'bert_model.ckpt')). assert_consumed ()
  

 
Примечание. Предварительно обученный TransformerEncoder также доступен на TensorFlow Hub. См. Подробности в приложении Hub.

Настроить оптимизатор

BERT использует оптимизатор Adam с уменьшением веса (также известный как AdamW). Он также использует график скорости обучения, который сначала нагревается от 0, а затем спадает до 0.

  # Настроить эпохи и шаги
эпох = 3
batch_size = 32
eval_batch_size = 32

train_data_size = len (glue_train_labels)
steps_per_epoch = int (размер_поездки / размер_пакета)
num_train_steps = steps_per_epoch * эпох
Warmup_steps = int (эпохи * размер_поездки * 0,1 / размер_пакета)

# создает оптимизатор с расписанием скорости обучения
optimizer = nlp.optimization.create_optimizer (
    2e-5, num_train_steps = num_train_steps, num_warmup_steps = Warmup_steps)
  

Это возвращает оптимизатор AdamWeightDecay с установленным расписанием скорости обучения:

Тип
  (оптимизатор)
  
официальный.nlp.optimization.AdamWeightDecay
 

Чтобы увидеть пример того, как настроить оптимизатор и его расписание, см. Приложение «Расписание оптимизатора».

Обучаем модель

Показателем является точность, и мы используем разреженную категориальную кросс-энтропию в качестве потерь.

  metrics = [tf.keras.metrics.SparseCategoricalAccuracy ('precision', dtype = tf.float32)]
loss = tf.keras.losses.SparseCategoricalCrossentropy (from_logits = True)

bert_classifier.compile (
    optimizer = оптимизатор,
    потеря = потеря,
    метрики = метрики)

bert_classifier.соответствовать(
      glue_train, glue_train_labels,
      validation_data = (glue_validation, glue_validation_labels),
      batch_size = 32,
      эпохи = эпохи)
  
Эпоха 1/3
115/115 [==============================] - 38 с 222 мс / шаг - потеря и двоеточие; 0.6067 - точность и двоеточие; 0.6737 - val_loss и двоеточие; 0.5166 - val_accuracy & двоеточие; 0,7574
Эпоха 2/3
115/115 [==============================] - 24 с 211 мс / шаг - потеря и двоеточие; 0,4362 - точность и двоеточие; 0.8062 - val_loss & двоеточие; 0.3850 - val_accuracy & двоеточие; 0,8137
Эпоха 3/3
115/115 [==============================] - 24 с 211 мс / шаг - потеря и двоеточие; 0,2994 - точность и двоеточие; 0.8912 - val_loss и двоеточие; 0,3774 - val_accuracy & двоеточие; 0,8309

 

Теперь запустите настроенную модель на пользовательском примере, чтобы убедиться, что она работает.

Начните с кодирования пар предложений:

  my_examples = bert_encode (
    glue_dict = {
        'предложение1': [
            «Дождь в Испании падает в основном на равнину.',
            'Послушайте, я отлично настроил BERT.'],
        'предложение2': [
            'На равнинах Испании в основном идут дожди.',
            'Работает? Это не совпадает. ']
    },
    tokenizer = токенизатор)
  

Модель должна сообщать, что класс 1 "соответствует" для первого примера и класс 0 "не соответствует" для второго:

  результат = bert_classifier (my_examples, training = False)

результат = tf.argmax (результат) .numpy ()
результат
  
массив ([1, 0])
 
  нп.массив (info.features ['метка']. имена) [результат]
  
array (['эквивалент', 'не_эквивалент'], dtype = '

 

Сохраните модель

Часто цель обучения модели состоит в том, чтобы использовать для чего-то, поэтому экспортируйте модель, а затем восстановите ее, чтобы убедиться, что она работает.

  export_dir = '. / Saved_model'
tf.saved_model.save (bert_classifier, export_dir = export_dir)
  
2021-08-19 11 & двоеточие; 30 & двоеточие; 12.946332 & двоеточие; W tenorflow / python / util / util.cc & col; 348] Наборы в настоящее время не считаются последовательностями, но это может измениться в будущем, поэтому рекомендуется избегать их использования.
ПРЕДУПРЕЖДЕНИЕ & двоеточие; absl & двоеточие; Обнаружены неотслеживаемые функции, такие как self_attention_layer_call_fn, self_attention_layer_call_and_return_conditional_losses, dropout_layer_call_fn, dropout_layer_call_and_return_conditional_losses, self_attention_layer_normal_losses Эти функции нельзя будет вызывать напрямую после загрузки.
ИНФОРМАЦИЯ & двоеточие; тензорный поток & двоеточие; Ресурсы, записанные в & двоеточие; ./ сохраненная_модель / активы
ИНФОРМАЦИЯ & двоеточие; тензорный поток & двоеточие; Ресурсы, записанные в & двоеточие; ./saved_model/assets
 
  reloaded = tf.saved_model.load (каталог_экспорта)
reloaded_result = reloaded ([my_examples ['input_word_ids'],
                            my_examples ['input_mask'],
                            my_examples ['input_type_ids']], обучение = False)

original_result = bert_classifier (my_examples, обучение = False)

# Результаты (почти) идентичны:
печать (original_result.numpy ())
Распечатать()
печать (reloaded_result.numpy ())
  
[[-1.1162528 1.014004]
 [0,9412503 -0,72278297]]

[[-1.1162527 1.0140039]
 [0,94125 -0,7227829]]
 

Приложение

Перекодирование большого набора данных

В этом руководстве для наглядности вы перекодировали набор данных в памяти.

Это было возможно только потому, что glue / mrpc - очень маленький набор данных. Для работы с большими наборами данных tf_models библиотека включает некоторые инструменты для обработки и перекодирования набора данных для эффективного обучения.

Первый шаг - описать, какие функции набора данных следует преобразовать:

  процессор = nlp.data.classifier_data_lib.TfdsProcessor (
    tfds_params = "набор данных = клей / mrpc, text_key = предложение1, text_b_key = предложение2",
    process_text_fn = bert.tokenization.convert_to_unicode)
  

Затем примените преобразование для создания новых файлов TFRecord.

  # Настроить вывод набора данных обучения и оценки Tensorflow
train_data_output_path = "./mrpc_train.tf_record "
eval_data_output_path = "./ mrpc_eval.tf_record"

max_seq_length = 128
batch_size = 32
eval_batch_size = 32

# Сгенерировать и сохранить данные обучения в файл записи tf
input_meta_data = (
    nlp.data.classifier_data_lib.generate_tf_record_from_data_file (
      процессор = процессор,
      data_dir = None, # Это `None`, потому что данные взяты из tfds, а не из локального каталога.
      tokenizer = токенизатор,
      train_data_output_path = train_data_output_path,
      eval_data_output_path = eval_data_output_path,
      max_seq_length = max_seq_length))
  

Наконец создайте tf.data входные конвейеры из этих файлов TFRecord:

  training_dataset = bert.run_classifier.get_dataset_fn (
    train_data_output_path,
    max_seq_length,
    размер партии,
    is_training = True) ()

оценка_dataset = bert.run_classifier.get_dataset_fn (
    eval_data_output_path,
    max_seq_length,
    eval_batch_size,
    is_training = Ложь) ()
  

Результирующие tf.data.Datasets возвращают (функции, метки) пар, как и ожидалось keras.Model.fit :

  training_dataset.element_spec
  
({'input_word_ids' & двоеточие; TensorSpec (shape = (32, 128), dtype = tf.int32, name = None),
  'input_mask' & двоеточие; TensorSpec (shape = (32, 128), dtype = tf.int32, name = None),
  'input_type_ids' & двоеточие; TensorSpec (shape = (32, 128), dtype = tf.int32, name = None)},
 TensorSpec (shape = (32,), dtype = tf.int32, name = None))
 
Создать tf.data.Dataset для обучения и оценки

Если вам нужно изменить загрузку данных, вот какой-то код для начала:

  def create_classifier_dataset (file_path, seq_length, batch_size, is_training):
  "" "Создает набор входных данных из файлов (tf) записей для train / eval."" "
  набор данных = tf.data.TFRecordDataset (путь к файлу)
  если is_training:
    набор данных = набор данных.shuffle (100)
    набор данных = набор данных.repeat ()

  def decode_record (запись):
    name_to_features = {
      'input_ids': tf.io.FixedLenFeature ([seq_length], tf.int64),
      'input_mask': tf.io.FixedLenFeature ([seq_length], tf.int64),
      'segment_ids': tf.io.FixedLenFeature ([seq_length], tf.int64),
      'label_ids': tf.io.FixedLenFeature ([], tf.int64),
    }
    вернуть tf.io.parse_single_example (запись, name_to_features)

  def _select_data_from_record (запись):
    x = {
        'input_word_ids': запись ['input_ids'],
        'input_mask': запись ['input_mask'],
        'input_type_ids': запись ['segment_ids']
    }
    y = запись ['label_ids']
    возврат (x, y)

  набор данных = набор данных.карта (decode_record,
                        num_parallel_calls = tf.data.AUTOTUNE)
  набор данных = набор данных. карта (
      _select_data_from_record,
      num_parallel_calls = tf.data.AUTOTUNE)
  набор данных = набор данных.batch (размер_пакета, drop_remainder = is_training)
  набор данных = набор данных.prefetch (tf.data.AUTOTUNE)
  вернуть набор данных
  
  # Настройка размеров партии
batch_size = 32
eval_batch_size = 32

# Вернуть набор данных Tensorflow
training_dataset = create_classifier_dataset (
    train_data_output_path,
    input_meta_data ['max_seq_length'],
    размер партии,
    is_training = True)

оценка_данных = создать_классификатор_данных (
    eval_data_output_path,
    input_meta_data ['max_seq_length'],
    eval_batch_size,
    is_training = Ложь)
  
  training_dataset.element_spec
  
({'input_word_ids' & двоеточие; TensorSpec (shape = (32, 128), dtype = tf.int64, name = None),
  'input_mask' & двоеточие; TensorSpec (shape = (32, 128), dtype = tf.int64, name = None),
  'input_type_ids' & двоеточие; TensorSpec (shape = (32, 128), dtype = tf.int64, name = None)},
 TensorSpec (shape = (32,), dtype = tf.int64, name = None))
 

TFModels BERT на TFHub

Вы можете получить модель BERT с полки на TFHub. Нетрудно добавить классификационную головку поверх этого концентратора .KerasLayer

  # Примечание: загрузка 350 МБ.
импортировать tensorflow_hub как концентратор
  

Код переключения

  hub_model_name = "bert_en_uncased_L-12_H-768_A-12"
  
  hub_encoder = hub.KerasLayer (f "https://tfhub.dev/tensorflow/{hub_model_name}/3",
                             trainable = True)

print (f "У кодировщика концентратора есть {len (hub_encoder.trainable_variables)} обучаемые переменные")
  
Энкодер Hub имеет 199 обучаемых переменных.
 

Тестовый запуск на пакете данных:

  результат = hub_encoder (
    входы = dict (
        input_word_ids = glue_train ['input_word_ids'] [: 10],
        input_mask = glue_train ['input_mask'] [: 10],
        input_type_ids = glue_train ['input_type_ids'] [: 10],),
    обучение = Ложь,
)

print ("Форма вывода пула:", результат ['pooled_output'].форма)
print ("Форма вывода последовательности:", результат ['sequence_output']. shape)
  
Форма вывода пула и двоеточие; (10, 768)
Форма вывода последовательности & двоеточие; (10, 103, 768)
 

На этом этапе было бы просто добавить классификационную головку самостоятельно.

Функция bert_models.classifier_model также может создавать классификатор на кодировщике из TensorFlow Hub:

  hub_classifier = nlp.modeling.models.BertClassifier (
    bert_encoder,
    num_classes = 2,
    dropout_rate = 0.1,
    инициализатор = tf.keras.initializers.TruncatedNormal (
        stddev = 0,02))
  

Обратной стороной загрузки этой модели из TFHub является то, что структура внутренних слоев keras не восстанавливается. Так что проверить или изменить модель сложнее. Модель BertEncoder теперь однослойная:

  tf.keras.utils.plot_model (hub_classifier, show_shapes = True, dpi = 64)
  

  попробуйте:
  tf.keras.utils.plot_model (hub_encoder, show_shapes = True, dpi = 64)
  утверждать ложно
кроме исключения как e:
  print (f "{type (e).__name__}: {e} ")
  
AttributeError & двоеточие; Объект KerasLayer не имеет атрибута Layers.
 

Младший модельный дом

Если вам нужен больший контроль над построением модели, стоит отметить, что использованная ранее функция classifier_model на самом деле является лишь тонкой оболочкой над nlp.modeling.networks.BertEncoder и nlp.modeling.models.BertClassifier классов. Просто помните, что если вы начнете изменять архитектуру, возможно, будет некорректно или невозможно перезагрузить предварительно обученную контрольную точку, поэтому вам придется переучиваться с нуля.

Сборка кодировщика:

  bert_encoder_config = config_dict.copy ()

# Вам нужно переименовать несколько полей, чтобы это работало:
bert_encoder_config ['внимание_dropout_rate'] = bert_encoder_config.pop ('внимание_probs_dropout_prob')
bert_encoder_config ['активация'] = tf_utils.get_activation (bert_encoder_config.pop ('hidden_act'))
bert_encoder_config ['dropout_rate'] = bert_encoder_config.pop ('hidden_dropout_prob')
bert_encoder_config ['инициализатор'] = tf.keras.initializers.TruncatedNormal (
          stddev = bert_encoder_config.pop ('диапазон_инициализатора'))
bert_encoder_config ['max_sequence_length'] = bert_encoder_config.pop ('max_position_embeddings')
bert_encoder_config ['num_layers'] = bert_encoder_config.pop ('num_hidden_layers')

bert_encoder_config
  
{'hidden_size' & двоеточие; 768, г.
 'промежуточный_размер' и двоеточие; 3072, г.
 'num_attention_heads' и двоеточие; 12,
 'type_vocab_size' и двоеточие; 2,
 "словарь_размер" и двоеточие; 30522, г.
 'внимание_дропаут_рейт' & двоеточие; 0,1,
 'активация' & двоеточие; <функция официальный.моделирование.activations.gelu.gelu (x)>,
 'dropout_rate' & двоеточие; 0,1,
 "инициализатор" и двоеточие; ,
 'max_sequence_length' и двоеточие; 512,
 'num_layers' и двоеточие; 12}
 
  manual_encoder = nlp.modeling.networks.BertEncoder (** bert_encoder_config)
  

Восстановить вес:

  контрольная точка = tf.train.Checkpoint (encoder = manual_encoder)
checkpoint.read (
    os.path.join (gs_folder_bert, 'bert_model.ckpt ')). assert_consumed ()
  

 

Тестовый запуск:

  результат = manual_encoder (my_examples, training = True)

print ("Форма вывода последовательности:", результат [0] .shape)
print ("Объединенная выходная форма:", результат [1] .shape)
  
Форма вывода последовательности & двоеточие; (2, 23, 768)
Форма вывода пула и двоеточие; (2, 768)
 

Обернуть в классификатор:

  manual_classifier = nlp.моделирование.models.BertClassifier (
        bert_encoder,
        num_classes = 2,
        dropout_rate = bert_encoder_config ['dropout_rate'],
        инициализатор = bert_encoder_config ['инициализатор'])
  
  manual_classifier (my_examples, training = True) .numpy ()
  
массив ([[0.19574928, -0.095
],
       [-0.3455575, 0.12091695]], dtype = float32)
 

Оптимизаторы и графики

Оптимизатор, используемый для обучения модели, был создан с использованием nlp.optimizer.create_optimizer функция:

  optimizer = nlp.optimization.create_optimizer (
    2e-5, num_train_steps = num_train_steps, num_warmup_steps = Warmup_steps)
  

Эта оболочка высокого уровня устанавливает расписания скорости обучения и оптимизатор.

Используемый здесь базовый график скорости обучения представляет собой линейное уменьшение до нуля во время тренировочного цикла:

  эпох = 3
batch_size = 32
eval_batch_size = 32

train_data_size = len (glue_train_labels)
steps_per_epoch = int (размер_поездки / размер_пакета)
num_train_steps = steps_per_epoch * эпох
  
  decay_schedule = tf.keras.optimizers.schedules.PolynomialDecay (
      initial_learning_rate = 2e-5,
      decay_steps = num_train_steps,
      end_learning_rate = 0)

plt.plot ([decay_schedule (n) для n в диапазоне (num_train_steps)])
  
[]
 

Это, в свою очередь, заключено в график WarmUp , который линейно увеличивает скорость обучения до целевого значения в течение первых 10% обучения:

  warmup_steps = num_train_steps * 0.1

Warmup_schedule = nlp.optimization.WarmUp (
        initial_learning_rate = 2e-5,
        decay_schedule_fn = decay_schedule,
        Warmup_steps = Warmup_steps)

# Разогрев выходит за пределы, потому что он нагревается до `initial_learning_rate`
# в соответствии с исходной реализацией. Вы можете установить
# `initial_learning_rate = decay_schedule (warmup_steps)` если вам не нравится
# перерегулирование.
plt.plot ([Warup_schedule (n) для n в диапазоне (num_train_steps)])
  
[]
 

Затем создайте файл nlp.optimisation.AdamWeightDecay с использованием этого расписания, настроенного для модели BERT:

  optimizer = nlp.optimization.AdamWeightDecay (
        learning_rate = расписание_ разминки,
        weight_decay_rate = 0,01,
        эпсилон = 1e-6,
        exclude_from_weight_decay = ['LayerNorm', 'layer_norm', 'bias'])
  

Точная настройка моделей обработки естественного языка с помощью службы машинного обучения Azure | Блог Azure и обновления

Соавторами этого сообщения в блоге являются Ли Ли, инженер-программист II, и Тодд Хендри, главный инженер-программист Microsoft AI Platform.

В области обработки естественного языка (NLP) предварительно обученные языковые представления традиционно были ключевой темой для нескольких важных случаев использования, таких как распознавание именованных сущностей (Sang and Meulder, 2003), ответы на вопросы (Rajpurkar et al., 2016) и синтаксический анализ (McClosky et al., 2010).

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

Недавно Девлин и др. Опубликовали статью под названием «BERT: представления двунаправленного кодера от трансформаторов», в которой были получены новые современные результаты по 11 задачам НЛП с использованием предварительно обученного подхода, упомянутого выше. В этом техническом сообщении блога мы хотим показать, как клиенты могут эффективно и легко настраивать BERT для своих пользовательских приложений с помощью служб машинного обучения Azure.Мы открываем исходный код на GitHub.

Интуиция за BERT

Интуиция, лежащая в основе новой языковой модели BERT, проста, но действенна. Исследователи считают, что достаточно большая глубокая модель нейронной сети с достаточно большим обучающим корпусом могла бы уловить взаимосвязь, стоящую за корпусом. В области НЛП сложно получить большой аннотированный корпус, поэтому исследователи использовали новую технику для получения большого количества обучающих данных. Вместо того, чтобы заставлять людей маркировать корпус и вводить его в нейронные сети, исследователи используют большой доступный в Интернете корпус - BookCorpus (Чжу, Кирос и др.) И английскую Википедию (800 млн и 2500 млн слов соответственно).Для создания меток для языковой модели используются два подхода, каждый для разных языковых задач.

  • Маскированная языковая модель: Для понимания взаимосвязи между словами. Ключевая идея состоит в том, чтобы замаскировать некоторые слова в предложении (около 15 процентов) и использовать эти замаскированные слова в качестве меток, чтобы заставить модели изучить взаимосвязь между словами. Например, исходное предложение будет таким:
Мужчина пошел в магазин. Он купил галлон молока.

И пара ввод / метка для языковой модели:

Вход: Мужчина подошел к [МАСКА1]. Он купил [MASK2] молока.
Ярлыки: [MASK1] = store; [MASK2] = 
галлон
  • Задача прогнозирования предложений: Чтобы понять отношения между предложениями. Эта задача просит модель предсказать, будет ли предложение B, вероятно, следующим предложением после данного предложения A. Используя тот же пример, приведенный выше, мы можем сгенерировать обучающие данные, такие как:
Приговор A: Мужчина пошел в магазин.Приговор B: он купил галлон молока.
Лейбл: IsNextSentence 

Применение BERT к индивидуальному набору данных

После того, как BERT обучен на большом корпусе (скажем, на всей доступной английской Википедии) с использованием описанных выше шагов, предполагается, что, поскольку набор данных огромен, модель может унаследовать много знаний об английском языке. Следующим шагом является точная настройка модели для различных задач в надежде, что модель сможет быстрее адаптироваться к новой области. Ключевая идея состоит в том, чтобы использовать большую модель BERT, обученную выше, и добавлять разные уровни ввода / вывода для разных типов задач.Например, вы можете захотеть провести анализ настроений для отдела поддержки клиентов. Это проблема классификации, поэтому вам может потребоваться добавить выходной слой классификации (как показано слева на рисунке ниже) и структурировать ввод. Для другой задачи, скажем, для ответа на вопрос, вам может потребоваться использовать другой уровень ввода / вывода, где ввод - это вопрос и соответствующий абзац, а вывод - это начальный / конечный диапазон ответов для вопроса (см. Рисунок на право).В каждом случае способ разработки BERT может позволить специалистам по данным легко подключать разные уровни, чтобы BERT можно было адаптировать к различным задачам.

Рисунок 1. Адаптация BERT для различных задач ( Source )

На изображении ниже показан результат для одного из самых популярных наборов данных в области НЛП, Стэнфордского набора данных с ответами на вопросы (SQuAD).

Рис. 2. Сообщенная производительность BERT на SQuAD 1.1 набор данных ( Источник ).

В зависимости от конкретных типов задач вам может потребоваться добавить очень разные комбинации уровней ввода / вывода. В репозитории GitHub мы продемонстрировали две задачи: General Language Understanding Evaluation (GLUE) (Wang et al., 2018) и Stanford Question Answering Dataset (SQuAD) (Rajpurkar and Jia et al., 2018).

Использование службы машинного обучения Azure

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

Рисунок 3.Обзор службы машинного обучения Azure

Что в записной книжке

Определение подходящей модели для конкретной задачи

Для точной настройки модели BERT первым шагом является определение правильного уровня ввода и вывода. В примере GLUE это определено как задача классификации, а фрагмент кода показывает, как создать модель языковой классификации с использованием предварительно обученных моделей BERT:

модель = моделирование.BertModel (
     config = bert_config,
     is_training = is_training,
     input_ids = input_ids,
     input_mask = input_mask,
     token_type_ids = segment_ids,
     use_one_hot_embeddings = use_one_hot_embeddings)

logits = tf.matmul (слой_вывода, вес_вывода, transpose_b = Истина)
logits = tf.nn.bias_add (logits, output_bias)
вероятности = tf.nn.softmax (логиты, ось = -1)
log_probs = tf.nn.log_softmax (логиты, ось = -1)
one_hot_labels = tf.one_hot (метки, глубина = num_labels, dtype = tf.float32)
per_example_loss = -tf.reduce_sum (one_hot_labels * log_probs, axis = -1)
потеря = tf.reduce_mean (per_example_loss) 

Настройка среды обучения с помощью службы машинного обучения Azure

В зависимости от размера набора данных обучение модели на фактическом наборе данных может занять много времени.Вычисления машинного обучения Azure предоставляют доступ к графическим процессорам для одного или нескольких узлов, чтобы ускорить процесс обучения. Создание кластера с одним или несколькими узлами в вычислительной среде машинного обучения Azure очень интуитивно понятно, как показано ниже:

compute_config = AmlCompute.provisioning_configuration (vm_size = 'STANDARD_NC24s_v3',
                                                         min_nodes = 0,
                                                         max_nodes = 8)
# создать кластер
gpu_compute_target = ComputeTarget.создать (WS, gpu_cluster_name, compute_config)
gpu_compute_target.wait_for_completion (show_output = True)
оценка = PyTorch (исходный_каталог = папка_проекта,
                 compute_target = gpu_compute_target,
                 script_params = {...},
                 entry_script = 'run_squad.azureml.py',
                 node_count = node_count,
                 process_count_per_node = process_count_per_node,
                 распределенный_backend = 'mpi',
                 use_gpu = True) 

Машинное обучение Azure значительно упрощает работу по настройке и запуску распределенного обучения.Как видите, масштабирование задания для нескольких рабочих выполняется простым изменением количества узлов в конфигурации и предоставлением распределенной серверной части. Для распределенных бэкэндов Машинное обучение Azure поддерживает популярные платформы, такие как сервер параметров TensorFlow, а также MPI с Horovod, и связано с оборудованием Azure, таким как InfiniBand, для подключения различных рабочих узлов для достижения оптимальной производительности. У нас будет следующий пост в блоге о том, как использовать возможности распределенного обучения в службе машинного обучения Azure для точной настройки моделей NLP.

Для получения дополнительной информации о том, как создавать и настраивать целевые объекты вычислений для обучения модели, посетите нашу документацию.

Настройка гиперпараметров

Для конкретного варианта использования конкретного клиента производительность модели сильно зависит от выбранных значений гиперпараметров. Гиперпараметры могут иметь большое пространство для поиска, и изучение каждого варианта может быть очень дорогостоящим. Службы машинного обучения Azure предоставляют службу автоматизированного машинного обучения, которая предоставляет возможности настройки гиперпараметров и может выполнять поиск по различным конфигурациям гиперпараметров, чтобы найти конфигурацию, которая обеспечивает наилучшую производительность.

В приведенном примере используется случайная выборка, и в этом случае значения гиперпараметров выбираются случайным образом из заданного пространства поиска. В приведенном ниже примере мы исследовали пространство скорости обучения от 1e-4 до 1e-6 в логарифмически единообразной манере, поэтому скорость обучения может составлять 2 значения около 1e-4, 2 значения около 1e-5 и 2 значения около 1e- 6.

Клиенты также могут выбрать метрику для оптимизации. Потеря валидации, оценка точности и оценка F1 - вот некоторые популярные показатели, которые можно выбрать для оптимизации.

из импорта azureml.train.hyperdrive *
импортная математика

param_sampling = RandomParameterSampling ({
         'Learning_rate': loguniform (math.log (1e-4), math.log (1e-6)),
})

hyperdrive_run_config = HyperDriveRunConfig (
     оценщик = оценщик,
     hyperparameter_sampling = param_sampling,
     primary_metric_name = 'f1',
     primary_metric_goal = PrimaryMetricGoal.MAXIMIZE,
     max_total_runs = 16,
     max_concurrent_runs = 4) 

Для каждого эксперимента клиенты могут наблюдать за развитием различных комбинаций гиперпараметров.Например, на рисунке ниже показаны средние потери с течением времени с использованием различных комбинаций гиперпараметров. Некоторые эксперименты можно прекратить досрочно, если потери в обучении не соответствуют ожиданиям (например, верхняя красная кривая).

Рис. 4. Средняя потеря обучающих данных для разных прогонов, а также раннее завершение

Для получения дополнительной информации о том, как использовать функцию автоматической настройки гиперпараметров в Azure ML, посетите нашу документацию по настройке гиперпараметров.А чтобы узнать, как отслеживать все эксперименты, посетите документацию по отслеживанию экспериментов и показателей.

Визуализация результата

Используя службу машинного обучения Azure, клиенты могут достичь 85-процентной точности оценки при точной настройке MRPC в наборе данных GLUE (для базовой модели BERT требуется 3 эпохи), что близко к современному результату. Использование нескольких графических процессоров может сократить время обучения, а использование более мощных графических процессоров (например, V100) также может сократить время обучения.Подробности одного из конкретных экспериментов приведены ниже:

Графический процессор # 1 2 4
K80 (семейство NC) 191 с / эпоха 105 с / эпоха 60 с / эпоха
V100 (семейство NCv3) 36 с / эпоха 22 с / эпоха 13 с / эпоха

Таблица 1.Время обучения на эпоху для MRPC в наборе данных GLUE

Для SQuAD 1.1 клиенты могут получить около 88,3 балла F1 и 81,2 балла с точным соответствием (EM). Для этого требуется 2 эпохи с использованием базовой модели BERT, и время для каждой эпохи показано ниже:

Графический процессор # 1 2 4
K80 (семейство NC) 16020 с / эпоха 8,820 с / эпоху 4020 с / эпоха
V100 (семейство NCv3) 2940 с / эпоха 1393 с / эпоха 735 с / эпоха

Таблица 2.Время обучения на эпоху для набора данных SQuAD

После завершения всех экспериментов пакет SDK службы машинного обучения Azure также предоставляет сводную визуализацию выбранных метрик и соответствующих гиперпараметров. Ниже приведен пример того, как скорость обучения влияет на потерю проверки. На протяжении экспериментов скорость обучения была изменена с примерно 7e-6 (крайний левый) до примерно 1e-3 (крайний правый), а лучшая скорость обучения с наименьшими потерями при проверке составляет около 3.1e-4. Эта диаграмма также может быть использована для оценки других показателей, которые клиенты хотят оптимизировать.

Рис. 5. Скорость обучения в сравнении с потерями при проверке

Сводка

В этом сообщении блога мы показали, как клиенты могут легко настроить BERT с помощью службы машинного обучения Azure, а также такие темы, как использование распределенных настроек и настройка гиперпараметров для соответствующего набора данных. Мы также показали некоторые предварительные результаты, чтобы продемонстрировать, как использовать службу машинного обучения Azure для точной настройки моделей NLP.Весь код доступен в репозитории GitHub. Пожалуйста, дайте нам знать, если есть какие-либо вопросы или комментарии, указав проблему в репозитории GitHub.

Список литературы

BERT: предварительное обучение глубоких двунаправленных преобразователей для понимания языка и его сайт GitHub.

Amazon SageMaker: ввод модели одним щелчком мыши и точная настройка для моделей Hugging Face в Amazon SageMaker JumpStart

Основываясь на контейнерах глубокого обучения Hugging Face, выпущенных ранее в этом году, Amazon SageMaker теперь упрощает развертывание и точную настройку современных моделей обработки естественного языка (NLP) всего за несколько щелчков мышью с помощью Amazon. SageMaker JumpStart.Amazon SageMaker JumpStart помогает быстро и легко начать работу с машинным обучением (ML). SageMaker JumpStart предоставляет набор решений для наиболее распространенных вариантов использования, которые можно легко развернуть всего за несколько щелчков мышью, и поддерживает развертывание в один щелчок и тонкую настройку популярных моделей с открытым исходным кодом, таких как обработка естественного языка, обнаружение объектов и изображения. классификационные модели. Эти решения полностью настраиваются и демонстрируют использование шаблонов AWS CloudFormation и эталонных архитектур, чтобы вы могли ускорить свой путь к машинному обучению.SageMaker JumpStart также интегрирован в Amazon SageMaker Studio, нашу полностью интегрированную среду разработки (IDE) для машинного обучения, что делает ее интуитивно понятным для поиска моделей, решений и многого другого.

Чтобы упростить начало работы с вариантами использования НЛП, Amazon SageMaker JumpStart теперь поддерживает вывод одним щелчком мыши и тонкую настройку одним щелчком для наиболее популярных моделей НЛП от Hugging Face. С сегодняшнего дня вы можете получить доступ к более чем 40 предварительно обученным моделям Hugging Face Transformers в SageMaker JumpStart для классификации пар предложений, генерации текста, суммирования текста, распознавания именованных сущностей и машинного перевода.Эти модели могут быть развернуты как есть для выполнения вывода. Модели классификации пар предложений также можно настроить для новых наборов данных, а затем развернуть для вывода. SageMaker JumpStart также поддерживает популярные концентраторы моделей, такие как PyTorch Hub и TensorFlow Hub, в то же время размещая более 300 моделей компьютерного зрения и обработки естественного языка, а также 16 готовых комплексных решений и 19 примеров ноутбуков.

Чтобы найти эти новые интеграции Amazon SageMaker JumpStart, вы можете открыть SageMaker Studio и перейти на вкладку SageMaker JumpStart.Найдите «Обнимающее лицо» в строке поиска вверху страницы, и вам будет предоставлен выбор из всех моделей «Обнимающее лицо». Кроме того, вы можете прокрутить вниз и найти модели обнимающего лица в карусели «Текст», чтобы найти сотни моделей, которые можно развернуть и настроить одним щелчком мыши.

Amazon SageMaker JumpStart доступен во всех регионах, где доступен Amazon SageMaker Studio. Чтобы начать работу с этими моделями Hugging Face в SageMaker JumpStart, обратитесь к документации.

Тонкая настройка Предварительно обученные модели BERT - документация gluonnlp 0.10.0

Файл словаря не найден. Скачивание.
Скачивание /root/.mxnet/models/2824122418885211946/2824122418885211946_book_corpus_wiki_en_uncased-a6607397.zip с https: //apache-mxnet.s3-accelerate.dualstack.amazonaws.com/gluon_ru_corpus_data/sdat_gluon_docs/sdat_s_docs/s/sd_s/data_gluon/docs/data_data.html
Загрузка /root/.mxnet/models/bert_12_768_12_book_corpus_wiki_en_uncased-75cc780f.zip86c4d8a9-e75d-4a71-a929-38781104208a с https: // apache-mxnet.s3-accelerate.dualstack.amazonaws.com/gluon/models/bert_12_768_12_book_corpus_wiki_en_uncased-75cc780f.zip ...
BERTMодель (
  (кодировщик): BERTEncoder (
    (dropout_layer): выпадение (p = 0,1, оси = ())
    (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
    (transformer_cells): HybridSequential (
      (0): BERTEncoderCell (
        (dropout_layer): выпадение (p = 0,1, оси = ())
        (ячейка внимания): DotProductSelfAttentionCell (
          (dropout_layer): выпадение (p = 0.1, оси = ())
        )
        (проект): плотный (768 -> 768, линейный)
        (ffn): PositionwiseFFN (
          (ffn_1): плотный (768 -> 3072, линейный)
          (активация): GELU ()
          (ffn_2): плотный (3072 -> 768, линейный)
          (dropout_layer): выпадение (p = 0,1, оси = ())
          (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
        )
        (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
      )
      (1): BERTEncoderCell (
        (dropout_layer): выпадение (p = 0.1, оси = ())
        (ячейка внимания): DotProductSelfAttentionCell (
          (dropout_layer): выпадение (p = 0,1, оси = ())
        )
        (проект): плотный (768 -> 768, линейный)
        (ffn): PositionwiseFFN (
          (ffn_1): плотный (768 -> 3072, линейный)
          (активация): GELU ()
          (ffn_2): плотный (3072 -> 768, линейный)
          (dropout_layer): выпадение (p = 0,1, оси = ())
          (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
        )
        (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
      )
      (2): BERTEncoderCell (
        (dropout_layer): выпадение (p = 0.1, оси = ())
        (ячейка внимания): DotProductSelfAttentionCell (
          (dropout_layer): выпадение (p = 0,1, оси = ())
        )
        (проект): плотный (768 -> 768, линейный)
        (ffn): PositionwiseFFN (
          (ffn_1): плотный (768 -> 3072, линейный)
          (активация): GELU ()
          (ffn_2): плотный (3072 -> 768, линейный)
          (dropout_layer): выпадение (p = 0,1, оси = ())
          (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
        )
        (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
      )
      (3): BERTEncoderCell (
        (dropout_layer): выпадение (p = 0.1, оси = ())
        (ячейка внимания): DotProductSelfAttentionCell (
          (dropout_layer): выпадение (p = 0,1, оси = ())
        )
        (проект): плотный (768 -> 768, линейный)
        (ffn): PositionwiseFFN (
          (ffn_1): плотный (768 -> 3072, линейный)
          (активация): GELU ()
          (ffn_2): плотный (3072 -> 768, линейный)
          (dropout_layer): выпадение (p = 0,1, оси = ())
          (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
        )
        (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
      )
      (4): BERTEncoderCell (
        (dropout_layer): выпадение (p = 0.1, оси = ())
        (ячейка внимания): DotProductSelfAttentionCell (
          (dropout_layer): выпадение (p = 0,1, оси = ())
        )
        (проект): плотный (768 -> 768, линейный)
        (ffn): PositionwiseFFN (
          (ffn_1): плотный (768 -> 3072, линейный)
          (активация): GELU ()
          (ffn_2): плотный (3072 -> 768, линейный)
          (dropout_layer): выпадение (p = 0,1, оси = ())
          (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
        )
        (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
      )
      (5): BERTEncoderCell (
        (dropout_layer): выпадение (p = 0.1, оси = ())
        (ячейка внимания): DotProductSelfAttentionCell (
          (dropout_layer): выпадение (p = 0,1, оси = ())
        )
        (проект): плотный (768 -> 768, линейный)
        (ffn): PositionwiseFFN (
          (ffn_1): плотный (768 -> 3072, линейный)
          (активация): GELU ()
          (ffn_2): плотный (3072 -> 768, линейный)
          (dropout_layer): выпадение (p = 0,1, оси = ())
          (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
        )
        (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
      )
      (6): BERTEncoderCell (
        (dropout_layer): выпадение (p = 0.1, оси = ())
        (ячейка внимания): DotProductSelfAttentionCell (
          (dropout_layer): выпадение (p = 0,1, оси = ())
        )
        (проект): плотный (768 -> 768, линейный)
        (ffn): PositionwiseFFN (
          (ffn_1): плотный (768 -> 3072, линейный)
          (активация): GELU ()
          (ffn_2): плотный (3072 -> 768, линейный)
          (dropout_layer): выпадение (p = 0,1, оси = ())
          (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
        )
        (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
      )
      (7): BERTEncoderCell (
        (dropout_layer): выпадение (p = 0.1, оси = ())
        (ячейка внимания): DotProductSelfAttentionCell (
          (dropout_layer): выпадение (p = 0,1, оси = ())
        )
        (проект): плотный (768 -> 768, линейный)
        (ffn): PositionwiseFFN (
          (ffn_1): плотный (768 -> 3072, линейный)
          (активация): GELU ()
          (ffn_2): плотный (3072 -> 768, линейный)
          (dropout_layer): выпадение (p = 0,1, оси = ())
          (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
        )
        (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
      )
      (8): BERTEncoderCell (
        (dropout_layer): выпадение (p = 0.1, оси = ())
        (ячейка внимания): DotProductSelfAttentionCell (
          (dropout_layer): выпадение (p = 0,1, оси = ())
        )
        (проект): плотный (768 -> 768, линейный)
        (ffn): PositionwiseFFN (
          (ffn_1): плотный (768 -> 3072, линейный)
          (активация): GELU ()
          (ffn_2): плотный (3072 -> 768, линейный)
          (dropout_layer): выпадение (p = 0,1, оси = ())
          (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
        )
        (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
      )
      (9): BERTEncoderCell (
        (dropout_layer): выпадение (p = 0.1, оси = ())
        (ячейка внимания): DotProductSelfAttentionCell (
          (dropout_layer): выпадение (p = 0,1, оси = ())
        )
        (проект): плотный (768 -> 768, линейный)
        (ffn): PositionwiseFFN (
          (ffn_1): плотный (768 -> 3072, линейный)
          (активация): GELU ()
          (ffn_2): плотный (3072 -> 768, линейный)
          (dropout_layer): выпадение (p = 0,1, оси = ())
          (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
        )
        (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
      )
      (10): BERTEncoderCell (
        (dropout_layer): выпадение (p = 0.1, оси = ())
        (ячейка внимания): DotProductSelfAttentionCell (
          (dropout_layer): выпадение (p = 0,1, оси = ())
        )
        (проект): плотный (768 -> 768, линейный)
        (ffn): PositionwiseFFN (
          (ffn_1): плотный (768 -> 3072, линейный)
          (активация): GELU ()
          (ffn_2): плотный (3072 -> 768, линейный)
          (dropout_layer): выпадение (p = 0,1, оси = ())
          (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
        )
        (layer_norm): LayerNorm (eps = 1e-12, axis = -1, center = True, scale = True, in_channels = 768)
      )
      (11): BERTEncoderCell (
        (dropout_layer): выпадение (p = 0.											

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *