Mahir Uysal tərəfindən

Transfer tədrisi ilə ən müasir danışıq zəkası necə qurulur

Bir neçə il əvvəl, bir chatbot yaratmaq - o vaxt məhdud olduğu kimi - qaydaların yaradılmasından danışıq mövzularından bəzilərini əhatə etmək üçün minlərlə cavab yazmağa aylar çəkə bilər.

NLP üçün dərin öyrənmədə son inkişaflar sayəsində, bu təlimdən də göründüyü kimi, cəmi bir neçə saat ərzində bu az şeydən qurtula və daha güclü söhbət süni zəkası qura bilərik.

Convai.huggingface.co saytında bu təlimdə bir araya gətirdiyimiz əvvəlcədən qurulmuş modeli istifadə edərək bir demo yaratdıq. Buna bax!
Əvvəlcədən qurulmuş modelin onlayn demosu üçün convai.huggingface.co saytındakı bu təlimata baxın.

Budur bu gün nə öyrənəcəyik və oynayacağıq:

  • OpenAI GPT və GPT-2 Transformer dil modellərinə əsaslanan ən müasir informasiya agentliyi yaratmaq üçün Transfer Learning-dən necə istifadə edə bilərsiniz.
  • Avtomatik metrik parçasını qazanan ConvAI2 NeurIPS 2018 dialoq müsabiqəsində istifadə etdiyimiz modeli necə çoxaltmaq olar?
  • Rəqabət kodunun 3k + sətirini 250-dən az şərh edilmiş təlim koduna necə yaydıq (yayılma və FP16 seçimləri ilə!) Və
  • Bu modeli 20 dollardan az bir bulud nümunəsində necə öyrətmək və ya əvvəlcədən qurulmuş açıq mənbə modelimizdən necə istifadə etmək olar.
Bu yazı ilə birlikdə əvvəlcədən hazırlanmış bir model ilə təmiz və şərhli bir kod bazası çıxardıq! Burada github reposuna baxın

Bu yazının hekayəsi bir neçə ay əvvəl NeurIPS 2018-də bir dialoq müsabiqəsi olan Conversational Intelligence Challenge 2 (ConvAI2) avtomatik izlənilməsində Hugging Face’in birinci yerə çıxdığı Montreal’də başladı.

Gizli sousumuz, geniş miqyaslı, əvvəlcədən öyrədilmiş bir dil modeli olan OpenAI GPT idi.

Rəqabətin sürətli templəri ilə bir çox təlim və memarlıq dəyişikliyini araşdıran 3000-dən çox kod xətti ilə başa çatdıq.

Aydındır ki, belə bir xam kod göndərmək ədalətli olmazdı.

Bu vaxt, 150.000 dəfədən çox yüklənmiş və OpenAI GPT və onun varisi GPT-2 kimi geniş miqyaslı dil modellərinin tətbiq olunmasını təklif edən pytorch-pretrained-BERT adlı transfer öyrənmə modelləri deposu qurmağa və açmağa başlamışıq.

Bir neçə həftə əvvəl yarışma kodumuzu Pytorch-pretrained-BERT-nin üstündə qurulmuş təmiz və şərhli bir kod bazasına çevirməyə və yanaşma və kodumuzu izah edən ətraflı bir blog yazısı yazmağa qərar verdim.

Beləliklə, gəldik let's

Şəxsiyyəti olan bir süni

Bir şəxslə bir söhbət AI yaradırıq.

Dialoq agentimiz, kim olduğunu (persona) təsvir edən bəzi cümlələrin saxlanıldığı bir məlumat bazasına və bir dialoq tarixçəsinə malikdir. Bir istifadəçidən yeni bir söz alındıqda, agent bir cavab yaratmaq üçün bu məlumat bazasının məzmunu ilə yeni alınan sözləri birləşdirir.

Budur ümumi sxem:

İntensiv dialoq agentlərini ardıcıl olaraq hazırlasaq, böyük bir problemlə qarşılaşırıq:

Dialoq məlumat dəstləri kiçikdir və səlis və müvafiq cavablar yaratmaq üçün kifayət qədər dil və sağlam düşüncə öyrənmək çətindir.

