国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

女女做的網(wǎng)站目前最新推廣平臺

女女做的網(wǎng)站,目前最新推廣平臺,wordpress怎么讓圖全屏顯示,網(wǎng)站開發(fā)網(wǎng)校經(jīng)典神經(jīng)網(wǎng)絡(luò)(14)T5模型原理詳解及其微調(diào)(文本摘要) 2018 年,谷歌發(fā)布基于雙向 Transformer 的大規(guī)模預(yù)訓(xùn)練語言模型 BERT,而后一系列基于 BERT 的研究工作如春筍般涌現(xiàn),預(yù)訓(xùn)練模型也成為了業(yè)內(nèi)解決 NLP 問題的標(biāo)配。 2019年,谷歌…

經(jīng)典神經(jīng)網(wǎng)絡(luò)(14)T5模型原理詳解及其微調(diào)(文本摘要)

  • 2018 年,谷歌發(fā)布基于雙向 Transformer 的大規(guī)模預(yù)訓(xùn)練語言模型 BERT,而后一系列基于 BERT 的研究工作如春筍般涌現(xiàn),預(yù)訓(xùn)練模型也成為了業(yè)內(nèi)解決 NLP 問題的標(biāo)配。

  • 2019年,谷歌又提出預(yù)訓(xùn)練模型 T5(Text-to-Text Transfer Transformer),T5模型本質(zhì)上來說是一個基于Transformer架構(gòu)的encoder-decoder模型。T5模型將各種NLP任務(wù)都視為Text-to-Text任務(wù),也就是輸入為Text,輸出也為Text的任務(wù)。

  • 我們知道BERT相關(guān)的預(yù)訓(xùn)練語言模型,在下游任務(wù)微調(diào)過程中都需要添加非線性層,將模型的輸出轉(zhuǎn)化為任務(wù)指定的輸出格式。但是,T5不需要對模型做任何改動,不需要添加任何非線性層,唯一需要做的就是在輸入數(shù)據(jù)前加上任務(wù)聲明前綴。

  • T5模型剛發(fā)布時,刷新了 Glue 榜單和 SuperGLUE 榜單,直至今日還是這兩個榜單的前10名。

    • https://gluebenchmark.com/leaderboard

    • https://super.gluebenchmark.com/leaderboard

  • 今天,我們來了解下T5這個經(jīng)典的模型。

    • 論文鏈接:https://arxiv.org/abs/1910.10683
    • Github 鏈接:https://github.com/google-research/text-to-text-transfer-transformer

1 T5模型簡介

  • 如下圖所示,T5(Text-to-Text Transfer Transformer)模型將翻譯、分類、回歸、摘要生成等任務(wù)都統(tǒng)一轉(zhuǎn)成Text-to-Text任務(wù),從而使得這些任務(wù)在訓(xùn)練(pre-train和fine-tune)時能夠使用相同的目標(biāo)函數(shù),在測試時也能使用相同的解碼過程。

  • T5模型在NLU和NLG上都具有出色表現(xiàn),能夠完成翻譯任務(wù)、文本分類、閱讀理解、摘要生成任務(wù)等多種下游任務(wù)。

  • 然而,T5剛出來的時候,我們可能沒有什么存在感,原因很簡單:沒有中文版T5可用。

    • 不過Google后面放出了多國語言版的T5(mT5),里邊包含了中文語言。

      • 論文鏈接:mT5: A massively multilingual pre-trained text-to-text transformer
      • Hugging face鏈接:https://huggingface.co/collections/google/mt5-release-65005f1a520f8d7b4d039509
    • 另外,國內(nèi)還有一些公司,利用T5模型使用了大量中文數(shù)據(jù)進行訓(xùn)練。

      • 孟子T5預(yù)訓(xùn)練生成模型與T5結(jié)構(gòu)相同,但是不包含下游任務(wù),需要在特定任務(wù)上 Finetune 后使用。孟子T5預(yù)訓(xùn)練生成模型-中文-base

      • iic在mt5模型基礎(chǔ)上使用了大量中文數(shù)據(jù)進行訓(xùn)練,并引入了零樣本分類增強的技術(shù)。全任務(wù)零樣本學(xué)習(xí)-mT5分類增強版-中文-base

在這里插入圖片描述

1.1 T5模型網(wǎng)絡(luò)架構(gòu)

1.1.1 Encoder-Decoder結(jié)構(gòu)

  • 如下圖所示,目前基于Transformer的模型架構(gòu)主要有Encoder-Decoder結(jié)構(gòu)(傳統(tǒng)的Transformer結(jié)構(gòu))、Language model結(jié)構(gòu) (GPT的結(jié)構(gòu))和Prefix LM結(jié)構(gòu)(UniLM的結(jié)構(gòu))。
    • Encoder-Decoder結(jié)構(gòu):Seq2Seq常用模型,編碼器輸入中可以看到序列中包括自己的全部字符,解碼器的輸出只能看到當(dāng)前字符及之前的字符;
    • LM模型:Encoder-Decoder中的Decoder部分,單向結(jié)構(gòu),每次只能看到當(dāng)前及之前的部分;
    • 基于前綴的語言模型Prefix LM:前面一部分文本可以看到前綴部分所有內(nèi)容,后面剩下的內(nèi)容只能看到自己及之前的內(nèi)容。

在這里插入圖片描述

  • 如下圖所示,作者通過實驗發(fā)現(xiàn)Encoder-decoder架構(gòu)的模型效果最好,所以T5模型本質(zhì)上來說是一個基于Transformer的Encoder-decoder模型。

在這里插入圖片描述

1.1.2 SentencePiece

  • 把一個句子看作一個整體,再拆成片段,而沒有保留天然的詞語的概念。

  • SentencePiece不將空格視為分隔符,而是將字符串作為其原始格式的輸入,使用BPE或ULM作為其分詞器來構(gòu)建詞匯表。

    • 下劃線被引入,代替了空格和句子開頭特殊符號;
    from transformers import T5Tokenizermodel_dir = r'D:\\python\\models\\model-download\\iic\\nlp_mt5_zero-shot-augment_chinese-base'
    tokenizer = T5Tokenizer.from_pretrained(model_dir, legacy=False)
    print(tokenizer.tokenize("Don't make the user feel stupid"))# ['▁Don', "'", 't', '▁make', '▁the', '▁user', '▁feel', '▁stupid']
    
    • 中文可以看到一些多字詞,但有些詞其實不符合一般的分詞習(xí)慣
print(tokenizer.tokenize("筆畫最多的漢字是龘(da)字"))# 可以看到"龘"字經(jīng)過tokenize變?yōu)?#xff1a;'<0xE9>', '<0xBE>', '<0x98>'
# ['▁', '筆', '畫', '最多', '的', '漢', '字', '是', '<0xE9>', '<0xBE>', '<0x98>', '(', 'da', ')', '字']

1.2 相對位置編碼

