使用BERT進(jìn)行fine-tuning

Github上BERT的README里面已經(jīng)給出了相當(dāng)詳細(xì)的使用說明,GOOGLE BERT地址
Fine-tuning就是載入預(yù)訓(xùn)練好的Bert模型,在自己的語料上再訓(xùn)練一段時間。載入模型和使用模型繼續(xù)訓(xùn)練這部分github上代碼已經(jīng)幫忙做好了,我們fine-tuning需要做的工作就是在官方代碼的run_classifier.py這個文件里面添加本地任務(wù)的Processor贪壳。


仿照官方代碼中的XnliProcessor,添加一個文本分類的fine-tuning處理類TextProcessor蚜退,它需要繼承DataProcessor闰靴,實現(xiàn)get_train_examplesget_labels方法钻注。
使用的文本數(shù)據(jù)不需要分詞(bert代碼會幫你做掉)蚂且,以'\t'為分隔分為兩列。第一列是文本的標(biāo)簽幅恋,第二列是輸入文本杏死。
train.tsv:
2 比奔馳寶馬比不了比相應(yīng)的的車輛小五你是第一
0 美國車就是費(fèi)油既然你買的起就能燒得起油

class TextProcessor(DataProcessor):
  """Processor for the Text classification"""

  # 讀入訓(xùn)練集語料 (.tsv即使用'\t'分隔的csv文件)
  def get_train_examples(self, data_dir):
    return self._create_examples(
        self._read_tsv(os.path.join(data_dir, "train.tsv")), "train")

  # 讀入evalation使用的語料, 如果--do_eval=False, 可以不實現(xiàn)
  def get_dev_examples(self, data_dir):
    return self._create_examples(
        self._read_tsv(os.path.join(data_dir, "dev.tsv")),
        "dev_matched")

  # 讀入測試集數(shù)據(jù), --do_predict的時候使用
  def get_test_examples(self, data_dir):
    return self._create_examples(
        self._read_tsv(os.path.join(data_dir, "test.tsv")), "test")

  # 文本分類的標(biāo)簽
  def get_labels(self):
    return ["0", "1", "2"]

  def _create_examples(self, lines, set_type):
    """Creates examples for the training and dev sets."""
    examples = []
    # lines是_read_tsv()方法讀入的數(shù)據(jù), 每一行樣本按照"\t"切成一個list
    for (i, line) in enumerate(lines):
      # guid是樣本的id, 保證唯一性就可以了
      guid = "%s-%s" % (set_type, i)
      # 輸入的文本數(shù)據(jù) (不需要分詞)
      text_a = tokenization.convert_to_unicode(line[1])
      # 只有一個輸出文本, text_b置為None
      text_b = None
      if set_type == "test":
        # 這邊假設(shè)test數(shù)據(jù)沒有標(biāo)簽, 隨便給個標(biāo)簽就行了
        label = "0"
      else:
        # 訓(xùn)練和驗證使用的數(shù)據(jù)標(biāo)簽
        label = tokenization.convert_to_unicode(line[0])
      examples.append(
          InputExample(guid=guid, text_a=text_a, text_b=text_b, label=label))
    return examples

還需要在def main()函數(shù)中添加任務(wù)

processors = {
      "cola": ColaProcessor,
      "mnli": MnliProcessor,
      "mrpc": MrpcProcessor,
      "xnli": XnliProcessor,
      "text": TextProcessor
  }

最后在shell腳本中添加以下內(nèi)容,運(yùn)行:

# 下載的預(yù)訓(xùn)練模型文件的目錄
export BERT_BASE_DIR=/path/to/bert/uncased_L-12_H-768_A-12
# fine-tuning使用的文件目錄 (目錄包含train.tsv, dev.tsv, test.tsv文件)
export TEXT_DIR=/path/to/text

CUDA_VISIBLE_DEVICES=0 python run_classifier.py \
  --task_name=text \
  --do_train=true \
  --do_eval=true \
  --data_dir=$TEXT_DIR \
  --vocab_file=$BERT_BASE_DIR/vocab.txt \
  --bert_config_file=$BERT_BASE_DIR/bert_config.json \
  --init_checkpoint=$BERT_BASE_DIR/bert_model.ckpt \
  --max_seq_length=128 \
  --train_batch_size=32 \
  --learning_rate=2e-5 \
  --num_train_epochs=3.0 \
  --output_dir=/tmp/text_output/

