<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          使用“BERT”作為編碼器和解碼器(BERT2BERT)來改進(jìn)Seq2Seq文本摘要模型

          共 3286字,需瀏覽 7分鐘

           ·

          2022-07-16 20:35

          來源:Deephub Imba
          本文約1500,建議閱讀5分鐘

          在本文中,想展示如何使用僅編碼器模型的預(yù)訓(xùn)練權(quán)重來為我們的微調(diào)提供一個(gè)良好的開始。


          BERT是一個(gè)著名的、強(qiáng)大的預(yù)先訓(xùn)練的“編碼器”模型。讓我們看看如何使用它作為“解碼器”來形成編碼器-解碼器架構(gòu)。

          Transformer 架構(gòu)由兩個(gè)主要構(gòu)建塊組成——編碼器和解碼器——我們將它們堆疊在一起形成一個(gè) seq2seq 模型。從頭開始訓(xùn)練基于Transformer 的模型通常很困難,因?yàn)樗枰笮蛿?shù)據(jù)集和高 GPU 內(nèi)存。我們可以使用許多具有不同目標(biāo)的預(yù)訓(xùn)練模型。


          首先,編碼器模型(例如,BERT、RoBERTa、FNet 等)學(xué)習(xí)如何從他們閱讀的文本中創(chuàng)建固定大小的特征表示。這種表示可用于訓(xùn)練網(wǎng)絡(luò)進(jìn)行分類、翻譯、摘要等。具有生成能力的基于解碼器的模型(如 GPT 系列)??梢酝ㄟ^在頂部添加一個(gè)線性層(也稱為“語言模型頭”)來預(yù)測(cè)下一個(gè)標(biāo)記。編碼器-解碼器模型(BART、Pegasus、MASS、...)能夠根據(jù)編碼器的表示來調(diào)節(jié)解碼器的輸出。它可用于摘要和翻譯等任務(wù)。它是通過從編碼器到解碼器的交叉注意力連接來完成的。

          在本文中,想展示如何使用僅編碼器模型的預(yù)訓(xùn)練權(quán)重來為我們的微調(diào)提供一個(gè)良好的開始。我們將使用 BERT 作為編碼器和解碼器來訓(xùn)練一個(gè)摘要模型。

          Huggingface 新的 API可以混合和匹配不同的預(yù)訓(xùn)練模型。這讓我們的工作變得超級(jí)簡(jiǎn)單!但在我們?cè)谶M(jìn)入代碼之前先看看這個(gè)概念。應(yīng)該怎么做才能使 BERT(編碼器模型)在 seq2seq 中工作?


          為簡(jiǎn)單起見,我們刪除了圖 中網(wǎng)絡(luò)的其他元素!為了進(jìn)行簡(jiǎn)單的比較,僅編碼器模型(左)的每個(gè)塊(層)都由一個(gè)自注意力和一個(gè)線性層組成。同時(shí),encoder-decoder 網(wǎng)絡(luò)(右)在每一層也有一個(gè) cross-attention 連接。交叉注意力層使模型能夠根據(jù)輸入來調(diào)節(jié)預(yù)測(cè)。

          將 BERT 模型直接用作解碼器是不可能的,因?yàn)闃?gòu)建塊是不一樣,但是利用BERT的權(quán)值可以很容易地添加額外的連接并構(gòu)建解碼器部分。在構(gòu)建完成后就需要微調(diào)模型來訓(xùn)練這些連接和語言模型的頭部權(quán)重。(注意:語言模型的頭部位置在輸出和最后一個(gè)線性層之間——它不包括在上圖中)

          我們可以使用 Huggingface 的 EncoderDecoderModel 對(duì)象來混合和匹配不同的預(yù)訓(xùn)練模型。它將通過調(diào)用 .from_encoder_decoder_pretrained() 方法指定編碼器/解碼器模型來處理添加所需的連接和權(quán)重。在下面的示例中,我們使用 BERT base 作為編碼器和解碼器。

          from transformers import EncoderDecoderModel

          bert2bert = EncoderDecoderModel.from_encoder_decoder_pretrained("bert-base-uncased",
                                                                        "bert-base-uncased")

          由于 BERT 模型不是為文本生成而設(shè)計(jì)的,所以我們需要做一些額外的配置。下一步是設(shè)置標(biāo)記器并指定句首和句尾標(biāo)記。

          from transformers import BertTokenizerFast

          # Set tokenizer
          tokenizer = BertTokenizerFast.from_pretrained("bert-base-uncased")
          tokenizer.bos_token = tokenizer.cls_token
          tokenizer.eos_token = tokenizer.sep_token

          # Set model's config
          bert2bert.config.decoder_start_token_id = tokenizer.bos_token_id
          bert2bert.config.eos_token_id = tokenizer.eos_token_id
          bert2bert.config.pad_token_id = tokenizer.pad_token_id

          現(xiàn)在我們可以使用 Huggingface 的 Seq2Seq Trainer 對(duì)象的Seq2SeqTrainingArguments() 參數(shù)微調(diào)模型。這里可以更改和嘗試許多配置,獲得適合模型的參數(shù)組合。注意以下數(shù)值并非最優(yōu)選擇,僅用于測(cè)試!如果顯存不夠的話,則 fp16 值是非常重要的。它將使用半精度減少顯存使用。要研究的其他有用變量是 learning_rate 、 batch_size 等。

          from transformers import Seq2SeqTrainingArguments, Seq2SeqTrainer

          training_args = Seq2SeqTrainingArguments(
            output_dir="./",
            learning_rate=5e-5,
            evaluation_strategy="steps",
            per_device_train_batch_size=4,
            per_device_eval_batch_size=8,
            predict_with_generate=True,
            overwrite_output_dir=True,
            save_total_limit=3,
            fp16=True,
          )

          trainer = Seq2SeqTrainer(
            model=bert2bert,
            tokenizer=tokenizer,
            args=training_args,
            compute_metrics=compute_metrics,
            train_dataset=train_data,
            eval_dataset=val_data,
          )

          trainer.train()

          訓(xùn)練的結(jié)果如下:

          在 CNN/DM 數(shù)據(jù)集上微調(diào)的 BERT-to-BERT 模型性能。我使用 Beam Search 解碼方法。使用 ROUGE 評(píng)分指標(biāo)計(jì)算結(jié)果。


          BART 模型是文本摘要中的 SOTA 模型,BERT seq2seq 的表現(xiàn)也很不錯(cuò)!只有 1% 的差異通常不會(huì)轉(zhuǎn)化為句子質(zhì)量的巨大變化。這里我們也沒有做任何的超參數(shù)調(diào)整,如果調(diào)整優(yōu)化后會(huì)變得更好。

          混合搭配方法可以讓我們進(jìn)行更多的實(shí)驗(yàn)。例如可以將 BERT 連接到 GPT-2 以利用 BERT 的來創(chuàng)建強(qiáng)大的文本表示以及 GPT 生成高質(zhì)量句子的能力。在為所有問題選擇 SOTA 模型之前,為自定義數(shù)據(jù)集使用不同的網(wǎng)絡(luò)是一種很好的做法。使用 BERT(與 BART 相比)的主要區(qū)別在于 512 個(gè)令牌輸入序列長(zhǎng)度限制(與 1024 相比)。因此,如果數(shù)據(jù)集的輸入序列較小,它使 BERT-to-BERT 模型會(huì)是一個(gè)不錯(cuò)的選擇。它訓(xùn)練較小的模型會(huì)更有效,并且需要更少的資源,例如數(shù)據(jù)和 GPU 內(nèi)存。

          本文的代碼在這里可以找到:

          https://github.com/NLPiation/tutorial_notebooks/blob/main/summarization/hf_BERT-BERT_training.ipynb


          編輯:王菁
          校對(duì):林亦霖



          瀏覽 70
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  一级黄色BB片 | 三级片免费网址 | 欧美在线一区二区 | 日韩免费网站 | 日韩美穴 |