不同于RNN、CNN等模型,對于Transformer模型來說,位置編碼的加入是必不可少的,因為純粹的Attention模塊是無法捕捉輸入順序的,即無法區(qū)分不同位置的Token。為此我們大體有兩個選擇:

  • 1、將位置信息融入到輸入中,這構(gòu)成了絕對位置編碼的一般做法;
  • 2、微調(diào)一下Attention結(jié)構(gòu),使得它有能力分辨不同位置的Token,這構(gòu)成了相對位置編碼的一般做法。

1.2.1 常規(guī)相對位置編碼的可視化解釋

Transformer中有兩種常用的位置編碼,分別為絕對位置編碼和相對位置編碼。

我們先看常規(guī)相對位置編碼的思路:

論文鏈接:https://arxiv.org/pdf/1803.02155

視頻解釋:Self-Attention with Relative Position Representations – Paper explained

  • 如下圖,假如有5個token,其中一個token與其他所有位置包括自己在內(nèi)的token之間存在一個權(quán)重。

在這里插入圖片描述

  • 如下圖, w 0 w_0 w0?表示 x 4 x_4 x4?與自己的位置關(guān)系,0表示與自己的距離, w 1 w_1 w1?表示向右移動一個位置, w ? 1 w_{-1} w?1?表示向左移動一個位置。

在這里插入圖片描述

  • x 3 x_3 x3?可以表示為下圖所示:

在這里插入圖片描述

  • 那么,第一個到最后一個就可以分別表示為下圖所示:

在這里插入圖片描述
在這里插入圖片描述

  • 如下圖所示,一共有9個不同的位置編碼,分別為 w ? 4 , w ? 2 , w ? 3 , w ? 1 , w 0 , w 1 , w 2 , w 3 , w 4 w_{-4}, w_{-2}, w_{-3}, w_{-1}, w_0, w_1, w_2, w_3, w_4 w?4?,w?2?,w?3?,w?1?,w0?,w1?,w2?,w3?,w4?。

在這里插入圖片描述

  • 我們可以用用標(biāo)識對表示

在這里插入圖片描述

  • 我們可以使用一個閾值k,例如k=2,當(dāng)超過這個特定的閾值(就是下圖中紅色背景的部分)

在這里插入圖片描述

  • 即其他的position_embedding距離自身超過2個位置,那么這些位置的position_embedding就和距離最近的position_embedding值一樣。例如下圖中 x 1 x_1 x1? w 3 w_3 w3? w 4 w_4 w4?就會變成 w 2 w_2 w2?,其他同理。

在這里插入圖片描述