Bəzi yanaşmalar ağıllı şüa tapanı istifadə edərək keyfiyyəti yaxşılaşdırmaq üçün modelin çıxışını süzərək həll etməyə çalışır. Son aylarda böyük maraq doğuran fərqli bir yola gedəcəyik: Transfer Learning.

Bu yanaşmanın arxasındakı fikir çox sadədir:

  • Mətnin uzun bitişik hissələrini yaratmaq üçün çox böyük bir mətn korpusunda bir dil modeli hazırlamağa başlayın.
  • Bu dil modelini son tapşırıq dialoqumuza uyğunlaşdırmaq üçün optimallaşdırın.

Dil modelinin hazırlanması bahalı bir təklifdir. Buna görə, ümumiyyətlə əvvəldən öyrədilmiş və açıq mənbəli biliklərə sahib olan bir modeldən başlamaq daha yaxşıdır.

Məqsədimiz üçün yaxşı bir əvvəlcədən hazırlanmış bir model nə ola bilər?

Böyük nə qədər yaxşıdırsa, eyni zamanda mətn yarada biləcək bir modelə ehtiyacımız var. Ən çox istifadə olunan əvvəlcədən hazırlanmış NLP modeli BERT, yalnız tam cümlələr üçün əvvəlcədən hazırlanır və yarımçıq qalmış cümlələri tamamlaya bilmir. OpenAI Open Sourcing tərəfindən təklif olunan digər iki model tətbiqetməmiz üçün daha maraqlıdır: GPT & GPT-2.

Gəlin onlara tez nəzər salaq

OpenAI GPT və GPT-2 modelləri

2018 və 2019-cu illərdə Alec Radford, Jeffrey Wu və OpenAI-dəki əməkdaşları çox böyük həcmli məlumat üçün açıq mənbə bilikləri olan iki dil modelini təqdim etdilər: GPT və GPT-2 (burada GPT Generative Pretrained Transformer).

Bir dekoder / səbəb transformatoru növbəti sözləri yaratmaq üçün sol kontekstə diqqət yetirir

GPT və GPT-2, Transformer əsaslı iki oxşar modeldir. Bu modellər dekoder və ya səbəb modelləri kimi tanınır. Bu o deməkdir ki, növbəti sözü proqnozlaşdırmaq üçün sol kontekstdən istifadə edirlər (sol rəqəmə bax).

Bir çox məqalə və blog yazısı Transformers modellərini və ardıcıl girişləri emal etmək üçün diqqət mexanizmlərindən necə istifadə etdiklərini təsvir edir, beləliklə onları ətraflı izah etməyə vaxt sərf etmirəm. Bu modellərlə tanış deyilsinizsə bir neçə göstərici: Emma Strubellin EMNLP slaydları mənim şəxsi favoritlərimdir və Jay Alammarın Illustrated Transformer çox dərin bir girişdir.

Məqsədlərimiz üçün bir dil modeli yalnız giriş işarələri ardıcıllığını götürən və giriş ardıcıllığından sonra növbəti lövhə üçün lüğət daxilində ehtimal paylanmasını yaradan bir modeldir. Dil modelləri adətən yuxarıdakı şəkildə göstərildiyi kimi paralel olaraq hər bir işarəni izləyən işarəni uzun bir giriş ardıcıllığı ilə proqnozlaşdıraraq öyrədilir.

Bu modellərin böyük bir korpusda təhsili bahalı bir prosesdir. Beləliklə, OpenAI tərəfindən öyrədilmiş bir model və bir tokenizer ilə başlayırıq. Tokenayzer giriş sətirini jetonlara (sözlər / alt sözlər) ayırır və bu jetonları model lüğətinin düzgün ədədi göstəricilərinə çevirir.

Pytorch-pretrained-BERT-də OpenAI GPT modeli və onun tokenizatoru asanlıqla əvvəlcədən yoxlanılmış məntəqədən aşağıdakı şəkildə yaradıla və yüklənə bilər:

Yəqin ki, bayaq danışdığımız dil modelindən biraz daha mürəkkəb səslənən OpenAI GPT Double Heads Model adlı bir model yüklədiyimizi gördünüz və haqlısınız!

Buna görə modelimizi dialoqa uyğunlaşdırmalıyıq. Gəlin necə işlədiyini görək!

Dil modelinin dialoq tapşırığına uyğunlaşdırılması