run_classifier.py使用的參數(shù)含義在文件開頭都有解釋捆交,這里就不再贅述了淑翼。

如果想利用fine-tuning好的模型來對test數(shù)據(jù)進(jìn)行預(yù)測,可以參考以下shell腳本

export BERT_BASE_DIR=/path/to/bert/uncased_L-12_H-768_A-12
export DATA_DIR=/path/to/text
# 前面fine-tuning模型的輸出目錄
export TRAINED_CLASSIFIER=/tmp/text_output/

python run_classifier.py \
  --task_name=text \
  --do_predict=true \
  --data_dir=$DATA_DIR \
  --vocab_file=$BERT_BASE_DIR/vocab.txt \
  --bert_config_file=$BERT_BASE_DIR/bert_config.json \
  --init_checkpoint=$TRAINED_CLASSIFIER \
  --max_seq_length=128 \
  --output_dir=/tmp/text_output/pred/

預(yù)測完成后會在/tmp/text_output/pred/目錄下生成一個test_results.tsv文件品追。文件每行代表模型對每個類別預(yù)測的分?jǐn)?shù)玄括,對應(yīng)順序為TextProcessorget_labels返回的標(biāo)簽順序。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末肉瓦,一起剝皮案震驚了整個濱河市遭京,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌泞莉,老刑警劉巖哪雕,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鲫趁,居然都是意外死亡斯嚎,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門饮寞,熙熙樓的掌柜王于貴愁眉苦臉地迎上來孝扛,“玉大人列吼,你說我怎么就攤上這事幽崩】嗍迹” “怎么了?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵慌申,是天一觀的道長陌选。 經(jīng)常有香客問我蹄溉,道長咨油,這世上最難降的妖魔是什么柒爵? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任役电,我火速辦了婚禮棉胀,結(jié)果婚禮上法瑟,老公的妹妹穿的比我還像新娘。我一直安慰自己唁奢,他們只是感情好霎挟,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著酥夭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪脊奋。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天诚隙,我揣著相機(jī)與錄音讶隐,去河邊找鬼。 笑死最楷,一個胖子當(dāng)著我的面吹牛整份,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播籽孙,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼犯建!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起适瓦,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤谱仪,失蹤者是張志新(化名)和其女友劉穎否彩,沒想到半個月后疯攒,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體列荔,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡敬尺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年贴浙,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片崎溃。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖袁串,靈堂內(nèi)的尸體忽然破棺而出概而,到底是詐尸還是另有隱情般婆,我是刑警寧澤到腥,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布蔚袍,位于F島的核電站,受9級特大地震影響啤咽,放射性物質(zhì)發(fā)生泄漏晋辆。R本人自食惡果不足惜宇整,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鳞青。 院中可真熱鬧,春花似錦臂拓、人聲如沸厚脉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至中捆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泄伪,已是汗流浹背殴蓬。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工臂容, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留根蟹,地道東北人脓杉。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓简逮,卻偏偏與公主長得像球散,于是被迫代替她去往敵國和親散庶。 傳聞我的和親對象是個殘疾皇子蕉堰,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 版權(quán)聲明:本文為博主原創(chuàng)文章悲龟,轉(zhuǎn)載請注明出處. 上篇文章介紹了如何安裝和使用BERT進(jìn)行文本相似度任務(wù),包括如何修...
    風(fēng)玲兒閱讀 10,408評論 3 9
  • 從11月初開始须教,google-research就陸續(xù)開源了BERT的各個版本。google此次開源的BERT是通過...
    奇點機(jī)智閱讀 84,113評論 51 102
  • 谷歌發(fā)布bert[https://github.com/google-research/bert]已經(jīng)有一段時間了...
    elephantnose閱讀 8,576評論 9 9
  • 在美麗的花園里有一棵樹叫七色樹乐疆。上面開著七色花,天上有蝴蝶來采蜜贬养,小鳥站在樹枝上,為她唱歌误算⊙雒溃花園里還有挺拔...
    楊欣儀小朋友閱讀 387評論 0 0
  • 凡是跟投資有關(guān)的儿礼,按照公允價值做賬的,年底公允價值的變動都是屬于非調(diào)整事項蜘犁。(例如結(jié)束年為當(dāng)年11月30翰苫,它在12...
    sarasit閱讀 316評論 0 0