1.2.2 常規(guī)相對位置編碼的公式解釋

  • 下圖是論文(https://arxiv.org/pdf/1803.02155)中給出的自注意力機制的公式
  • 其中 e i j e_{ij} eij?的計算方式采用的是Scaled Dot-Product

在這里插入圖片描述

  • 我們知道,相對位置編碼的做法就是:微調(diào)一下Attention結(jié)構(gòu),使得它有能力分辨不同位置的Token
  • 一般認(rèn)為,相對位置編碼是由絕對位置編碼啟發(fā)而來,考慮一般的帶絕對位置編碼的Attention(下面推導(dǎo)公式來源于蘇神博客):

在這里插入圖片描述

  • Google論文(https://arxiv.org/pdf/1803.02155)中,對上式進行了修改:

在這里插入圖片描述

  • 通過上面的解釋,我們就很容易理解論文中下面的公式了:

在這里插入圖片描述

在這里插入圖片描述

  • 如下圖左邊所示,是論文中提出的具體的截斷方式。
  • 如下圖右邊所示,通過在每個注意頭之間共享相對位置表示來降低存儲相對位置表示的空間復(fù)雜度。
    • 分子第一項中,我們的輸入 x i x_i xi?的tensor的Shape為:(B, h, seq_length, d),它計算的是query和key的關(guān)系,所以第一項的輸出為(B, h, seq_length, seq_length),第二項的輸出shape必須跟第一項一致。
    • 第二項中, a i j K a_{ij}^K aijK?表示的是 i j ij ij的相對位置編碼,從位置編碼的Embeding向量table中去lookup得到的,lookup后的shape為(seq_length, seq_length, da),轉(zhuǎn)換下維度得到(seq_length, da, seq_length),其中原始位置編碼lookup后的向量table我們用A來表示,轉(zhuǎn)換維度后我們用 A T A^T AT表示。
    • x i x_i xi? W Q W^Q WQ相乘后得到tensor其shape為(B, h, seq_length, dz),轉(zhuǎn)換下維度得到(seq_length, B, h, dz),再轉(zhuǎn)換下得到(seq_length, B×h, dz),再跟 a i j K a_{ij}^K aijK?來相乘,實質(zhì)是跟 A T A^T AT相乘,所以(seq_length, B×h, dz)和矩陣(seq_length, da, seq_length)相乘,因此需要dz=da,得到(seq_length, B×h, seq_length)后reshape下得到(seq_length, B, h, seq_length),轉(zhuǎn)置后shape為(B, h, seq_length, seq_length)這樣就跟第一項對應(yīng)起來了。

在這里插入圖片描述

1.2.3 T5模型中的位置編碼

我們先看下蘇神博客中的內(nèi)容,分析下T5模型中相對位置編碼公式的由來:

在這里插入圖片描述

  • T5采用了一個長距離不敏感的相對位置編碼,這一設(shè)計是考慮到遠距離的單詞依賴往往比較稀疏且不精細(xì),因此我們需要對周圍單詞的位置做精確的區(qū)分,而遠距離單詞的位置變化則相對緩慢。
  • 如下圖所示,T5模型對相對位置進行了一個“分桶”處理,將原始的relative position當(dāng)成一個個小方塊放置在順序排列的桶中,最后用方塊所屬的桶號來代替相對距離:
    • 在T5中num_buckets=32,max_distance=128源碼中將num_buckets/2的距離定義為近的分割線(對于雙向attention是8,對單向attention是16)
    • 低于這個數(shù)值的距離被認(rèn)為是近的,高于這個數(shù)值的距離被認(rèn)為是遠的。
    • 這個設(shè)計的思路其實也很直觀,就是比較鄰近的位置(0-7),我們需要比較得精細(xì)一些,所以給它們都分配一個獨立的位置編碼,至于稍遠的位置(比如8~11),我們不用區(qū)分得太清楚,所以它們可以共用一個位置編碼。距離越遠,共用的范圍就可以越大,直到達到指定范圍再clip。

在這里插入圖片描述

  • 我們來看下transformers庫中T5模型相對位置編碼的實現(xiàn):
    # transformers/models/t5/modeling_t5.py中的T5Attention類def compute_bias(self, query_length, key_length, device=None):"""Compute binned relative position bias"""if device is None:device = self.relative_attention_bias.weight.devicecontext_position = torch.arange(query_length, dtype=torch.long, device=device)[:, None]memory_position = torch.arange(key_length, dtype=torch.long, device=device)[None, :]    # 計算相對位置relative_position = memory_position - context_position  # shape (query_length, key_length)# 分桶處理relative_position_bucket = self._relative_position_bucket(relative_position,  # shape (query_length, key_length)bidirectional=(not self.is_decoder),num_buckets=self.relative_attention_num_buckets,max_distance=self.relative_attention_max_distance,)# Embedding矩陣為:self.relative_attention_bias = nn.Embedding(self.relative_attention_num_buckets, self.n_heads)# look-up查找,并進行維度轉(zhuǎn)換values = self.relative_attention_bias(relative_position_bucket)  # shape (query_length, key_length, num_heads)values = values.permute([2, 0, 1]).unsqueeze(0)  # shape (1, num_heads, query_length, key_length)return values
# 這里我們假設(shè)query_length=key_length=128
# 那么相對位置矩陣為
>>> relative_position
tensor([[   0,    1,    2,  ...,  125,  126,  127],[  -1,    0,    1,  ...,  124,  125,  126],[  -2,   -1,    0,  ...,  123,  124,  125],...,[-125, -124, -123,  ...,    0,    1,    2],[-126, -125, -124,  ...,   -1,    0,    1],[-127, -126, -125,  ...,   -2,   -1,    0]])
# 分桶后
>>> relative_position_bucket
tensor([[ 0, 17, 18,  ..., 31, 31, 31],[ 1,  0, 17,  ..., 31, 31, 31],[ 2,  1,  0,  ..., 31, 31, 31],...,[15, 15, 15,  ...,  0, 17, 18],[15, 15, 15,  ...,  1,  0, 17],[15, 15, 15,  ...,  2,  1,  0]])>>> relative_position_bucket[0]
# 查看第一個,雙向attention近的分割線為8
tensor([ 0, 17, 18, 19, 20, 21, 22, 23, 24, 24, 24, 24, 25, 25, 25, 25, 26, 26,26, 26, 26, 26, 26, 27, 27, 27, 27, 27, 27, 27, 27, 27, 28, 28, 28, 28,28, 28, 28, 28, 28, 28, 28, 28, 28, 28, 29, 29, 29, 29, 29, 29, 29, 29,29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 30, 30, 30, 30, 30, 30, 30, 30,30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30,30, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31,31, 31])>>> relative_position_bucket[-1]
# 查看最后一個,雙向attention近的分割線為8
# 就是比較鄰近的位置(0~7),我們需要比較得精細(xì)一些,所以給它們都分配一個獨立的位置編碼
# 至于稍遠的位置(比如8~11),我們不用區(qū)分得太清楚,所以它們可以共用一個位置編碼。距離越遠,共用的范圍就可以越大
tensor([15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14,14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 13, 13, 13, 13, 13, 13, 13, 13,13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 12, 12, 12, 12, 12, 12, 12, 12,12, 12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11, 11, 11, 11, 10, 10, 10,10, 10, 10, 10,  9,  9,  9,  9,  8,  8,  8,  8,  7,  6,  5,  4,  3,  2,1,  0])# look-up查找后
values shape=(128, 128, 12)
# 維度轉(zhuǎn)換后
values shape=(1, 12, 128, 128)
    # transformers/models/t5/modeling_t5.py中的T5Attention類def forward(self,hidden_states,mask=None,key_value_states=None,position_bias=None,past_key_value=None,layer_head_mask=None,query_length=None,use_cache=False,output_attentions=False,):......# 計算注意力分?jǐn)?shù)scores = torch.matmul(query_states, key_states.transpose(3, 2))  # equivalent of torch.einsum("bnqd,bnkd->bnqk", query_states, key_states), compatible with onnx op>9if position_bias is None:if not self.has_relative_attention_bias:......else:# 計算相對位置編碼 shape = (1, num_heads, seq_length, key_length)position_bias = self.compute_bias(real_seq_length, key_length, device=scores.device)if mask is not None:# seq_length = key_length# 加上mask信息 mask shape = (batch_size, 1, 1, seq_length)# position_bias shape = (batch_size, n_heads, seq_length, seq_length)position_bias = position_bias + mask  if self.pruned_heads:mask = torch.ones(position_bias.shape[1])mask[list(self.pruned_heads)] = 0position_bias_masked = position_bias[:, mask.bool()]else:position_bias_masked = position_bias# Note: 位置編碼加在了注意力分?jǐn)?shù)scores上scores += position_bias_maskedattn_weights = nn.functional.softmax(scores.float(), dim=-1).type_as(scores)  # (batch_size, n_heads, seq_length, key_length)......

總結(jié)一下:

在這里插入圖片描述

在這里插入圖片描述

1.3 T5模型的訓(xùn)練策略

1.3.1 訓(xùn)練數(shù)據(jù)集探索

作者對公開爬取的網(wǎng)頁數(shù)據(jù)集Common Crawl進行了過濾:

  • 僅保留以終端標(biāo)點符號(即句號、感嘆號、問號或結(jié)束引號)結(jié)尾的文本行;
  • 刪除任何包含「污穢、下流或其他臟話字眼」的頁面;
  • 由于爬取到的很多頁面包含「應(yīng)啟用 Javascript」的警告信息,所以刪除含有 Javascript 一詞的所有文本行;
  • 有些頁面包含占位符「亂數(shù)假文」(lorem ipsum),所以刪除出現(xiàn)「亂數(shù)假文」短語的所有頁面;
  • 有些頁面會無意中含有代碼。由于花括號「{」出現(xiàn)在很多編程語言中(如網(wǎng)上廣泛使用的 Javascript),但不會出現(xiàn)在自然文本中,所以刪除所有含有花括號的頁面;
  • 為了刪除數(shù)據(jù)集中的重復(fù)數(shù)據(jù),刪除數(shù)據(jù)集中多次出現(xiàn)的任何三個句子中的兩個。
  • 此外,由于大多數(shù)下游任務(wù)都集中在英文文本上,因此研究者使用 langdetect 來過濾掉所有未歸類為英文的頁面(概率至少為 0.99)。
  • 為了匯編基礎(chǔ)數(shù)據(jù)集,他們下載了自 2019 年 4 月開始網(wǎng)絡(luò)爬取的文本并進行了過濾。這樣產(chǎn)生的文本集合不僅比用于預(yù)訓(xùn)練的大多數(shù)數(shù)據(jù)集大幾個數(shù)量級(大約 750GB),而且還包含非常干凈自然的英文文本。
  • 研究者將此數(shù)據(jù)集稱為「Colossal Clean Crawled Corpus」(或簡稱 C4 語料庫),并將其作為 TensorFlow 數(shù)據(jù)集的一部分發(fā)布。

在這里插入圖片描述

從上圖實驗結(jié)果可以看出:

(1) C4比unfiltered C4效果好,說明數(shù)據(jù)清洗的重要性;

(2) Wikipedia+TBC在SGLUE上的效果比C4好,主要是因為在SGLUE中的MultiRC任務(wù)得分很高,MultiRC是一個閱讀理解數(shù)據(jù)集,其中的數(shù)據(jù)主要是小說書籍,和TBC屬于同一領(lǐng)域數(shù)據(jù)。由此說明預(yù)訓(xùn)練的數(shù)據(jù)集中包含一定的領(lǐng)域數(shù)據(jù)對下游該領(lǐng)域任務(wù)的性能提升有效;

在這里插入圖片描述

從上圖中可以看出,隨著數(shù)據(jù)集不斷縮小,模型的性能逐漸下降,說明大的模型很可能在小的數(shù)據(jù)集上發(fā)生了過擬合,因此建議預(yù)訓(xùn)練模型還是盡可能使用大數(shù)據(jù)集。

1.3.2 無監(jiān)督預(yù)訓(xùn)練目標(biāo)探索

論文對無監(jiān)督目標(biāo)過程中所做的選擇進行了探索,從下面四個方面進行實驗:

  • 1、自監(jiān)督的預(yù)訓(xùn)練方法
    • 語言模型式:單向的從左到右依次預(yù)測,典型代表為GPT-2模型
    • BERT-style式:像BERT模型一樣隨機破壞掉一部分內(nèi)容,然后進行還原
    • 順序還原式:將文本打亂,然后進行還原

在這里插入圖片描述

如上圖所示,給定句子“Thank you for inviting me to your party last week .”,圖中展示了針對不同的預(yù)訓(xùn)練目標(biāo),模型的Input和Target樣本的形式。

在這里插入圖片描述

  • 2、對文本一部分進行破壞時的策略
    • Mask法:將被破壞token換成特殊符如[M];
    • Replace span(小段替換)法:可以把它當(dāng)作是把上面 Mask 法中相[M]都合成了一個特殊符,每一小段替換一個特殊符,提高計算效率;
    • Drop法:沒有替換操作,直接隨機丟棄一些字符。

在這里插入圖片描述

其中Replace corrupted spans就是上上圖中的noise replace spans目標(biāo)

Drop corrupted tokens就是上上圖中的noise, drop tokens目標(biāo)。

結(jié)果表明,這幾種BERT-style預(yù)訓(xùn)練目標(biāo)的變種效果差不多,但是后兩種方法不需要預(yù)測整個輸入序列,而僅需要預(yù)測被污染的部分,因此預(yù)測的序列長度更短,訓(xùn)練速度也更快。

  • 3、對文本百分之多少進行破壞

在這里插入圖片描述

  • 4、對大概多長的文本段進行破壞

在這里插入圖片描述

因此,經(jīng)過上述實驗,確定了T5模型的預(yù)訓(xùn)練方式如下:

在這里插入圖片描述

1.3.3 T5模型的微調(diào)

微調(diào)模型的所有參數(shù)可能會導(dǎo)致結(jié)果欠佳,尤其是在資源匱乏的情況下。論文專注于兩種替代的微調(diào)方法,這些方法僅更新編碼器-解碼器模型的參數(shù)的子集。

  • Adapter layers。
    • 在微調(diào)時保持大多數(shù)原始模型固定不變。
    • 在transformer每個塊中前饋神經(jīng)網(wǎng)絡(luò)后添加dense-ReLU-denseblocks。
    • 新的前饋網(wǎng)絡(luò)使得輸出可以與輸入維度匹配。 (這樣就可以將它們插入網(wǎng)絡(luò),而無需更改結(jié)構(gòu)或參數(shù))
    • 進行微調(diào)時,僅更新適配器層和層歸一化參數(shù)。
    • 這種方法的主要超參數(shù)是前饋網(wǎng)絡(luò)的內(nèi)部維數(shù) d,它改變了添加到模型中的新參數(shù)的數(shù)量。
  • Gradual unfreezing。
    • 初始微調(diào)時,只有最后一層的參數(shù)被更新,訓(xùn)練一段時間后,倒數(shù)第2層及其之后層的參數(shù)被更新,直至整個網(wǎng)絡(luò)的參數(shù)都被更新。

如下圖所示,所有參數(shù)一起更新效果是最好的,但是缺點就是慢。

adapter layers可能是一種在較少參數(shù)上進行微調(diào)的有前途的技術(shù),只要將維度適當(dāng)?shù)乜s放到任務(wù)大小即可,假如任務(wù)數(shù)據(jù)量小的話,d取小一些,任務(wù)數(shù)據(jù)量大的話,d取大一些。

Gradual unfreezing盡管在微調(diào)過程中確實提供了一定的加速,但全局解凍會在所有任務(wù)中造成輕微的性能下降。因此通過更仔細(xì)地調(diào)整解凍時間表,可以獲得更好的結(jié)果。

在這里插入圖片描述

1.3.4 T5模型的多任務(wù)學(xué)習(xí)

1) 多任務(wù)學(xué)習(xí)如何取樣
  • 大多數(shù)將多任務(wù)學(xué)習(xí)應(yīng)用于NLP的應(yīng)用都會添加特定于任務(wù)的分類網(wǎng)絡(luò),或者為每個任務(wù)使用不同的損失函數(shù)。本論文的多任務(wù)學(xué)習(xí)僅將不同任務(wù)的數(shù)據(jù)集混合在一起。

  • 若現(xiàn)在有無監(jiān)督任務(wù)、有監(jiān)督任務(wù)1、有監(jiān)督任務(wù)2、有監(jiān)督任務(wù)3,一起訓(xùn)練時如何采樣數(shù)據(jù)?

  • 作者設(shè)置了三種采樣方法:

    • Examples-proportional mixing:設(shè)任務(wù)的數(shù)據(jù)集大小為 e n , n ∈ 1 , . . . , N e_n,n∈1,...,N en?,n1,...,N,采樣時,采樣自第m個任務(wù)數(shù)據(jù)的概率為 r m = m i n ( e m , K ) ∑ m i n ( e n , K ) r_m=\frac{min(e_m,K)}{\sum min(e_n,K)} rm?=min(en?,K)min(em?,K)?,這里K是提前設(shè)定的參數(shù);
    • Temperature-scaled mixing:在第一個實驗的基礎(chǔ)上,對求得的 r m r_m rm?再求 1 T \frac{1}{T} T1?方根,當(dāng)T=1時,即Examples-proportional mixing。T越大,各個任務(wù)數(shù)據(jù)集采樣越均衡;
    • Equal mixing:各個任務(wù)數(shù)據(jù)采樣概率相同。

在這里插入圖片描述

2) 多任務(wù)學(xué)習(xí)+微調(diào)

