Huggingface初上手即ERNIE-gram句子相似性實戰

大模型如火如荼的今天,不學點語言模型(LM)相關的技術實在是說不過去了。只不過由于過往項目用到LM較少,所以學習也主要停留在直面——動眼不動手的水平。Huggingface(HF)也是現在搞LM離不開的工具了。

出于項目需要,以及實踐出真知的想法,在此記錄一下第一次使用HF和微調ERNIE-gram的過程。

文章目錄

    • 開始的開始
    • 模型選擇
    • 如何使用選好的模型
    • 怎么微調
      • 模型定義
      • 訓練流程
    • 參考

開始的開始

HF已經做的很好了。但是對于第一次上手實操LM的我來說,還是有點陌生的。上手時有幾個問題是一直困擾我的:

  • HF上這么多模型,我該用哪一個?
  • 每個LM的主要作用是對文本進行Embedding,可我的任務是句子對相似性計算,這該怎么搞?
  • 我想在自己的數據上繼續微調模型,該怎么做?

模型選擇

簡單描述一下我的任務:給定兩個句子,判斷兩個句子的語義是否等價

從NLP的角度出發,這是一類STS(Semantic Textual Similarity)任務,本質是在比較兩個文本的語義是否相似。通過檢索,找到了一些相關的比賽,例如問題匹配的比賽和相關的模型,這里簡單羅列一下:

  • 千言數據集:問題匹配魯棒性。
  • 千言-問題匹配魯棒性評測基線。
  • Quora Question Pairs。
  • ATEC學習賽:NLP之問題相似度計算。
  • 第三屆魔鏡杯大賽—— 語義相似度算法設計。
  • LCQMC通用領域問題匹配數據集。
  • [Chinese-BERT-wwm]。

通過以上資料,我大致確定了我要使用的模型——ERNIE-Gram1

如何使用選好的模型

首先,我找到了ERNIE-Gram的代碼倉庫2。代碼里開源了模型的結構以及微調的代碼,相對來說還是比較齊全的。但是有一個最不方便的地方——它是用飛漿寫的(不是說飛漿不好,只是一直以來都用pytorch)。當然,很快我又找到了pytorch版的ERNIE-Gram,并且在HF找到了ERNIE-Gram模型。如果我知道怎么使用HF,那么或許我可以很快開始我的微調了,可惜沒有如果。

那怎么使用HF上的模型,在自己的數據上進行微調呢?

找到了一篇比較合適的參考資料3,其中介紹了如何在HF中調用ERNIE模型:

from transformers import BertTokenizer, ErnieModel
tokenizer = BertTokenizer.from_pretrained("nghuyong/ernie-1.0-base-zh")
model = ErnieModel.from_pretrained("nghuyong/ernie-1.0-base-zh")

根據這個,我發現通過HF使用某個模型的方法是從transformers庫中導入對應的模型和工具即可。那么,我只需要找到對應的模型名和工具,然后以此作為基座,再添加一些可訓練層就可以了?

分析dir(transformers)看看都有哪些和Ernie相關的類:

d = dir(transformers)
dd = [e for e in d if 'ernie' in e.lower()]
len(dd)  # 26
print(dd)
# ====
['ERNIE_M_PRETRAINED_CONFIG_ARCHIVE_MAP', 'ERNIE_M_PRETRAINED_MODEL_ARCHIVE_LIST', 'ERNIE_PRETRAINED_CONFIG_ARCHIVE_MAP', 'ERNIE_PRETRAINED_MODEL_ARCHIVE_LIST', 'ErnieConfig', 'ErnieForCausalLM', 'ErnieForMaskedLM', 'ErnieForMultipleChoice', 'ErnieForNextSentencePrediction', 'ErnieForPreTraining', 'ErnieForQuestionAnswering', 'ErnieForSequenceClassification', 'ErnieForTokenClassification', 'ErnieMConfig', 'ErnieMForInformationExtraction', 'ErnieMForMultipleChoice', 'ErnieMForQuestionAnswering', 'ErnieMForSequenceClassification', 'ErnieMForTokenClassification', 'ErnieMModel', 'ErnieMPreTrainedModel', 'ErnieMTokenizer', 'ErnieModel', 'ErniePreTrainedModel', 'models.ernie', 'models.ernie_m']

為了更好了解每個類是干啥的,直接上transformers庫來看各個類的介紹4。很快啊,我就發現ErnieForSequenceClassification很適合我的任務:

image-20240227181634595

圖中的GLUE(General Language Understanding Evaluation )5是一系列評測任務集合,顯然,我的任務屬于Similarity那一類。

image-20240227182050635

很好,大致可以確定該怎么使用HF上的Ernie-Gram模型來完成我的任務了(可惜沒有對應的示例)。