Dil modelimiz tək bir giriş ilə öyrədilir: sözlər ardıcıllığı.

Daha əvvəl də gördüyümüz kimi, bir dialoq şəraitində, modelimiz çıxış ardıcıllığı yaratmaq üçün müxtəlif kontekstlərdən istifadə etməlidir:

  • bir və ya daha çox şəxs dəsti,
  • dialoqun tarixçəsi istifadəçi tərəfindən ən azı son açıqlama ilə,
  • Çıxış ardıcıllığının sözdən-sözə yaratdığımızdan bəri artıq yaradılan çıxış ardıcıllığının əlamətləri.
Modelimiz üçün bu fərqli kontekstdən necə bir giriş yarada bilərik?

Sadə cavab, kontekst seqmentlərini tək bir ardıcıllıqla birləşdirmək və cavabı sonuna qoymaqdır. Daha sonra ardıcıllığı davam etdirərək hər bir işarəyə cavab işarəsinin tamamlanmasını yarada bilərik:

Giriş qaydası: persona (mavi), kurs (çəhrayı) və cavab (yaşıl) ayırıcılarla birləşməsi (açıq çəhrayı). Burada cavabı tamamlamaq üçün

Bu sadə quraşdırma ilə bağlı iki problem var:

  • Transformatorumuz rəng korudur! Ayırıcılar hər sözün hansı hissəyə aid olduğu barədə yalnız zəif bir fikir verir. Məsələn, illüstrasiyamızda “NYC” sözü mavi (Persona) ilə göstərilmişdir, lakin modelimiz bu məlumatı yalnız ayırıcılardan çıxarmaqda çətinlik çəkəcək: seqmentlər haqqında daha çox məlumat əlavə etməliyik.
  • Transformatorumuz mövqedədir! Diqqət simmetrik bir skalar məhsuludur, buna görə hər bir jeton üçün mövqe məlumatı əlavə etməliyik.

Bu məlumatı əlavə etməyin asan bir yolu söz, mövqe və seqmentlər üçün üç paralel giriş ardıcıllığı yaratmaq və onları üç növ gömülü qruplaşdıraraq tək bir ardıcıllıqla birləşdirməkdir: söz, mövqe və seqment daxilolmaları:

Sözləri (boz), mövqeyi (qradiyenti) və seqmentlərini (mavi / çəhrayı / yaşıl) göstərən üç növ daxiletmənin cəmlənməsi

Bunu necə edirik?

Əvvəlcə ayırıcılar və seqment göstəriciləri üçün lüğətimizə xüsusi ayələr əlavə edəcəyik. Bu ayələr modelimizin əvvəlcədən hazırlanmasının bir hissəsi deyildi, buna görə də onlar üçün yeni göbələklər yaratmalı və öyrətməliyik.

Lüğətə / modelə xüsusi ayələr və yeni daxilolmalar əlavə etmək Pytorch əvvəlcədən hazırlanmış BERT dərsləri ilə çox asandır. Tokenatorumuzun lüğət və yerləşdirmələrinə beş xüsusi ayə əlavə edək:

Bu xüsusi mö'cüzə metodları hər biri tokenizer-in söz ehtiyatına beş xüsusi jetonumuzu əlavə edir və modeldə beş əlavə yerləşdirmə yaradır.

İndi şəxsdən, tarixçədən və cavab kontekstlərinin başlanğıcından giriş ardıcıllığımızı yaratmaq üçün lazım olan hər şeyə sahibik. Budur sadə bir nümunə:

Çox tapşırıq itkiləri

İndi əvvəlcədən hazırlanmış modelimizi işə saldıq və təlim girişlərimizi yaratdıq. Qalan yalnız dəqiq tənzimləmə zamanı optimallaşdırmaq üçün bir zərər seçməkdir.

Dil modelləşdirməsini növbəti cümlə üçün proqnozlaşdırma məqsədi ilə birləşdirən çox tapşırıq itkisindən istifadə edəcəyik.
Növbəti cümlə üçün proqnozlaşdırma məqsədi BERT hazırlığının bir hissəsidir. Verilənlər dəstindən təsadüfi yayındırıcıları seçmək və giriş ardıcıllığının qızıl cavab və ya yayındırıcı ilə başa çatdığını ayırd etmək üçün modeli öyrətməkdən ibarətdir. Modeli yerli kontekstdən başqa qlobal seqmentlərə baxmağa öyrədir.