多任務(wù)學(xué)習(xí)+微調(diào):先用多個任務(wù)進行預(yù)訓(xùn)練,再對具體任務(wù)進行微調(diào)

  • 實驗一:在Examples-proportional mixing 的人工混合數(shù)據(jù)集上預(yù)訓(xùn)練模型,然后在每個單獨的下游任務(wù)上對其進行微調(diào);
  • 實驗二:在相同的混合數(shù)據(jù)集上對模型進行預(yù)訓(xùn)練,只是從該預(yù)訓(xùn)練混合物中省略了一項下游任務(wù)。然后,我們在預(yù)訓(xùn)練中遺漏的任務(wù)上對模型進行微調(diào)。對于考慮的每個下游任務(wù),都會重復(fù)此步驟。這種方法為“l(fā)eave-one-out”多任務(wù)訓(xùn)練;
  • 實驗三:把無監(jiān)督目標(biāo)(即baseline的預(yù)訓(xùn)練目標(biāo))剔除,對所有考慮的監(jiān)督任務(wù)進行預(yù)訓(xùn)練。

在這里插入圖片描述

如上圖所示,我們發(fā)現(xiàn)Multi-task pretraining+fine-tuning的效果和Unsupervised pre-training + fine-tuning的效果差不多,但是前者在預(yù)訓(xùn)練過程還能夠監(jiān)控下游任務(wù)的性能,因此作者最后采用Multi-task pre-training。

