日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

bert 是单标签还是多标签 的分类_搞定NLP领域的“变形金刚”!手把手教你用BERT进行多标签文本分类...

發布時間:2023/12/29 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 bert 是单标签还是多标签 的分类_搞定NLP领域的“变形金刚”!手把手教你用BERT进行多标签文本分类... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

大數據文摘出品

來源:medium

編譯:李雷、睡不著的iris、Aileen

過去的一年,深度神經網絡的應用開啟了自然語言處理的新時代。預訓練模型在研究領域的應用已經令許多NLP項目的最新成果產生了巨大的飛躍,例如文本分類,自然語言推理和問答。

ELMo,ULMFiT 和OpenAI Transformer是其中幾個關鍵的里程碑。所有這些算法都允許我們在大型數據庫(例如所有維基百科文章)上預先訓練無監督語言模型,然后在下游任務上對這些預先訓練的模型進行微調。

這一年里,在這一領域中最激動人心的事件恐怕要數BERT的發布,這是一種基于多語言轉換器的模型,它已經在各種NLP項目中取得了令人矚目的成果。BERT是一種基于transformer架構的雙向模型,它以一種速度更快的基于Attention的方法取代了RNN(LSTM和GRU)的sequential屬性。

該模型還在兩個無監督任務(“遮蔽語言模型”和“下一句預測”)上進行了預訓練。這讓我們可以通過對下游特定任務(例如情緒分類,意圖檢測,問答等)進行微調來使用預先訓練的BERT模型。

本文將手把手教你,用BERT完成一個Kaggle競賽。

在本文中,我們將重點介紹BERT在多標簽文本分類問題中的應用。傳統的分類問題假定每個文檔都分配給一個且只分配給一個類別,即標簽。這有時也被稱為多元分類,比如類別數量是2的話,就叫做二元分類。

而多標簽分類假設文檔可以同時獨立地分配給多個標簽或類別。多標簽分類具有許多實際應用,例如業務分類或為電影分配多個類型。在客戶服務領域,此技術可用于識別客戶電子郵件的多種意圖。

我們將使用Kaggle的“惡意評論分類挑戰”來衡量BERT在多標簽文本分類中的表現。

在本次競賽中,我們將嘗試構建一個能夠將給文本片段分配給同惡評類別的模型。我們設定了惡意評論類別作為模型的目標標簽,它們包括普通惡評、嚴重惡評、污言穢語、威脅、侮辱和身份仇視。

比賽鏈接:

https://www.kaggle.com/c/jigsaw-toxic-comment-classification-challenge從哪開始?

Google Research最近公開了BERT 的tensorflow部署代碼,并發布了以下預訓練模型:BERT-Base, Uncased: 12層,768個隱藏單元,自注意力的 head數為12,110M參數

BERT-Large, Uncased:24層,1024個隱藏單元,自注意力的 head數為16,340M參數

BERT-Base, Cased:12層,768個隱藏單元,自注意力的 head數為12,110M參數

BERT-Large, Cased:24層,1024個隱藏單元,自注意力的 head數為16,340M參數

BERT-Base, Multilingual Cased (最新推薦):104種語言,12層,768個隱藏單元,自注意力的 head數為12,110M參數

BERT-Base, Chinese:中文(簡體和繁體),12層,768個隱藏單元,自注意力的 head數為12,110M參數

編者注:這里cased和uncased的意思是在進行WordPiece分詞之前是否區分大小寫。uncased表示全部會調整成小寫,且剔除所有的重音標記;cased則表示文本的真實情況和重音標記都會保留下來。

我們將使用較小的Bert-Base,uncased模型來完成此任務。Bert-Base模型有12個attention層,所有文本都將由標記器轉換為小寫。我們在亞馬遜云 p3.8xlarge EC2實例上運行此模型,該實例包含4個Tesla V100 GPU,GPU內存總共64 GB。

因為我個人更喜歡在TensorFlow上使用PyTorch,所以我們將使用來自HuggingFace的BERT模型PyTorch端口,這可從https://github.com/huggingface/pytorch-pretrained-BERT下載。我們已經用HuggingFace的repo腳本將預先訓練的TensorFlow檢查點(checkpoints)轉換為PyTorch權重。

我們的實現很大程度上是以BERT原始實現中提供的run_classifier示例為基礎的。數據展示

數據用類InputExample來表示。text_a:文本評論

text_b:未使用

標簽:來自訓練數據集的評論標簽列表(很明顯,測試數據集的標簽將為空)class InputExample(object):

