<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低版瀏覽器,為了您的雷峰網賬號安全和更好的產品體驗,強烈建議使用更快更安全的瀏覽器
      此為臨時鏈接,僅用于文章預覽,將在時失效
      人工智能開發者 正文
      發私信給skura
      發送

      1

      手把手教你用 Transformers 和 Tokenizers 從頭訓練新語言模型

      本文作者: skura 2020-02-20 11:42
      導語:如何從頭開始訓練自己的語言模型?

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

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

      世界語是一種以易學性為目標的結構化語言。我們選擇它有幾個原因:              

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

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

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

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

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

      手把手教你用 Transformers 和 Tokenizers 從頭訓練新語言模型

      1.查找數據集              

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

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

      手把手教你用 Transformers 和 Tokenizers 從頭訓練新語言模型

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

      最終的訓練語料庫的大小為3 GB,仍然很小。當然,對于你的模型,你可以獲得更多的數據來進行預訓練,從而獲得更好的結果。              

      2.訓練標記器              

      我們選擇使用與 RoBERTa 相同的特殊令牌來訓練字節級字節對編碼標記器(與 GPT-2 相同)。讓我們任意選擇它的大小,這里設置為 52000。              

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

      #! 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")

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

      手把手教你用 Transformers 和 Tokenizers 從頭訓練新語言模型

      在我們數據集上的訓練大約花了 5 分鐘。              

      ?? 哇,太快了!???              

      我們現在有一個 vocab.json,它是按頻率排列的最常用標記列表,還有一個 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
      # ...

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

      下面是如何在標記器中使用它的方法,包括處理 RoBERTa 特殊標記——當然,你也可以直接從 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.從頭開始訓練語言模型              

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

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

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

      我們只需要做兩件事:              

      • 實現從文本文件加載數據集的簡單子類。              

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

      • 選擇并實驗不同的超參數集。              

      這是我們世界語數據集的一個簡單版本。

      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])

      如果數據集非常大,可以選擇動態加載和標記示例,而不是將其作為預處理步驟。              

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

          --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。              

      ??? 我們開始訓練吧!!???              

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

      手把手教你用 Transformers 和 Tokenizers 從頭訓練新語言模型

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

      4.檢查 LM 是否受過訓練              

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

      管道是標記器和模型周圍的簡單包裝器,「填充掩碼」允許你輸入一個包含屏蔽令牌的序列(這里是 <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
      # }    

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

      5.在下游任務上微調 LM              

      我們現在可以在詞性標注的下游任務上微調我們的新的世界語語言模型。              

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

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

      手把手教你用 Transformers 和 Tokenizers 從頭訓練新語言模型

      再次強調,這里是這個微調的托管 Tensorboard。我們使用每 GPU 64 的批處理大小訓練 3 個階段。     

      訓練和評估損失會收斂到很小的殘值,因為任務相當簡單:語言是規則的,能夠端到端地訓練。         

      這次,讓我們使用 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.分享你的模型?              

      最后,當你有一個好的模型時,請考慮與社區分享:              

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

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

      • 模型描述           

      • 訓練參數(數據集、預處理、超參數)            

      • 評估結果              

      • 預期用途和限制              

      • 任何其他有用的!?                         

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

      手把手教你用 Transformers 和 Tokenizers 從頭訓練新語言模型 

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

      雷鋒網雷鋒網雷鋒網 

      雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知

      手把手教你用 Transformers 和 Tokenizers 從頭訓練新語言模型

      分享:
      相關文章
      當月熱門文章
      最新文章
      請填寫申請人資料
      姓名
      電話
      郵箱
      微信號
      作品鏈接
      個人簡介
      為了您的賬戶安全,請驗證郵箱
      您的郵箱還未驗證,完成可獲20積分喲!
      請驗證您的郵箱
      立即驗證
      完善賬號信息
      您的賬號已經綁定,現在您可以設置密碼以方便用郵箱登錄
      立即設置 以后再說
      主站蜘蛛池模板: 久久久久亚洲AV成人网人人小说| 亚洲香蕉| 四虎影视国产精品永久在线| 伊人网综合| 久久国产精99精产国高潮| 内射干少妇亚洲69xxx| 国产丝袜极在线| 日韩免费无码一区二区视频| 最新久久成人国产精品视频免费| 女同综合网| 精品无码av无码免费专区| 少妇私密会所按摩到高潮呻吟| 欧美精品一区二区三区中文字幕| 一本一道久久综合狠狠躁牛牛影视| caoporn国产| 欧美色图久久| 精品人妻潮喷久久久又裸又黄| 国产精品人妻精品| 国产精品久久久久久av| 国产免费爽爽视频| 国模杨依粉嫩蝴蝶150p| 一区二区三区国产亚洲网站| 日本精品视频| 青青av| 最新亚洲中文av在线不卡| 91免费国产高清观看| 亚洲欧美日韩中文字幕网址| 99久久国产宗和精品1上映| 最新精品国偷自产在线下载| 亚洲熟妇自偷自拍另欧美| 久久久久久久人妻无码中文字幕爆| 大色欧美| 亚洲欧美日韩另类| 999久久久国产精品消防器材| 亚洲蜜桃v妇女| 久久99九九精品久久久久蜜桃| 湾仔区| 91色老久久精品偷偷性色| 中文字幕人妻无码一区二区三区| 国产精品一区二区婷婷| 国产极品美女高潮无套|