1.4 最終選擇

通過對各種對比實驗的結(jié)果進行分析,作者最終確定了訓(xùn)練T5模型的較優(yōu)方案:

  • 無監(jiān)督訓(xùn)練目標(biāo):采用span-corruption目標(biāo),類似SpanBERT的做法。
  • 預(yù)訓(xùn)練策略:采用multi-task預(yù)訓(xùn)練方式(即無監(jiān)督任務(wù)和有監(jiān)督任務(wù)一起預(yù)訓(xùn)練)。
  • 把前面的最佳方案組合在一起,作者訓(xùn)練了Small、Base、Large、3B、11B五種T5模型。
模型LayersHidden SizeAttention Head參數(shù)量
Small6512860M
Base1276812220M
Large24102416770M
3B241024323B
11B24202812811B

1.5 mT5和Flan-T5模型

1.5.1 mT5模型

mT5仍是T5數(shù)據(jù)構(gòu)造方式(C4數(shù)據(jù)集),但語料不再只限于英語,而是擴大到101種語言,其中就包括了中文、俄語等。模型結(jié)構(gòu)是使用的T5.1.1版本,相比于原始T5版本主要有如下升級:

  • 激活函數(shù)變更: Gated-GELU activation替代ReLU;
  • 無標(biāo)簽數(shù)據(jù)不做dropout;
  • embedding和分類層不做參數(shù)共享;
  • 更大的d_model,更小的num_heads和d_ff;

1.5.2 Flan-T5模型

  • 這里的Flan指的是(Instruction finetuning),即"基于指令的微調(diào)"。論文的核心貢獻是提出一套多任務(wù)的微調(diào)方案(Flan),來極大提升語言模型的泛化性
  • 如下圖所示,引入Flan微調(diào)方案,可以很好提高語言模型在超大規(guī)模任務(wù)上的整體效果。

在這里插入圖片描述

  • Flan微調(diào)的過程:

    • 第一步是收集一系列監(jiān)督的數(shù)據(jù);

    • 第二步將任務(wù)都轉(zhuǎn)換成相同的“輸入格式”喂給模型訓(xùn)練,同時這些任務(wù)的輸出也需要是統(tǒng)一的“輸出格式”,這樣是為了使用單個語言模型來完成超過1800+種不同的任務(wù);

      • 如下圖,根據(jù) “是否需要進行思維鏈推理 (CoT)” 以及 “是否需要提供示例(Few-shot)” 可將輸入、輸出劃分成四種類型。
      • 在這里插入圖片描述
    • 第三步就是微調(diào)過程。

      • 將多個訓(xùn)練樣本“打包”成一個訓(xùn)練樣本,這些訓(xùn)練樣本直接會通過一個特殊的“結(jié)束token”進行分割。
      • 訓(xùn)練時候在每個指定的步數(shù)會在“保留任務(wù)”上進行模型評估,保存最佳的checkpoint。
      • 盡管微調(diào)的任務(wù)數(shù)量很多,但是相比于語言模型本身的預(yù)訓(xùn)練過程,計算量小了非常多,只有0.2%。
  • 例如下面文章中的例子,模型訓(xùn)練好之后,可直接讓模型做問答:

    「模型輸入」是:"Geoffrey Hinton和George Washington這兩個人有沒有交談過?在回答之前想一想原因?!?/p>

    「模型返回」是:Geoffrey Hinton是一個計算機科學(xué)家,出生在1947年;而George Washington在1799年去世。所以這兩個不可能有過交談。所以答案時“沒有”。

在這里插入圖片描述

  • 論文: Scaling Instruction-Finetuned Language Models
    • 地址:https://arxiv.org/abs/2210.11416
    • 模型:Flan-T5 release - a google Collection

2 基于T5模型的微調(diào)(文本摘要)

  • 我們這里基于瀾舟科技開源的mengzi-t5-base做摘要生成。
  • 孟子T5與T5結(jié)構(gòu)相同,但是不包含下游任務(wù),需要在特定任務(wù)上 finetune 后使用。
  • 這里是自己實現(xiàn)文本摘要,如果借助transformers庫的組件會更加簡單。

2.1 加載數(shù)據(jù)集

  • 數(shù)據(jù)集地址:https://huggingface.co/datasets/supremezxc/nlpcc_2017

  • 我們看一條數(shù)據(jù)集:

    {'title': '組圖:黑河邊防軍人零下30℃戶外訓(xùn)練,冰霜沾滿眉毛和睫毛,防寒服上滿是冰霜。', 'content': '中國軍網(wǎng)2014-12-1709:08:0412月16日,黑龍江省軍區(qū)駐黑河某邊防團機動步兵連官兵,冒著-30℃嚴(yán)寒氣溫進行體能訓(xùn)練,挑戰(zhàn)極寒,鍛造鋼筋鐵骨。該連素有“世界冠軍的搖籃”之稱,曾有5人24人次登上世界軍事五項冠軍的領(lǐng)獎臺。(魏建順攝)黑龍江省軍區(qū)駐黑河某邊防團機動步兵連官兵冒著-30℃嚴(yán)寒氣溫進行體能訓(xùn)練駐黑河某邊防團機動步兵連官兵嚴(yán)寒中戶外訓(xùn)練,防寒服上滿是冰霜駐黑河某邊防團機動步兵連官兵嚴(yán)寒中戶外訓(xùn)練,防寒服上滿是冰霜官兵睫毛上都被凍上了冰霜官兵們睫毛上都被凍上了冰霜駐黑河某邊防團機動步兵連官兵嚴(yán)寒中進行戶外體能訓(xùn)練駐黑河某邊防團機動步兵連官兵嚴(yán)寒中進行戶外體能訓(xùn)練駐黑河某邊防團機動步兵連官兵嚴(yán)寒中進行戶外體能訓(xùn)練'
    }
    
  • 我們可以通過num參數(shù)控制數(shù)據(jù)集的數(shù)量進行訓(xùn)練。