"""A single training/test example for sequence classification."""

def __init__(self, guid, text_a, text_b=None, labels=None):

"""Constructs a InputExample.

Args:

guid: Unique id for the example.

text_a: string. The untokenized text of the first sequence. For single

sequence tasks, only this sequence must be specified.

text_b: (Optional) string. The untokenized text of the second sequence.

Only must be specified for sequence pair tasks.

labels: (Optional) [string]. The label of the example. This should be

specified for train and dev examples, but not for test examples.

"""

self.guid= guid

self.text_a = text_a

self.text_b = text_b

self.labels = labels

class InputFeatures(object):

"""A single set of features of data."""

def __init__(self, input_ids, input_mask, segment_ids, label_ids):

self.input_ids= input_ids

self.input_mask = input_mask

self.segment_ids = segment_ids

self.label_ids = label_ids

我們將InputExample轉換為BERT能理解的特征,該特征用類InputFeatures來表示。input_ids:標記化文本的數字id列表

input_mask:對于真實標記將設置為1,對于填充標記將設置為0

segment_ids:對于我們的情況,這將被設置為全1的列表

label_ids:文本的one-hot編碼標簽標記化(Tokenisation)

BERT-Base,uncased模型使用包含30,522個單詞的詞匯表。標記化過程涉及將輸入文本拆分為詞匯表中可用的標記列表。為了處理不在詞匯表中的單詞,BERT使用一種稱為基于雙字節編碼(BPE,Byte-Pair Encoding)的WordPiece標記化技術。

這種方法將不在詞匯表之中的詞一步步分解成子詞。因為子詞是詞匯表的一部分,模型已經學習了這些子詞在上下文中的表示,并且該詞的上下文僅僅是子詞的上下文的組合,因此這個詞就可以由一組子詞表示。要了解關于此方法的更多詳細信息,請參閱文章《使用子詞單位的稀有單詞的神經網絡機器翻譯》。

文章鏈接:

https://arxiv.org/pdf/1508.07909

在我看來,這與BERT本身一樣都是一種突破。模型架構

我們將改寫BertForSequenceClassification類以使其滿足多標簽分類的要求。class BertForMultiLabelSequenceClassification(PreTrainedBertModel):

"""BERT model for classification.

This module is composed of the BERT model with a linear layer on top of

the pooled output.

"""

def __init__(self, config, num_labels=2):

super(BertForMultiLabelSequenceClassification, self).__init__(config)

self.num_labels= num_labels

self.bert = BertModel(config)

self.dropout = torch.nn.Dropout(config.hidden_dropout_prob)

self.classifier = torch.nn.Linear(config.hidden_size, num_labels)

self.apply(self.init_bert_weights)

def forward(self, input_ids, token_type_ids=None, attention_mask=None, labels=None):

_, pooled_output = self.bert(input_ids, token_type_ids, attention_mask, output_all_encoded_layers=False)

pooled_output = self.dropout(pooled_output)

logits = self.classifier(pooled_output)

if labels is not None:

loss_fct = BCEWithLogitsLoss()

loss = loss_fct(logits.view(-1, self.num_labels), labels.view(-1, self.num_labels))

return loss

else:

return logits

def freeze_bert_encoder(self):

for param in self.bert.parameters():

param.requires_grad = False

def unfreeze_bert_encoder(self):

for param in self.bert.parameters():

param.requires_grad = True

這里主要的改動是用logits作為二進制交叉熵的損失函數(BCEWithLogitsLoss),取代用于多元分類的vanilla交叉熵損失函數(CrossEntropyLoss)。二進制交叉熵損失可以讓我們的模型為標簽分配獨立的概率。