İndi "cüt başlı" bir model yükləməyimizin səbəbini görə bilərsiniz. Bir baş dil modelləşdirmə üçün proqnozları hesablayır, digər baş isə növbəti cümlə üçün təsnif etiketlərini proqnozlaşdırır. İtkilərin necə hesablandığına baxaq:

Çox vəzifəli təlim məqsədi - Modelin dil modellərini proqnozlaşdırmaq (narıncı) və növbəti cümləni (mavi) təsnif etmək üçün iki başı var.

Ümumi zərər, aşağıdakı şəkildə hesablanan dil modelləşdirmə itkisinin və növbəti cümlə üçün proqnoz itkisinin ağırlıqlı cəmidir:

  • Dil modelləşdirmə: Günlükləri əldə etmək və hədəfin qızıl cavabla uyğun hissəsinə çarpaz entropiya itkisi tətbiq etmək üçün yuxarıdakı şəkildəki yaşıl etiket) daxilolma matrisi üzərində gizli vəziyyəti proqnozlaşdırırıq.
  • Növbəti cümlə proqnozu: Son nəticənin gizli vəziyyətini (ardıcıllığın sonu işarəsi) xətti bir düzlükdən keçirib hesab toplayırıq və yayındırıcılar arasında qızıl cavabı düzgün təsnif etmək üçün çarpaz entropiya itkisi tətbiq edirik.

Gəlin bunu necə kodlaya biləcəyimizi görək:

İndi modelimiz üçün lazım olan bütün girişlərə sahibik və iki itki və ümumi itki (ağırlıqlı cəm olaraq) əldə etmək üçün modeli ötürə bilərik:

Məşqə başlamağa hazırıq

A Dialoq məlumat qeydinə hazırlıq

ConvAI2 yarışması üçün keçən il Facebook tərəfindən yayımlanan maraqlı bir məlumat dəsti istifadə edildi: PERSONA-CHAT.

Şəxsiyyət dəstlərini mənimsəmək və müəyyən bir personaj rolunu oynayarkən qoşalaşmış işçilərdən söhbət etmələrini xahiş etməklə yaradılan kifayət qədər böyük bir dialoq məlumat toplusudur (10k dialoq) (soldakı nümunəyə baxın) İllüstrasiya).

Bu məlumat dəsti, Facebook-un ParlAI kitabxanasında tokenləşdirilmiş xam mətn şəklində mövcuddur. Sizi yükləmək üçün GPT simvollaşdırıcısını istifadə edərək aşağıdakı şəkildə yükləyə və işarələyə biləcəyiniz bir JSON formatlı versiyasını da yüklədik.

PERSONA-CHAT'ın JSON versiyası, modelimizi iç içə bir siyahı lüğəti olaraq öyrətmək üçün bütün müvafiq girişlərə sürətli giriş təklif edir:

PERSONA-CHAT'ın JSON versiyasının təşkili

NVIDIA-dan fantastik PyTorch-Ignite çərçivəsini və Avtomatik Qarışıq Həssaslıq (FP16 / 32) üçün yeni API istifadə edərək, 3.000 sətirdən çox olan rəqabət kodumuzu paylanmış və FP16 seçimləri ilə 250 sətirdən az təlim koduna distillə edə bildik!

Yuxarıdakı hissələrdə kodun əsas hissələrini nəzərdən keçirdik, belə ki hamısının necə uyğun olduğunu görmək üçün şərh edilmiş kodu oxuya bilərsiniz.

Təlim kodu (train.py) burada ➱ ➱

Bu modeli 8 V100 GPU ilə AWS nümunəsində hazırlamaq bir saatdan az çəkir (hal-hazırda p3.16xlarge olan ən böyük AWS nümunəsində 25 dollardan azdır) və istifadə olunan SOTA-ya yaxın nəticələr verir. ConvAI2-nin 79-dan yuxarı hitləri ilə rəqabəti 20.5-dən, F1-i isə 16.5-dən qiymətləndirilib.