"""微調(diào)瀾舟科技開源的mengzi-t5-base做摘要生成數(shù)據(jù)集(只取5000條):nlpcc_2017: https://huggingface.co/datasets/supremezxc/nlpcc_2017model link:https://modelscope.cn/models/langboat/mengzi-t5-baselink: https://huggingface.co/Langboat/mengzi-t5-base孟子中文T5預(yù)訓(xùn)練生成模型與T5結(jié)構(gòu)相同,只有無監(jiān)督數(shù)據(jù)訓(xùn)練,不包含下游任務(wù),需要在特定任務(wù)上finetune后使用
"""
import os
import platform
import torch
import torch.nn as nn
from torch.utils.data import Dataset, DataLoader
from datasets import load_from_disk
from transformers import AdamW
from transformers import T5Tokenizer, T5ForConditionalGeneration
from logging_util import get_logger
from rouge import Rougedevice = 'cuda' if torch.cuda.is_available() else 'cpu'# 獲取當(dāng)前操作系統(tǒng)的名稱
os_name = platform.system()
logger = get_logger(model_name='mengzi-t5-base')# 設(shè)置模型路徑及數(shù)據(jù)集路徑
if os_name == "Windows":model_dir = r'D:\python\models\langboat\meng_zi_t5'data_dir = r'D:\python\datas\nlp_seq2seq\nlpcc_2017'logger.info("當(dāng)前執(zhí)行環(huán)境是 Windows...")
elif os_name == "Linux":model_dir = r'/root/autodl-fs/models/meng_zi_t5'data_dir = r'/root/autodl-fs/data/nlp_ai/nlp_seq2seq/nlpcc_2017'logger.info("當(dāng)前執(zhí)行環(huán)境是 Linux...")
else:raise ValueError("當(dāng)前執(zhí)行環(huán)境不是 Windows 也不是 Linux")class Dataset(Dataset):def __init__(self, split, num=None):# 在線加載數(shù)據(jù)集(需外網(wǎng)環(huán)境)# dataset = load_dataset(path='nlpcc_2017', split=split)# 我們可以將數(shù)據(jù)保存到本地磁盤,下次利用load_from_disk直接從本地加載即可# dataset.save_to_disk("./nlpcc_2017")# 劃分?jǐn)?shù)據(jù)集為:訓(xùn)練集和測試集dataset = load_from_disk(dataset_path=data_dir)# 選取4900條訓(xùn)練集、100條測試集split_dataset = dataset.train_test_split(100, seed=42)if num:# 離線加載數(shù)據(jù)集,cpu環(huán)境取少量數(shù)據(jù)用來訓(xùn)練、測試模型dataset = split_dataset[split].select(range(num))else:# 離線加載數(shù)據(jù)集dataset = split_dataset[split]# 過濾掉太長的句子,需要去掉CLS、SEPdef f(data):return len(data['content']) <= 512 - 2dataset = dataset.filter(f)self.dataset = datasetdef __len__(self):return len(self.dataset)def __getitem__(self, i):content = self.dataset[i]['content']title = self.dataset[i]['title']return content, title

2.2 對數(shù)據(jù)集進行組裝

  • 主要就是在content前面加上特定的提示詞
  • 然后調(diào)用tokenizer進行批處理
def get_collate_fn(tokenizer):def collate_fn(batch):contents = ["摘要生成: \n" + tup2[0] for tup2 in batch]original_labels = [tup2[1] for tup2 in batch]# 特殊字符# 0 -> <pad># 1 -> </s># 2 -> <unk>inputs = tokenizer(contents, max_length=384, truncation=True, return_tensors='pt', padding=True)labels = tokenizer(text_target=original_labels, max_length=64, truncation=True, return_tensors='pt', padding=True)return inputs, labelsreturn collate_fn

2.3 構(gòu)建模型

  • 利用transformers庫中的T5ForConditionalGeneration加載摘要生成的預(yù)訓(xùn)練模型

  • T5ForConditionalGeneration源碼中實現(xiàn)了KV-cache,有興趣的可以閱讀源碼(主要是T5Attention中實現(xiàn)相對位置編碼、KV-cache、以及門結(jié)構(gòu)的前饋神經(jīng)網(wǎng)絡(luò)T5DenseGatedActDense的實現(xiàn))。

  • T5模型中可以調(diào)用generate函數(shù)(transformers\generation\utils.py),這個函數(shù)中實現(xiàn)了8種采樣的方法(如下代碼所示),每種采樣都有不同的配置參數(shù),具體可以看transformers\generation\configuration_utils.py中GenerationConfig類的參數(shù)解釋。

    # transformers\generation\configuration_utils.py
    class GenerationMode(ExplicitEnum):"""Possible generation modes, downstream of the [`~generation.GenerationMixin.generate`] method."""# Non-beam methodsCONTRASTIVE_SEARCH = "contrastive_search"GREEDY_SEARCH = "greedy_search"SAMPLE = "sample"ASSISTED_GENERATION = "assisted_generation"# Beam methodsBEAM_SEARCH = "beam_search"BEAM_SAMPLE = "beam_sample"CONSTRAINED_BEAM_SEARCH = "constrained_beam_search"GROUP_BEAM_SEARCH = "group_beam_search"
    
class MengZiT5Model(nn.Module):def __init__(self):super().__init__()# 加載預(yù)訓(xùn)練模型self.model = T5ForConditionalGeneration.from_pretrained(model_dir)def forward(self, inputs, labels=None):# 1、encoder的input_ids和attention_maskinput_ids = inputs['input_ids']attention_mask = inputs['attention_mask']if labels is not None:# 2、decoder 的labelstrain_labels = labels['input_ids'].contiguous()train_labels_mask = labels['attention_mask']# 3、decoder 的input_ids和attention_maskdecoder_input_ids = train_labels.new_zeros(train_labels.shape)decoder_input_ids[..., 1:] = train_labels[..., :-1].clone()decoder_attention_mask = train_labels_mask.new_zeros(train_labels_mask.shape)decoder_attention_mask[..., 1:] = train_labels_mask[..., :-1].clone()decoder_attention_mask[..., 0] = 1# 4、送入模型進行預(yù)測outputs = self.model(input_ids=input_ids, attention_mask=attention_mask, decoder_input_ids=decoder_input_ids, decoder_attention_mask=decoder_attention_mask, labels=train_labels)# 5、返回訓(xùn)練時候的Loss值return outputs.losselse:# 模型生成summary_ids = self.model.generate(input_ids, num_beams=4 # 束搜索法, no_repeat_ngram_size=2 # 確保不重復(fù), min_length=10 # 長度限制, max_length=64, early_stopping=True)# 將id轉(zhuǎn)換為輸出 summary_ids.shape = [bs, length]outputs = tokenizer.batch_decode(summary_ids, skip_special_tokens=True)return outputs

