<label id="jgr5k"></label>
    <legend id="jgr5k"><track id="jgr5k"></track></legend>

    <sub id="jgr5k"></sub>
  1. <u id="jgr5k"></u>
      久草国产视频,91资源总站,在线免费看AV,丁香婷婷社区,久久精品99久久久久久久久,色天使av,无码探花,香蕉av在线
      您正在使用IE低版瀏覽器,為了您的雷峰網賬號安全和更好的產品體驗,強烈建議使用更快更安全的瀏覽器
      此為臨時鏈接,僅用于文章預覽,將在時失效
      人工智能開發者 正文
      發私信給AI科技評論
      發送

      0

      干貨 | BERT fine-tune 終極實踐教程

      本文作者: AI科技評論 2018-11-26 17:10
      導語:終極實踐教程

      從11月初開始,google-research就陸續開源了BERT的各個版本。google此次開源的BERT是通過tensorflow高級API—— tf.estimator進行封裝(wrapper)的。因此對于不同數據集的適配,只需要修改代碼中的processor部分,就能進行代碼的訓練、交叉驗證和測試。

      以下是奇點機智技術團隊對BERT在中文數據集上的fine tune終極實踐教程。

      在自己的數據集上運行 BERT

      BERT的代碼同論文里描述的一致,主要分為兩個部分。一個是訓練語言模型(language model)的預訓練(pretrain)部分。另一個是訓練具體任務(task)的fine-tune部分。在開源的代碼中,預訓練的入口是在run_pretraining.py而fine-tune的入口針對不同的任務分別在run_classifier.py和run_squad.py。其中run_classifier.py適用的任務為分類任務。如CoLA、MRPC、MultiNLI這些數據集。而run_squad.py適用的是閱讀理解(MRC)任務,如squad2.0和squad1.1。

      預訓練是BERT很重要的一個部分,與此同時,預訓練需要巨大的運算資源。按照論文里描述的參數,其Base的設定在消費級的顯卡Titan x 或Titan 1080ti(12GB RAM)上,甚至需要近幾個月的時間進行預訓練,同時還會面臨顯存不足的問題。不過所幸的是谷歌滿足了Issues#2里各國開發者的請求,針對大部分語言都公布了BERT的預訓練模型。因此在我們可以比較方便地在自己的數據集上進行fine-tune。

      下載預訓練模型

      對于中文而言,google公布了一個參數較小的BERT預訓練模型。具體參數數值如下所示:

      Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, 110M parameters

      模型的下載鏈接可以在github上google的開源代碼里找到。對下載的壓縮文件進行解壓,可以看到文件里有五個文件,其中bert_model.ckpt開頭的文件是負責模型變量載入的,而vocab.txt是訓練時中文文本采用的字典,最后bert_config.json是BERT在訓練時,可選調整的一些參數。

      修改 processor

      任何模型的訓練、預測都是需要有一個明確的輸入,而BERT代碼中processor就是負責對模型的輸入進行處理。我們以分類任務的為例,介紹如何修改processor來運行自己數據集上的fine-tune。在run_classsifier.py文件中我們可以看到,google對于一些公開數據集已經寫了一些processor,如XnliProcessor,MnliProcessor,MrpcProcessor和ColaProcessor。這給我們提供了一個很好的示例,指導我們如何針對自己的數據集來寫processor。

      對于一個需要執行訓練、交叉驗證和測試完整過程的模型而言,自定義的processor里需要繼承DataProcessor,并重載獲取label的get_labels和獲取單個輸入的get_train_examples,get_dev_examples和get_test_examples函數。其分別會在main函數的FLAGS.do_train、FLAGS.do_eval和FLAGS.do_predict階段被調用。
      這三個函數的內容是相差無幾的,區別只在于需要指定各自讀入文件的地址。

      以get_train_examples為例,函數需要返回一個由InputExample類組成的list。InputExample類是一個很簡單的類,只有初始化函數,需要傳入的參數中guid是用來區分每個example的,可以按照train-%d'%(i)的方式進行定義。text_a是一串字符串,text_b則是另一串字符串。在進行后續輸入處理后(BERT代碼中已包含,不需要自己完成) text_a和text_b將組合成[CLS] text_a [SEP] text_b [SEP]的形式傳入模型。最后一個參數label也是字符串的形式,label的內容需要保證出現在get_labels函數返回的list里。

      舉一個例子,假設我們想要處理一個能夠判斷句子相似度的模型,現在在data_dir的路徑下有一個名為train.csv的輸入文件,如果我們現在輸入文件的格式如下csv形式:

      1,你好,您好
      0,你好,你家住哪

      那么我們可以寫一個如下的get_train_examples的函數。當然對于csv的處理,可以使用諸如csv.reader的形式進行讀入。

      def get_train_examples(self, data_dir):
         file_path = os.path.join(data_dir, 'train.csv')    with open(file_path, 'r') as f:
             reader = f.readlines()
         examples = []    for index, line in enumerate(reader):
             guid = 'train-%d'%index
             split_line = line.strip().split(',')
             text_a = tokenization.convert_to_unicode(split_line[1])
             text_b = tokenization.convert_to_unicode(split_line[2])
             label = split_line[0]
             examples.append(InputExample(guid=guid, text_a=text_a,
                                          text_b=text_b, label=label))    return examples

      同時對應判斷句子相似度這個二分類任務,get_labels函數可以寫成如下的形式:

      def get_labels(self):
         return ['0','1']

      在對get_dev_examples和get_test_examples函數做類似get_train_examples的操作后,便完成了對processor的修改。其中get_test_examples可以傳入一個隨意的label數值,因為在模型的預測(prediction)中label將不會參與計算。

      修改 processor 字典

      修改完成processor后,需要在在原本main函數的processor字典里,加入修改后的processor類,即可在運行參數里指定調用該processor。

      processors = {

            "cola": ColaProcessor,

            "mnli": MnliProcessor,

            "mrpc": MrpcProcessor,

            "xnli": XnliProcessor,
            "selfsim": SelfProcessor #添加自己的processor
       }

      運行 fine-tune

      之后就可以直接運行run_classsifier.py進行模型的訓練。在運行時需要制定一些參數,一個較為完整的運行參數如下所示:

      export BERT_BASE_DIR=/path/to/bert/chinese_L-12_H-768_A-12 #全局變量 下載的預訓練bert地址export MY_DATASET=/path/to/xnli #全局變量 數據集所在地址python run_classifier.py \
       --task_name=selfsim \ #自己添加processor在processors字典里的key名
       --do_train=true \
       --do_eval=true \
       --dopredict=true \
       --data_dir=$MY_DATASET \
       --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=5e-5 \
       --num_train_epochs=2.0 \
       --output_dir=/tmp/selfsim_output/ #模型輸出路徑

      BERT 源代碼里還有什么

      在開始訓練我們自己fine-tune的BERT后,我們可以再來看看BERT代碼里除了processor之外的一些部分。
      我們可以發現,process在得到字符串形式的輸入后,在file_based_convert_examples_to_features里先是對字符串長度,加入[CLS]和[SEP]等一些處理后,將其寫入成TFrecord的形式。這是為了能在estimator里有一個更為高效和簡易的讀入。

      我們還可以發現,在create_model的函數里,除了從modeling.py獲取模型主干輸出之外,還有進行fine-tune時候的loss計算。因此,如果對于fine-tune的結構有自定義的要求,可以在這部分對代碼進行修改。如進行NER任務的時候,可以按照BERT論文里的方式,不只讀第一位的logits,而是將每一位logits進行讀取。

      BERT這次開源的代碼,由于是考慮在google自己的TPU上高效地運行,因此采用的estimator是tf.contrib.tpu.TPUEstimator,雖然TPU的estimator同樣可以在gpu和cpu上運行,但若想在gpu上更高效地做一些提升,可以考慮將其換成tf.estimator.Estimator,于此同時model_fn里一些tf.contrib.tpu.TPUEstimatorSpec也需要修改成tf.estimator.EstimatorSpec的形式,以及相關調用參數也需要做一些調整。在轉換成較普通的estimator后便可以使用常用的方式對estimator進行處理,如生成用于部署的.pb文件等。

      GitHub Issues 里一些有趣的內容

      從google對BERT進行開源開始,Issues里的討論便異常活躍,BERT論文第一作者Jacob Devlin也積極地在Issues里進行回應,在交流討論中,產生了一些很有趣的內容。

      在GitHub Issues#95中大家討論了BERT模型在今年AI-Challenger比賽上的應用。我們也同樣嘗試了BERT在AI-Challenger的機器閱讀理解(mrc)賽道的表現。如果簡單得地將mrc的文本連接成一個長字符串的形式,可以在dev集上得到79.1%的準確率。

      如果參考openAI的GPT論文里multi-choice的形式對BERT的輸入輸出代碼進行修改則可以將準確率提高到79.3%。采用的參數都是BERT默認的參數,而單一模型成績在賽道的test a排名中已經能超過榜單上的第一名。因此,在相關中文的任務中,bert能有很大的想象空間。

      在GitHub Issues#123中,@hanxiao給出了一個采用ZeroMQ便捷部署BERT的service,可以直接調用訓練好的模型作為應用的接口。同時他將BERT改為一個大的encode模型,將文本通過BERT進行encode,來實現句子級的encode。此外,他對比了多GPU上的性能,發現bert在多GPU并行上的出色表現。

      總結

      總的來說,google此次開源的BERT和其預訓練模型是非常有價值的,可探索和改進的內容也很多。相關數據集上已經出現了對BERT進行修改后的復合模型,如squad2.0上哈工大(HIT)的AoA + DA + BERT以及西湖大學(DAMO)的SLQA + BERT。 在感謝google這份付出的同時,我們也可以借此站在巨人的肩膀上,嘗試將其運用在自然語言處理領域的方方面面,讓人工智能的夢想更近一步。

      雷峰網版權文章,未經授權禁止轉載。詳情見轉載須知

      干貨 | BERT fine-tune 終極實踐教程

      分享:
      相關文章
      當月熱門文章
      最新文章
      請填寫申請人資料
      姓名
      電話
      郵箱
      微信號
      作品鏈接
      個人簡介
      為了您的賬戶安全,請驗證郵箱
      您的郵箱還未驗證,完成可獲20積分喲!
      請驗證您的郵箱
      立即驗證
      完善賬號信息
      您的賬號已經綁定,現在您可以設置密碼以方便用郵箱登錄
      立即設置 以后再說
      主站蜘蛛池模板: 日韩精品极品视频在线观看免费| 亚洲欧美另类小说| 国产麻豆91网在线看| 亚洲香蕉av一区二区蜜桃| 日本大片在线看黄a∨免费| 五月。。激情綜合老漢色| 娇妻系列交换27部多p在线观看 | 亚洲欧美香港在线观看三级片| 影音先锋亚洲成aⅴ人在| 婷婷综合久久| 国产欧美网站| 中文字幕无码人妻aaa片| 国产精品成人精品久久久| 凹凸国产熟女精品视频| 老王AV| 天天操?天天干?天天爽| 欧美色综合| 激情综合网激情激情五月天| 精品无码三级在线观看视频 | 中文字幕日韩av| 一本大道人妻中字幕在线视频 | 亚洲无码2| 日韩精品中文女同在线播放| 亚洲高清WWW色好看美女| 色猫咪av在线网址| 人人凹凸XX凹凸爽凹凸| 脱了老师内裤猛烈进入的软件 | 日韩AV在线免费观看| 亚洲毛多水多男女| 亚洲成av人片大线观看| 九九精品在线看| 人妻少妇被猛烈进入中文字幕| 国产一区二区一卡二卡| 亚洲精品日本久久久中文字幕 | 镇原县| 亚洲国产精品无码久久久| 十八禁黄网站| 日本55丰满熟妇厨房伦| 午夜三级福利| 无码人妻毛片丰满熟妇精品区| 亚洲成人综合导航|