下面的模型摘要說明了模型的各個層及其維度。BertForMultiLabelSequenceClassification(

(bert): BertModel(

(embeddings): BertEmbeddings(

(word_embeddings): Embedding(28996, 768)

(position_embeddings): Embedding(512, 768)

(token_type_embeddings): Embedding(2, 768)

(LayerNorm): FusedLayerNorm(torch.Size([768]), eps=1e-12, elementwise_affine=True)

(dropout): Dropout(p=0.1)

)

(encoder): BertEncoder(

(layer): ModuleList(

# ? ? ? 12 BertLayers

(11): BertLayer(

(attention): BertAttention(

(self): BertSelfAttention(

(query): Linear(in_features=768, out_features=768, bias=True)

(key): Linear(in_features=768, out_features=768, bias=True)

(value): Linear(in_features=768, out_features=768, bias=True)

(dropout): Dropout(p=0.1)

)

(output): BertSelfOutput(

(dense): Linear(in_features=768, out_features=768, bias=True)

(LayerNorm): FusedLayerNorm(torch.Size([768]), eps=1e-12, elementwise_affine=True)

(dropout): Dropout(p=0.1)

)

)

(intermediate): BertIntermediate(

(dense): Linear(in_features=768, out_features=3072, bias=True)

)

(output): BertOutput(

(dense): Linear(in_features=3072, out_features=768, bias=True)

(LayerNorm): FusedLayerNorm(torch.Size([768]), eps=1e-12, elementwise_affine=True)

(dropout): Dropout(p=0.1)

)

)

)

)

(pooler): BertPooler(

(dense): Linear(in_features=768, out_features=768, bias=True)

(activation): Tanh()

)

)

(dropout): Dropout(p=0.1)

(classifier): Linear(in_features=768, out_features=6, bias=True)

)BertEmbeddings:輸入嵌入層

BertEncoder: 12個BERT模型attention層

分類器:我們的多標簽分類器,out_features = 6,每個分類符對應6個標簽模型訓練

訓練循環與原始BERT實現中提供的run_classifier.py里的循環相同。我們的模型訓練了4個epoch(一個完整的數據集通過了神經網絡一次并且返回了一次,這個過程稱為一個 epoch),每批數據大小為32,序列長度為512,即預訓練模型的最大可能性。根據原始論文的建議,學習率保持在3e-5。

因為有機會使用多個GPU,所以我們將Pytorch模型封裝在DataParallel模塊中,這使我們能夠在所有可用的GPU上進行訓練。

我們沒有使用半精度FP16技術,因為使用logits 損失函數的二進制交叉熵不支持FP16處理。但這并不會影響最終結果,只是需要更長的時間訓練。評估指標def accuracy_thresh(y_pred:Tensor, y_true:Tensor, thresh:float=0.5, sigmoid:bool=True):

"Compute accuracy when `y_pred` and `y_true` are the same size."

if sigmoid: y_pred= y_pred.sigmoid()

return np.mean(((y_pred>thresh)==y_true.byte()).float().cpu().numpy(), axis=1).sum()from sklearn.metrics import roc_curve, auc

# Compute ROC curve and ROC area for each class

fpr = dict()

tpr = dict()

roc_auc = dict()

for i in range(num_labels):

fpr[i], tpr[i], _ = roc_curve(all_labels[:, i], all_logits[:, i])

roc_auc[i] = auc(fpr[i], tpr[i])

# Compute micro-average ROC curve and ROC area

fpr["micro"], tpr["micro"], _ = roc_curve(all_labels.ravel(), all_logits.ravel())

roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])

我們為精度度量函數增加了一個閾值,默認設置為0.5。

對于多標簽分類,更重要的指標是ROC-AUC曲線。這也是Kaggle比賽的評分指標。我們分別計算每個標簽的ROC-AUC,并對單個標簽的roc-auc分數進行微平均。

如果想深入了解roc-auc曲線,這里有一篇很不錯的博客。

博客鏈接:

https://towardsdatascience.com/understanding-auc-roc-curve-68b2303cc9c5。評估分數

我們重復進行了幾次實驗,每次都有一些輸入上的變化,但都得到了類似的結果,如下所示:

訓練損失:0.022,驗證損失:0.018,驗證準確度:99.31%。

各個標簽的ROC-AUC分數:普通惡評:0.9988

嚴重惡評:0.9935

污言穢語:0.9988

威脅:0.9989

侮辱:0.9975

身份仇視:0.9988

微觀平均ROC-AUC得分:0.9987

這樣的結果似乎非常令人鼓舞,因為我們看上去已經創建了一個近乎完美的模型來檢測文本評論的惡毒程度。現在看看我們在Kaggle排行榜上的得分。Kaggle競賽結果

我們在Kaggle提供的測試數據集上運行推理邏輯,并將結果提交給競賽。以下是結果:

我們的roc-auc評分達到了0.9863,在所有競爭者中排名前10%。為了使比賽結果更具說服力,這次Kaggle比賽的獎金為35000美元,而一等獎得分為0.9885。

最高分的團隊由專業的高技能數據科學家和從業者組成。除了我們所做的工作之外,他們還使用各種技術來進行數據集成,數據增強(data augmentation)和測試時增強(test-time augmentation)。結論和后續