2.4 構(gòu)造訓(xùn)練及測試函數(shù)

  • 這里簡單實現(xiàn)了模型的訓(xùn)練及評估的函數(shù)
  • 評估主要使用了指標(biāo)rouge-1、rouge-2、rouge-l
# 模型訓(xùn)練
def train(epochs, model, loader):model.to(device)lr = 2e-5# 訓(xùn)練optimizer = AdamW(model.parameters(), lr=lr)model.train()for epoch in range(epochs):for step, (inputs, labels) in enumerate(loader):inputs = inputs.to(device)labels = labels.to(device)# 模型計算# [b, lens] -> [b, lens, 8]loss = model(inputs, labels)# 梯度下降loss.backward()optimizer.step()optimizer.zero_grad()if step % 10 == 0:print(f'epoch = {epoch}, step = {step}, loss = {loss:.4f}')os.makedirs('./output', exist_ok=True)torch.save(model, './output/meng_zi_t5_sft.pt')# 模型評估
def test():# 1、加載模型model_load = torch.load('output/meng_zi_t5_sft.pt').to(device)model_load.eval()rouge = Rouge()# 2、加載測試集test_loader = DataLoader(dataset=Dataset('test'),batch_size=32,collate_fn=get_collate_fn(tokenizer=tokenizer),shuffle=False,drop_last=True)for step, (inputs, labels) in enumerate(test_loader):if step == 2:breakwith torch.no_grad():# [b, lens] -> [b, lens, 8]decode_preds = model_load(inputs.to(device))decode_labels = tokenizer.batch_decode(labels['input_ids'].to(device), skip_special_tokens=True)decode_preds = [" ".join(p) for p in decode_preds]decode_labels = [" ".join(l) for l in decode_labels]scores = rouge.get_scores(decode_preds, decode_labels, avg=True)r = {"rouge-1": scores["rouge-1"]["f"],"rouge-2": scores["rouge-2"]["f"],"rouge-l": scores["rouge-l"]["f"],}logger.info(f'setp = {step}, 評估結(jié)果:\n{r}')return rif __name__ == '__main__':# 1、加載分詞器tokenizer = T5Tokenizer.from_pretrained(model_dir, legacy=False)# 2、加載訓(xùn)練數(shù)據(jù)train_loader = DataLoader(dataset=Dataset('train'),batch_size=16,collate_fn=get_collate_fn(tokenizer=tokenizer),shuffle=True,drop_last=True)# 3、創(chuàng)建模型model = MengZiT5Model()# 4、模型訓(xùn)練及評估train(epochs=1, model=model, loader=train_loader)test() # 模型評估# 5、對模型進行預(yù)測text = """摘要生成: \n在經(jīng)歷了那段驚心動魄但又充滿人情味的艱難時刻后,32歲的埃里克森時隔1100天再次為國征戰(zhàn)歐洲杯,而且奉獻了進球。丹麥隊對壘斯洛文尼亞,這場熱度并不算高的小組賽首輪爭奪因為一個人的出現(xiàn)得到了外界的關(guān)注,他就是埃里克森。曼聯(lián)中場在在第17分鐘的進球幫助祖國球隊取得了領(lǐng)先,他也在經(jīng)歷上屆歐洲杯的心臟驟停的遭遇之后,實現(xiàn)了“王者歸來”。盡管這次破門遺憾沒能幫助丹麥隊最終獲得勝利,但綽號“愛神”的埃里克森依然得到了全場乃至全世界球迷的祝福。"""inputs = tokenizer(text, return_tensors='pt')model_load = torch.load('output/meng_zi_t5_sft.pt')model_load.eval()print('摘要內(nèi)容:\n', model_load(inputs))
# 訓(xùn)練好的模型可以進行摘要生成
摘要內(nèi)容:['曼聯(lián)32歲埃里克森時隔1100天再次為國征戰(zhàn)歐洲杯,并奉獻了進球。']

3 mT5模型的推理

  • 這里的mT5模型在下游任務(wù)上做了微調(diào),可以直接使用
