<label id="jgr5k"></label>
    <legend id="jgr5k"><track id="jgr5k"></track></legend>

    <sub id="jgr5k"></sub>
  1. <u id="jgr5k"></u>
      久草国产视频,91资源总站,在线免费看AV,丁香婷婷社区,久久精品99久久久久久久久,色天使av,无码探花,香蕉av在线
      您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強(qiáng)烈建議使用更快更安全的瀏覽器
      此為臨時鏈接,僅用于文章預(yù)覽,將在時失效
      人工智能開發(fā)者 正文
      發(fā)私信給skura
      發(fā)送

      1

      手把手教你用 Transformers 和 Tokenizers 從頭訓(xùn)練新語言模型

      本文作者: skura 2020-02-20 11:42
      導(dǎo)語:如何從頭開始訓(xùn)練自己的語言模型?

      在過去的幾周里,我們對 transformers 和 tokenizers 庫進(jìn)行了一些改進(jìn),目的是讓從頭開始訓(xùn)練新的語言模型變得更加容易。              

      在本文中,我們將演示如何用世界語訓(xùn)練一個「小」模型(84 M,6 個層,768 個隱藏層,12 個注意力頭)——這與 DistilBERT 的層數(shù)和注意力頭數(shù)相同。然后,我們將在詞性標(biāo)記的下游任務(wù)上微調(diào)模型。

      世界語是一種以易學(xué)性為目標(biāo)的結(jié)構(gòu)化語言。我們選擇它有幾個原因:              

      • 它是一種資源相對較少的語言(盡管大約有 200 萬人使用它),所以這個演示不像訓(xùn)練一個英語模型那樣枯燥?。          

      • 它的語法規(guī)則性很強(qiáng)(例如所有常用名詞都以 -o 結(jié)尾,所有形容詞都以 -a 結(jié)尾),所以即使是在一個小的數(shù)據(jù)集上,我們也可以得到有趣的結(jié)果。              

      • 最后,語言的總體目標(biāo)是縮短人與人之間的距離,促進(jìn)世界和平和國際理解,可以說是與 NLP 社區(qū)的目標(biāo)一致?。           

      PS:你不需要了解世界語就可以理解這篇文章。

      我們的模型將被稱為…「wait for it… EsperBERTo」?。

      手把手教你用 Transformers 和 Tokenizers 從頭訓(xùn)練新語言模型

      1.查找數(shù)據(jù)集              

      首先,讓我們找到一個世界語文本的語料庫。這里我們將使用來自 INRIA 的 OSCAR 語料庫(https://traces1.inria.fr/oscar/ )中的世界語部分。              

      OSCAR 是一個龐大的多語種語料庫,它是通過對 Web 上爬取的文本進(jìn)行語言分類和過濾而獲得的。

      手把手教你用 Transformers 和 Tokenizers 從頭訓(xùn)練新語言模型

      數(shù)據(jù)集的世界語部分只有 299M,因此我們將與 Leipzig 語料庫集合(https://wortschatz.uni-leipzig.de/en/download )中的世界語子語料庫相連接,該語料庫由來自新聞、文學(xué)和維基百科等不同來源的文本組成。              

      最終的訓(xùn)練語料庫的大小為3 GB,仍然很小。當(dāng)然,對于你的模型,你可以獲得更多的數(shù)據(jù)來進(jìn)行預(yù)訓(xùn)練,從而獲得更好的結(jié)果。              

      2.訓(xùn)練標(biāo)記器              

      我們選擇使用與 RoBERTa 相同的特殊令牌來訓(xùn)練字節(jié)級字節(jié)對編碼標(biāo)記器(與 GPT-2 相同)。讓我們?nèi)我膺x擇它的大小,這里設(shè)置為 52000。              

      我們建議訓(xùn)練字節(jié)級的 BPE(而不是像 BERT 這樣的詞條標(biāo)記器),因為它將從單個字節(jié)的字母表開始構(gòu)建詞匯表,所以所有單詞都可以分解為標(biāo)記(不再是 <unk> 標(biāo)記)。

      #! pip install tokenizers==0.4.2

      from pathlib import Path

      from tokenizers import ByteLevelBPETokenizer

      paths = [str(x) for x in Path("./eo_data/").glob("**/*.txt")]

      # Initialize a tokenizer
      tokenizer = ByteLevelBPETokenizer()

      # Customize trainingtokenizer.train(files=paths, vocab_size=52_000, min_frequency=2, special_tokens=[
          "<s>",
          "<pad>",
          "</s>",
          "<unk>",
          "<mask>",
      ])

      # Save files to disk
      tokenizer.save(".", "esperberto")

      這里有一個對輸出的捕獲,圖片稍微進(jìn)行了加速:

      手把手教你用 Transformers 和 Tokenizers 從頭訓(xùn)練新語言模型

      在我們數(shù)據(jù)集上的訓(xùn)練大約花了 5 分鐘。              

      ?? 哇,太快了!???              

      我們現(xiàn)在有一個 vocab.json,它是按頻率排列的最常用標(biāo)記列表,還有一個 merges.txt 合并列表。

      {
          "<s>": 0,
          "<pad>": 1,
          "</s>": 2,
          "<unk>": 3,
          "<mask>": 4,
          "!": 5,
          "\"": 6,
          "#": 7,
          "$": 8,
          "%": 9,
          "&": 10,
          "'": 11,
          "(": 12,
          ")": 13,
          # ...
      }

      # merges.txt
      l a
      ? k
      o n
      ? la
      t a
      ? e
      ? d
      ? p
      # ...

      最棒的是,我們的標(biāo)記器為世界語進(jìn)行了優(yōu)化。與為英語訓(xùn)練的通用標(biāo)記器相比,更多的本機(jī)單詞由一個單獨(dú)的、未加修飾的標(biāo)記表示。變音符號,即在世界語中使用的重音字符 -?、?、?、?、? 和 ?- 是本機(jī)編碼的。我們還以更有效的方式表示序列。在這個語料庫中,編碼序列的平均長度比使用預(yù)先訓(xùn)練的 GPT-2 標(biāo)記器時減小了約 30%。              

      下面是如何在標(biāo)記器中使用它的方法,包括處理 RoBERTa 特殊標(biāo)記——當(dāng)然,你也可以直接從 transformer 中使用它。

      from tokenizers.implementations import ByteLevelBPETokenizer
      from tokenizers.processors import BertProcessing


      tokenizer = ByteLevelBPETokenizer(
          "./models/EsperBERTo-small/vocab.json",
          "./models/EsperBERTo-small/merges.txt",
      )
      tokenizer._tokenizer.post_processor = BertProcessing(
          ("</s>", tokenizer.token_to_id("</s>")),
          ("<s>", tokenizer.token_to_id("<s>")),
      )
      tokenizer.enable_truncation(max_length=512)

      print(
          tokenizer.encode("Mi estas Julien.")
      )
      # Encoding(num_tokens=7, ...)
      # tokens: ['<s>', 'Mi', '?estas', '?Juli', 'en', '.', '</s>']

      3.從頭開始訓(xùn)練語言模型              

      我們現(xiàn)在將使用來自 transformer 的 run_language_modeling.py 腳本(https://github.com/huggingface/transformers/blob/master/examples/run_language_modeling.py )(由 run_lm_finetuning.py 重新命名而來,因為它現(xiàn)在更無縫地支持從頭開始的訓(xùn)練)來訓(xùn)練我們的語言模型。只需記住從零開始訓(xùn)練,而不是從現(xiàn)有的模型或檢查點(diǎn)開始訓(xùn)練。              

      我們將訓(xùn)練一個類似于 RoBERTa 的模型,這是一個類似于 BERT 的模型,并進(jìn)行了一些更改(查看文檔https://huggingface.co/transformers/model_doc/roberta.html 了解更多細(xì)節(jié))。              

      由于該模型類似于 BERT,我們將對其進(jìn)行屏蔽語言建模任務(wù)的訓(xùn)練,即預(yù)測如何填充我們在數(shù)據(jù)集中隨機(jī)屏蔽的任意令牌。這由示例腳本處理。              

      我們只需要做兩件事:              

      • 實(shí)現(xiàn)從文本文件加載數(shù)據(jù)集的簡單子類。              

      根據(jù)你的用例,如果所提供的示例(TextDataset 和 LineByLineTextDataset)中的一個有效,你甚至可能不需要編寫自己的 Dataset 子類,但是你可能希望根據(jù)你的語料庫的實(shí)際情況添加許多自定義調(diào)整。        

      • 選擇并實(shí)驗不同的超參數(shù)集。              

      這是我們世界語數(shù)據(jù)集的一個簡單版本。

      class EsperantoDataset(Dataset):
          def __init__(self, evaluate: bool = false):
              tokenizer = ByteLevelBPETokenizer(
                  "./models/EsperBERTo-small/vocab.json",
                  "./models/EsperBERTo-small/merges.txt",
              )
              tokenizer._tokenizer.post_processor = BertProcessing(
                  ("</s>", tokenizer.token_to_id("</s>")),
                  ("<s>", tokenizer.token_to_id("<s>")),
              )
              tokenizer.enable_truncation(max_length=512)
              # or use the RobertaTokenizer from `transformers` directly.

              self.examples = []

              src_files = Path("./data/").glob("*-eval.txt") if evaluate else Path("./data/").glob("*-train.txt")
              for src_file in src_files:
                  print("?", src_file)
              lines = src_file.read_text(encoding="utf-8").splitlines()
                  self.examples += [x.ids for x in tokenizer.encode_batch(lines)]

          def __len__(self):
              return len(self.examples)

          def __getitem__(self, i):
              # We’ll pad at the batch level.
              return torch.tensor(self.examples[i])

      如果數(shù)據(jù)集非常大,可以選擇動態(tài)加載和標(biāo)記示例,而不是將其作為預(yù)處理步驟。              

      下面是我們傳遞給腳本的一組特定的超參數(shù)和參數(shù):

          --output_dir ./models/EsperBERTo-small-v1
          --model_type roberta
          --mlm
          --config_name ./models/EsperBERTo-small
          --tokenizer_name ./models/EsperBERTo-small
          --do_train
          --do_eval
          --learning_rate 1e-4
          --num_train_epochs 5
          --save_total_limit 2
          --save_steps 2000
          --per_gpu_train_batch_size 16
          --evaluate_during_training
          --seed 42

      像往常一樣,選擇最大的批量大小,你可以適合你的 GPU。              

      ??? 我們開始訓(xùn)練吧!!???              

      在這里,你可以查看我們的 Tensorboard(https://tensorboard.dev/experiment/8AjtzdgPR1qG6bDIe1eKfw/#scalars )以獲取一組特定的超參數(shù):

      手把手教你用 Transformers 和 Tokenizers 從頭訓(xùn)練新語言模型

      默認(rèn)情況下,我們的示例腳本會登錄到 Tensorboard 格式,在 runs/ 下。然后,要查看你的面板,只需運(yùn)行 tensorboard dev upload --logdir runs,這將設(shè)置 tensorboard.dev,它是一個 Google 托管的版本,允許你與任何人共享 ML 實(shí)驗。              

      4.檢查 LM 是否受過訓(xùn)練              

      除了觀察正在下降的訓(xùn)練和評估損失之外,檢查我們的語言模型是否學(xué)習(xí)到了有趣的東西的最簡單方法是使用 FillMaskPipeline。              

      管道是標(biāo)記器和模型周圍的簡單包裝器,「填充掩碼」允許你輸入一個包含屏蔽令牌的序列(這里是 <mask>),并返回一個最可能填充序列的列表及其概率。

      from transformers import pipeline

      fill_mask = pipeline(
          "fill-mask",
          model="./models/EspertBERTo-small",
          tokenizer="./models/EspertBERTo-small"
      )

      # The sun <mask>.
      # =>

      result = fill_mask("La suno <mask>.")

      # {'score': 0.2526160776615143, 'sequence': '<s> La suno brilis.</s>', 'token': 10820}
      # {'score': 0.0999930202960968, 'sequence': '<s> La suno lumis.</s>', 'token': 23833}
      # {'score': 0.04382849484682083, 'sequence': '<s> La suno brilas.</s>', 'token': 15006}
      # {'score': 0.026011141017079353, 'sequence': '<s> La suno falas.</s>', 'token': 7392}
      # {'score': 0.016859788447618484, 'sequence': '<s> La suno pasis.</s>', 'token': 4552}

      OK,使用簡單的語法就可以了。讓我們嘗試一個更有趣的提示:

      fill_mask("Jen la komenco de bela <mask>.")

      # This is the beginning of a beautiful <mask>.
      # =>

      # {
      #     'score':0.06502299010753632
      #     'sequence':'<s> Jen la komenco de bela vivo.</s>'
      #     'token':1099
      # }
      # {
      #     'score':0.0421181358397007
      #     'sequence':'<s> Jen la komenco de bela vespero.</s>'
      #     'token':5100
      # }
      # {
      #     'score':0.024884626269340515
      #     'sequence':'<s> Jen la komenco de bela laboro.</s>'
      #     'token':1570
      # }
      # {
      #     'score':0.02324388362467289
      #     'sequence':'<s> Jen la komenco de bela tago.</s>'
      #     'token':1688
      # }
      # {
      #     'score':0.020378097891807556
      #     'sequence':'<s> Jen la komenco de bela festo.</s>'
      #     'token':4580
      # }    

      通過更復(fù)雜的提示,你可以探究你的語言模型是否捕獲了更多的語義知識,甚至某種統(tǒng)計常識推理。

      5.在下游任務(wù)上微調(diào) LM              

      我們現(xiàn)在可以在詞性標(biāo)注的下游任務(wù)上微調(diào)我們的新的世界語語言模型。              

      如前所述,世界語是一種規(guī)則性很強(qiáng)的語言,詞尾通常制約著詞性的語法部分。使用 CoNLL-2003 格式的帶注釋的世界語 POS 標(biāo)記數(shù)據(jù)集(見下面的示例),我們可以使用 transformer 中的 run_ner.py(https://github.com/huggingface/transformers/blob/master/examples/run_ner.py )腳本。 

      POS 標(biāo)記和 NER 一樣是一個令牌分類任務(wù),因此我們可以使用完全相同的腳本。

      手把手教你用 Transformers 和 Tokenizers 從頭訓(xùn)練新語言模型

      再次強(qiáng)調(diào),這里是這個微調(diào)的托管 Tensorboard。我們使用每 GPU 64 的批處理大小訓(xùn)練 3 個階段。     

      訓(xùn)練和評估損失會收斂到很小的殘值,因為任務(wù)相當(dāng)簡單:語言是規(guī)則的,能夠端到端地訓(xùn)練。         

      這次,讓我們使用 TokenClassificationPipeline:

      from transformers import TokenClassificationPipeline, pipeline

      MODEL_PATH = "./models/EsperBERTo-small-pos/"

      nlp = pipeline(
          "ner",
          model=MODEL_PATH,
          tokenizer=MODEL_PATH,
      )
      # or instantiate a TokenClassificationPipeline directly.

      nlp("Mi estas viro kej estas tago varma.")

      # {'entity': 'PRON', 'score': 0.9979867339134216, 'word': ' Mi'}
      # {'entity': 'VERB', 'score': 0.9683094620704651, 'word': ' estas'}
      # {'entity': 'VERB', 'score': 0.9797462821006775, 'word': ' estas'}
      # {'entity': 'NOUN', 'score': 0.8509314060211182, 'word': ' tago'}
      # {'entity': 'ADJ', 'score': 0.9996201395988464, 'word': ' varma'}

      看起來很有效!?                   

      6.分享你的模型?              

      最后,當(dāng)你有一個好的模型時,請考慮與社區(qū)分享:              

      • 使用 CLI 上載模型:transformers CLI upload              

      • 編寫 README.md 模型卡并將其添加到 model_cards/ 下的存儲庫中。理想情況下,你的模型卡應(yīng)包括:              

      • 模型描述           

      • 訓(xùn)練參數(shù)(數(shù)據(jù)集、預(yù)處理、超參數(shù))            

      • 評估結(jié)果              

      • 預(yù)期用途和限制              

      • 任何其他有用的!?                         

      ??你的模型在 http://huggingface.co/models  上有一個頁面,每個人都可以使用 AutoModel.from_pretrained(“用戶名/模型名”)加載它。

      手把手教你用 Transformers 和 Tokenizers 從頭訓(xùn)練新語言模型 

      via:https://huggingface.co/blog/how-to-train

      雷鋒網(wǎng)雷鋒網(wǎng)雷鋒網(wǎng) 

      雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知

      手把手教你用 Transformers 和 Tokenizers 從頭訓(xùn)練新語言模型

      分享:
      相關(guān)文章
      當(dāng)月熱門文章
      最新文章
      請?zhí)顚懮暾埲速Y料
      姓名
      電話
      郵箱
      微信號
      作品鏈接
      個人簡介
      為了您的賬戶安全,請驗證郵箱
      您的郵箱還未驗證,完成可獲20積分喲!
      請驗證您的郵箱
      立即驗證
      完善賬號信息
      您的賬號已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
      立即設(shè)置 以后再說
      主站蜘蛛池模板: 97久久精品无码一区二区天美| 久久久午夜精品福利内容 | 国产成人久久精品激情| 人妻另类 专区 欧美 制服 | 中国女人做爰A片| 久久AV无码精品人妻糸列| 国产精品一区二区av片| 久久久亚洲国产精品主播| 成人午夜电影福利免费| 一本一道av中文字幕无码| 日韩不卡手机视频在线观看| 东北露脸91| 亚洲人妻一区二区av| 影音先锋你懂得| 美国黄色片一区二区三区| 欧美人与zoxxxx另类| 婷婷色香合缴缴情AV第三区 | 日本中文字幕在线播放| 久久中文字幕人妻丝袜系列| av在线无码| 亚洲国产精品毛片av不卡在线| 色婷婷久久久swag精品| 四虎成人精品无码永久在线| 久久久久高潮毛片免费全部播放| 荔波县| 亚洲国产天堂一区二区三区| 一区二区淫网| 成人喷水?亚洲一区无码| 中文字幕熟女人妻丝袜丝| 亚州成人小说| ww91在线观看| 精品亚洲网| 亚洲av日韩av永久无码电影| 国产精品一品二品有码| 国产欧美日韩高清在线不卡| 亚洲日韩在线中文字幕第一页 | 一本大道久久香蕉成人网| 日韩精品人妻中文字幕有| 天天躁狠狠躁av| 亚洲人成网站观看在线观看| 国产99re热这里只有精品|