Rəqabət aparan modelimizlə müqayisədə bir neçə fərq bir az daha aşağı puanları izah edir, kod reposunun oxunma sənədində verilmişdir və əsasən yerin yerləşdirilməsini optimallaşdırmaq və fərqli bir dekoderdən istifadə etməkdir.

Modellə danışın - dekoder

Dialoq modellərinin təəccüblü tərəfi odur ki, onlarla danışa bilərsiniz

Modelimizlə qarşılıqlı əlaqə qurmaq üçün bir şey əlavə etməliyik: modelimizin növbəti işarəsi proqnozlarından tam ardıcıllıqlar yaradan bir dekoder.

İndi son bir neçə ayda dekoderlərdə çox maraqlı inkişaflar baş verdi və sizi burada müasirləşdirmək üçün onları tez bir zamanda təqdim etmək istədim.

Danışıq yaratmaq üçün ən çox istifadə olunan iki dekoder yaw decoding və ray search idi.

Söz (cümlə) söz cümləsi yaradın

Açgözlü deşifrə bir cümlə yaratmağın ən asan yoludur: hər addımda ardıcıllığın sonundakı işarələrə çatana qədər modelə uyğun olaraq ən çox ehtimal olunan növbəti işarəni seçirik. Açgözlü deşifrə ilə bağlı bir risk, ehtimal olunan bir mö'cüzənin gizlədilməsi və aşağı ehtimala sahib bir əlamətdən sonra gözardı edilməsidir.

Sözdən-sözə qurduğumuz bir neçə mümkün ardıcıllığın şüasını qorumaqla bu problemi azaltmağa çalışan şüa izləmə. Prosesin sonunda şüalar arasında ən yaxşı dəsti seçəcəyik. Son illərdə şüa axtarışı, dialoq da daxil olmaqla demək olar ki, bütün nitq yaratma tapşırıqları üçün standart kod çözmə alqoritmi olmuşdur (baxın ən son [1]).

Bununla birlikdə 2018/2019-cu ilin əvvəlində bir neçə inkişaf baş verdi. Birincisi, şüa axtarışının nəticələrin uzunluğundan çox asılı olduğunu və dekodlaşdırmadan əvvəl çıxış uzunluğunun proqnozlaşdırılması halında ən yaxşı nəticələrin əldə edilə biləcəyinə dair artan dəlillər var idi [2, 3 ] EMNLP 2018-də). Çıxış ardıcıllığının uzunluğunun girişdən təxminən proqnozlaşdırıla biləcəyi tərcümə kimi aşağı entropiyası olan tapşırıqlar üçün mənalı olsa da, bu, çox fərqli nəticələrə sahib çıxışların olduğu dialoq və hekayə yaratma kimi yüksək entropiyalı tapşırıqlar üçün təsadüfi görünür. Uzunluqlar ümumiyyətlə eyni dərəcədə etibarlıdır.

Eyni zamanda, yüksək entropiya nəsli ilə əlaqəli tapşırıqlara dair ən azı iki nüfuzlu məqalə ([4, 5]) nəşr olundu, burada həris addımda açgözlü / şüa axtarışının dekodlaşdırılması növbəti nişan paylanmasından seçmə ilə əvəz olundu. Bu işdə nümunə götürmənin top k nümunəsi adlanan bir variantı istifadə edildi, burada dekoder yalnız ən çox ehtimal olunan mö'cüzələrdən (k hiperparametrdir) nümunələr götürdü.

Bu son işçi meylinin son daşı bu yaxınlarda Ari Holtzman et al. [6], şüa axtarışı və açgözlü deşifrə ilə yaradılan mətnlərdəki söz bölgüsünün, süni mətnlərdəki söz bölgülərindən çox fərqli olduğunu göstərdi. Dialoq sistemləri kontekstində [7, 8] də bildirildiyi kimi, şüaların axtarışı və açgözlü deşifrənin insan mətnlərinin paylanmasının bəzi cəhətlərini çoxalda bilməyəcəyi aydındır:

Solda: GPT-2 ilə insan tərəfindən yaradılan jetonlara və radiasiya axtarışına təyin olunmuş ehtimal (insan mətnindəki radiasiya axtarışı ilə çoxalmayan böyük fərqi qeyd edin). Sağda: İnsan və maşın tərəfindən yaradılan mətnlərdə N-qram paylanması (Yaw / ray axtarış və tarama dekodlaşdırma üsulları arasında tam ayrılığa diqqət yetirin).

