From 40c51fbe3ae184e0771a35aa00f8197ce14e5a77 Mon Sep 17 00:00:00 2001 From: lewtun Date: Thu, 15 Feb 2024 14:17:08 +0100 Subject: [PATCH] Bump release (#682) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * refactor: rephrase text to improve clarity and specificity In context to "training with a dataset specific to your task" and "train directly for the final task", I was not able to infer easily that "directly" here implies training from scratch. * Demo link fixes (#562) * demo link fixes * minor demo fix * Bump release (#566) * Add note about `remove_unused_columns` for whole word masking * Merge pull request #24 from huggingface/fix-typo Fix typo * Merge pull request #26 from huggingface/fix-qa-offsets Fix inequalities in answer spans for QA chapter * Merge pull request #30 from huggingface/fix-modelcard-url Update model card URL * Merge pull request #69 from yulonglin/patch-1 Correct typo mixing up space and newline symbols * Bump release (#99) * Bump release * Update author list Co-authored-by: DOOHAE JUNG Co-authored-by: m_khandaker Co-authored-by: Md. Al-Amin Khandaker Co-authored-by: ftarlaci <18291571+ftarlaci@users.noreply.github.com> Co-authored-by: Doohae Jung <80743307+Doohae@users.noreply.github.com> Co-authored-by: melaniedrevet * Bump release (#115) * ko-chapter1/1 * ko _toctree.yml created * Fix the issue #80 * Single expression changed * ko/chapter1 finished * ko/chapter0 finished * ko/chapter0 finished * reviewed by @bzantium ko/chapter0 * reviewed by @bzantium chapter0 & fixed typo * reviewed by @rainmaker712 * maximize Korean expressions * [Chapter 1] bangla traslation initial commit * Update 1.mdx update and fix formating * Fix formating and typos * translate _toctree.yml 0-1 chapter * Add Korean to CI * [tr] Translated chapter1/2.mdx * remove translation from sec titles not yet translated * Add authors [th ru] * [FIX] _toctree.yml * Update chapters/bn/chapter0/1.mdx [FIX] syntax formatting Co-authored-by: lewtun * tag typos & indentation & unnatural expressions * modified toctree.yml for chapter1/2 * modified toctree.yml for chapter1/2 & fix typo * French Translation - Chapter 5 * Add Bengali to CI * Update author list * Adding translations for 2/4 and 2/5 🚀 (#74) * Adding translations for 2/4 and 2/5 🚀 * Remove English content Co-authored-by: lewtun * Translation to Russian (#97) * translation of chapter 2/section 1 * add section 1 / chapter 2 to _toctree.yml * Translation of Chapter0 to Hindi (#86) * Hindi?Chapter0-Part_1 * Hindi/Chapter0-Part_2 * Chapter 0 Persian Translation First Draft (#95) * merged branch0 into main. no toctree yet. * updated toctree. * Updated the glossary with terms from chapter0. * Second draft in collab w/ @schoobani. Added empty chapter1 for preview. * Glossary typo fix. * Translation of Chapter0 (setup) to Arabic (#104) * Add AR translation for `introduction` * Fix alignment & format * Add Arabic to CI build * Russian - Chapter 1 finished (#98) * 01/4 start * 1/4 finished * 1/5 finished * 1/5 update toc * 1/6 finished * 1/7 finished * 1/8 finished * 1/9 finished * 1/4 fix * toc update * Chinese - Chapter 1 finished (#113) * Chinese - Chapter 1 finished * Add zh to the languages field Co-authored-by: petrichor1122 <87262598+petrichor1122@users.noreply.github.com> Co-authored-by: zhlhyx <95976146+zhlhyx@users.noreply.github.com> * [PT] Translation of chapter 2 (#107) * add PT translate to 2.1 * add PT translate to 2.2 * add portuguese translation to 2.3 * WIP portuguese translation to 2.4 * add portuguese translation to 2.4 * add portuguese translation to 2.5 * add portuguese translation to 2.6 * add _toctree infos Co-authored-by: lewtun * [FR] Translation of chapter 2 & event + Review of chapters 0 & 5 (#106) * Update _toctree.yml Add chapter 2 + little fix of chapter 5 * Update 1.mdx Review of chapter 0 * Create 1.mdx * Create 2.mdx * Create 3.mdx * Create 4.mdx * Create 5.mdx * Create 6.mdx * Create 7.mdx * Create 8.mdx * Update 8.mdx Since AutoNLP has recently been renamed to AutoTrain, let me make the correction on the English file * Update 1.mdx Review of chapter 5/1 * Update 2.mdx Review of chapter 5/2 * Update 3.mdx Review of chapter 5/3 * Update 4.mdx Review of chapter 5/4 * Update 5.mdx Review of chapter 5/5 * Update 6.mdx Review of chapter 5/6 * Update 7.mdx Review of chapter 5/7 * Update 8.mdx Review of chapter 5/8 * Create 1.mdx event's translation * Update _toctree.yml add event to the tree * Update _toctree.yml deletion of the files that pose a problem to pass the checks, will be resubmitted in another PR * Delete 1.mdx deletion of the files that pose a problem to pass the checks, will be resubmitted in another PR * make style correction * Update _toctree.yml the - * Fix spacing Co-authored-by: Lewis Tunstall * [th] Translated Chapter2/1 (#83) * Finish chapter2/1 * Update _toctree.yml * ko-chapter1/1 * ko _toctree.yml created * Fix the issue #80 * Single expression changed * ko/chapter1 finished * ko/chapter0 finished * ko/chapter0 finished * reviewed by @bzantium ko/chapter0 * reviewed by @bzantium chapter0 & fixed typo * reviewed by @rainmaker712 * maximize Korean expressions * [Chapter 1] bangla traslation initial commit * Update 1.mdx update and fix formating * Fix formating and typos * translate _toctree.yml 0-1 chapter * Add Korean to CI * remove translation from sec titles not yet translated * Add authors [th ru] * [FIX] _toctree.yml * Update chapters/bn/chapter0/1.mdx [FIX] syntax formatting Co-authored-by: lewtun * tag typos & indentation & unnatural expressions * modified toctree.yml for chapter1/2 * modified toctree.yml for chapter1/2 & fix typo * Add Bengali to CI * Update author list * Adding translations for 2/4 and 2/5 🚀 (#74) * Adding translations for 2/4 and 2/5 🚀 * Remove English content Co-authored-by: lewtun * Translation to Russian (#97) * translation of chapter 2/section 1 * add section 1 / chapter 2 to _toctree.yml * Translation of Chapter0 to Hindi (#86) * Hindi?Chapter0-Part_1 * Hindi/Chapter0-Part_2 * Chapter 0 Persian Translation First Draft (#95) * merged branch0 into main. no toctree yet. * updated toctree. * Updated the glossary with terms from chapter0. * Second draft in collab w/ @schoobani. Added empty chapter1 for preview. * Glossary typo fix. * Translation of Chapter0 (setup) to Arabic (#104) * Add AR translation for `introduction` * Fix alignment & format * Add Arabic to CI build * Russian - Chapter 1 finished (#98) * 01/4 start * 1/4 finished * 1/5 finished * 1/5 update toc * 1/6 finished * 1/7 finished * 1/8 finished * 1/9 finished * 1/4 fix * toc update * Chinese - Chapter 1 finished (#113) * Chinese - Chapter 1 finished * Add zh to the languages field Co-authored-by: petrichor1122 <87262598+petrichor1122@users.noreply.github.com> Co-authored-by: zhlhyx <95976146+zhlhyx@users.noreply.github.com> * [PT] Translation of chapter 2 (#107) * add PT translate to 2.1 * add PT translate to 2.2 * add portuguese translation to 2.3 * WIP portuguese translation to 2.4 * add portuguese translation to 2.4 * add portuguese translation to 2.5 * add portuguese translation to 2.6 * add _toctree infos Co-authored-by: lewtun * [FR] Translation of chapter 2 & event + Review of chapters 0 & 5 (#106) * Update _toctree.yml Add chapter 2 + little fix of chapter 5 * Update 1.mdx Review of chapter 0 * Create 1.mdx * Create 2.mdx * Create 3.mdx * Create 4.mdx * Create 5.mdx * Create 6.mdx * Create 7.mdx * Create 8.mdx * Update 8.mdx Since AutoNLP has recently been renamed to AutoTrain, let me make the correction on the English file * Update 1.mdx Review of chapter 5/1 * Update 2.mdx Review of chapter 5/2 * Update 3.mdx Review of chapter 5/3 * Update 4.mdx Review of chapter 5/4 * Update 5.mdx Review of chapter 5/5 * Update 6.mdx Review of chapter 5/6 * Update 7.mdx Review of chapter 5/7 * Update 8.mdx Review of chapter 5/8 * Create 1.mdx event's translation * Update _toctree.yml add event to the tree * Update _toctree.yml deletion of the files that pose a problem to pass the checks, will be resubmitted in another PR * Delete 1.mdx deletion of the files that pose a problem to pass the checks, will be resubmitted in another PR * make style correction * Update _toctree.yml the - * Fix spacing Co-authored-by: Lewis Tunstall * [th] Translated Chapter2/1 (#83) * Finish chapter2/1 * Update _toctree.yml * Add Hindi to CI (#116) Co-authored-by: DOOHAE JUNG Co-authored-by: m_khandaker Co-authored-by: Md. Al-Amin Khandaker Co-authored-by: ftarlaci <18291571+ftarlaci@users.noreply.github.com> Co-authored-by: Doohae Jung <80743307+Doohae@users.noreply.github.com> Co-authored-by: melaniedrevet Co-authored-by: Jose M Munoz Co-authored-by: svv73 <88366711+svv73@users.noreply.github.com> Co-authored-by: Vedant Pandya Co-authored-by: Bahram Shamshiri Co-authored-by: Giyaseddin Bayrak <34009210+giyaseddin@users.noreply.github.com> Co-authored-by: Pavel <60391448+pdumin@users.noreply.github.com> Co-authored-by: 1375626371 <40328311+1375626371@users.noreply.github.com> Co-authored-by: petrichor1122 <87262598+petrichor1122@users.noreply.github.com> Co-authored-by: zhlhyx <95976146+zhlhyx@users.noreply.github.com> Co-authored-by: João Gustavo A. Amorim Co-authored-by: lbourdois <58078086+lbourdois@users.noreply.github.com> Co-authored-by: Cherdsak Kingkan * Bump release 4 (#133) * Bump release (#138) * ko-chapter1/1 * ko _toctree.yml created * Fix the issue #80 * Single expression changed * ko/chapter1 finished * ko/chapter0 finished * ko/chapter0 finished * reviewed by @bzantium ko/chapter0 * reviewed by @bzantium chapter0 & fixed typo * reviewed by @rainmaker712 * maximize Korean expressions * [Chapter 1] bangla traslation initial commit * Update 1.mdx update and fix formating * Fix formating and typos * translate _toctree.yml 0-1 chapter * Add Korean to CI * [tr] Translated chapter1/2.mdx * remove translation from sec titles not yet translated * Add authors [th ru] * [FIX] _toctree.yml * Update chapters/bn/chapter0/1.mdx [FIX] syntax formatting Co-authored-by: lewtun * tag typos & indentation & unnatural expressions * modified toctree.yml for chapter1/2 * modified toctree.yml for chapter1/2 & fix typo * French Translation - Chapter 5 * Add Bengali to CI * Update author list * Adding translations for 2/4 and 2/5 🚀 (#74) * Adding translations for 2/4 and 2/5 🚀 * Remove English content Co-authored-by: lewtun * Translation to Russian (#97) * translation of chapter 2/section 1 * add section 1 / chapter 2 to _toctree.yml * Translation of Chapter0 to Hindi (#86) * Hindi?Chapter0-Part_1 * Hindi/Chapter0-Part_2 * Chapter 0 Persian Translation First Draft (#95) * merged branch0 into main. no toctree yet. * updated toctree. * Updated the glossary with terms from chapter0. * Second draft in collab w/ @schoobani. Added empty chapter1 for preview. * Glossary typo fix. * Translation of Chapter0 (setup) to Arabic (#104) * Add AR translation for `introduction` * Fix alignment & format * Add Arabic to CI build * Russian - Chapter 1 finished (#98) * 01/4 start * 1/4 finished * 1/5 finished * 1/5 update toc * 1/6 finished * 1/7 finished * 1/8 finished * 1/9 finished * 1/4 fix * toc update * Chinese - Chapter 1 finished (#113) * Chinese - Chapter 1 finished * Add zh to the languages field Co-authored-by: petrichor1122 <87262598+petrichor1122@users.noreply.github.com> Co-authored-by: zhlhyx <95976146+zhlhyx@users.noreply.github.com> * [PT] Translation of chapter 2 (#107) * add PT translate to 2.1 * add PT translate to 2.2 * add portuguese translation to 2.3 * WIP portuguese translation to 2.4 * add portuguese translation to 2.4 * add portuguese translation to 2.5 * add portuguese translation to 2.6 * add _toctree infos Co-authored-by: lewtun * [FR] Translation of chapter 2 & event + Review of chapters 0 & 5 (#106) * Update _toctree.yml Add chapter 2 + little fix of chapter 5 * Update 1.mdx Review of chapter 0 * Create 1.mdx * Create 2.mdx * Create 3.mdx * Create 4.mdx * Create 5.mdx * Create 6.mdx * Create 7.mdx * Create 8.mdx * Update 8.mdx Since AutoNLP has recently been renamed to AutoTrain, let me make the correction on the English file * Update 1.mdx Review of chapter 5/1 * Update 2.mdx Review of chapter 5/2 * Update 3.mdx Review of chapter 5/3 * Update 4.mdx Review of chapter 5/4 * Update 5.mdx Review of chapter 5/5 * Update 6.mdx Review of chapter 5/6 * Update 7.mdx Review of chapter 5/7 * Update 8.mdx Review of chapter 5/8 * Create 1.mdx event's translation * Update _toctree.yml add event to the tree * Update _toctree.yml deletion of the files that pose a problem to pass the checks, will be resubmitted in another PR * Delete 1.mdx deletion of the files that pose a problem to pass the checks, will be resubmitted in another PR * make style correction * Update _toctree.yml the - * Fix spacing Co-authored-by: Lewis Tunstall * [th] Translated Chapter2/1 (#83) * Finish chapter2/1 * Update _toctree.yml * Add Hindi to CI (#116) * Update README.md (#87) * Update authors on README (#120) * Update authors * French translation `Chapter1` full (#56) * traduction 1st part of chapter1 * fix typo * fix job titles and encoder-decoder translation * add part 2 for 1st chapter * fix some typo part2 * fix Transformer -> Transformers * add part 3 not totally ended * end of part3 of chapter1 * part9 chapter 1 * add part7 chapter 1 * add part5 chapter 1 * part 6 chapter 1 * add part8 chapter 1 * end quizz of chapter * add last part of chapter 1 Co-authored-by: ChainYo * Translate to Japanese Chapter0 (#123) * start working * translate chapter0/1.mdx * [FA] First draft of Chapter2/Page2 (#129) * merged branch0 into main. no toctree yet. * updated toctree. * Updated the glossary with terms from chapter0. * Second draft in collab w/ @schoobani. Added empty chapter1 for preview. * Glossary typo fix. * Added missing backticks. * Removed a couple of bad indefinite articles I forgot. * First draft of ch2/p2. Adds to glossary. Trans. guidelines moved out. * Fixed missing diacritics, fixed the py/tf switch placing. Other fixes. * Changed the equivalent for prediction per @kambizG 's direction. * Redid ambiguous passage in translation per @lewtun 's direction. * [th] Finished whole Chapter 2 translation (#127) * Finish chapter2/1 * delete untranslated files * chapter2/2 WIP * Delete WIP files * WIP chapter2/2 * Fixed conflict * Update _toctree.yml * Update _toctree.yml * Finished Chapter2/2 * Finish all chapter2/n * Finish all chapter2/n * Fixed Ch2/8 as PR run failed * [de] Translation Chapter 0 (#130) * Copy files to newly created german dir (de) * Add translation for chapter 0 * Clean up english files for chapter 1 * Change _toctree.yml for chapter 0 * Fix whitespaces * Fix whitespaces again * Adjust _toctree.yml - leave only chaper 0 * Add German language (de) to workflow yaml files * [de] German Translation Guide (#132) * German Translation Guide * Add German Glossary to TOC * Chapter 1, Section 1 Bengali translation (#124) * [ADD] Chapter 1, Section 1 benglai tranlation * [FIX] toc * [FIX] commit mistakes * [FIX] remove the Eng duplicates Co-authored-by: m_khandaker * [FR] Review of chapters 0, 2 & 5 + add chapters 6, 7, 8 & event (#125) * Create 1.mdx Event translation * Create 1.mdx * Chapter 6 in French * Update 1.mdx fix italic * Update 9.mdx fix italic * Update 3.mdx fix italic * Update 4.mdx fix italic * Update 4.mdx * Update 1.mdx little fix * Update 2.mdx little fix * Update 4.mdx fix italic * Update 8.mdx fix italic * Update 1.mdx little fix * Update 2.mdx little fix * Update 3.mdx little fix * Update 5.mdx little fix * Update 7.mdx little fix * Update 8.mdx little fix * add chapter8 * Update 6.mdx fix italic * Update 3.mdx fix, fix everywhere * Update 2.mdx fix, fix everywhere * Update 4.mdx fix, fix everywhere * Update 4_tf.mdx fix, fix everywhere * Add files via upload add chapter 7 * Update 1.mdx fix links * Update 2.mdx fix, fix everywhere * Update 3.mdx fix, fix everywhere * Update 4.mdx fix, fix everywhere * Update 5.mdx * Update 6.mdx fix, fix everywhere * Update 7.mdx fix, fix everywhere * Update 3.mdx fix link * Update 8.mdx fix link * Update 2.mdx fix link * Update 4.mdx little fix * Update 6.mdx * Update 7.mdx * Update 8.mdx fix * Update 2.mdx little fix * Update 3.mdx little fix * Update 5.mdx * Update 4_tf.mdx little fix * Update _toctree.yml Forgot the toctree * Update _toctree.yml fix local fields * Update _toctree.yml My bad, I forgot some 🙃 * Update 7.mdx I don't know why it was there... * Update 1.mdx * [de] Chapter 3 translation (#128) * chapter 3 part 1 DE * [DE] Chapter 3 - Part 2 * Prepare TOC-Tree * Fein-tuning * Initial translation * Glossary additions for C3P3 * C3P2 style * [de] Chapter 3 P3-TF initial translation * [de] Chapter 3 P4 initial translation * [de] Chapter 3 Part 5 initial translation * [de] Chapter 3 P6 Initial translation * Missing commas * fixing quotes * Mark third option on chapter 8, question 8 as correct (#135) * doc_change(translation): translating course from english to gujarati (#126) * change(translation): chapter0 to gujarati content translated: Chapter0/1.mdx - Introduction commit-by: menonashwathi4@gmail.com * Revert "change(translation): chapter0 to gujarati" This reverts commit c27e06992af8892687f343a19368ce322d69e8b2. * doc_change(translation): translation to gj translated content: chapters/gj/chapter0.mdx - introduction * doc_change(translation): translation to gj translated content: chapters/gj/chapter0.mdx - introduction * Delete _toctree.yml * change: adding gj to github workflow * nit: fix heading * Update authors (#136) * [FA] First draft of Chapter4/Page1 (#134) * added chapter4 title and it's first section * added first draft of Chapter4/Page1 * minor fix * updated the title according to convention * applied some updates according to convention * added footnotes, minor improvements * applied tweaks according to review points * the new draft of glossary according to PR #134 * fixed an inconsistant title * minor fix for better compatibility with T points * applied final touches for this round of G updates * [FR] End of chapter 3 + chapter 4 (#137) * add chapters 3 & 4 * Update 2.mdx fix links * Update 3.mdx some fix * Update 6.mdx fix tag * Update 3.mdx add link to chapter 7 * Update 3_tf.mdx add link to chapter 7 * Update _toctree.yml Co-authored-by: DOOHAE JUNG Co-authored-by: m_khandaker Co-authored-by: Md. Al-Amin Khandaker Co-authored-by: ftarlaci <18291571+ftarlaci@users.noreply.github.com> Co-authored-by: Doohae Jung <80743307+Doohae@users.noreply.github.com> Co-authored-by: melaniedrevet Co-authored-by: Jose M Munoz Co-authored-by: svv73 <88366711+svv73@users.noreply.github.com> Co-authored-by: Vedant Pandya Co-authored-by: Bahram Shamshiri Co-authored-by: Giyaseddin Bayrak <34009210+giyaseddin@users.noreply.github.com> Co-authored-by: Pavel <60391448+pdumin@users.noreply.github.com> Co-authored-by: 1375626371 <40328311+1375626371@users.noreply.github.com> Co-authored-by: petrichor1122 <87262598+petrichor1122@users.noreply.github.com> Co-authored-by: zhlhyx <95976146+zhlhyx@users.noreply.github.com> Co-authored-by: João Gustavo A. Amorim Co-authored-by: lbourdois <58078086+lbourdois@users.noreply.github.com> Co-authored-by: Cherdsak Kingkan Co-authored-by: Thomas Chaigneau <50595514+ChainYo@users.noreply.github.com> Co-authored-by: ChainYo Co-authored-by: hiromu <45531573+hiromu166@users.noreply.github.com> Co-authored-by: Cherdsak Kingkan Co-authored-by: Marcus Fraaß Co-authored-by: Jesper Dramsch Co-authored-by: amyeroberts Co-authored-by: Ash <103081562+ashwathim@users.noreply.github.com> Co-authored-by: Hamed Homaei Rad * Bump release (#147) * Bump release (#161) * Fix typos in chapter 9 (#176) (#180) Co-authored-by: regisss <15324346+regisss@users.noreply.github.com> * Bump release (#187) * Chapter 2 Section 1 Bengali Translation (huggingface#72) (#168) * [TH] Chapter 6 Section 1 and 2 (#171) Co-authored-by: Suteera * [FA] CH1 / P1-2 (#142) * Spanish Chapter 3: sections 1 & 2 (#162) * fix typos in bpe, wordpiece, unigram (#166) * [FR] French Review (#186) * Part 7: Training a causal... fixes (#179) * typo & error mitigation * consistency * Trainer.predict() returns 3 fields * ran make style * [TR] Translated Chapter 1.6 🤗 (#185) * added chapter 1/6 to _toctree.yml * [TR] Translated Chapter 1.6 🤗 Co-authored-by: Avishek Das Co-authored-by: Suteera Seeha <33692408+meanna@users.noreply.github.com> Co-authored-by: Suteera Co-authored-by: Saeed Choobani Co-authored-by: Fermin Ordaz Co-authored-by: Kerem Turgutlu Co-authored-by: lbourdois <58078086+lbourdois@users.noreply.github.com> Co-authored-by: Sebastian Sosa <37946988+CakeCrusher@users.noreply.github.com> Co-authored-by: tanersekmen <56790802+tanersekmen@users.noreply.github.com> * Bump release 10 (#194) * Bump release (#195) * Bump release 12 (#209) * Bump release (#224) * Bump release (#229) * Bump release (#236) * Bump release (#258) * Bump release (#270) * Bump release (#274) * Bump release (#286) * Bump release (#288) * Chapter 2 Section 1 Bengali Translation (huggingface#72) (#168) * [TH] Chapter 6 Section 1 and 2 (#171) Co-authored-by: Suteera * [FA] CH1 / P1-2 (#142) * Spanish Chapter 3: sections 1 & 2 (#162) * fix typos in bpe, wordpiece, unigram (#166) * [FR] French Review (#186) * Part 7: Training a causal... fixes (#179) * typo & error mitigation * consistency * Trainer.predict() returns 3 fields * ran make style * [TR] Translated Chapter 1.6 🤗 (#185) * added chapter 1/6 to _toctree.yml * [TR] Translated Chapter 1.6 🤗 * [PT][Chapter 01 - 2.mdx] - issue #51 (#170) * Fix Gradio ToC (#193) * Add Gradio authors and Blocks event (#189) * Update 6.mdx (#188) Correct link to Transformer XL doc * Add translating notes and glossary to Spanish (#192) * Add translating notes and glosary to Spanish * Adding glossary to the toc * add pt 4.3 (#191) * [FR] Visual corrections (#190) * [PT] add chapter 4.4 and 4.5 (#196) * fix invite discord link (#197) * [FA] Second draft of CH2/P1-2 (#139) * added chapter3 in hindi (#198) * [TR] Chapter 3/1 (#165) * [RU] Ch3-1/2/3 (#200) * [PT] add 5.1 and 5.2 (#204) * [FA] - Ch3 - P1 and P2 (#199) * [PT] add `end-of-chapter quiz` for chapter 4 (4.6) (#201) Co-authored-by: lewtun * Chapter1: 2.mdx Translated. (#206) * Remove comments from Persian ToC (#210) * Fix CI URL for PRs (#211) * code fragment & english syntax and meaning (#203) * Updated Ch1/1 with Emoji (#214) * Add missing numpy import (#217) * [ES] translate sections 8.1 and 8.2 (#215) * Fix path to datasets (#216) * [PT] add 5.3 (#218) * fix 4.3 (#223) * Fix notebook generation (#227) * Add Gradio nb links * add 5.4 (#226) * add pt wip (#225) * Added Gujarati List. (#221) * Add Gradio nbs links to fr (#228) * Chinese - Chapter 3finished (#219) * add ch7 at _toctree and translate 7.1 (#222) * add 5.5 (#235) * [FR] Review of chapter 7 (#233) * Italian translation - chapter 4 (#230) * Added Thai translation of chapters 3 (#231) * [Ru] Add part 2, chapter 2 (#234) * Update 8.mdx (#237) - Remove Gradio Blocks Party - Add, Where to next? section * Created HI/Chapter1/5.mdx (#232) * Add Spanish chaper3/section4, update toc and glossary (#238) * [RU] Chapter 3 finished (#239) * [PT] add 5.6 and 5.7 (#240) * [EN] Visual corrections (#245) * Translation for 1/4, 1/5 and 1/6. (#247) * add event in PT (#250) * Pin version of black (#252) * Translate ja event (#241) * [PT] add quiz chapter 5 (#243) * Update 5.mdx (#253) inconsistent naming with line 327 * Translation for Traditional Chinese (zh-tw) chapter0 (#251) Co-authored-by: Lewis Tunstall * Translated the whole Chapter 3 to Thai (#255) * Japanese chapter 4 (#244) * Translation of 1/7, 1/8, and 1/9. (#263) * [PT] add chapter 8.1 and 8.2 (#265) * [RU] Chapter 4 (#269) * Add Thai translation for chapter 6.3b to 6.10 (#268) * add 8.3 (#266) * 3.mdx of chapter 01 (#260) Co-authored-by: Lewis Tunstall * Fix typo (#271) * [PT] add chapter 6.1 (#273) * add Japanese chapter7 (#267) * replace `load_metric` with `evaluate.load` (#285) * update `load_metric` refs to `evaluate.load` Co-authored-by: lewtun * [GJ] Translation to Gujarati - Ch0 Setup (#287) * [PT] add chapter 6.2 and 6.3 (#279) * zh-CN - Chapter 4,5finished (#281) Co-authored-by: Lewis Tunstall * Chapter 01 - Done [PT] #51 (#280) Co-authored-by: Lewis Tunstall Co-authored-by: Avishek Das Co-authored-by: Suteera Seeha <33692408+meanna@users.noreply.github.com> Co-authored-by: Suteera Co-authored-by: Saeed Choobani Co-authored-by: Fermin Ordaz Co-authored-by: Kerem Turgutlu Co-authored-by: lbourdois <58078086+lbourdois@users.noreply.github.com> Co-authored-by: Sebastian Sosa <37946988+CakeCrusher@users.noreply.github.com> Co-authored-by: tanersekmen <56790802+tanersekmen@users.noreply.github.com> Co-authored-by: Victor Costa <54755870+victorescosta@users.noreply.github.com> Co-authored-by: Camille Couturier Co-authored-by: João Gustavo A. Amorim Co-authored-by: Bahram Shamshiri Co-authored-by: Kavya <36916536+robotjellyzone@users.noreply.github.com> Co-authored-by: Batuhan Ayhan Co-authored-by: Pavel <60391448+pdumin@users.noreply.github.com> Co-authored-by: Kambiz Ghoorchian Co-authored-by: Vedant Pandya Co-authored-by: Diego Vargas <91356068+dzarkV@users.noreply.github.com> Co-authored-by: Thomas O'Brien Co-authored-by: Lincoln V Schreiber Co-authored-by: 1375626371 <40328311+1375626371@users.noreply.github.com> Co-authored-by: Giorgio Severi Co-authored-by: svv73 <88366711+svv73@users.noreply.github.com> Co-authored-by: Ömer Faruk Özdemir Co-authored-by: Caterina Bonan <97481648+CaterinaBi@users.noreply.github.com> Co-authored-by: Hiromu Hota Co-authored-by: trtd56 <5toda6@gmail.com> Co-authored-by: Mehrdad Nezamdoost Co-authored-by: Wolvz Co-authored-by: a-krirk <56425947+a-krirk@users.noreply.github.com> Co-authored-by: atgctg <105969161+atgctg@users.noreply.github.com> Co-authored-by: Thiago Medeiros Co-authored-by: webbigdata-jp <87654083+webbigdata-jp@users.noreply.github.com> Co-authored-by: Leandro von Werra Co-authored-by: Bhadresh Savani * Bump release (#295) * Bump release (#296) * Bump release (#299) * Bump release (#305) * Chinese - Chapter 1 finished * Add zh to the languages field Add zh to the languages field in the build_documentation.yml and build_pr_documentation.yml files * Remove untranslated chapters in _toctree.yml Remove all these sections that haven't been translated yet Remove Chapter 0 from the table of contents since it hasn't been translated yet * Fixed an error in the translation format Fixed an error in the translation format of Chapter 1, Section 3 * Added a small part of the missing content * Fix style * Complete the translation of Chapters 0 and 2 * Fixed some bugs ·Fixed some formatting errors ·Moved Chapters 0 and 2 to Simplified Chinese * Add files via upload Formatting revisions and some translation corrections * run make style to format chapter1 session3 * run make style to format code * run make style to format code * Fix style * Chapter 2 Section 1 Bengali Translation (huggingface#72) (#168) * [TH] Chapter 6 Section 1 and 2 (#171) Co-authored-by: Suteera * [FA] CH1 / P1-2 (#142) * Spanish Chapter 3: sections 1 & 2 (#162) * fix typos in bpe, wordpiece, unigram (#166) * [FR] French Review (#186) * Part 7: Training a causal... fixes (#179) * typo & error mitigation * consistency * Trainer.predict() returns 3 fields * ran make style * [TR] Translated Chapter 1.6 🤗 (#185) * added chapter 1/6 to _toctree.yml * [TR] Translated Chapter 1.6 🤗 * [PT][Chapter 01 - 2.mdx] - issue #51 (#170) * Fix Gradio ToC (#193) * Add Gradio authors and Blocks event (#189) * Update 6.mdx (#188) Correct link to Transformer XL doc * Add translating notes and glossary to Spanish (#192) * Add translating notes and glosary to Spanish * Adding glossary to the toc * add pt 4.3 (#191) * [FR] Visual corrections (#190) * [PT] add chapter 4.4 and 4.5 (#196) * fix invite discord link (#197) * [FA] Second draft of CH2/P1-2 (#139) * added chapter3 in hindi (#198) * [TR] Chapter 3/1 (#165) * [RU] Ch3-1/2/3 (#200) * [PT] add 5.1 and 5.2 (#204) * Add placeholders for audio chapters (#208) * [FA] - Ch3 - P1 and P2 (#199) * [PT] add `end-of-chapter quiz` for chapter 4 (4.6) (#201) Co-authored-by: lewtun * Chapter1: 2.mdx Translated. (#206) * Remove comments from Persian ToC (#210) * Fix CI URL for PRs (#211) * code fragment & english syntax and meaning (#203) * Updated Ch1/1 with Emoji (#214) * Add missing numpy import (#217) * Updata chapter3 * Code format for chapter3 * Updata yml file of chapter3 * Uptata yml file of chapter3 * Fix yml file bug * [ES] translate sections 8.1 and 8.2 (#215) * Fix path to datasets (#216) * [PT] add 5.3 (#218) * fix 4.3 (#223) * Run make style * Fix notebook generation (#227) * Add Gradio nb links * add 5.4 (#226) * add pt wip (#225) * Added Gujarati List. (#221) * Fix quality * Add Gradio nbs links to fr (#228) * Fix ToC tree * Remove audio templates * Fix fr section * Fix fr chapter * Chinese - Chapter 3finished (#219) * add ch7 at _toctree and translate 7.1 (#222) * add 5.5 (#235) * [FR] Review of chapter 7 (#233) * Italian translation - chapter 4 (#230) * Added Thai translation of chapters 3 (#231) * [Ru] Add part 2, chapter 2 (#234) * Update 8.mdx (#237) - Remove Gradio Blocks Party - Add, Where to next? section * Created HI/Chapter1/5.mdx (#232) * Add Spanish chaper3/section4, update toc and glossary (#238) * [RU] Chapter 3 finished (#239) * [PT] add 5.6 and 5.7 (#240) * [EN] Visual corrections (#245) * Translation for 1/4, 1/5 and 1/6. (#247) * add event in PT (#250) * Pin version of black (#252) * Translate ja event (#241) * [PT] add quiz chapter 5 (#243) * Update 5.mdx (#253) inconsistent naming with line 327 * Translation for Traditional Chinese (zh-tw) chapter0 (#251) Co-authored-by: Lewis Tunstall * Translated the whole Chapter 3 to Thai (#255) * Japanese chapter 4 (#244) * Translation of 1/7, 1/8, and 1/9. (#263) * [PT] add chapter 8.1 and 8.2 (#265) * [RU] Chapter 4 (#269) * Add Thai translation for chapter 6.3b to 6.10 (#268) * add 8.3 (#266) * 3.mdx of chapter 01 (#260) Co-authored-by: Lewis Tunstall * Fix typo (#271) * [PT] add chapter 6.1 (#273) * add Japanese chapter7 (#267) * zh-CN - Chapter 4,5finished * replace `load_metric` with `evaluate.load` (#285) * update `load_metric` refs to `evaluate.load` Co-authored-by: lewtun * [GJ] Translation to Gujarati - Ch0 Setup (#287) * [PT] add chapter 6.2 and 6.3 (#279) * Fix formatting * Debug formatting * Debug FR formatting * zh-CN - Chapter 4,5finished (#281) Co-authored-by: Lewis Tunstall * Chapter 01 - Done [PT] #51 (#280) Co-authored-by: Lewis Tunstall * tf_default_data_collator seems to have moved * zh-CN - Chapter 6finished * Revert "Merge branch 'huggingface:main' into main" This reverts commit aebb46e12f9f87a4303f8bb4f0f2cf545eb83b21, reversing changes made to 69187a3789e8d3d2d0de821ebe495f111d1cc73d. * Revert "zh-CN - Chapter 6finished" This reverts commit e69fce28d3a7b35b76c4f768a6cedf295b37d8c9. * zh-CN - Chapter 6finished * fix style * undo bad commit * Chapter5it (#278) * added the italian translation for unit 1 chapter5 Co-authored-by: Leandro von Werra * Vietnamese translation (#293) * Update .github/workflows/build_pr_documentation.yml Co-authored-by: lewtun * Translate JP chapter 8 (#249) * Italian translation - Chapter 8 (#272) * Translation to Vietnamese - chapter 5 (#297) * Add course contributors (#298) * Add CourseFloatingBanner component * DocNotebookDropdown -> CourseFloatingBanner * Italian translation Ch 2/1, 2/2 (#300) * Add contributors (#304) * Add forum button (#306) Co-authored-by: 1375626371 <40328311+1375626371@users.noreply.github.com> Co-authored-by: 1375626371 <1375626371@qq.com> Co-authored-by: Avishek Das Co-authored-by: Suteera Seeha <33692408+meanna@users.noreply.github.com> Co-authored-by: Suteera Co-authored-by: Saeed Choobani Co-authored-by: Fermin Ordaz Co-authored-by: Kerem Turgutlu Co-authored-by: lbourdois <58078086+lbourdois@users.noreply.github.com> Co-authored-by: Sebastian Sosa <37946988+CakeCrusher@users.noreply.github.com> Co-authored-by: tanersekmen <56790802+tanersekmen@users.noreply.github.com> Co-authored-by: Victor Costa <54755870+victorescosta@users.noreply.github.com> Co-authored-by: Camille Couturier Co-authored-by: João Gustavo A. Amorim Co-authored-by: Bahram Shamshiri Co-authored-by: Kavya <36916536+robotjellyzone@users.noreply.github.com> Co-authored-by: Batuhan Ayhan Co-authored-by: Pavel <60391448+pdumin@users.noreply.github.com> Co-authored-by: Kambiz Ghoorchian Co-authored-by: Vedant Pandya Co-authored-by: Diego Vargas <91356068+dzarkV@users.noreply.github.com> Co-authored-by: Thomas O'Brien Co-authored-by: Lincoln V Schreiber Co-authored-by: Giorgio Severi Co-authored-by: svv73 <88366711+svv73@users.noreply.github.com> Co-authored-by: Ömer Faruk Özdemir Co-authored-by: Caterina Bonan <97481648+CaterinaBi@users.noreply.github.com> Co-authored-by: Hiromu Hota Co-authored-by: trtd56 <5toda6@gmail.com> Co-authored-by: Mehrdad Nezamdoost Co-authored-by: Wolvz Co-authored-by: a-krirk <56425947+a-krirk@users.noreply.github.com> Co-authored-by: atgctg <105969161+atgctg@users.noreply.github.com> Co-authored-by: Thiago Medeiros Co-authored-by: webbigdata-jp <87654083+webbigdata-jp@users.noreply.github.com> Co-authored-by: Leandro von Werra Co-authored-by: Bhadresh Savani Co-authored-by: Andreas Ehrencrona Co-authored-by: leandro Co-authored-by: Matt Co-authored-by: Nolanogenn <52080100+Nolanogenn@users.noreply.github.com> Co-authored-by: Hồng Hạnh Co-authored-by: Younes Belkada <49240599+younesbelkada@users.noreply.github.com> Co-authored-by: Edoardo Abati <29585319+EdAbati@users.noreply.github.com> Co-authored-by: Mishig Davaadorj Co-authored-by: Acciaro Gennaro Daniele * Bump release (#307) * Bump release (#308) * Bump release (#314) * Bump release (#320) * Bump release (#328) * Bump release (#333) * Bump release (#335) * Bump release (#343) * Bump release (#355) * Bump release (#358) * Bump release (#371) * Bump release (#381) * Bump release (#387) * Bump release (#404) * Bump release (#413) * Bump release (#426) * Bump release (#463) --------- Co-authored-by: DOOHAE JUNG Co-authored-by: m_khandaker Co-authored-by: Md. Al-Amin Khandaker Co-authored-by: ftarlaci <18291571+ftarlaci@users.noreply.github.com> Co-authored-by: Doohae Jung <80743307+Doohae@users.noreply.github.com> Co-authored-by: melaniedrevet Co-authored-by: Jose M Munoz Co-authored-by: svv73 <88366711+svv73@users.noreply.github.com> Co-authored-by: Vedant Pandya Co-authored-by: Bahram Shamshiri Co-authored-by: Giyaseddin Bayrak <34009210+giyaseddin@users.noreply.github.com> Co-authored-by: Pavel <60391448+pdumin@users.noreply.github.com> Co-authored-by: 1375626371 <40328311+1375626371@users.noreply.github.com> Co-authored-by: petrichor1122 <87262598+petrichor1122@users.noreply.github.com> Co-authored-by: zhlhyx <95976146+zhlhyx@users.noreply.github.com> Co-authored-by: João Gustavo A. Amorim Co-authored-by: lbourdois <58078086+lbourdois@users.noreply.github.com> Co-authored-by: Cherdsak Kingkan Co-authored-by: Thomas Chaigneau <50595514+ChainYo@users.noreply.github.com> Co-authored-by: ChainYo Co-authored-by: hiromu <45531573+hiromu166@users.noreply.github.com> Co-authored-by: Cherdsak Kingkan Co-authored-by: Marcus Fraaß Co-authored-by: Jesper Dramsch Co-authored-by: amyeroberts Co-authored-by: Ash <103081562+ashwathim@users.noreply.github.com> Co-authored-by: Hamed Homaei Rad Co-authored-by: Dawood Khan Co-authored-by: regisss <15324346+regisss@users.noreply.github.com> Co-authored-by: Avishek Das Co-authored-by: Suteera Seeha <33692408+meanna@users.noreply.github.com> Co-authored-by: Suteera Co-authored-by: Saeed Choobani Co-authored-by: Fermin Ordaz Co-authored-by: Kerem Turgutlu Co-authored-by: Sebastian Sosa <37946988+CakeCrusher@users.noreply.github.com> Co-authored-by: tanersekmen <56790802+tanersekmen@users.noreply.github.com> Co-authored-by: Victor Costa <54755870+victorescosta@users.noreply.github.com> Co-authored-by: Camille Couturier Co-authored-by: Kavya <36916536+robotjellyzone@users.noreply.github.com> Co-authored-by: Batuhan Ayhan Co-authored-by: Kambiz Ghoorchian Co-authored-by: Diego Vargas <91356068+dzarkV@users.noreply.github.com> Co-authored-by: Thomas O'Brien Co-authored-by: Lincoln V Schreiber Co-authored-by: Giorgio Severi Co-authored-by: Ömer Faruk Özdemir Co-authored-by: Caterina Bonan <97481648+CaterinaBi@users.noreply.github.com> Co-authored-by: Hiromu Hota Co-authored-by: trtd56 <5toda6@gmail.com> Co-authored-by: Mehrdad Nezamdoost Co-authored-by: Wolvz Co-authored-by: a-krirk <56425947+a-krirk@users.noreply.github.com> Co-authored-by: atgctg <105969161+atgctg@users.noreply.github.com> Co-authored-by: Thiago Medeiros Co-authored-by: webbigdata-jp <87654083+webbigdata-jp@users.noreply.github.com> Co-authored-by: Leandro von Werra Co-authored-by: Bhadresh Savani Co-authored-by: 1375626371 <1375626371@qq.com> Co-authored-by: Andreas Ehrencrona Co-authored-by: leandro Co-authored-by: Matt Co-authored-by: Nolanogenn <52080100+Nolanogenn@users.noreply.github.com> Co-authored-by: Hồng Hạnh Co-authored-by: Younes Belkada <49240599+younesbelkada@users.noreply.github.com> Co-authored-by: Edoardo Abati <29585319+EdAbati@users.noreply.github.com> Co-authored-by: Mishig Davaadorj Co-authored-by: Acciaro Gennaro Daniele * Revert "Bump release (#566)" (#567) This reverts commit cccc2c91ac8e702e5e14bbb0419dbf0490c7aaaf. * updated documentation links * [doc build] Use secrets (#581) * docs: fix broken links * changed 'perspires' to 'persists' in chapter 1 quiz solves issue #585 * Update 4.mdx You forgot to write a return for this function. * Update 4.mdx : Fix Typo Should be "course" * fix link * Update 2.mdx updated loading datasets link * Update 2.mdx updated loading datasets link * Update 2.mdx updated loading datasets link * Update 2.mdx updated loading datasets link * Update 2.mdx updated loading datasets link * Update 2.mdx updated loading datasets link * Update 2.mdx updated loading datasets link * Update 2.mdx updated loading datasets link * Update 2.mdx updated loading datasets link * Update 2.mdx updated loading datasets link * Update 2.mdx updated loading datasets link * Update 2.mdx updated loading datasets link * Fix syntax in vi/chapter7/7.mdx There was an unnecessary `` * Remove `get_lr()` from logs which refers to nonexistent function `get_lr()` is called as part of this function, but the function is not declared anywhere in the script. This change removes this portion of the code since it is non-necessary. * Update 4.mdx removed judgmental argument * Update en-version * fix: remove useless token * fix: remove useless token (#635) * Translate Chapter 3 to Spanish (#510) * translate Chapter 3 to Spanish * translate code comments to Spanish and fix typos * Translating Chapter 6 to Spanish (#523) * Translating sections 1 and 2 to spanish * Translating sections 3 to spanish * Translating sections 3b to spanish * Translating sections 4 to spanish * Translating section 5 to spanish * Translating section 6 to spanish * Translating section 7 to spanish * Translating section 8 to spanish * Translating section 9 to spanish * Translating section 10 to spanish * Adding Sections to _toctree.yml * Fixing Typos after second review --------- Co-authored-by: datacubeR * Update 5.mdx Ajuste na tradução de "encoders". São "codificadores", não "decodificadores". Decoders são "decodificadores". * finalize de_ch_4_part2 * add ch 4 parts to table of contents * Update doc CI (#643) * Фиксация текущих результатов. * Фиксирую текущее состояние. * Fixing the transfer results for today. * Translated files 3b and partially 4. Fixing the result. * Fixing today's translation. * fix typos in Spanish translation (#511) * Fixing today's translation. Files: 6.mdx, 7.mdx and half of 8.mdx. * The translation of chapter 6 has been completed. * Delete chapters/en/.ipynb_checkpoints/_toctree-checkpoint.yml This is backup created by JupyterLab. * Delete chapters/en/chapter5/.ipynb_checkpoints/8-checkpoint.mdx This is backup created by JupyterLab. * Delete chapters/en/chapter6/.ipynb_checkpoints/1-checkpoint.mdx This is backup created by JupyterLab. * Delete chapters/en/chapter6/.ipynb_checkpoints/2-checkpoint.mdx This is backup created by JupyterLab. * Delete chapters/en/chapter6/.ipynb_checkpoints/8-checkpoint.mdx This is backup created by JupyterLab. * Delete chapters/en/chapter6/.ipynb_checkpoints/9-checkpoint.mdx This is backup created by JupyterLab. * Delete chapters/ru/.ipynb_checkpoints/TRANSLATING-checkpoint.txt This is backup created by JupyterLab. * Delete chapters/ru/.ipynb_checkpoints/_toctree-checkpoint.yml This is backup created by JupyterLab. * Delete chapters/ru/chapter5/.ipynb_checkpoints/8-checkpoint.mdx This is backup created by JupyterLab. * Update 10.mdx Minor fix. * Update 10.mdx Trying to solve the markup problem. * Update 10.mdx Correcting the syntax of some markup again) * Update chapters/ru/chapter6/4.mdx Yes, that space is redundant here. You're right about that. Co-authored-by: Maria Khalusova * Update chapters/ru/chapter6/4.mdx Extra space. I overlooked it. My mistake. Co-authored-by: Maria Khalusova * Update chapters/ru/chapter6/3.mdx There's an extra space here. You're right. Co-authored-by: Maria Khalusova * Update chapters/ru/chapter6/3.mdx There's an extra space here. You're right. Co-authored-by: Maria Khalusova * Update chapters/ru/chapter6/3b.mdx Yeah, there's no need for a space here. Co-authored-by: Maria Khalusova * Update chapters/ru/chapter6/3.mdx Co-authored-by: Maria Khalusova * Update 3.mdx * Update 7.mdx Translated the comments noted on the review. * Update 3.mdx Translated the missing comments in the code. * Update chapters/ru/chapter6/3b.mdx Yes, an extra space. Co-authored-by: Maria Khalusova * Update chapters/ru/chapter6/5.mdx Minor fix. Co-authored-by: Maria Khalusova * Completed the translation of the first part of Chapter 7 into Russian. * After run python utils/code_formatter.py * Update chapters/ru/chapter7/1.mdx Extra space. Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/2.mdx Extra space. I didn't notice. Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/2.mdx Extra space. I didn't notice. Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/2.mdx Yes, indeed, I ate the space bar))))) Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/5.mdx There's that extra space again. Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/5.mdx There's that extra space again that I didn't notice. Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/5.mdx Extra space. Co-authored-by: Maria Khalusova * Update 5.mdx Translated the missing comment. * Update chapters/ru/chapter7/4.mdx Extra space. Co-authored-by: Maria Khalusova * Update 2.mdx Translated the missing comment in the code * Update 2.mdx Translated the missing sentence. * Update 3.mdx Translated the missing sentence. * Update 3.mdx I agree, it sounds more neutral that way. * Update chapters/ru/chapter7/3.mdx An unnecessary parenthesis. Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/3.mdx Also an option, but we've translated it as "карточка модели" a lot of places. Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/3.mdx Extra space. Co-authored-by: Maria Khalusova * Update 3.mdx Translated the missing comment in the code. * Update chapters/ru/chapter7/3.mdx Extra sapce. Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/4.mdx Extra space. Co-authored-by: Maria Khalusova * Update 4.mdx Translated the missing comment in the code. * Update 5.mdx Added and translated the missing sentence: "Since the collator expects a list of dicts, where each dict represents a single example in the dataset, we also need to wrangle the data into the expected format before passing it to the data collator:" * Update 5.mdx Edit the display of the table on the course page. * fixed links to other chapters * fixed links to chapters' intros * I added myself to the Languages and translations table. * Deleted unnecessary folder automatically created by JupyterLab. * Fix links to HF docs * Finalizing the translation of chapter 7. * Update 6.mdx Extra space * Update 7.mdx Extra space * Update chapters/ru/chapter7/6.mdx Correcting a link Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/6.mdx Correcting a link Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/6.mdx Correcting a link Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/7.mdx Correcting a link Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/6.mdx Correcting a link Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/7.mdx Correcting a link Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/7.mdx Correcting a link Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/8.mdx Correction of abbreviation - NLP Co-authored-by: Maria Khalusova * Update 7.mdx Translated the code commentary * Update 6.mdx Translated the missing sentence. * Update chapters/ru/chapter7/7.mdx Co-authored-by: Maria Khalusova * Update 6.mdx * Update chapters/ru/chapter7/6.mdx Correcting a link Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/7.mdx Correcting a link Co-authored-by: Maria Khalusova * Update chapters/ru/chapter7/6.mdx Co-authored-by: Maria Khalusova * 8/1-2 done * 8/3 finished * 8/4 finished * fix typo * toc update * typos fixed * removed english text * 8/5 finished * 8/6-7 finished * fix and update toc * chapter8/1 fixed * chapter8/2 fixed * chapter8/3 fixed * chapter8/4 fixed * chapter8/5 fixed * fix title 8/5 * fix title 8/5 in toc * Update _toctree.yml title 8 Co-authored-by: Maria Khalusova * Bump black (#671) * fix unexpected token in quiz * 8/2 fixed * 8/3 fixed * 8/4_tf fixed * Added translation of chapter 9 and Course Events. * Added translation of chapter 9 and Course Events. * Update chapters/ru/chapter9/6.mdx OK Co-authored-by: Maria Khalusova * Update chapters/ru/chapter9/7.mdx OK Co-authored-by: Maria Khalusova * Update chapters/ru/chapter9/7.mdx OK Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx I agree. Co-authored-by: Maria Khalusova * Update chapters/ru/events/1.mdx I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Sorry. I was hasty and made an incorrect assumption))) Co-authored-by: Maria Khalusova * Update chapters/ru/events/1.mdx I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/1.mdx I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/1.mdx I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/1.mdx I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/1.mdx I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/1.mdx I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/1.mdx I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/1.mdx I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/1.mdx I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/1.mdx I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/1.mdx I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/1.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/1.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Update chapters/ru/events/2.mdx Removing tag. I agree with you. Co-authored-by: Maria Khalusova * Capture the current state of the translation. Two files are translated: , . Corrections to the table of contents. * Made a full translation of Chapter 2. * Fix problem in . * Deleting JupyterLab backup files. * Update 8.mdx Correcting problems in file. * Update 8.mdx Translated a missing piece of text in English. * remove original sentence * Update chapters/ru/chapter2/2.mdx OK. Co-authored-by: Maria Khalusova * Update chapters/ru/chapter2/2.mdx Co-authored-by: Maria Khalusova * Update chapters/ru/chapter2/4.mdx Co-authored-by: Maria Khalusova * Update chapters/ru/chapter2/5.mdx Co-authored-by: Maria Khalusova * Update chapters/ru/chapter2/5.mdx Co-authored-by: Maria Khalusova * Update chapters/ru/chapter2/5.mdx Co-authored-by: Maria Khalusova * Update chapters/ru/chapter2/5.mdx Co-authored-by: Maria Khalusova * Update chapters/ru/chapter2/2.mdx Co-authored-by: Maria Khalusova * Update 2.mdx * Update 2.mdx * Update chapters/ru/chapter2/2.mdx Co-authored-by: Maria Khalusova * Update 2.mdx * Update chapters/ru/chapter2/2.mdx Co-authored-by: Maria Khalusova * Update chapters/ru/chapter2/3.mdx Co-authored-by: Maria Khalusova * Update chapters/ru/chapter2/4.mdx Co-authored-by: Maria Khalusova * Update 4.mdx --------- Co-authored-by: Tiezhen WANG <38108242+xianbaoqian@users.noreply.github.com> Co-authored-by: Pranav <66965591+Pranav-Bobde@users.noreply.github.com> Co-authored-by: Maria Khalusova Co-authored-by: DOOHAE JUNG Co-authored-by: m_khandaker Co-authored-by: Md. Al-Amin Khandaker Co-authored-by: ftarlaci <18291571+ftarlaci@users.noreply.github.com> Co-authored-by: Doohae Jung <80743307+Doohae@users.noreply.github.com> Co-authored-by: melaniedrevet Co-authored-by: Jose M Munoz Co-authored-by: svv73 <88366711+svv73@users.noreply.github.com> Co-authored-by: Vedant Pandya Co-authored-by: Bahram Shamshiri Co-authored-by: Giyaseddin Bayrak <34009210+giyaseddin@users.noreply.github.com> Co-authored-by: Pavel <60391448+pdumin@users.noreply.github.com> Co-authored-by: 1375626371 <40328311+1375626371@users.noreply.github.com> Co-authored-by: petrichor1122 <87262598+petrichor1122@users.noreply.github.com> Co-authored-by: zhlhyx <95976146+zhlhyx@users.noreply.github.com> Co-authored-by: João Gustavo A. Amorim Co-authored-by: lbourdois <58078086+lbourdois@users.noreply.github.com> Co-authored-by: Cherdsak Kingkan Co-authored-by: Thomas Chaigneau <50595514+ChainYo@users.noreply.github.com> Co-authored-by: ChainYo Co-authored-by: hiromu <45531573+hiromu166@users.noreply.github.com> Co-authored-by: Cherdsak Kingkan Co-authored-by: Marcus Fraaß Co-authored-by: Jesper Dramsch Co-authored-by: amyeroberts Co-authored-by: Ash <103081562+ashwathim@users.noreply.github.com> Co-authored-by: Hamed Homaei Rad Co-authored-by: Dawood Khan Co-authored-by: regisss <15324346+regisss@users.noreply.github.com> Co-authored-by: Avishek Das Co-authored-by: Suteera Seeha <33692408+meanna@users.noreply.github.com> Co-authored-by: Suteera Co-authored-by: Saeed Choobani Co-authored-by: Fermin Ordaz Co-authored-by: Kerem Turgutlu Co-authored-by: Sebastian Sosa <37946988+CakeCrusher@users.noreply.github.com> Co-authored-by: tanersekmen <56790802+tanersekmen@users.noreply.github.com> Co-authored-by: Victor Costa <54755870+victorescosta@users.noreply.github.com> Co-authored-by: Camille Couturier Co-authored-by: Kavya <36916536+robotjellyzone@users.noreply.github.com> Co-authored-by: Batuhan Ayhan Co-authored-by: Kambiz Ghoorchian Co-authored-by: Diego Vargas <91356068+dzarkV@users.noreply.github.com> Co-authored-by: Thomas O'Brien Co-authored-by: Lincoln V Schreiber Co-authored-by: Giorgio Severi Co-authored-by: Ömer Faruk Özdemir Co-authored-by: Caterina Bonan <97481648+CaterinaBi@users.noreply.github.com> Co-authored-by: Hiromu Hota Co-authored-by: trtd56 <5toda6@gmail.com> Co-authored-by: Mehrdad Nezamdoost Co-authored-by: Wolvz Co-authored-by: a-krirk <56425947+a-krirk@users.noreply.github.com> Co-authored-by: atgctg <105969161+atgctg@users.noreply.github.com> Co-authored-by: Thiago Medeiros Co-authored-by: webbigdata-jp <87654083+webbigdata-jp@users.noreply.github.com> Co-authored-by: Leandro von Werra Co-authored-by: Bhadresh Savani Co-authored-by: 1375626371 <1375626371@qq.com> Co-authored-by: Andreas Ehrencrona Co-authored-by: leandro Co-authored-by: Matt Co-authored-by: Nolanogenn <52080100+Nolanogenn@users.noreply.github.com> Co-authored-by: Hồng Hạnh Co-authored-by: Younes Belkada <49240599+younesbelkada@users.noreply.github.com> Co-authored-by: Edoardo Abati <29585319+EdAbati@users.noreply.github.com> Co-authored-by: Mishig Davaadorj Co-authored-by: Acciaro Gennaro Daniele Co-authored-by: nnoboa Co-authored-by: Vipula Sandaruwan Dissanayake Co-authored-by: Alex Bzdel Co-authored-by: JieShen <49408146+JieShenAI@users.noreply.github.com> Co-authored-by: Hardik Bhadani Co-authored-by: Omar Sanseviero Co-authored-by: Suket Kamboj <82956207+Sookeyy-12@users.noreply.github.com> Co-authored-by: Brad Windsor Co-authored-by: Pierre Alexandre SCHEMBRI Co-authored-by: Remy Co-authored-by: María Grandury <57645283+mariagrandury@users.noreply.github.com> Co-authored-by: Alfonso Tobar-Arancibia <48638337+datacubeR@users.noreply.github.com> Co-authored-by: datacubeR Co-authored-by: Alysson <50303964+k3ybladewielder@users.noreply.github.com> Co-authored-by: Fabrizio Damicelli Co-authored-by: Merve Noyan Co-authored-by: Artyom Boyko Co-authored-by: mariosasko Co-authored-by: Pavel --- chapters/de/_toctree.yml | 7 + chapters/de/chapter4/4.mdx | 91 ++++++++++ chapters/de/chapter4/5.mdx | 12 ++ chapters/de/chapter4/6.mdx | 231 +++++++++++++++++++++++++ chapters/ru/_toctree.yml | 13 +- chapters/ru/chapter2/1.mdx | 21 +-- chapters/ru/chapter2/2.mdx | 125 +++++++------- chapters/ru/chapter2/3.mdx | 85 +++++----- chapters/ru/chapter2/4.mdx | 240 ++++++++++++++++++++++++++ chapters/ru/chapter2/5.mdx | 338 +++++++++++++++++++++++++++++++++++++ chapters/ru/chapter2/6.mdx | 164 ++++++++++++++++++ chapters/ru/chapter2/7.mdx | 18 +- chapters/ru/chapter2/8.mdx | 310 ++++++++++++++++++++++++++++++++++ 13 files changed, 1529 insertions(+), 126 deletions(-) create mode 100644 chapters/de/chapter4/4.mdx create mode 100644 chapters/de/chapter4/5.mdx create mode 100644 chapters/de/chapter4/6.mdx create mode 100644 chapters/ru/chapter2/4.mdx create mode 100644 chapters/ru/chapter2/5.mdx create mode 100644 chapters/ru/chapter2/6.mdx create mode 100644 chapters/ru/chapter2/8.mdx diff --git a/chapters/de/_toctree.yml b/chapters/de/_toctree.yml index c43192ca8..cf4af10c2 100644 --- a/chapters/de/_toctree.yml +++ b/chapters/de/_toctree.yml @@ -52,6 +52,13 @@ title: Verwendung vortrainierter Modelle - local: chapter4/3 title: Vortrainierte Modelle teilen + - local: chapter4/4 + title: Erstellung einer Modellkarte ("model card") + - local: chapter4/5 + title: Teil 1 abgeschlossen! + - local: chapter4/6 + title: Quiz am Ende des Kapitels + quiz: 4 - title: Wörterverzeichnis sections: diff --git a/chapters/de/chapter4/4.mdx b/chapters/de/chapter4/4.mdx new file mode 100644 index 000000000..1689f5ade --- /dev/null +++ b/chapters/de/chapter4/4.mdx @@ -0,0 +1,91 @@ +# Erstellung einer Modellkarte ("model card") + + + +Die Modellkarte (Steckbrief) ist eine Datei, die wahrscheinlich genauso wichtig wie das Modell und der Tokenizer in dem Modell-Repository ist. +Da liegt die zentrale Definition vom Modell und sie trägt dazu bei, dass andere Menschen der Community das wiederverwenden und die Ergebnisse reproduzieren können – also das ist die Basis, auf der Andere ihre Artifakte bauen können. + +Die Dokumentation zum Modell- Training und Evaluierung hilft anderen Nutzer:innen zu verstehen, was sie vom Modell erwarten sollten. +Ausreichende Information zu der Vor- und Nachaufarbeitung der Daten dient auch dazu, dass man die Einschränkungen, Biases und den Kontext identifizieren kann, wann das Modell nützlich ist und wann nicht. + +Deswegen ist die Erstellung einer klar definierten Modellkarte ein sehr wichtiger Schritt. Hier geben wir ein Paar Hinweise, die dir dabei helfen könnten. Die Modellkarte wird durch eine *README.md* Datei (eine Markdown Datei) kreiert, die du schonmal gesehen hast. + +Das Konzept von Modellkarte ("model card") stammt aus einer Forschungsrichtung bei Google, die zuerst in dem Paper ["Model Cards for Model Reporting"](https://arxiv.org/abs/1810.03993) von Margaret Mitchell et al erschien. Vieles von dem, was hier steht, basiert auf dem Paper und wir empfehlen dir, das Paper zu lesen, um besser zu verstehen, warum Modellkarten so wichtig sind, wenn man Wert auf Reproduzierbarkeit, Wiederverwendbarkeit und Fairness legt. + +Eine Modellkarte fängt mit einer kurzen, große Übersicht davon, was das Modell kann plus einige Details in den folgenden Abschnitte: + +- Modell-Beschreibung +- Beabsichtigte Nutzung und Einschränkungen +- Modell-Bedienung +- Einschränkungen und Bias +- Trainingsdaten +- Trainingsverfahren +- Evaluierungsergebnisse + +Lass uns anschauen, was genau in jedem Abschnitt stehen sollte. + +### Modell-Beschreibung + +Die Modellbeschreibung enthält grundlegende Details zum Modell. Dazu gehören die Architektur, die Version, ob es in einem Paper vorgestellt wurde, ob eine Originalimplementierung verfügbar ist, der Autor und allgemeine Informationen über das Modell. Eventuelle Urheberrechte sind hier anzugeben. In diesem Abschnitt können auch allgemeine Informationen zu Trainingsverfahren, Parametern und wichtigen Haftungsausschlüssen erwähnt werden. + +### Verwendungszweck und Einschränkungen + +Hier beschreibst du die angedachten Anwendungsfälle fürs Modell, einschließlich der Sprachen, Felder und Domänen, in denen es angewendet werden kann. In diesem Abschnitt der Modellkarte können auch Bereiche dokumentiert werden, die bekanntermaßen außerhalb des Anwendungsbereichs des Modells liegen oder in denen die Leistung wahrscheinlich nicht optimal ist. + +### Modell-Bedienung + +Dieser Abschnitt sollte einige Beispiele für die Verwendung des Modells enthalten. Dies kann die Verwendung der Funktion `pipeline()`, die Verwendung der Modell- und Tokenizer-Klassen und jeden anderen Code zeigen, der deiner Meinung nach hilfreich sein könnte. + + +### Trainingsdaten + +In diesem Teil sollte angegeben werden, auf welchen Datensatz bzw. Datensätze das Modell trainiert wurde. Eine kurze Beschreibung des Datensatzes/der Datensätze ist ebenfalls willkommen. + +### Trainingsverfahren + +In diesem Abschnitt solltest du alle relevanten Aspekte des Modelltrainingsverfahren beschreiben, die für die Reproduzierbarkeit nützlich sind. Dazu gehören alle Vor- und Nachbearbeitungen, die an den Daten durchgeführt wurden, sowie Details wie die Anzahl der Trainingsepochene, Batch-Größe, die Lernrate usw. + +### Variablen und Metriken + +Hier solltest du die Bewertungsmetriken beschreiben und die verschiedenen Faktoren, die du dabei mit berücksichtigst. Durch die Angabe, welche Metrik(en) verwendet wurden, für welchen Datensatz und welche Datensatzaufteilung, kannst du die Leistung deines Modells leicht mit der anderer Modelle vergleichen. Diese sollten durch die vorherigen Abschnitte informiert werden, wie z. B. die beabsichtigten Benutzer und Anwendungsfälle. + +### Evaluierungsergebnisse + +Abschließend gibst du an, wie gut das Modell mit dem Bewertungsdatensatz abschneidet. Wenn das Modell einen Entscheidungsschwellenwert verwendet, gib entweder den in der Bewertung verwendeten Entscheidungsschwellenwert an oder mach Angaben zur Bewertung bei verschiedenen Schwellenwerten für die beabsichtigten Verwendungszwecke. + +## Beispiel + +Im Folgenden findest du einige Beispiele von guten Modellkarten: + +- [`bert-base-cased`](https://huggingface.co/bert-base-cased) +- [`gpt2`](https://huggingface.co/gpt2) +- [`distilbert`](https://huggingface.co/distilbert-base-uncased) + + +Mehr Beispiele von verschiedene Organisationen/Firmen sind hier verfügbar [here](https://github.com/huggingface/model_card/blob/master/examples.md). + +## Hinweis + +Modellkarten sind bei der Veröffentlichung von Modellen nicht erforderlich und du musst bei der Erstellung nicht alle oben beschriebenen Abschnitte einbeziehen. Allerdings kann eine explizite Dokumentation des Modells künftigen Nutzern nur nützen, daher empfehlen wir dir, so viele Abschnitte wie möglich nach bestem Wissen und Gewissen auszufüllen. + +## Modellkarte-Metadaten + +Wenn du den Hugging Face Hub ein wenig erkundet hast, solltest du gesehen haben, dass einige Modelle zu bestimmten Kategorien gehören: Du kannst sie nach Aufgaben, Sprachen, Bibliotheken und mehr filtern. Die Kategorien, zu denen ein Modell gehört, werden anhand der Metadaten identifiziert, die du im Kopf der Modellkarte hinzufügst. + +Zum Beispiel sieh dir dieses an [`camembert-base` model card](https://huggingface.co/camembert-base/blob/main/README.md). Du solltest folgende Zeilen auf der Modellkarte sehen: + +``` +--- +language: fr +license: mit +datasets: +- oscar +--- +``` + +Diese Metadaten werden vom Hugging Face Hub analysiert, der dieses Modell dann als französisches Modell mit einer MIT-Lizenz identifiziert, das auf dem Oscar-Datensatz trainiert wurde. + +Die vollständige [Modellkarte](https://github.com/huggingface/hub-docs/blame/main/modelcard.md) ermöglicht die Angabe von Sprachen, Lizenzen, Tags, Datensätzen, Metriken sowie den Bewertungsergebnissen, die das Modell wann erhalten hat Ausbildung. diff --git a/chapters/de/chapter4/5.mdx b/chapters/de/chapter4/5.mdx new file mode 100644 index 000000000..65eac0fa9 --- /dev/null +++ b/chapters/de/chapter4/5.mdx @@ -0,0 +1,12 @@ +# Teil 1 abgeschlossen! + + + +Dies ist das Ende des ersten Teils des Kurses! Teil 2 wird am 15. November mit einem großen Community-Event veröffentlicht, weitere Informationen findest du [hier](https://huggingface.co/blog/course-launch-event). + +Du solltest nun in der Lage sein, ein vorab trainiertes Modell für ein Textklassifizierungsproblem (einzelne Sätze oder Satzpaare) zu optimieren und das Ergebnis in den Model Hub hochzuladen. Um sicherzustellen, dass du diesen ersten Abschnitt beherrschst, solltest du genau das an einem Problem verwenden, das dich interessiert (und nicht unbedingt auf Englisch, wenn Sie eine andere Sprache sprechen)! Hilfe findest du in den [Hugging Face-Foren](https://discuss.huggingface.co/) und du kannst dein Projekt in [diesem Thema](https://discuss.huggingface.co/t/share-your-projects) teilen /6803), sobald du damit fertig bist. + +Wir freuen uns darauf, zu sehen, was du alles damit baust! diff --git a/chapters/de/chapter4/6.mdx b/chapters/de/chapter4/6.mdx new file mode 100644 index 000000000..cc87f7cb3 --- /dev/null +++ b/chapters/de/chapter4/6.mdx @@ -0,0 +1,231 @@ + + + + +# Quiz am Ende des Kapitels + + + +Lass uns testen, was du im vorheringen Kapitel gelernt hast! + +### 1. Auf welche Modelle sind die Hub-Modelle beschränkt? + + + +### 2. Wie kannst du die Modelle auf dem Hub verwalten? + +git-lfs benutzen.", + correct: true + } + ]} +/> + +### 3. Was kannst du mit der Hugging Face Hub-Weboberfläche tun? + + + +### 4. Was ist eine Modellkarte? + + + +### 5. Welche dieser Objekte der 🤗 Transformers-Bibliothek können mit `push_to_hub()` direkt auf dem Hub geteilt werden? + +{#if fw === 'pt'} +push_to_hub, und wenn su sie verwendest, werden alle Tokenizer-Dateien (Vokabular, Architektur des Tokenizers usw.) in ein bestimmtes Repo verschoben. Aber das ist nicht die einzig richtige Antwort!", + correct: true + }, + { + text: "Eine Modell-Konfiguration", + explain: "Richtig! Alle Modellkonfigurationen verfügen über die Methode push_to_hub, und wenn Sie sie verwenden, werden sie an ein bestimmtes Repo gepusht. Was kannst du sonst noch teilen?", + correct: true + }, + { + text: "Ein Model", + explain: "Richtig! Alle Modelle verfügen über die Methode push_to_hub, und wenn du sie verwendest, werden sie und ihre Konfigurationsdateien in ein bestimmtes Repo gepusht. Das ist jedoch nicht alles, was du teilen kannst.", + correct: true + }, + { + text: "Ein Trainer", + explain: "Das ist richtig – der Trainer implementiert auch die Methode push_to_hub und lädt mit dieser Methode das Modell, seine Konfiguration, den Tokenizer und einen Modellkartenentwurf auf einen gegebenen Server hoch repo. Versuch es auch mit einer anderen Antwort!", + correct: true + } + ]} +/> +{:else} +push_to_hub method, and using it will push all the tokenizer files (vocabulary, architecture of the tokenizer, etc.) to a given repo. That's not the only right answer, though!", + explain: "Richtig! Alle Tokenizer verfügen über die Methode push_to_hub, und wenn du sie verwendest, werden alle Tokenizer-Dateien (Vokabular, Architektur des Tokenizers usw.) in ein bestimmtes Repo verschoben. Das ist aber nicht die einzige richtige Antwort!", + correct: true + }, + { + text: "Eine Modell-Konfiguration", + explain: "Right! All model configurations have the push_to_hub method, and using it will push them to a given repo. What else can you share?", + explain: "Richtig! Alle Modellkonfigurationen verfügen über die Methode push_to_hub, und wenn du sie verwendest, werden sie an ein bestimmtes Repo gepusht. Was kannst du sonst noch teilen?", + correct: true + }, + { + text: "Ein Modell", + explain: "Richtig! Alle Modelle verfügen über die Methode push_to_hub, und wenn du sie verwendest, werden sie und ihre Konfigurationsdateien in ein bestimmtes Repo gepusht. Das ist jedoch nicht alles, was du teilen kannst.", + correct: true + }, + { + text: "Alles oben mit einem speziellen `Callback`", + explain: "Das ist richtig – der PushToHubCallback sendet während des Trainings regelmäßig alle diese Objekte an ein Repo.", + correct: true + } + ]} +/> +{/if} + +### 6. Was ist der erste Schritt bei Verwendung der Methode `push_to_hub()` oder der CLI-Tools? + + + +### 7. Du verwendest ein Modell und einen Tokenizer – wie kannst du diese auf den Hub hochladen? + +huggingface_hub-Dienstprogramm einschließt.", + explain: "Modelle und Tokenizer profitieren bereits von den Dienstprogrammen huggingface_hub: kein zusätzlicher Wrapping erforderlich!" + }, + { + text: "Indem du sie auf der Festplatte speicherst und transformers-cli upload-model aufrufst", + explain: "Der Befehl upload-model existiert nicht." + } + ]} +/> + +### 8. Welche Git-Operationen kann man mit der Klasse „Repository“ ausführen? + +git_commit() Methode da.", + correct: true + }, + { + text: "Ein Pull", + explain: "Das ist der Zweck der git_pull() Methode.", + correct: true + }, + { + text: "Ein Push", + explain: "Die Methode git_push() macht das.", + correct: true + }, + { + text: "Ein Merge", + explain: "Nein, die Operation wird mit dieser API nie möglich sein." + } + ]} +/> diff --git a/chapters/ru/_toctree.yml b/chapters/ru/_toctree.yml index 575ac4556..46b889425 100644 --- a/chapters/ru/_toctree.yml +++ b/chapters/ru/_toctree.yml @@ -26,16 +26,25 @@ - local: chapter1/10 title: Проверка знаний -- title: 2. Использование библиотеки 🤗 Transformers +- title: 2. Использование 🤗 Transformers sections: - local: chapter2/1 title: Введение - local: chapter2/2 - title: Внутри конвейера + title: За конвейером - local: chapter2/3 title: Модели + - local: chapter2/4 + title: Токенизаторы + - local: chapter2/5 + title: Обработка множественных последовательностей + - local: chapter2/6 + title: Собираем все воедино - local: chapter2/7 title: Базовое использование завершено! + - local: chapter2/8 + title: Итоговый тест по главе + quiz: 2 - title: 3. Fine-tuning предобученной модели sections: diff --git a/chapters/ru/chapter2/1.mdx b/chapters/ru/chapter2/1.mdx index ce2dbae74..94add379c 100644 --- a/chapters/ru/chapter2/1.mdx +++ b/chapters/ru/chapter2/1.mdx @@ -1,24 +1,25 @@ -# Введение +# Введение[[introduction]] -Как вы могли заметить в [Главе 1](../chapter1/1), модели трансформеров обычно бывают очень большие. Обучение и развертывание таких моделей с миллионами и даже десятками *миллиардов* параметров является сложной задачей. Кроме того, новые модели выпускаются почти ежедневно, и каждая из них имеет собственную реализацию, опробовать их все — непростая задача. +Как вы видели в [Главе 1](../chapter1), модели трансформеров обычно очень большие. С миллионами и десятками *миллиардов* параметров, обучение и развертывание этих моделей - сложная задача. Кроме того, поскольку новые модели выходят практически ежедневно и каждая из них имеет свою собственную реализацию, попробовать их все - задача не из легких. -Библиотека 🤗 Transformers была создана для решения этой проблемы. Её цель — предоставить единый API, с помощью которого можно загружать, обучать и сохранять любую модель трансформера. Основными функциями библиотеки являются: +Для решения этой проблемы была создана библиотека 🤗 Transformers. Ее цель - предоставить единый API, с помощью которого можно загрузить, обучить и сохранить любую модель Transformer. Основными особенностями библиотеки являются: -- **Удобство в использовании**: Скачивание, загрузку и использование современной модели NLP для вывода данных, можно выполнять всего двумя строками кода. -- **Гибкость**: По своей сути все модели представляют собой простые классы библиотек PyTorch `nn.Module` или TensorFlow `tf.keras.Model` и могут обрабатываться, как и любые другие модели, в соответствующих средах машинного обучения (МО). -- **Простота**: В библиотеке практически не используются абстракции. "Все в одном файле" является основной концепцией: прямой проход модели полностью определяется в одном файле, так что сам код понятен, но при этом доступен для взлома. +- **Простота использования**: Скачать, загрузить и использовать современную модель NLP для инференса можно всего в две строчки кода. +- **Гибкость**: По своей сути все модели представляют собой простые классы PyTorch `nn.Module` или TensorFlow `tf.keras.Model` и могут быть обработаны как любые другие модели в соответствующих фреймворках машинного обучения (ML). +- **Простота**: В библиотеке почти нет абстракций. Концепция "Все в одном файле" является основной: прямой проход модели полностью определяется в одном файле, так что сам код понятен и доступен для изменения. -Последняя особенность сильно отличает библиотеку 🤗 Transformers от других библиотек машинного обучения. Модели не строятся на модулях, которые являются общими для всех файлов; вместо этого каждая модель имеет свои собственные слои. Это не только делает модели более доступными и понятными, но и позволяет легко экспериментировать с одной моделью, не затрагивая другие. +Эта последняя особенность делает 🤗 Transformers совершенно непохожей на другие ML-библиотеки. Модели не строятся на основе модулей +которые совместно используются в разных файлах; вместо этого каждая модель имеет свои собственные слои. Помимо того, что это делает модели более доступными и понятными, это позволяет легко экспериментировать с одной моделью, не затрагивая другие. -Эта глава начнается со сквозного примера, в котором мы используем модель и токенизатор вместе, чтобы воспроизвести функцию `pipeline()` представленную в [Главе 1](../chapter1/1). Далее мы обсудим API модели: углубимся в классы модели и конфигурации и покажем, как загружать модель и как она обрабатывает числовые входные данные для получения прогнозов. +Эта глава начнется со сквозного примера, в котором мы используем модель и токенизатор вместе, чтобы воссоздать функцию `pipeline()`, представленную в [Главе 1](../chapter1). Далее мы обсудим API модели: мы погрузимся в модель и классы конфигурации, покажем, как загрузить модель и как она обрабатывает числовые данные для вывода прогнозов. -Затем мы рассмотрим API токенизатора, который является другим основным компонентом функции `pipeline()`. Токенизаторы берут на себя первый и последний этапы обработки, обрабатывая преобразование текста в числовые входные данные для нейронной сети и обратное преобразование в текст, когда это необходимо. Наконец, мы покажем вам, как обработывается передача нескольких предложений в модель с помощью подготовленных пакетов, а затем завершим все это более детальным рассмотрением высокоуровневой функции `tokenizer()`. +Затем мы рассмотрим API токенизатора, который является другим основным компонентом функции `pipeline()`. Токенизаторы берут на себя первый и последний шаги препроцессинга, обработку преобразования текста в числовые входы для нейронной сети и обратное преобразование в текст, когда это необходимо. Наконец, мы покажем вам, как обрабатывать несколько предложений, передавая их в модель в подготовленном батче, затем завершим все это более подробным рассмотрением высокоуровневой функции `tokenizer()`. -⚠️ Чтобы воспользоваться всеми функциями, доступными в Model Hub и 🤗 Transformers, мы рекомендуем создать учетную запись. +⚠️ Чтобы воспользоваться всеми возможностями, доступными в Model Hub и 🤗 Transformers, мы рекомендуем создать учетную запись. \ No newline at end of file diff --git a/chapters/ru/chapter2/2.mdx b/chapters/ru/chapter2/2.mdx index 3960afe39..b61f2f25d 100644 --- a/chapters/ru/chapter2/2.mdx +++ b/chapters/ru/chapter2/2.mdx @@ -1,14 +1,14 @@ -# Внутри конвейера +# За конвейером[[behind-the-pipeline]] {#if fw === 'pt'} {:else} @@ -16,14 +16,14 @@ {/if} -Это первый раздел, содержание которого будет немного отличаться в зависимости от того, используете ли вы PyTorch или TensorFlow. Нажмите переключатель над заголовком, чтобы выбрать предпочитаемую платформу! +Это первый раздел, в котором содержание немного отличается в зависимости от того, используете ли вы PyTorch или TensorFlow. Переключите переключатель в верхней части заголовка, чтобы выбрать платформу, которую вы предпочитаете! {#if fw === 'pt'} @@ -32,7 +32,7 @@ {/if} -Давайте начнем с готового примера, взглянув на то, что происходило за кулисами, когда мы выполняли следующий код в [Главе 1](../chapter1/1): +Давайте начнем с полноценного примера и посмотрим, что произошло за кулисами, когда мы выполнили следующий код в [Главе 1](../chapter1): ```python from transformers import pipeline @@ -46,33 +46,33 @@ classifier( ) ``` -и на выходе получали: +и получили: ```python out [{'label': 'POSITIVE', 'score': 0.9598047137260437}, {'label': 'NEGATIVE', 'score': 0.9994558095932007}] ``` -Как мы уже увидели в [Главе 1](../chapter1/1), данный конвейер включает в себя три шага: предварительная обработка, передача входных данных через модель и постобработка: +Как мы видели в [Главе 1] (../chapter1), этот конвейер объединяет три этапа: предобработку, пропуск входных данных через модель и постобработку:
-Полный конвейер NLP: токенизация текста, преобразование в идентификаторы и вывод с помощью модели Transformer и слоя 'head' модели. - +Полный конвейер NLP: токенизация текста, конвертация в идентификаторы, инференс через модель Transformer и голову модели. +
-Давайте вкратце рассмотрим каждый из этих этапов. +Давайте быстро пройдемся по каждому из них. -## Предварительная обработка с помощью токенизатора +## Предобработка с помощью токенизатора[[preprocessing-with-a-tokenizer]] -Как и другие нейронные сети, модели Transformer не могут обрабатывать необработанный текст напрямую, поэтому первым шагом нашего конвейера является преобразование входных текстовых данных в числа, понятные модели. Для этого мы используем *токенизатор*, который будет отвечать за: +Как и другие нейронные сети, модели Transformer не могут напрямую обрабатывать сырой текст, поэтому первым шагом нашего конвейера является преобразование текстовых данных в числа, которые сможет воспринимать модель. Для этого мы используем *токенизатор*, который будет отвечать за: -- Разделение входных данных на слова, подслова или символы (например, знаки препинания), которые называются *токенами* -- Отображение каждого токена в целое число +- Разбиение входных данных на слова, подслова или символы (например, пунктуацию), которые называются *токенами* +- Сопоставление каждого токена с целым числом - Добавление дополнительных входных данных, которые могут быть полезны для модели -Всю эту предварительную обработку необходимо выполнять точно так же, как и при предварительном обучении модели, поэтому сначала нам нужно загрузить эту информацию из [Model Hub](https://huggingface.co/models). Для этого мы используем класс `AutoTokenizer` и его метод `from_pretrained()`. Используя имя контрольной точки нашей модели, он автоматически извлекает данные, связанные с токенизатором модели, и кэширует их (поэтому они загружаются только при первом запуске кода ниже). +Вся эта предобработка должна быть выполнена точно так же, как и при предварительном обучении модели, поэтому сначала нам нужно загрузить эту информацию из [Model Hub](https://huggingface.co/models). Для этого мы используем класс `AutoTokenizer` и его метод `from_pretrained()`. Используя имя контрольной точки нашей модели, он автоматически получает данные, ассоциированные с токенизатором модели, и кэширует их (таким образом, они скачиваются только в первый раз, когда вы выполняете приведенный ниже код). -Поскольку контрольной точкой конвейра `sentiment-analysis` по-умолчанию является модель `distilbert-base-uncased-finetuned-sst-2-english` (вы можете увидеть карточку модели [здесь](https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english)), мы выполним следующие команды: +Поскольку контрольной точкой по умолчанию конвейера `sentiment-analysis` является `distilbert-base-uncased-finetuned-sst-2-english` (вы можете посмотреть ее карточку модели [здесь](https://huggingface.co/distilbert-base-uncased-finetuned-sst-2-english)), мы выполняем следующее: ```python from transformers import AutoTokenizer @@ -81,12 +81,11 @@ checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" tokenizer = AutoTokenizer.from_pretrained(checkpoint) ``` -После того, как мы сосздадим токенизатор, мы сможем напрямую передать ему наши предложения, и получить словарь, готовый для использования в нашей модели! Осталось только преобразовать список входных идентификаторов в тензоры. +Когда у нас есть токенизатор, мы можем напрямую передать ему наши предложения и получить в ответ словарь, готовый к передаче в нашу модель! Осталось только преобразовать список входных идентификаторов в тензоры. -Вы можете использовать библиотеку 🤗 Transformers, не беспокоясь о том, какой фреймворк ML используется в качестве бэкэнда; это может быть PyTorch или TensorFlow или Flax для некоторых моделей. Однако модели Transformer принимают только *тензоры* в качестве входных данных. Если вы впервые слышите о тензорах, вы можете представлять их как массивы NumPy. Массив NumPy может быть скаляром (0D), вектором (1D), матрицой (2D) или иметь больше измерений. Фактически это тензор; тензоры других платформ машинного обучения ведут себя аналогично, и обычно их так же просто создавать, как массивы NumPy. +Вы можете использовать 🤗 Transformers, не задумываясь о том, какой ML-фреймворк используется в качестве бэкенда; это может быть PyTorch или TensorFlow, или Flax для некоторых моделей. Однако модели Transformer принимают на вход только *тензоры*. Если вы впервые слышите о тензорах, то можете считать их массивами NumPy. Массив NumPy может быть скаляром (0D), вектором (1D), матрицей (2D) или иметь больше измерений. По сути, это тензор; тензоры других ML-фреймворков ведут себя аналогично, и их обычно так же просто инстанцировать, как и массивы NumPy. - -Чтобы указать тип тензоров, которые мы хотим получить (PyTorch, TensorFlow, или обычный NumPy), мы используем аргумент `return_tensors`: +Чтобы указать тип тензоров, которые мы хотим получить в ответ (PyTorch, TensorFlow или обычный NumPy), мы используем аргумент `return_tensors`: {#if fw === 'pt'} ```python @@ -108,11 +107,11 @@ print(inputs) ``` {/if} -Не беспокойтесь пока о параметрах дополнения (padding) и усечения (truncation); мы объясним это позже. Здесь главное помнить, что вы можете передать одно предложение или список предложений, а также указать тип тензоров, которые вы хотите получить обратно (если тип не передан, в результате вы получите список из списков). +Не беспокойтесь пока о дополнении и усечении, мы расскажем об этом позже. Главное, что нужно запомнить: вы можете передать одно предложение или список предложений, а также указать тип тензоров, которые вы хотите получить в ответ (если тип не указан, то в результате вы получите список списков). {#if fw === 'pt'} -Вот как результаты выглядят в виде тензоров PyTorch: +Вот как выглядят результаты в виде тензоров PyTorch: ```python out { @@ -122,13 +121,13 @@ print(inputs) ]), 'attention_mask': tensor([ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], - [1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0] + [1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0] ]) } ``` {:else} -Вот как результаты выглядят в виде тензоров TensorFlow: +Вот как выглядят результаты в виде тензоров TensorFlow: ```python out { @@ -140,18 +139,18 @@ print(inputs) 'attention_mask': } ``` {/if} -Сам вывод представляет собой словарь, содержащий два ключа, `input_ids` и `attention_mask`. `input_ids` содержит две строки целых чисел (по одному для каждого предложения), которые являются уникальными идентификаторами токенов в каждом предложении. Мы объясним, что такое `attention_mask` позже в этой главе. +Сам результат представляет собой словарь, содержащий два ключа, `input_ids` и `attention_mask`. `input_ids` содержит две строки целых чисел (по одной на каждое предложение), которые являются уникальными идентификаторами токенов в каждом предложении. Мы объясним, что такое `attention_mask` позже в этой главе. -## Проходим через модель +## Проходя сквозь модель[[going-through-the-model]] {#if fw === 'pt'} -Мы можем загрузить нашу предварительно обученную модель так же, как и наш токенизатор. Библиотека 🤗 Transformers предоставляет класс `AutoModel` который также имеет метод `from_pretrained()`: +Мы можем загрузить нашу предварительно обученную модель так же, как мы это делали с нашим токенизатором. 🤗 Transformers предоставляет класс `AutoModel`, у которого также есть метод `from_pretrained()`: ```python from transformers import AutoModel @@ -160,7 +159,7 @@ checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" model = AutoModel.from_pretrained(checkpoint) ``` {:else} -Мы можем загрузить нашу предварительно обученную модель так же, как и наш токенизатор. Библиотека 🤗 Transformers предоставляет класс `TFAutoModel` который также имеет метод `from_pretrained`: +Мы можем загрузить нашу предварительно обученную модель так же, как мы это делали с нашим токенизатором. 🤗 Transformers предоставляет класс `TFAutoModel`, в котором также есть метод `from_pretrained`: ```python from transformers import TFAutoModel @@ -170,25 +169,25 @@ model = TFAutoModel.from_pretrained(checkpoint) ``` {/if} -В этом фрагменте кода мы загрузили ту же контрольную точку, которую использовали в нашем конвейере ранее (на самом деле она уже должна была быть закэширована) и создали с ее помощью экземпляр модели. +В этом фрагменте кода мы загрузили ту же контрольную точку, которую использовали в нашем конвейере ранее (на самом деле она уже должна была быть кэширована), и инстанцировали модель с ее помощью. -Эта архитектура содержит только базовый модуль Transformer: при некоторых входных данных он выводит то, что мы будем называть *скрытыми состояниями*, также известными как *параметры*. Для каждого входного набора данных модели мы получим многомерный вектор, представляющий **контекстное понимание этого входного набора моделью Transformer**. +Эта архитектура содержит только базовый модуль Transformer: при наличии некоторых входных данных он выводит то, что мы будем называть *скрытыми состояниями (hidden states)*, также известными как *признаки (features)*. Для каждого входа модели мы получим многомерный вектор, представляющий **контекстное понимание этого входа моделью Transformer**. -Если вы пока не понимаете в чем смысл, не беспокойтесь об этом. Мы объясним все это позже. +Если вы не поняли смысла, не волнуйтесь. Мы объясним всё это позже. -Хотя эти скрытые состояния могут быть полезны сами по себе, они обычно являются входными данными для другой части модели, известной как слой *head*. В [Главе 1](../chapter1/1) разные задачи могли бы выполняться с одной и той же архитектурой, но с каждой из этих задач будет связан отдельный слой "head". +Хотя эти скрытые состояния могут быть полезны сами по себе, обычно они являются входными данными для другой части модели, известной как *голова (head)*. В [Главе 1](../chapter1) различные задачи могли быть выполнены с помощью одной и той же архитектуры, но каждая из этих задач будет связана с разной головой. -### Многомерный вектор, что это? +### Многомерный вектор?[[a-high-dimensional-vector]] -Вектор, выводимый модулем Transformer, обычно является большим. И как правило, он имеет три параметра: +Вектор, возвращаемый модулем Transformer, обычно большой. Обычно он имеет три измерения: -- **Размер пакета**: Количество последовательностей, обрабатываемых одновременно (в нашем примере 2). -- **Длина последовательности**: Длина числового представления последовательности (в нашем примере 16). -- **Размер скрытого слоя сети**: Количество измерений вектора каждого входного параметра модели. +- **Размер батча (Batch size)**: Количество последовательностей, обрабатываемых за один раз (в нашем примере - 2). +- **Длина последовательности (Sequence length)**: Длина числового представления последовательности (в нашем примере - 16). +- **Скрытый размер (Hidden size)**: Размерность вектора каждого входа модели. -Его называют "многомерный" из-за последнего значения. Размер скрытого слоя сети может быть очень большим (768 обычно используется для небольших моделей, а в больших моделях он может достигать 3072 или более). +О нем говорят как о "многомерном" из-за последнего значения. Скрытый размер может быть очень большим (768 - обычное явление для небольших моделей, а в больших моделях он может достигать 3072 и более). -Мы можем увидеть это, если передадим входные данные, которые мы предварительно обработали, в нашу модель: +Мы можем убедиться в этом, если подадим в нашу модель входные данные, которые мы подвергли предобработке: {#if fw === 'pt'} ```python @@ -210,24 +209,24 @@ print(outputs.last_hidden_state.shape) ``` {/if} -Обратите внимание, что выходные данные моделей 🤗 Transformers ведут себя как именованные кортежи или словари. Вы можете получить доступ к элементам по атрибутам (как это сделали мы) или по ключу (`outputs["last_hidden_state"]`), или даже по индексу, если вы точно знаете, где находится то, что вы ищете (`outputs[0]`). +Обратите внимание, что выходы моделей 🤗 Transformers ведут себя как `именованные кортежи` или словари. Вы можете обращаться к элементам по атрибутам (как мы это делали), по ключу (`outputs["last_hidden_state"]`) или даже по индексу, если вы точно знаете, где находится искомый элемент (`outputs[0]`). -### Слои "head" модели: Разбираемся в цифрах +### Головы моделей: Извлечение смысла из чисел[[model-heads-making-sense-out-of-numbers]] -Слои "head" модели принимают многомерный вектор скрытых состояний в качестве входных данных и проецируют их в другое измерение. Они обычно состоят из одного или нескольких линейных слоев: +Головы модели принимают на вход многомерный вектор скрытых состояний и проецируют его на другое измерение. Обычно они состоят из одного или нескольких линейных слоев:
-Нейронная сеть Transformer перед слоем 'head'. - +Сеть-трансформер с головой. +
-Выходные данные модели Transformer отправляются непосредственно в слой "head" модели для обработки. +Выход модели Transformer передается непосредственно в голову модели для обработки. -На данной диаграмме модель представлена слоем вложений и последующими слоями. Слой вложений преобразует каждый входной идентификатор полученный токенизатором, в вектор, который представляет собой связанный с ним токен. Последующие слои манипулируют этими векторами, используя механизм внимания, чтобы получить окончательное представление предложений. +На этой диаграмме модель представлена слоем эмбеддингов и последующими слоями. Слой эмбеддингов преобразует каждый входной идентификатор в токенизированном входе в вектор, который представляет соответствующий токен. Последующие слои манипулируют этими векторами с помощью механизма внимания, чтобы получить окончательное представление предложений. -В 🤗 Transformersдоступно множество различных архитектур, каждая из которых предназначена для решения конкретной задачи. Вот неполный список: +Существует множество различных архитектур 🤗 Transformers, каждая из которых предназначена для решения определенной задачи. Вот неполный список: -- `*Model` (извлекает скрытые состояния) +- `*Model` (извлечение скрытых состояний) - `*ForCausalLM` - `*ForMaskedLM` - `*ForMultipleChoice` @@ -237,7 +236,7 @@ print(outputs.last_hidden_state.shape) - и другие 🤗 {#if fw === 'pt'} -Для нашего примера нам понадобится модель со слоем "head" для классификации последовательностей (чтобы иметь возможность классифицировать предложения как положительные или отрицательные). Итак, на самом деле мы будем использовать не класс `AutoModel`, а `AutoModelForSequenceClassification`: +Для нашего примера нам понадобится модель с головой классификации последовательности (чтобы иметь возможность классифицировать предложения как положительные или отрицательные). Поэтому мы будем использовать не класс `AutoModel`, а `AutoModelForSequenceClassification`: ```python from transformers import AutoModelForSequenceClassification @@ -247,7 +246,7 @@ model = AutoModelForSequenceClassification.from_pretrained(checkpoint) outputs = model(**inputs) ``` {:else} -Для нашего примера нам понадобится модель со слоем "head" для классификации последовательностей (чтобы иметь возможность классифицировать предложения как положительные или отрицательные). Итак, на самом деле мы будем использовать не класс `TFAutoModel`, а `TFAutoModelForSequenceClassification`: +Для нашего примера нам понадобится модель с головой классификации последовательности (чтобы иметь возможность классифицировать предложения как положительные или отрицательные). Поэтому мы будем использовать не класс `TFAutoModel`, а `TFAutoModelForSequenceClassification`: ```python from transformers import TFAutoModelForSequenceClassification @@ -258,7 +257,7 @@ outputs = model(inputs) ``` {/if} -Теперь, если мы посмотрим на форму наших входных данных, размерность будет намного ниже: слой "head" модели принимает в качестве входных данных многомерные векторы, которые мы видели ранее, и выводит векторы, содержащие всего два значения (по одному на метку): +Теперь, если мы посмотрим на форму наших выходов, размерность будет гораздо ниже: голова модели принимает на вход высокоразмерные векторы, которые мы видели ранее, и возвращает векторы, содержащие два значения (по одному на метку): ```python print(outputs.logits.shape) @@ -274,11 +273,11 @@ torch.Size([2, 2]) ``` {/if} -Поскольку у нас всего два предложения и две метки, результат, который мы получаем от нашей модели, имеет форму 2 x 2. +Поскольку у нас всего два предложения и две метки, результат, полученный с помощью нашей модели, имеет форму 2 x 2. -## Постобработка выходных данных +## Постобработка вывода[[postprocessing-the-output]] -Значения, которые мы получаем в качестве выходных данных нашей модели, не обязательно имеют смысл сами по себе. Давайте посмотрим: +Значения, которые мы получаем на выходе из нашей модели, не всегда имеют смысл сами по себе. Давайте посмотрим: ```python print(outputs.logits) @@ -297,7 +296,7 @@ tensor([[-1.5607, 1.6123], ``` {/if} -Наша модель предсказала `[-1.5607, 1.6123]` для первого предложения и `[ 4.1692, -3.3464]` для второго. Это не вероятности, а *логиты*, необработанные, ненормализованные оценки, выводимые последним слоем модели. Для преобразования в вероятности, они должны пройти через слой [SoftMax](https://en.wikipedia.org/wiki/Softmax_function) (все модели 🤗 Transformers выводят логиты, поскольку функция потерь для обучения обычно объединяет последнюю функцию активации, такую как SoftMax, с фактической функцией потерь, такой как перекрестная энтропия): +Наша модель спрогнозировала `[-1.5607, 1.6123]` для первого предложения и `[ 4.1692, -3.3464]` для второго. Это не вероятности, а *логиты*, сырые, ненормированные оценки, выведенные последним слоем модели. Чтобы преобразовать их в вероятности, они должны пройти через слой [SoftMax](https://en.wikipedia.org/wiki/Softmax_function) (все модели 🤗 Transformers выводят логиты, поскольку функция потерь для обучения обычно объединяет последнюю функцию активации, такую как SoftMax, с фактической функцией потерь, такой как кросс-энтропия): {#if fw === 'pt'} ```py @@ -328,9 +327,9 @@ tf.Tensor( ``` {/if} -Теперь мы видим, что модель предсказала `[0.0402, 0.9598]` для первого предложения и `[0.9995, 0.0005]` для второго. Это легко узнаваемые оценки вероятности. +Теперь мы видим, что модель спрогнозировала `[0.0402, 0.9598]` для первого предложения и `[0.9995, 0.0005]` для второго. Это узнаваемые оценки вероятности. -Чтобы получить метки, соответствующие каждой позиции, мы можем проверить атрибут `id2label` в конфигурации модели (подробнее об этом в следующем разделе): +Чтобы получить метки, соответствующие каждой позиции, мы можем обратиться к атрибуту `id2label` в конфигурации модели ( более подробно об этом в следующем разделе): ```python model.config.id2label @@ -340,15 +339,15 @@ model.config.id2label {0: 'NEGATIVE', 1: 'POSITIVE'} ``` -Теперь мы можем сделать вывод, что модель предсказала следующее: +Теперь мы можем сделать вывод, что модель спрогнозировала следующее: - Первое предложение: NEGATIVE: 0.0402, POSITIVE: 0.9598 - Второе предложение: NEGATIVE: 0.9995, POSITIVE: 0.0005 -Мы успешно воспроизвели три этапа конвейера: предварительную обработку с помощью токенизаторов, передачу входных данных через модель и постобработку! Теперь давайте уделим некоторое время тому, чтобы углубиться в каждый из этих шагов. +Мы успешно воспроизвели три этапа конвейера: предобработку с помощью токенизаторов, прохождение входных данных через модель и постобработку! Теперь давайте уделим немного времени тому, чтобы углубиться в каждый из этих этапов. -✏️ **Попробуйте это сделать!** Выберите два (или более) собственных текста и пропустите их через конвейер `sentiment-analysis`. Затем повторите шаги, которые вы видели здесь, и убедитесь, что вы получаете такие же результаты! +✏️ **Попробуйте! ** Выберите два (или более) собственных текста и пропустите их через конвейер `sentiment-analysis`. Затем повторите описанные здесь шаги и убедитесь, что вы получили те же результаты! diff --git a/chapters/ru/chapter2/3.mdx b/chapters/ru/chapter2/3.mdx index b7e941ac4..42296bcba 100644 --- a/chapters/ru/chapter2/3.mdx +++ b/chapters/ru/chapter2/3.mdx @@ -1,14 +1,14 @@ -# Модели +# Модели[[models]] {#if fw === 'pt'} {:else} @@ -16,8 +16,8 @@ {/if} @@ -29,46 +29,46 @@ {/if} {#if fw === 'pt'} -В этом разделе мы подробнее рассмотрим создание и использование модели. Мы будем использовать класс `AutoModel`, который удобен, когда вы хотите создать экземпляр любой модели из контрольной точки. +В этом разделе мы подробно рассмотрим создание и использование модели. Мы будем использовать класс `AutoModel`, который удобен, когда вы хотите инстанцировать любую модель из контрольной точки. -Класс `AutoModel` и все его родственники на самом деле являются простыми оболочками для большого количества моделей, доступных в библиотеке. Это умная оболочка, поскольку она может автоматически угадывать подходящую архитектуру модели для вашей контрольной точки, а затем создает экземпляр модели с этой архитектурой. +Класс `AutoModel` и все его представители на самом деле являются простыми обертками для широкого спектра моделей, доступных в библиотеке. Это умная обертка, поскольку она может автоматически определить архитектуру модели, подходящую для вашей контрольной точки, а затем инстанцировать модель с этой архитектурой. {:else} -In this section we'll take a closer look at creating and using a model. We'll use the `TFAutoModel` class, which is handy when you want to instantiate any model from a checkpoint. +В этом разделе мы подробно рассмотрим создание и использование модели. Мы будем использовать класс `TFAutoModel`, который удобен, когда вы хотите инстанцировать любую модель из контрольной точки. -Класс `TFAutoModel` и все его родственники на самом деле являются простыми оболочками для большого количества моделей, доступных в библиотеке. Это умная оболочка, поскольку она может автоматически угадывать подходящую архитектуру модели для вашей контрольной точки, а затем создает экземпляр модели с этой архитектурой. +Класс `TFAutoModel` и все его родственники на самом деле являются простыми обертками для широкого спектра моделей, доступных в библиотеке. Это умная обертка, поскольку она может автоматически определить подходящую архитектуру модели для вашей контрольной точки, а затем инстанцировать модель с этой архитектурой. {/if} -Однако, если вы знаете тип модели, которую хотите использовать, вы можете использовать класс, который напрямую определяет ее архитектуру. Давайте посмотрим, как это работает с моделью BERT. +Однако если вы знаете тип модели, которую хотите использовать, вы можете напрямую использовать класс, определяющий ее архитектуру. Давайте рассмотрим, как это работает на примере модели BERT. -## Создание модели Transformer +## Создание Transformer[[creating-a-transformer]] -Первое, что нам нужно будет сделать для инициализации модели BERT, это загрузить объект конфигурации: +Первое, что нам нужно сделать для инициализации модели BERT, - загрузить объект конфигурации: {#if fw === 'pt'} ```py from transformers import BertConfig, BertModel -# Building the config +# Создание конфигурации config = BertConfig() -# Building the model from the config +# Создание модели на основе конфигурации model = BertModel(config) ``` {:else} ```py from transformers import BertConfig, TFBertModel -# Building the config +# Создание конфигурации config = BertConfig() -# Building the model from the config +# Создание модели на основе конфигурации model = TFBertModel(config) ``` {/if} -Конфигурация содержит множество атрибутов, которые используются для построения модели: +Конфигурация содержит множество атрибутов, которые используются для создания модели: ```py print(config) @@ -86,11 +86,11 @@ BertConfig { } ``` -Хотя вы еще не видели, что делают все эти атрибуты, вы должны узнать некоторые из них: атрибут `hidden_size` определяет размер вектора `hidden_states`, а `num_hidden_layers` определяет количество слоев, которые имеет модель. +Хотя вы еще не видели, что делают все эти атрибуты, вы должны узнать некоторые из них: атрибут `hidden_size` определяет размер вектора `hidden_states`, а `num_hidden_layers` определяет количество слоев в модели Transformer. -### Различные способы загрузки +### Различные методы загрузки[[different-loading-methods]] -Создание модели из конфигурации по умолчанию инициализирует ее случайными значениями: +При создании модели из конфигурации по умолчанию она инициализируется случайными значениями: {#if fw === 'pt'} ```py @@ -112,9 +112,9 @@ model = TFBertModel(config) ``` {/if} -Модель можно использовать в этом состоянии, но она будет выводить тарабарщину; сначала ее нужно обучить. Мы могли бы обучить модель с нуля для решения поставленной задачи, но, как вы видели в [Главе 1](../chapter1/1), это потребовало бы много времени и большого количества данных, а также имело бы значительное воздействие на окружающую среду. Чтобы избежать ненужных и дублирующих усилий, крайне важно иметь возможность делиться и повторно использовать модели, которые уже были обучены. +Модель можно использовать и в таком состоянии, но она будет выдавать тарабарщину; сначала ее нужно обучить. Мы могли бы обучить модель с нуля для конкретной задачи, но, как вы видели в [Главе 1](../chapter1), это потребовало бы много времени и большого количества данных, а также оказало бы немалое влияние на окружающую среду. Чтобы избежать ненужных и дублирующих усилий, крайне важно иметь возможность обмениваться уже обученными моделями и повторно их использовать. -Загрузить уже обученную модель Transformer очень просто — мы можем сделать это с помощью метода `from_pretrained()`: +Загрузить уже обученную модель Transformer очень просто - мы можем сделать это с помощью метода `from_pretrained()`: {#if fw === 'pt'} ```py @@ -123,7 +123,7 @@ from transformers import BertModel model = BertModel.from_pretrained("bert-base-cased") ``` -Как вы видели ранее, мы могли бы заменить `BertModel` эквивалентным классом `AutoModel`. С этого момента мы начнем делать так, поскольку таким образом создается код, не зависящий от контрольных точек; если ваш код работает для одной контрольной точки, он должен беспрепятственно работать с другой. Это применимо, даже если архитектура отличается, при условии, что контрольная точка была обучена для аналогичной задачи (например, задачи анализа тональности). +Как вы видели ранее, мы можем заменить `BertModel` на эквивалентный класс `AutoModel`. В дальнейшем мы будем поступать именно так, поскольку таким образом мы получаем код, не зависящий от контрольных точек; если ваш код работает на одной контрольной точке, он должен без проблем работать и на другой. Это касается даже разных архитектур, если контрольная точка была обучена для схожей задачи (например, задачи анализа настроений). {:else} ```py @@ -132,27 +132,27 @@ from transformers import TFBertModel model = TFBertModel.from_pretrained("bert-base-cased") ``` -Как вы видели ранее, мы могли бы заменить `TFBertModel` эквивалентным классом `TFAutoModel`. С этого момента мы начнем делать так, поскольку таким образом создается код, не зависящий от контрольных точек; если ваш код работает для одной контрольной точки, он должен беспрепятственно работать с другой. Это применимо, даже если архитектура отличается, при условии, что контрольная точка была обучена для аналогичной задачи (например, задачи анализа тональности). +Как вы видели ранее, мы можем заменить `TFBertModel` на эквивалентный класс `TFAutoModel`. В дальнейшем мы будем поступать именно так, поскольку таким образом мы получаем код, не зависящий от контрольных точек; если ваш код работает на одной контрольной точке, он должен без проблем работать и на другой. Это касается даже разных архитектур, если контрольная точка была обучена для схожей задачи (например, задачи анализа настроений). {/if} -В приведенном выше примере кода мы не использовали `BertConfig`, а вместо этого загрузили предварительно обученную модель с помощью идентификатора `bert-base-cased`. Это контрольная точка модели, которую обучили сами авторы BERT; вы можете найти более подробную информацию о ней в её [карточке модели](https://huggingface.co/bert-base-cased). +В приведенном выше примере кода мы не использовали `BertConfig`, а вместо этого загрузили предварительно обученную модель через идентификатор `bert-base-cased`. Это контрольная точка модели, которая была обучена самими авторами BERT; более подробную информацию о ней можно найти в ее [карточке модели](https://huggingface.co/bert-base-cased). -Теперь эта модель инициализирована со всеми весами контрольной точки. Её можно использовать непосредственно для логического вывода на задачах, для которых она обучалась, а также её можно точно донастроить для новой задачи. Тренируясь с предварительно обученными весами, а не с нуля, мы можем быстро добиться хороших результатов. +Теперь эта модель инициализирована всеми весами контрольной точки. Ее можно использовать непосредственно для инференса на задачах, для которых она была обучена, а также для дообучения на новой задаче. Обучаясь с предварительно подготовленными весами, а не с нуля, мы можем быстро добиться хороших результатов. -Веса будут загружены и кэшированы (поэтому будущие вызовы метода `from_pretrained()` не будут загружать их повторно) в папку кеша, которая по умолчанию находится в *~/.cache/huggingface/transformers*. Вы можете настроить папку кэша, установив переменную среды `HF_HOME`. +Веса были загружены и кэшированы (чтобы последующие вызовы метода `from_pretrained()` не загружали их заново) в папке кэша, которая по умолчанию находится в *~/.cache/huggingface/transformers*. Вы можете настроить папку кэша, установив переменную окружения `HF_HOME`. -Идентификатор, используемый для загрузки модели, может быть идентификатором любой модели в Model Hub, если он совместим с архитектурой BERT. Полный список доступных контрольных точек моделей BERT можно найти [здесь](https://huggingface.co/models?filter=bert). +Идентификатор, используемый для загрузки модели, может быть идентификатором любой модели на Model Hub, если она совместима с архитектурой BERT. Полный список доступных контрольных точек BERT можно найти [здесь](https://huggingface.co/models?filter=bert). -### Способы сохранения +### Методы сохранения[[saving-methods]] -Сохранить модель так же просто, как и загрузить - для этого мы используем метод `save_pretrained()`, аналогичный методу `from_pretrained()`: +Сохранить модель так же просто, как и загрузить ее - мы используем метод `save_pretrained()`, который аналогичен методу `from_pretrained()`: ```py model.save_pretrained("directory_on_my_computer") ``` -Данный код сохранит два файла на вашем диске: +При этом на диск сохраняются два файла: {#if fw === 'pt'} ``` @@ -168,21 +168,21 @@ config.json tf_model.h5 ``` {/if} -Если вы посмотрите на файл *config.json*, вы увидите атрибуты, необходимые для построения архитектуры модели. Этот файл также содержит некоторые метаданные, например, откуда появилась контрольная точка и какую версию 🤗 Transformers вы использовали, когда в последний раз сохраняли контрольную точку. +Если вы посмотрите на файл *config.json*, то узнаете атрибуты, необходимые для построения архитектуры модели. Этот файл также содержит некоторые метаданные, такие как место создания контрольной точки и версию 🤗 Transformers, которую вы использовали при последнем сохранении контрольной точки. {#if fw === 'pt'} -Файл *pytorch_model.bin* известен как *словарь состояний*; он содержит все веса вашей модели. Эти два файла идут рука об руку; конфигурация необходима, чтобы знать архитектуру вашей модели, в то время как веса модели являются параметрами вашей модели. +Файл *pytorch_model.bin* известен как *словарь состояний (state dictionary)*; он содержит все веса вашей модели. Эти два файла неразрывно связаны друг с другом; конфигурация необходима для того, чтобы знать архитектуру модели, а веса модели - это ее параметры. {:else} -Файл *tf_model.h5* известен как *словарь состояний*; он содержит все веса вашей модели. Эти два файла идут рука об руку; конфигурация необходима, чтобы знать архитектуру вашей модели, в то время как веса модели являются параметрами вашей модели. +Файл *tf_model.h5* известен как *словарь состояний (state dictionary)*; он содержит все веса вашей модели. Эти два файла неразрывно связаны друг с другом; конфигурация необходима для того, чтобы знать архитектуру модели, а веса модели - это ее параметры. {/if} -## Использование модели Transformer для логического вывода +## Использование модели Transformer для инференса[[using-a-transformer-model-for-inference]] -Теперь, когда вы знаете, как загружать и сохранять модель, давайте попробуем использовать ее для построения некоторых предсказаний. Модели Transformer могут обрабатывать только числа — числа, которые генерирует токенизатор. Но прежде чем мы обсудим токенизаторы, давайте рассмотрим, какие входные данные принимает модель. +Теперь, когда вы знаете, как загружать и сохранять модель, давайте попробуем использовать ее для прогнозирования. Модели Transformer могут обрабатывать только числа - числа, которые генерирует токенизатор. Но прежде чем мы обсудим токенизаторы, давайте узнаем, какие входные данные (входы) принимает модель. -Токенизаторы могут позаботиться о преобразовании входных данных в соответствующие тензоры фреймворка, но чтобы помочь вам понять, что происходит, мы кратко рассмотрим, что необходимо сделать, прежде чем отправлять входные данные в модель. +Токенизаторы могут позаботиться о приведении входных данных к тензорам соответствующего фреймворка, но чтобы помочь вам понять, что происходит, мы кратко рассмотрим, что нужно сделать перед передачей входных данных в модель. Допустим, у нас есть несколько последовательностей: @@ -190,7 +190,7 @@ config.json tf_model.h5 sequences = ["Hello!", "Cool.", "Nice!"] ``` -Токенизатор преобразует их в словарные индексы, которые обычно называются *входными идентификаторами*. Каждая последовательность теперь представляет собой список чисел! В результате получается: +Токенизатор преобразует их в индексы словаря, которые обычно называются *идентификаторами входов (input IDs)*. Теперь каждая последовательность представляет собой список чисел! В результате на выходе получаем: ```py no-format encoded_sequences = [ @@ -200,7 +200,7 @@ encoded_sequences = [ ] ``` -Это список закодированных последовательностей: список списков. Тензоры принимают только прямоугольные формы (например, матрицы). Этот "массив" уже имеет прямоугольную форму, поэтому преобразовать его в тензор несложно: +Это список закодированных последовательностей: список списков. Тензоры принимают только прямоугольную форму (подумайте о матрицах). Этот "массив" уже имеет прямоугольную форму, поэтому преобразовать его в тензор очень просто: {#if fw === 'pt'} ```py @@ -216,12 +216,13 @@ model_inputs = tf.constant(encoded_sequences) ``` {/if} -### Использование тензоров в качестве входных данных для модели +### Использование тензоров в качестве входов в модель[[using-the-tensors-as-inputs-to-the-model]] -Использовать тензоры с моделью чрезвычайно просто — мы просто вызываем модель с входными данными: +Использовать тензоры с моделью очень просто - мы просто вызываем модель с входами: ```py output = model(model_inputs) ``` -В то время как модель принимает множество различных аргументов, необходимы только входные идентификаторы. Позже мы объясним, для чего применяются другие аргументы и когда они требуются, но сначала нам нужно поближе познакомиться с токенизаторами, которые используются для создания входных данных, понятных модели Transformer. +Хотя модель принимает множество различных аргументов, только идентификаторы входов являются необходимыми. О том, что делают остальные аргументы и когда они нужны, мы расскажем позже, +но сначала нам нужно подробнее рассмотреть токенизаторы, которые формируют входные данные (входы), которые может понять модель Transformer. diff --git a/chapters/ru/chapter2/4.mdx b/chapters/ru/chapter2/4.mdx new file mode 100644 index 000000000..45b0bb20b --- /dev/null +++ b/chapters/ru/chapter2/4.mdx @@ -0,0 +1,240 @@ + + +# Токенизаторы[[tokenizers]] + +{#if fw === 'pt'} + + + +{:else} + + + +{/if} + + + +Токенизаторы - один из основных компонентов конвейера NLP. Они служат одной цели: преобразовать текст в данные, которые могут быть обработаны моделью. Модели могут обрабатывать только числа, поэтому токенизаторы должны преобразовывать наш текст в числовые данные. В этом разделе мы рассмотрим, что именно происходит в конвейере токенизации. + +В задачах NLP данные, которые обычно подвергаются обработке, представляют собой необработанный текст. Вот пример такого текста: + +``` +Jim Henson was a puppeteer +``` + +Однако модели могут обрабатывать только числа, поэтому нам нужно найти способ преобразовать исходный текст в числа. Этим занимаются токенизаторы, и существует множество способов сделать это. Цель состоит в том, чтобы найти наиболее осмысленное представление - то есть то, которое имеет наибольший смысл для модели, - и, если возможно, наименьшее представление. + +Давайте рассмотрим несколько примеров алгоритмов токенизации и постараемся ответить на некоторые вопросы, которые могут у вас возникнуть по токенизации. + +## На основе слов[[word-based]] + + + +Первый тип токенайзера, который приходит на ум, - это _на основе слов (word-based)_. Как правило, его очень легко настроить и использовать с помощью всего нескольких правил, и он часто дает достойные результаты. Например, на изображении ниже цель состоит в том, чтобы разбить исходный текст на слова и найти для каждого из них числовое представление: + +
+ Пример токенизации на базе слов. + +
+ +Разделить текст можно разными способами. Например, мы можем использовать пробельные символы, чтобы разделить текст на слова, применив функцию Python `split()`: + +```py +tokenized_text = "Jim Henson was a puppeteer".split() +print(tokenized_text) +``` + +```python out +['Jim', 'Henson', 'was', 'a', 'puppeteer'] +``` + +Существуют также разновидности токенизаторов слов, которые содержат дополнительные правила для пунктуации. Используя такой токенизатор, мы можем получить довольно большие "словари", где словарь определяется общим количеством независимых токенов, которые есть в нашем корпусе. + +Каждому слову присваивается идентификатор, начиная с 0 и заканчивая размером словаря. Модель использует эти идентификаторы для идентификации каждого слова. + +Если мы хотим полностью покрыть язык с помощью токенизатора, основанного на словах, нам понадобится идентификатор для каждого слова в языке, что приведет к созданию огромного количества токенов. Например, в английском языке более 500 000 слов, поэтому, чтобы построить карту соответствия каждого слова входному идентификатору, нам нужно будет отслеживать такое количество идентификаторов. Кроме того, такие слова, как "dog", представляются иначе, чем слова типа "dogs", и модель изначально не будет знать, что "dog" и "dogs" похожи: она определит эти два слова как несвязанные. То же самое относится и к другим похожим словам, например "run" и "running", которые модель изначально не будет воспринимать как похожие. + +Наконец, нам нужен специальный токен для обозначения слов, которых нет в нашем словаре. Это так называемый "unknown" токен, часто представляемый как "[UNK]" или "<unk>". Обычно это плохой знак, если вы видите, что токенизатор выдает много таких токенов, поскольку он не смог получить разумное представление слова, и вы теряете информацию на этом этапе. При создании словаря целью является сделать это таким образом, чтобы токенизатор как можно меньше слов токенизировал как неизвестный токен. + +Один из способов уменьшить количество неизвестных токенов - это пойти на один уровень глубже, используя _основанный на символах (character-based)_ токенизатор. + +## На основе символов[[character-based]] + + + +Токенизаторы на основе символов (character-based) разбивают текст на символы, а не на слова. Это дает два основных преимущества: + +- Словарь намного меньше. +- Неизвестных токенов гораздо меньше, поскольку каждое слово может быть образовано из символов. + +Но и здесь возникают некоторые вопросы, связанные с пробелами и пунктуацией: + +
+ Пример токенизации, основанной на символах. + +
+ +Такой подход тоже не идеален. Поскольку представление теперь основано на символах, а не на словах, можно утверждать, что интуитивно оно менее осмысленно: каждый символ сам по себе мало что значит, в то время как в случае со словами это не так. Однако это опять же зависит от языка: например, в Китайском языке каждый символ несет больше информации, чем символ в латинском языке. + +Еще один момент, который следует учитывать, - это то, что в итоге мы получим очень большое количество токенов для обработки нашей моделью: если при использовании токенизатора, основанного на словах, слово будет состоять только из одного токена, то при преобразовании в символы оно может легко превратиться в 10 или более токенов. + +Чтобы получить лучшее из обоих миров, мы можем использовать третью технику, которая объединяет эти два подхода: *токенизацию по подсловам (subword tokenization)*. + +## Токенизация по подсловам[[subword-tokenization]] + + + +Алгоритмы токенизации подслов (subword tokenization) основываются на принципе, согласно которому часто используемые слова не должны разбиваться на более мелкие подслова, а редкие слова должны быть разложены на значимые подслова. + +Например, "annoyingly" может считаться редким словом и может быть разложено на "annoying" и "ly". Оба они, скорее всего, будут чаще появляться как самостоятельные подслова, но в то же время значение " annoyingly" сохраняется за счет составного значения "annoying" и "ly". + +Вот пример, показывающий, как алгоритм токенизации подслов будет токенизировать последовательность "Let's do tokenization!": + +
+ Алгоритм токенизации по подсловам. + +
+ +Эти подслова в конечном итоге несут в себе большой семантический смысл: например, в приведенном выше примере "tokenization" было разделено на "token" и "ization" - два токена, которые несут в себе семантический смысл и при этом занимают мало места (для представления длинного слова требуется всего два токена). Это позволяет нам получить относительно хорошее покрытие при небольшом размере словаря и почти полном отсутствии неизвестных токенов. + +Этот подход особенно полезен в агглютинативных языках, таких как турецкий, где вы можете образовывать (почти) произвольно длинные сложные слова, соединяя подслова. + +### И не только![[and-more]] + +Неудивительно, что существует множество других техник. Вот лишь некоторые из них: + +- Byte-level BPE, на уровне байтов, используется в GPT-2 +- WordPiece, используемый в BERT +- SentencePiece или Unigram, используемый в нескольких многоязычных моделях + +Теперь у вас должно быть достаточно знаний о том, как работают токенизаторы, чтобы приступить к работе с API. + +## Загрузка и сохранение[[loading-and-saving]] + +Загрузка и сохранение токенизаторов так же проста, как и в случае с моделями. Фактически, они основаны на тех же двух методах: `from_pretrained()` и `save_pretrained()`. Эти методы загружают или сохраняют алгоритм, используемый токенизатором (что-то вроде *архитектуры* модели), а также его словарь (что-то вроде *весов* модели). + +Загрузка токенизатора BERT, обученного на той же контрольной точке, что и BERT, выполняется так же, как и загрузка модели, за исключением того, что мы используем класс `BertTokenizer`: + +```py +from transformers import BertTokenizer + +tokenizer = BertTokenizer.from_pretrained("bert-base-cased") +``` + +{#if fw === 'pt'} +Подобно `AutoModel`, класс `AutoTokenizer` будет захватывать нужный класс токенизатора в библиотеке, основываясь на имени контрольной точки, и может быть использован непосредственно с любой контрольной точкой: + +{:else} +Подобно `TFAutoModel`, класс `AutoTokenizer` захватит нужный класс токенизатора в библиотеке, основываясь на имени контрольной точки, и может быть использован непосредственно с любой контрольной точкой: + +{/if} + +```py +from transformers import AutoTokenizer + +tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") +``` + +Теперь мы можем использовать токенизатор, как показано в предыдущем разделе: + +```python +tokenizer("Using a Transformer network is simple") +``` + +```python out +{'input_ids': [101, 7993, 170, 11303, 1200, 2443, 1110, 3014, 102], + 'token_type_ids': [0, 0, 0, 0, 0, 0, 0, 0, 0], + 'attention_mask': [1, 1, 1, 1, 1, 1, 1, 1, 1]} +``` + +Сохранение токенизатора идентично сохранению модели: + +```py +tokenizer.save_pretrained("directory_on_my_computer") +``` + +Подробнее о `token_type_ids` мы поговорим в [Главе 3](../chapter3/1), а ключ `attention_mask` мы объясним чуть позже. Сначала давайте посмотрим, как генерируются `input_ids`. Для этого нам понадобится рассмотреть промежуточные методы токенизатора. + +## Кодирование[[encoding]] + + + +Перевод текста в числа называется _кодированием (encoding)_. Кодирование выполняется в два этапа: токенизация, а затем преобразование во входные идентификаторы. + +Как мы уже видели, первым шагом является разбиение текста на слова (или части слов, знаки препинания и т. д.), обычно называемые *токенами*. Существует множество правил, которые могут управлять этим процессом, поэтому нам нужно инстанцировать токенизатор, используя имя модели, чтобы убедиться, что мы используем те же правила, которые были использованы во время предварительного обучения модели. + +Второй шаг - преобразование этих токенов в числа, чтобы мы могли построить из них тензор и передать его в модель. Для этого у токенизатора есть *словарь*, который мы загружаем, когда инстанцируем его с помощью метода `from_pretrained()`. Опять же, нам нужно использовать тот же словарь, который использовался при предварительном обучении модели. + +Чтобы лучше понять эти два этапа, мы рассмотрим их по отдельности. Обратите внимание, что мы будем использовать некоторые методы, выполняющие части конвейера токенизации отдельно, чтобы показать вам промежуточные результаты этих шагов, но на практике вы должны вызывать токенизатор непосредственно на ваших входных данных (как показано в разделе 2). + +### Токенизация[[tokenization]] + +Процесс токенизации выполняется методом `tokenize()` токенизатора: + +```py +from transformers import AutoTokenizer + +tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") + +sequence = "Using a Transformer network is simple" +tokens = tokenizer.tokenize(sequence) + +print(tokens) +``` + +Результатом работы этого метода является список строк, или токенов: + +```python out +['Using', 'a', 'transform', '##er', 'network', 'is', 'simple'] +``` + +Этот токенизатор является токенизатором подслов: он разбивает слова до тех пор, пока не получит токены, которые могут быть представлены в его словаре. В данном случае слово `transformer` разбивается на два токена: `transform` и `##er`. + +### От токенов к идентификаторам входа[[from-tokens-to-input-ids]] + +Преобразование во входные идентификаторы выполняется методом токенизатора `convert_tokens_to_ids()`: + +```py +ids = tokenizer.convert_tokens_to_ids(tokens) + +print(ids) +``` + +```python out +[7993, 170, 11303, 1200, 2443, 1110, 3014] +``` + +Эти выходы, преобразованные в тензор соответствующего фреймворка, могут быть использованы в качестве входов в модель, как было показано ранее в этой главе. + + + +✏️ **Попробуйте! ** Повторите два последних шага (токенизацию и преобразование во входные идентификаторы) на входных предложениях, которые мы использовали в разделе 2 ("I've been waiting for a HuggingFace course my whole life." и "I hate this so much!"). Убедитесь, что вы получили те же самые входные идентификаторы, которые мы получали ранее! + + + +## Декодирование[[decoding]] + +*Декодирование* происходит наоборот: из индексов словаря мы хотим получить строку. Это можно сделать с помощью метода `decode()` следующим образом: + +```py +decoded_string = tokenizer.decode([7993, 170, 11303, 1200, 2443, 1110, 3014]) +print(decoded_string) +``` + +```python out +'Using a Transformer network is simple' +``` + +Обратите внимание, что метод `decode` не только преобразует индексы обратно в токены, но и группирует токены, которые были частью одних и тех же слов, чтобы создать читаемое предложение. Такое поведение будет очень полезно, когда мы будем использовать модели, прогнозирующие новый текст (либо текст, сгенерированный из подсказки (prompt), либо для решения задачи преобразования последовательности-в-последовательность (sequence-to-sequence), такой как перевод или резюмирование). + +Теперь вы должны понимать, какие атомарные операции может выполнять токенизатор: токенизация, преобразование в идентификаторы и преобразование идентификаторов обратно в строку. Однако мы лишь пощупали верхушку айсберга. В следующем разделе мы рассмотрим ограничения нашего подхода и посмотрим, как их преодолеть. diff --git a/chapters/ru/chapter2/5.mdx b/chapters/ru/chapter2/5.mdx new file mode 100644 index 000000000..5dfa9c630 --- /dev/null +++ b/chapters/ru/chapter2/5.mdx @@ -0,0 +1,338 @@ + + +# Обработка нескольких последовательностей[[handling-multiple-sequences]] + +{#if fw === 'pt'} + + + +{:else} + + + +{/if} + +{#if fw === 'pt'} + +{:else} + +{/if} + +В предыдущем разделе мы рассмотрели самый простой вариант использования: проведение инференса на одной последовательности небольшой длины. Однако уже сейчас возникают некоторые вопросы: + +- Как нам работать с несколькими последовательностями? +- Как нам работать с несколькими последовательностями *разной длины*? +- Являются ли индексы словаря единственными входными данными, которые позволяют модели работать хорошо? +- Существует ли такая вещь, как слишком длинная последовательность? + +Давайте посмотрим, какие проблемы возникают в связи с этими вопросами и как их можно решить с помощью 🤗 Transformers API. + +## Модели ожидают батч входов[[models-expect-a-batch-of-inputs]] + +В предыдущем упражнении вы видели, как последовательности преобразуются в списки чисел. Давайте преобразуем этот список чисел в тензор и передадим его в модель: + +{#if fw === 'pt'} +```py +import torch +from transformers import AutoTokenizer, AutoModelForSequenceClassification + +checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) +model = AutoModelForSequenceClassification.from_pretrained(checkpoint) + +sequence = "I've been waiting for a HuggingFace course my whole life." + +tokens = tokenizer.tokenize(sequence) +ids = tokenizer.convert_tokens_to_ids(tokens) +input_ids = torch.tensor(ids) +# Эта строка выдаст ошибку. +model(input_ids) +``` + +```python out +IndexError: Dimension out of range (expected to be in range of [-1, 0], but got 1) +``` +{:else} +```py +import tensorflow as tf +from transformers import AutoTokenizer, TFAutoModelForSequenceClassification + +checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) +model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint) + +sequence = "I've been waiting for a HuggingFace course my whole life." + +tokens = tokenizer.tokenize(sequence) +ids = tokenizer.convert_tokens_to_ids(tokens) +input_ids = tf.constant(ids) +# Эта строка выдаст ошибку. +model(input_ids) +``` + +```py out +InvalidArgumentError: Input to reshape is a tensor with 14 values, but the requested shape has 196 [Op:Reshape] +``` +{/if} + +О нет! Почему это не удалось? Мы следовали шагам из конвейера в разделе 2. + +Проблема в том, что мы отправили в модель одну последовательность, в то время как 🤗 модели Transformers по умолчанию ожидают несколько предложений. Здесь мы попытались сделать все то, что токенизатор делал за кулисами, когда мы применяли его к `последовательности`. Но если вы приглядитесь, то увидите, что токенизатор не просто преобразовал список входных идентификаторов в тензор, а добавил к нему еще одно измерение: + +{#if fw === 'pt'} +```py +tokenized_inputs = tokenizer(sequence, return_tensors="pt") +print(tokenized_inputs["input_ids"]) +``` + +```python out +tensor([[ 101, 1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, + 2607, 2026, 2878, 2166, 1012, 102]]) +``` +{:else} +```py +tokenized_inputs = tokenizer(sequence, return_tensors="tf") +print(tokenized_inputs["input_ids"]) +``` + +```py out + +``` +{/if} + +Давайте попробуем еще раз и добавим новое измерение: + +{#if fw === 'pt'} +```py +import torch +from transformers import AutoTokenizer, AutoModelForSequenceClassification + +checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) +model = AutoModelForSequenceClassification.from_pretrained(checkpoint) + +sequence = "I've been waiting for a HuggingFace course my whole life." + +tokens = tokenizer.tokenize(sequence) +ids = tokenizer.convert_tokens_to_ids(tokens) + +input_ids = torch.tensor([ids]) +print("Input IDs:", input_ids) + +output = model(input_ids) +print("Logits:", output.logits) +``` +{:else} +```py +import tensorflow as tf +from transformers import AutoTokenizer, TFAutoModelForSequenceClassification + +checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) +model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint) + +sequence = "I've been waiting for a HuggingFace course my whole life." + +tokens = tokenizer.tokenize(sequence) +ids = tokenizer.convert_tokens_to_ids(tokens) + +input_ids = tf.constant([ids]) +print("Input IDs:", input_ids) + +output = model(input_ids) +print("Logits:", output.logits) +``` +{/if} + +Мы выводим входные идентификаторы, а также результирующие логиты - вот результат: + +{#if fw === 'pt'} +```python out +Input IDs: [[ 1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, 2607, 2026, 2878, 2166, 1012]] +Logits: [[-2.7276, 2.8789]] +``` +{:else} +```py out +Input IDs: tf.Tensor( +[[ 1045 1005 2310 2042 3403 2005 1037 17662 12172 2607 2026 2878 + 2166 1012]], shape=(1, 14), dtype=int32) +Logits: tf.Tensor([[-2.7276208 2.8789377]], shape=(1, 2), dtype=float32) +``` +{/if} + +*Батчинг* - это отправка нескольких предложений через модель одновременно. Если у вас есть только одно предложение, вы можете просто создать батч с одной последовательностью: + +``` +batched_ids = [ids, ids] +``` + +Это батч из двух одинаковых последовательностей! + + + +✏️ **Попробуйте!** Преобразуйте этот список `batched_ids` в тензор и пропустите его через вашу модель. Проверьте, что вы получаете те же логиты, что и раньше (но дважды)! + + + +Батчинг позволяет модели работать, когда вы подаете ей несколько последовательностей. Использование нескольких последовательностей так же просто, как и создание батча с одной последовательностью. Однако есть и вторая проблема. Когда вы пытаетесь собрать в батч два (или более) предложения, они могут быть разной длины. Если вы когда-нибудь работали с тензорами, то знаете, что они должны иметь прямоугольную форму, поэтому вы не сможете напрямую преобразовать список входных идентификаторов в тензор. Чтобы обойти эту проблему, мы обычно прибегаем к *дополнению (pad)* входных данных. + +## Дополнение входов[[padding-the-inputs]] + +Следующий список списков не может быть преобразован в тензор: + +```py no-format +batched_ids = [ + [200, 200, 200], + [200, 200] +] +``` + +Чтобы обойти эту проблему, мы будем использовать *дополнение (padding)*, чтобы придать тензорам прямоугольную форму. Дополнение обеспечивает одинаковую длину всех предложений, добавляя специальное слово *токен дополнения* к предложениям с меньшим количеством значений. Например, если у вас есть 10 предложений с 10 словами и 1 предложение с 20 словами, то при дополнении все предложения будут состоять из 20 слов. В нашем примере результирующий тензор выглядит следующим образом: + +```py no-format +padding_id = 100 + +batched_ids = [ + [200, 200, 200], + [200, 200, padding_id], +] +``` + +Идентификатор токена дополнения можно найти в `tokenizer.pad_token_id`. Давайте используем его и отправим наши два предложения в модель по отдельности и батчем: + +{#if fw === 'pt'} +```py no-format +model = AutoModelForSequenceClassification.from_pretrained(checkpoint) + +sequence1_ids = [[200, 200, 200]] +sequence2_ids = [[200, 200]] +batched_ids = [ + [200, 200, 200], + [200, 200, tokenizer.pad_token_id], +] + +print(model(torch.tensor(sequence1_ids)).logits) +print(model(torch.tensor(sequence2_ids)).logits) +print(model(torch.tensor(batched_ids)).logits) +``` + +```python out +tensor([[ 1.5694, -1.3895]], grad_fn=) +tensor([[ 0.5803, -0.4125]], grad_fn=) +tensor([[ 1.5694, -1.3895], + [ 1.3373, -1.2163]], grad_fn=) +``` +{:else} +```py no-format +model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint) + +sequence1_ids = [[200, 200, 200]] +sequence2_ids = [[200, 200]] +batched_ids = [ + [200, 200, 200], + [200, 200, tokenizer.pad_token_id], +] + +print(model(tf.constant(sequence1_ids)).logits) +print(model(tf.constant(sequence2_ids)).logits) +print(model(tf.constant(batched_ids)).logits) +``` + +```py out +tf.Tensor([[ 1.5693678 -1.3894581]], shape=(1, 2), dtype=float32) +tf.Tensor([[ 0.5803005 -0.41252428]], shape=(1, 2), dtype=float32) +tf.Tensor( +[[ 1.5693681 -1.3894582] + [ 1.3373486 -1.2163193]], shape=(2, 2), dtype=float32) +``` +{/if} + +Что-то не так с логитами в наших батчах: во втором ряду должны быть те же логиты, что и для второго предложения, но мы получили совершенно другие значения! + +Это связано с тем, что ключевой особенностью моделей Transformer являются слои внимания (attention layers), которые *контекстуализируют* каждый токен. Они учитывают токены дополнений, так как рассматривают все токены последовательности. Чтобы получить одинаковый результат при прохождении через модель отдельных предложений разной длины или при прохождении батча с одинаковыми предложениями и дополнениями, нам нужно указать слоям внимания игнорировать дополняющие токены. Для этого используется маска внимания (attention mask). + +## Маски внимания[[attention-masks]] + +*Маски внимания (Attention masks)* - это тензоры той же формы, что и тензор входных идентификаторов, заполненные 0 и 1: 1 означает, что соответствующие токены должны "привлекать внимание", а 0 означает, что соответствующие токены не должны "привлекать внимание" (т.е. должны игнорироваться слоями внимания модели). + +Дополним предыдущий пример маской внимания: + +{#if fw === 'pt'} +```py no-format +batched_ids = [ + [200, 200, 200], + [200, 200, tokenizer.pad_token_id], +] + +attention_mask = [ + [1, 1, 1], + [1, 1, 0], +] + +outputs = model(torch.tensor(batched_ids), attention_mask=torch.tensor(attention_mask)) +print(outputs.logits) +``` + +```python out +tensor([[ 1.5694, -1.3895], + [ 0.5803, -0.4125]], grad_fn=) +``` +{:else} +```py no-format +batched_ids = [ + [200, 200, 200], + [200, 200, tokenizer.pad_token_id], +] + +attention_mask = [ + [1, 1, 1], + [1, 1, 0], +] + +outputs = model(tf.constant(batched_ids), attention_mask=tf.constant(attention_mask)) +print(outputs.logits) +``` + +```py out +tf.Tensor( +[[ 1.5693681 -1.3894582 ] + [ 0.5803021 -0.41252586]], shape=(2, 2), dtype=float32) +``` +{/if} + +Теперь мы получим такие же логиты для второго предложения в батче. + +Обратите внимание, что последнее значение второй последовательности - это идентификатор дополнения (padding ID), который в маске внимания имеет значение 0. + + + +✏️ **Попробуйте! ** Примените токенизацию вручную к двум предложениям, использованным в разделе 2 ("I've been waiting for a HuggingFace course my whole life." и "I hate this so much!"). Пропустите их через модель и проверьте, что вы получите те же логиты, что и в разделе 2. Теперь объедините их в батч с использованием токена дополнения, а затем создайте соответствующую маску внимания. Проверьте, что при прохождении через модель вы получаете те же результаты! + + + +## Более длинные последовательности[[longer-sequences]] + +В моделях Transformer существует ограничение на длину последовательностей, которые мы можем передавать моделям. Большинство моделей работают с последовательностями длиной до 512 или 1024 токенов и терпят крах при необходимости обработки более длинных последовательностей. Есть два решения этой проблемы: + +- Использовать модель с большей поддерживаемой длиной последовательности. +- Усечение (truncate) последовательностей. + +Модели имеют разную поддерживаемую длину последовательности, а некоторые специализируются на работе с очень длинными последовательностями. Одним из примеров является [Longformer](https://huggingface.co/docs/transformers/model_doc/longformer), а другим - [LED](https://huggingface.co/docs/transformers/model_doc/led). Если вы работаете над задачей, требующей очень длинных последовательностей, мы рекомендуем вам обратить внимание на эти модели. + +В противном случае мы рекомендуем использовать усечение последовательностей, указав параметр `max_sequence_length`: + +```py +sequence = sequence[:max_sequence_length] +``` diff --git a/chapters/ru/chapter2/6.mdx b/chapters/ru/chapter2/6.mdx new file mode 100644 index 000000000..6097ad0fa --- /dev/null +++ b/chapters/ru/chapter2/6.mdx @@ -0,0 +1,164 @@ + + +# Собираем все воедино[[putting-it-all-together]] + +{#if fw === 'pt'} + + + +{:else} + + + +{/if} + +В последних нескольких разделах мы старались делать большую часть работы вручную. Мы изучили, как работают токенизаторы, рассмотрели токенизацию, преобразование во входные идентификаторы, дополнении, усечении и маски внимания. + +Однако, как мы видели в разделе 2, 🤗 Transformers API может обработать все это для нас с помощью высокоуровневой функции, которую мы рассмотрим здесь. Когда вы вызываете свой `tokenizer` непосредственно на предложении, вы получаете обратно входы, готовые к передаче в вашу модель: + +```py +from transformers import AutoTokenizer + +checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) + +sequence = "I've been waiting for a HuggingFace course my whole life." + +model_inputs = tokenizer(sequence) +``` + +Здесь переменная `model_inputs` содержит все, что необходимо для нормальной работы модели. Для DistilBERT это идентификаторы входов, а также маска внимания. В других моделях, принимающих дополнительные входы, они также будут формироваться выходами объекта `tokenizer`. + +Как мы увидим на нескольких примерах ниже, это очень мощный метод. Во-первых, он может токенизировать одну последовательность: + +```py +sequence = "I've been waiting for a HuggingFace course my whole life." + +model_inputs = tokenizer(sequence) +``` + +Он также обрабатывает несколько последовательностей одновременно, без каких-либо изменений в API: + +```py +sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"] + +model_inputs = tokenizer(sequences) +``` + +Он может быть дополнен исходя из нескольких целей: + +```py +# Дополнение последовательностей до максимальной длины последовательности +model_inputs = tokenizer(sequences, padding="longest") + +# Дополнение последовательностей до максимальной длины модели +# (512 для BERT или DistilBERT) +model_inputs = tokenizer(sequences, padding="max_length") + +# Дополнение последовательностей до заданной максимальной длины +model_inputs = tokenizer(sequences, padding="max_length", max_length=8) +``` + +Он также может выполнять усечение последовательностей: + +```py +sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"] + +# Усечение последовательностей, длина которых превышает максимальную длину модели +# (512 для BERT или DistilBERT) +model_inputs = tokenizer(sequences, truncation=True) + +# Усечение последовательностей, длина которых превышает заданную максимальную длину +model_inputs = tokenizer(sequences, max_length=8, truncation=True) +``` + +Объект `tokenizer` может выполнять преобразование в тензоры конкретных фреймворков, которые затем могут быть напрямую переданы в модель. Например, в следующем примере кода мы задаем токенизатору возвращать тензоры для различных фреймворков - `"pt"` возвращает тензоры PyTorch, `"tf"` возвращает тензоры TensorFlow, а `"np"` возвращает массивы NumPy: + +```py +sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"] + +# Вернуть тензоры PyTorch +model_inputs = tokenizer(sequences, padding=True, return_tensors="pt") + +# Вернуть тензоры TensorFlow +model_inputs = tokenizer(sequences, padding=True, return_tensors="tf") + +# Вернуть массивы NumPy +model_inputs = tokenizer(sequences, padding=True, return_tensors="np") +``` + +## Специальные токены[[special-tokens]] + +Если мы посмотрим на идентификаторы входа, возвращаемые токенизатором, то увидим, что они немного отличаются от тех, что мы получали ранее: + +```py +sequence = "I've been waiting for a HuggingFace course my whole life." + +model_inputs = tokenizer(sequence) +print(model_inputs["input_ids"]) + +tokens = tokenizer.tokenize(sequence) +ids = tokenizer.convert_tokens_to_ids(tokens) +print(ids) +``` + +```python out +[101, 1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, 2607, 2026, 2878, 2166, 1012, 102] +[1045, 1005, 2310, 2042, 3403, 2005, 1037, 17662, 12172, 2607, 2026, 2878, 2166, 1012] +``` + +Один идентификатор токена был добавлен в начале, а другой - в конце. Давайте декодируем две последовательности идентификаторов, приведенные выше, чтобы понять, в чем дело: + +```py +print(tokenizer.decode(model_inputs["input_ids"])) +print(tokenizer.decode(ids)) +``` + +```python out +"[CLS] i've been waiting for a huggingface course my whole life. [SEP]" +"i've been waiting for a huggingface course my whole life." +``` + +Токенизатор добавил специальное слово `[CLS]` в начале и специальное слово `[SEP]` в конце. Это связано с тем, что модель была предварительно обучена с ними, поэтому для получения тех же результатов при инференсе нам нужно добавить и их. Обратите внимание, что некоторые модели не добавляют специальные слова или добавляют другие слова; модели также могут добавлять эти специальные слова только в начале или только в конце. В любом случае, токенизатор знает, какие из них ожидаются, и справится с этим сам. + +## Подведение итогов: От токенизатора к модели[[wrapping-up-from-tokenizer-to-model]] + +Теперь, когда мы рассмотрели все отдельные шаги, которые использует объект `tokenizer` при работе с текстами, давайте в последний раз посмотрим, как он может работать с множественными последовательностями (дополнение!), очень длинными последовательностями (усечение!) и несколькими типами тензоров с помощью своего основного API: + +{#if fw === 'pt'} +```py +import torch +from transformers import AutoTokenizer, AutoModelForSequenceClassification + +checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) +model = AutoModelForSequenceClassification.from_pretrained(checkpoint) +sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"] + +tokens = tokenizer(sequences, padding=True, truncation=True, return_tensors="pt") +output = model(**tokens) +``` +{:else} +```py +import tensorflow as tf +from transformers import AutoTokenizer, TFAutoModelForSequenceClassification + +checkpoint = "distilbert-base-uncased-finetuned-sst-2-english" +tokenizer = AutoTokenizer.from_pretrained(checkpoint) +model = TFAutoModelForSequenceClassification.from_pretrained(checkpoint) +sequences = ["I've been waiting for a HuggingFace course my whole life.", "So have I!"] + +tokens = tokenizer(sequences, padding=True, truncation=True, return_tensors="tf") +output = model(**tokens) +``` +{/if} diff --git a/chapters/ru/chapter2/7.mdx b/chapters/ru/chapter2/7.mdx index 708d47430..13c62e066 100644 --- a/chapters/ru/chapter2/7.mdx +++ b/chapters/ru/chapter2/7.mdx @@ -1,18 +1,18 @@ -# Базовое использование завершено! +# Базовое использование завершено![[basic-usage-completed]] -Отличная работа, вы прошли курс до текущего момента! Напомним, что в этой главе вы: +Отличная работа по изучению курса до этого места! Напомним, что в этой главе вы: -- Изучил основные строительные блоки модели Transformer. +- Узнали об основных составляющих блоках модели Transformer. - Узнали, из чего состоит конвейер токенизации. -- Увидел, как использовать модель Transformer на практике. -- Научились использовать токенизатор для преобразования текста в тензоры, понятные модели. -- Настроили токенизатор и модель так, чтобы было возможно перейти от текста к прогнозированию. -- Изучили ограничения для входных идентификаторов и узнал о масках внимания. -- Поэкспериментировали с универсальными и настраиваемыми методами токенизатора. +- Узнали, как использовать модель Transformer на практике. +- Узнали, как использовать токенизатор для преобразования текста в тензоры, понятные модели. +- Настроили токенизатор и модель вместе, чтобы перейти от текста к прогнозам. +- Узнали об ограничениях входных идентификаторов и познакомились с масками внимания. +- Поиграли с универсальными и настраиваемыми методами токенизатора. -Теперь вы сможете свободно ориентироваться в документации 🤗 Transformers: словарный запас будет для вас знаком, и к тому уже вы видели методы, которые будете использовать большую часть времени. +С этого момента вы должны свободно ориентироваться в документации 🤗 Transformers: лексикон будет звучать знакомо, и вы уже познакомились с методами, которые будете использовать чаще всего. diff --git a/chapters/ru/chapter2/8.mdx b/chapters/ru/chapter2/8.mdx new file mode 100644 index 000000000..d9e4a98f1 --- /dev/null +++ b/chapters/ru/chapter2/8.mdx @@ -0,0 +1,310 @@ + + + + +# Итоговый тест по главе[[end-of-chapter-quiz]] + + + +### 1. Каков порядок работы конвейера языкового моделирования? + + + +### 2. Сколько измерений имеет тензор, выводимый базовой моделью Transformer, и каковы они? + + + +### 3. Что из перечисленного ниже является примером токенизации по подсловам? + + + +### 4. Что такое голова модели? + + + +{#if fw === 'pt'} +### 5. Что такое AutoModel? + +AutoTrain?" + }, + { + text: "Объект, возвращающий правильную архитектуру на основе контрольной точки", + explain: "Именно: в AutoModel для возврата правильной архитектуры достаточно знать контрольную точку, с которой нужно инициализироваться.", + correct: true + }, + { + text: "Модель, которая автоматически определяет язык, используемый для входов, чтобы загрузить правильные веса", + explain: "Неверно; хотя некоторые контрольные точки и модели способны работать с несколькими языками, встроенных инструментов для автоматического выбора контрольной точки в зависимости от языка не существует. Вам следует обратиться в Model Hub, чтобы найти лучшую контрольную точку для вашей задачи!" + } + ]} +/> + +{:else} +### 5. Что такое TFAutoModel? + +AutoTrain?" + }, + { + text: "Объект, возвращающий правильную архитектуру на основе контрольной точки", + explain: "Именно так: в TFAutoModel для возврата правильной архитектуры достаточно знать контрольную точку, с которой нужно инициализироваться.", + correct: true + }, + { + text: "Модель, которая автоматически определяет язык, используемый на входах, чтобы загрузить правильные веса", + explain: "Неверно; хотя некоторые контрольные точки и модели способны работать с несколькими языками, встроенных инструментов для автоматического выбора контрольной точки в зависимости от языка не существует. Вам следует обратиться в Model Hub, чтобы найти лучшую контрольную точку для вашей задачи!" + } + ]} +/> + +{/if} + +### 6. На какие техники следует обратить внимание при объединении в батч последовательностей разной длины? + + + +### 7. В чем смысл применения функции SoftMax к логитам, выводимым моделью классификации последовательностей? + + + +### 8. Какой метод является основным в API токенизатора? + +encode, поскольку он может кодировать текст в идентификаторы и идентификаторы в прогнозы.", + explain: "Неверно! Если метод encode существует в токенизаторах, то в моделях его нет." + }, + { + text: "Вызов объекта токенизатора напрямую.", + explain: "Точно! Метод __call__ токенизатора - это очень мощный метод, который может обрабатывать практически все. Это также метод, используемый для получения прогнозов из модели.", + correct: true + }, + { + text: "pad", + explain: "Неверно! Дополнение очень полезно, но это всего лишь одна из частей API токенизатора." + }, + { + text: "tokenize", + explain: "Метод tokenize, пожалуй, один из самых полезных методов, но он не является ядром API токенизатора." + } + ]} +/> + +### 9. Что содержит переменная `result` в этом примере кода? + +```py +from transformers import AutoTokenizer + +tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") +result = tokenizer.tokenize("Hello!") +``` + +__call__ или convert_tokens_to_ids!" + }, + { + text: "Строка, содержащая все токены", + explain: "Это было бы неоптимально, поскольку цель состоит в том, чтобы разбить строку на множество токенов." + } + ]} +/> + +{#if fw === 'pt'} +### 10. Есть ли что-то неправильное в следующем коде? + +```py +from transformers import AutoTokenizer, AutoModel + +tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") +model = AutoModel.from_pretrained("gpt2") + +encoded = tokenizer("Hey!", return_tensors="pt") +result = model(**encoded) +``` + + + +{:else} +### 10. Что-то не так с приведенным ниже кодом? + +```py +from transformers import AutoTokenizer, TFAutoModel + +tokenizer = AutoTokenizer.from_pretrained("bert-base-cased") +model = TFAutoModel.from_pretrained("gpt2") + +encoded = tokenizer("Hey!", return_tensors="pt") +result = model(**encoded) +``` + + + +{/if}