怎么微調

在實操之前,對于在預訓練好的模型上進行微調,我的想法是:把預訓練模型包起來,添加一個分類層,學習分類層的參數就可以了。

但是如果我選擇了ErnieForSequenceClassification,通過源碼可以發現該類其實是在ErnieModel的基礎上添加了一個分類層,那我是否直接加載模型后,選擇訓練哪些參數就可以了呢?

image-20240227184848206

其實,廣義的來說,這等價于一個問題:在HuggingFace中如何微調模型?678

其實,微調和平常的模型訓練沒有太大區別,只不過需要加載預訓練好的模型,以及利用現成的工具搭建訓練流程,其中主要涉及到的就兩點:模型的定義、訓練流程的搭建。

模型定義

由于transformers中已經定義好了很多模型,如果某個完全符合要求,那就可以直接使用了。根據自己的需求,選擇凍結和訓練哪些參數就可以了。

但是有些時候只是用預訓練的模型作為自己模型的一部分,這個時候就需要我們做一些額外的工作了——把預訓練模型作為一塊積木,搭建我們自己的模型。正如ErnieForSequenceClassification所做的一樣。

訓練流程

訓練流程類似。可以重頭自己搭建訓練流程,或者使用transformes自帶的Trainer接口。

這里直接參考HF的教程即可:Fine-tuning a model with the Trainer API、自己搭建訓練流程。

參考


  1. ERNIE-Gram: Pre-Training with Explicitly N-Gram Masked Language Modeling for Natural Language Understanding, NAACL-HLT, 2021. ??

  2. ernie-gram. ??

  3. 試試在transformers中調用ERNIE. ??

  4. Hugging Face Ernie Doc`` ??

  5. GLUE: A MULTI-TASK BENCHMARK AND ANALYSIS PLATFORM FOR NATURAL LANGUAGE UNDERSTANDING, ICLR, 2019. ??

  6. Hugging Face 的 Transformers 庫快速入門(四):微調預訓練模型. ??

  7. HuggingFace | 在HuggingFace中如何微調模型. ??

  8. FINE-TUNING A PRETRAINED MODEL. ??

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712606.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712606.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712606.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

最新 DataGrip 2023.3.4 下載安裝激活 + 永久免費

文章目錄 DataGrip簡介同類產品對比使用技巧不足實戰 下載安裝激活Stage 1 : 官網下載Stage 2 : 下載工具Stage 3-1 : windows為例Stage 3-2 : mac為例常見問題部分小伙伴 Mac 系統執行腳本遇到如下錯誤:解決方法: 執行腳本做了啥?和收費版區…

基于springboot+vue的可盈保險合同管理系統