Hal-hazırda uğurlu radiasiya axtarışı / açgözlü deşifrə üçün ən ümidverici iki namizəd top-k və nüvə (və ya top-p) taramasıdır. Bu iki metodun ümumi prinsipi, bu paylanmanı süzdükdən sonra yalnız yuxarı k jetonlarını (yuxarı k) və ya yuxarıdakı məcmu ehtimala sahib yuxarı nişanları tapmaq üçün paylamanın seçilməsidir. saxlamaq üçün bir eşik (core / top-k). p).

Beləliklə top-k və / və ya nüvə / top-p nümunəsi ilə deşifrə edə bilərik:

İndi modelimizlə danışmağa hazırıq

İnteraktiv skript burada (interact.py) və ssenarini çalıştırmaq istəmirsinizsə, sadəcə burada olan canlı demomuzla oynaya bilərsiniz.

Budur bir dialoq nümunəsi:

Varsayılan parametrlərlə interaktiv skriptlərdən istifadə nümunəsi - bot şəxsiyyəti: ildə iyirmi kitab oxuyuram. Mən ikinci işim kimi kaskaderəm. Mən yalnız koşer yeyirəm. Yalnız bir valideyn olan bir ailədə böyümüşəm.

Lusion Nəticə

Sadə, müasir danışıq zəkası yaratmaq üçün köçürmə öyrənməsindən və OpenAI GPT kimi əhatəli bir dil modelindən necə istifadə edə biləcəyinizi izah edən bu yazının sonuna gəldik.

Hugging Face-də öyrəndik ki, danışıq zəkanınızı tez bir zamanda işə salmaq uğur üçün ən yaxşı reseptdir. Ümid edirik ki, bu, bəzilərinizə bunu etməyə kömək edir!

Əlaqədar demo və kodu yoxladığınızdan əmin olun:

  • Canlı demo orada və
  • Açıq qaynaq kodu və əvvəlcədən hazırlanmış modellər burada.

Həmişə olduğu kimi, bu yazını bəyəndinizsə, ətrafınızdakı xəbərləri bizə bildirmək üçün bir neçə give verin!

İstinadlar:

[1] ^ Ilya Kulikov, Alexander H. Miller, Kyunghyun Cho və Jason Weston tərəfindən sinir dialoqunun modelləşdirilməsi üçün bir axtarış strategiyasının əhəmiyyəti (http://arxiv.org/abs/1811.00907)

[2] ^ Kenton Murray, David Chiang tərəfindən sinir aparatı tərcüməsində uzunluq təhrifinin düzəldilməsi (http://arxiv.org/abs/1808.10006)

[3] ^ Şüa Axtarış Lənətinin Sındırılması: Yilin Yang, Liang Huang və Mingbo Ma tərəfindən Sinir Maşın Tərcüməsi Üçün Yenidən Qiymətləndirmə Metodları və Sinir Maşın Tərcümə meyarlarının dayandırılması üzərində iş (https://arxiv.org/abs/1808.09582)

[4] ^ Angela Fan, Mike Lewis və Yann Dauphin tərəfindən hazırlanmış Hiyerarşik Sinir Hekayələri Nəsli (https://arxiv.org/abs/1805.04833)

[5] ^ Dil modelləri, Alec Radford, Jeff Wu, Rewon Child, David Luan, Dario Amodei və Ilya Sutskeverdən nəzarətsiz çox vəzifəli şagirdlərdir (https://openai.com/blog/better-language-models/)

[6] ^ Ari Holtzman, Jan Buys, Maxwell Forbes və Yejin Choi tərəfindən qəribə sinir mətni dejenerasyonu (https://arxiv.org/abs/1904.09751)

[7] ^ Alın və dəqiqləşdirin: Jason Weston, Emily Dinan və Alexander H. Miller tərəfindən Dialoq üçün Təkmilləşdirilmiş Səs Nəsil Modelləri (https://arxiv.org/abs/1808.04776)

[8] ^ Emily Dinan və digərlərinin ikinci Conversational Intelligence Challenge (ConvAI2). (https://arxiv.org/abs/1902.00098)