我們使用強大的BERT預訓練模型實現了多標簽分類模型。正如我們所展示的那樣,模型在已熟知的公開數據集上得到了相當不錯的結果。我們能夠建立一個世界級的模型生產應用于各行業,尤其是客戶服務領域。

對于我們來說,下一步將是使用“遮蔽語言模型”和“下一句預測”對下游任務的文本語料庫來微調預訓練的語言模型。這將是一項無監督的任務,希望該模型能夠學習一些我們自定義的上下文和術語,這和ULMFiT使用的技術類似。

資料鏈接:

https://nbviewer.jupyter.org/github/kaushaltrivedi/bert-toxic-comments-multilabel/blob/master/toxic-bert-multilabel-classification.ipynb

https://github.com/kaushaltrivedi/bert-toxic-comments-multilabel/blob/master/toxic-bert-multilabel-classification.ipynb

原始BERT論文:

https://arxiv.org/pdf/1810.04805

相關報道:

https://medium.com/huggingface/multi-label-text-classification-using-bert-the-mighty-transformer-69714fa3fb3d

總結

以上是生活随笔為你收集整理的bert 是单标签还是多标签 的分类_搞定NLP领域的“变形金刚”!手把手教你用BERT进行多标签文本分类...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 久久精品国产精品亚洲色婷婷 | 91精品国自产在线 | aaaaa级少妇高潮大片免费看 | 天天舔天天舔 | 日韩美一级片 | 国产精品第七页 | 天天干天天综合 | 久久久老司机 | 草久网 | 波多野结衣 一区 | 成人免费无码大片a毛片 | 毛片无遮挡高清免费观看 | 国产国语亲子伦亲子 | 亚洲成人高清在线观看 | 体内精视频xxxxx | 国产人妻人伦精品1国产丝袜 | 亚洲a一区| 欧美日韩在线免费观看视频 | 一区二区三区在线电影 | 可以直接在线观看的av | 人人人妻人人澡人人爽欧美一区 | 免费av大全 | 瑟瑟视频免费观看 | 亚洲精品~无码抽插 | 欧美经典一区 | 亚洲在线激情 | 综合色88 | 日韩激情小说 | 成人激情视频在线播放 | 日韩av福利 | 欧美三级一区二区 | 人av在线| 97超碰总站 | 美女网站在线看 | 在线91av | 夫妻自拍偷拍 | 黄色一二三区 | 日韩不卡一二区 | 自拍视频啪 | 91久久久久久久久久久久久 | 日本福利在线观看 | 日韩精品一卡 | 在线免费观看av网站 | 夜夜狠 | 国产男女在线 | 日韩一卡二卡三卡 | jzzijzzij亚洲成熟少妇在线播放 狠狠躁日日躁夜夜躁2022麻豆 | 四虎影视永久免费观看 | 理论片高清免费理伦片 | 色欲久久久天天天综合网精品 | 新狠狠干 | av在线免费观看一区 | 日本资源在线 | 东北毛片 | 国产精品电影在线观看 | 爱草在线视频 | 日韩av网址大全 | 免费看a| 亚洲九九视频 | 一区二区播放 | 熟女国产精品一区二区三 | 成人免费高清 | 国产极品91 | 久久久久亚洲AV成人网人人小说 | 五月综合激情日本mⅴ | 自拍视频网址 | 欧美黑人精品一区二区 | 亚洲精品a | 国产精品麻豆欧美日韩ww | 欧美久久综合网 | 国产色爱 | 波多野结衣在线视频播放 | 91大神视频在线播放 | 少妇婷婷 | 人人澡人人草 | 亚洲一区亚洲二区 | 丰满少妇一区二区三区 | 国产精品区一区二区三 | 久久久综合网 | av 一区二区三区 | 亚洲专区在线 | 亚洲国产综合一区 | 美女又爽又黄视频毛茸茸 | 国产高清视频免费在线观看 | 国语对白对话在线观看 | 国产日韩欧美中文字幕 | 国产又粗又黄又爽又硬的视频 | 成人免费黄色大片 | 99热欧美| 国产伦精品一区二区三区视频痴汉 | 中文字幕一区二区三区四区不卡 | 国产乱人对白 | 山村大伦淫第1部分阅读小说 | 91九色视频在线观看 | 青青草五月天 | 日韩精品一区二区三区无码专区 | 亚洲夜色 | 国产一区二区高清视频 | 久久99一区 |