博主主頁:貓頭鷹源碼 博主簡介:Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰,歡迎高校老師\講師\同行交流合作 ?主要內容:畢業設計(Javaweb項目|小程序|Pyt…

XUbuntu22.04之如何找到.so庫所在的軟件包?(二百一十六)

簡介: CSDN博客專家,專注Android/Linux系統,分享多mic語音方案、音視頻、編解碼等技術,與大家一起成長! 優質專欄:Audio工程師進階系列【原創干貨持續更新中……】🚀 優質專欄:多媒…

Vue中的事件總線(EventBus)是什么?它有什么優點和缺點?

作為一名使用Vue的前端開發者,有時候會聽到事件總線(EventBus)這個名詞。但可能是我入行比較晚,我在Vue網站中并沒有看到過事件總線的介紹,在項目中也沒有使用過。那究竟什么是事件總線?事件總線可以解決什么問題? 事…

element-plus表格合并

要實現這樣的表格, 怎么做呢? 甚至是這種三級的呢? 官網的案例也是通過這個方法進行配置的,也就是說表格長什么樣,關鍵在怎么處理的方法上。 這是官網的方法,可參考拓展: const arraySpanMeth…

一款云滲透工具 - Sea Moon

SeaMoon - 月海 什么是月海 🌕 月出于云卻隱于海 月海(Sea Moon) 是一款 FaaS/BaaS 實現的 Serverless 網絡工具集,期望利用云原生的優勢,實現更簡單、更便宜的網絡功能。 月海之名取自于蘇軾的《西江月頃在黃州》,寓意月海取自…

【JVM】JVM相關機制

1. JVM內存區域劃分 1.1 內存區域劃分簡介 內存區域劃分:實際上JVM也是一個進程,進程運行時需要向操作系統申請一些系統資源(內存就是典型的資源),這些內存空間就支撐著后續Java程序的運行,而這些內存又會…

Python環境搭建:一站式指南

在當前AIGC技術蓬勃發展的背景下,Python作為人工智能領域最受青睞的編程語言之一,成為我們必須掌握的技能。因此,搭建一個適合自己的Python環境成為了每個Python開發者的首要任務。本文將為您提供一站式的Python環境搭建指南,幫助…

PythonOpenCV隨機粘貼圖像

import cv2 import numpy as np import random # 讀取兩個圖像 image1 cv2.imread(image1.jpg) image2 cv2.imread(image2.jpg) # 將image1轉換為灰度圖像 gray_image1 cv2.cvtColor(image1, cv2.COLOR_BGR2GRAY) # 創建掩碼,黑色部分為0,非黑色部…

Python自動發郵件

我經常需要用手機看服務器的運行情況,所以就寫一個腳本,通過郵件把服務器運行情況發送給我,直接手機可以查看煉丹狀態。事實證明還是很有用的,所以撰寫一篇博文將腳本分享給大家。這里用到smtplib和email兩個python包。 import s…

力扣精選算法100道——顏色分類(雙指針和三指針倆種方法解決此題)

目錄 🚩了解題意 🚩算法分析 第一種方法:雙指針 🚩代碼實現一 第二種方法:三指針 🚩代碼實現二 🚩了解題意 本題將整數0,1,2代表紅白籃,nums中的整數并…

仿牛客網項目---私信列表和發送列表功能的實現

這篇文章我們來講一下我的這個項目的另外一個功能&#xff1a;私信列表和發送列表功能。 先來設計DAO層。 Mapper public interface MessageMapper {// 查詢當前用戶的會話列表,針對每個會話只返回一條最新的私信.List<Message> selectConversations(int userId, int of…

【激光SLAM】基于已知位姿的構圖算法 (Grid-based)

文章目錄 地圖分類概念 覆蓋柵格建圖算法柵格地圖的特征數學描述假設 算法流程激光雷達的逆觀測模型 計數(Count Model)建圖算法概念數學描述觀測模型地圖估計 地圖分類 概念 地圖即為環境的空間模型。環境地圖是機器人進行定位和規劃的前提。定位可以用特征地圖&#xff08;…

可穿戴設備相關Python包【待更】

提供7個python 包。 1 2 3 4 5 6 7 pyActigraphyGitHub - ghammad/pyActigraphy: Python-based open source package for actigraphy data analysisActiGraph ActiGraph GitHub

基礎內容哦!!!吳恩達deeplearning.ai:利用計算圖求導(反向傳播)

以下內容有任何不理解可以翻看我之前的博客哦&#xff1a;吳恩達deeplearning.ai專欄 文章目錄 一個小型神經網絡的例子利用計算圖逐步計算價值函數J利用計算圖求出價值函數的導數 計算圖是深度學習中的一個關鍵概念&#xff0c;它也是Tensorflow等編程框架自動計算神經網絡導…

Linux之sed命令詳解及實踐

1、定義 sed全稱是&#xff1a;stream editor 流編輯器 對文件的操作無非就是”增刪改查“&#xff0c;**sed命令就是實現對文件的”增刪改查“。** **man sed//man 的解釋** 用于過濾和轉換文本的流編輯器 2、功能 Sed 主要用來自動編輯一個或多個文件、簡化對文件的反復…

實現定時器的兩種方法:使用windows api定時器 和使用c++11/14 定時器

前言&#xff1a; 當我有一個開發需求&#xff0c;符合下面的條件 1.需要某個任務在程序中每隔一段時間就要執行一次&#xff0c;可能把這個任務封裝成了一個函數。 2.這種需要定時執行的任務&#xff0c;有2個&#xff0c;3個....越來越多。 這個時候我們就可以考慮使用定時…

iOS高級理論:常用的架構模式

一、常用的架構模式簡介 在 iOS 開發中&#xff0c;常用的架構模式有以下幾種&#xff1a; MVC&#xff08;Model-View-Controller&#xff09;模式&#xff1a;是 iOS 開發中最常見的架構模式。在 MVC 模式中&#xff0c;Model 負責數據處理和業務邏輯&#xff0c;View 負責界…

Tcl文件訪問

1. 基本文件輸入輸出命令 open 文件名 方式 set f [open $filename "r"] f 是文件的通道ID,可以使用open命令打開文件并獲取通道ID r 只讀方式打開,文件必須已經存在 r+ 讀寫方式打開,文件必須已經存在 w 只寫方式打開文件,如果文件存在則清空文件內容,否則創建…

第三百七十六回

文章目錄 1 .概念介紹2. 實現方法3. 示例代碼 我們在上一章回中介紹了在頁面之間共傳遞數據相關的內容&#xff0c;本章回中將介紹如何攔截路由.閑話休提&#xff0c;讓我們一起Talk Flutter吧。 1 .概念介紹 本章回中介紹的路由攔截是指在路由運行過程中&#xff0c;對路由做…