成人av在线资源一区,亚洲av日韩av一区,欧美丰满熟妇乱XXXXX图片,狠狠做五月深爱婷婷伊人,桔子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ī)屏蔽的任意令牌。這由示例腳本處理。              

    我們只需要做兩件事:              

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

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

    • 選擇并實驗不同的超參數(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 實驗。              

    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è)置 以后再說