"""model: iic/nlp_mt5_zero-shot-augment_chinese-baselink: https://modelscope.cn/models/iic/nlp_mt5_zero-shot-augment_chinese-base該模型在mt5模型基礎(chǔ)上使用了大量中文數(shù)據(jù)進行訓(xùn)練,并引入了零樣本分類增強的技術(shù),使模型輸出穩(wěn)定性大幅提升。支持任務(wù)包含:文本分類:給定一段文本和候選標(biāo)簽,模型可輸出文本所屬的標(biāo)簽。自然語言推理:給定兩段文本,判斷兩者關(guān)系。閱讀理解:給定問題和參考文本,輸出問題的答案。問題生成:給定答案和參考文本,生成該答案對應(yīng)的問題。摘要生成:給定一段文本,生成該文本的摘要。標(biāo)題生成:給定一段文本,為其生成標(biāo)題。評價對象抽取:給定一段文本,抽取該段文本的評價對象。翻譯:給定一段文本,將其翻譯成另一種語言。
"""
import torch
import platform
from transformers import T5Tokenizer, T5ForConditionalGeneration, T5Config# 獲取當(dāng)前操作系統(tǒng)的名稱
os_name = platform.system()
device = 'cuda:0' if torch.cuda.is_available() else 'cpu'# 設(shè)置模型路徑及數(shù)據(jù)集路徑
if os_name == "Windows":model_dir = r'D:\\python\\models\\model-download\\iic\\nlp_mt5_zero-shot-augment_chinese-base'print("當(dāng)前執(zhí)行環(huán)境是 Windows...")
elif os_name == "Linux":model_dir = r'/root/autodl-fs/models/nlp_mt5_zero-shot-augment_chinese-base'print("當(dāng)前執(zhí)行環(huán)境是 Linux...")
else:raise ValueError("當(dāng)前執(zhí)行環(huán)境不是 Windows 也不是 Linux")# 1、加載tokenizer及預(yù)訓(xùn)練模型
tokenizer = T5Tokenizer.from_pretrained(model_dir, legacy=False)
model = T5ForConditionalGeneration.from_pretrained(model_dir)
model.to(device)def t5inference(text, task_prefix, max_length=None, min_length=1):""":param text: 要生成摘要的文本:param task_prefix: 執(zhí)行的任務(wù):param max_length: 摘要的最大長度:return:"""# 準(zhǔn)備前綴+文本t5_prepared_text = f'{task_prefix}: ' + textprint("input text: \n", t5_prepared_text)# 分詞tokenized_text = tokenizer.encode(t5_prepared_text, return_tensors="pt").to(device)# 進行文本摘要# prepare_inputs_for_generationsummary_ids = model.generate(tokenized_text,num_beams=4, # 束搜索法no_repeat_ngram_size=2, # 確保不重復(fù)min_length=min_length, # 長度限制max_length=max_length,early_stopping=True # 提前停止)# 將id轉(zhuǎn)換為輸出 summary_ids.shape = [1, length]output = tokenizer.decode(summary_ids[0], skip_special_tokens=True)return outputdef t0():text = """“足球從未高于生死”,這是3年前歐洲杯賽場上丹麥球員埃里克森心臟驟停時,各路媒體報道該事件用的最多的表達。而在經(jīng)歷了那段驚心動魄但又充滿人情味的艱難時刻后,32歲的埃里克森時隔1100天再次為國征戰(zhàn)歐洲杯,而且奉獻了進球。17日凌晨的歐洲杯小組賽,埃里克森進球的那一刻,感動和欣慰撲面而來。最終丹麥和斯洛文尼亞隊1比1戰(zhàn)平,各取1分。丹麥隊對壘斯洛文尼亞,這場熱度并不算高的小組賽首輪爭奪因為一個人的出現(xiàn)得到了外界的關(guān)注,他就是埃里克森。曼聯(lián)中場在在第17分鐘的進球幫助祖國球隊取得了領(lǐng)先,他也在經(jīng)歷上屆歐洲杯的心臟驟停的遭遇之后,實現(xiàn)了“王者歸來”。盡管這次破門遺憾沒能幫助丹麥隊最終獲得勝利,但綽號“愛神”的埃里克森依然得到了全場乃至全世界球迷的祝福。"""output = t5inference(text, task_prefix='文本摘要', min_length=20, max_length=64)print('模型結(jié)果:\n', output)text = """候選標(biāo)簽:故事,房產(chǎn),娛樂,文化,游戲,國際,股票,科技,軍事,教育。文本內(nèi)容:他們的故事平靜而閃光,一代人奠定沉默的基石,讓中國走向繁榮。"""output = t5inference(text, task_prefix='文本分類', max_length=64)print('模型結(jié)果:\n', output)text = """如果日本沉沒,中國會接收日本難民嗎?"""output = t5inference(text, task_prefix='翻譯成英文', max_length=512)print('模型結(jié)果:\n', output)if __name__ == '__main__':# print(model.config)# print(model)t0()
input text: 
文本摘要: “足球從未高于生死”,這是3年前歐洲杯賽場上丹麥球員埃里克森心臟驟停時,各路媒體報道該事件用的最多的表達。而在經(jīng)歷了那段驚心動魄但又充滿人情味的艱難時刻后,32歲的埃里克森時隔1100天再次為國征戰(zhàn)歐洲杯,而且奉獻了進球。17日凌晨的歐洲杯小組賽,埃里克森進球的那一刻,感動和欣慰撲面而來。最終丹麥和斯洛文尼亞隊1比1戰(zhàn)平,各取1分。丹麥隊對壘斯洛文尼亞,這場熱度并不算高的小組賽首輪爭奪因為一個人的出現(xiàn)得到了外界的關(guān)注,他就是埃里克森。曼聯(lián)中場在在第17分鐘的進球幫助祖國球隊取得了領(lǐng)先,他也在經(jīng)歷上屆歐洲杯的心臟驟停的遭遇之后,實現(xiàn)了“王者歸來”。盡管這次破門遺憾沒能幫助丹麥隊最終獲得勝利,但綽號“愛神”的埃里克森依然得到了全場乃至全世界球迷的祝福。 
模型結(jié)果:埃里克森:足球從未高于生死,愛神歸來,為國征戰(zhàn)input text: 
文本分類: 候選標(biāo)簽:故事,房產(chǎn),娛樂,文化,游戲,國際,股票,科技,軍事,教育。文本內(nèi)容:他們的故事平靜而閃光,一代人奠定沉默的基石,讓中國走向繁榮。     
模型結(jié)果:文化input text: 
翻譯成英文: 如果日本沉沒,中國會接收日本難民嗎?     
模型結(jié)果:will China accept Japanese refugees if Japan sinks?
http://aloenet.com.cn/news/43220.html

相關(guān)文章:

  • 南通網(wǎng)站開發(fā)招聘按效果付費的網(wǎng)絡(luò)推廣方式
  • html5手機網(wǎng)站開發(fā)區(qū)別百度快照推廣
  • 建設(shè)網(wǎng)站必備條件長春網(wǎng)站建設(shè)推廣
  • 大于二高端網(wǎng)站建設(shè)新手seo入門教程
  • 網(wǎng)站標(biāo)簽怎么做重慶網(wǎng)站網(wǎng)絡(luò)推廣
  • 淄博北京網(wǎng)站建設(shè)手機百度搜索引擎入口
  • 做網(wǎng)站收費標(biāo)準(zhǔn)哪個平臺可以免費打廣告
  • 網(wǎng)站在建設(shè)時不容忽略的一些細(xì)節(jié)最權(quán)威的排行榜網(wǎng)站
  • 網(wǎng)站建設(shè)中模板下載武漢百度開戶代理
  • 百度搜索不到asp做的網(wǎng)站天津搜狗seo推廣
  • 網(wǎng)站建設(shè)哪個空間比較好網(wǎng)站怎么優(yōu)化到首頁
  • 上海簡站商貿(mào)有限公司seo基礎(chǔ)理論
  • 做任務(wù)傭金網(wǎng)站源碼互聯(lián)網(wǎng)營銷培訓(xùn)平臺
  • 公眾號編輯 wordpress魔貝課凡seo
  • 聚美優(yōu)品網(wǎng)站怎么做的最新的即時比分
  • 白糖貿(mào)易怎么做網(wǎng)站廈門seo公司到1火星
  • 外貿(mào)網(wǎng)站建設(shè)設(shè)計杭州做seo的公司
  • 微信h5免費制作網(wǎng)站seo優(yōu)化與推廣招聘
  • 招聘網(wǎng)站怎么做營銷軟文代寫平臺
  • 個人網(wǎng)站可以做淘寶客杭州網(wǎng)站推廣平臺
  • 商城網(wǎng)站建站深圳優(yōu)化seo排名
  • 如果做鏡像網(wǎng)站360廣告投放平臺
  • 北京的網(wǎng)站設(shè)計公司線上營銷策劃方案
  • 重慶做網(wǎng)站微信的公司提高搜索引擎檢索效果的方法
  • 郴州seo快速排名關(guān)鍵詞優(yōu)化排名工具
  • 重慶市建設(shè)工程信息網(wǎng)一體化平臺河源市企業(yè)網(wǎng)站seo價格
  • 手機網(wǎng)站排名優(yōu)化軟件網(wǎng)絡(luò)營銷推廣方式都有哪些
  • 遼寧省網(wǎng)站制作公司排名怎樣在百度發(fā)廣告貼
  • html5網(wǎng)站優(yōu)點優(yōu)化推廣網(wǎng)站怎么做最好
  • 鄭州網(wǎng)站建設(shè)培訓(xùn)短期班營銷推廣怎么做