Transformer模型實戰篇

引入

基于Transformers的NLP解決方案的步驟如下:(以文本分類為例)

  1. 導入相關包,General,可以詢問ai需要導什么包
  2. 加載數據集,Data_loader,Datasets
  3. 數據集劃分,測試機,驗證集,訓練集,Datasets
  4. 數據集預處理,處理空的部分,Tokenizer+Datasets
  5. 創建模型,Model
  6. 設置評估函數,可以去hugging face上查看這個相應的評估指標有哪些,Evaluate
  7. 配置訓練參數,訓練批次,輸出大小,日志打印頻率,Training Argument
  8. 創建訓練器,Trainer+Data Collator
  9. 模型訓練,評估,預測,Trainer
  10. 如果只是想要用模型進行預測使用pipeline即可,不用子啊設置評估和訓練函數了。Pipeline

顯存優化分析

顯存占用分析
  • 模型權重

    • 4Bytes*模型參數(因為每一個參數都是32bit的)
  • 優化器狀態

    • 8Bytes*模型參數量,對于常用的AdamW優化器而言
  • 梯度

    • 4Bytes*模型參數量
  • 前向激活值

    • 取決于序列長度,隱層額外i都,Batch大小等多個因素
顯存優化策略

使用hfl/chinese-macbert-large,330M進行測試

優化策略優化對象顯存占用訓練時間
Baseline(BS 32 ,MaxLength 128)-15.2G64s
+Gradient Accumulation (BS 1, GA 32)
gradient_accumulation_steps=32 梯度累加?
前向激活值,一次只計算一個批次是數據,為了防止效果變差,我們設置計算32個batch之后才進行參數優化7.4G260s
+Gradient Checkpoints (BS 1, GA 32)
gradient_checkpointing=True梯度檢查點?
前向激活值 ,訓練的過程中會存儲很多沒必要存儲的信息,對于沒有存儲的激活值,可有在反向傳播計算梯度的時候,讓它重新計算即可。7.2G422s
+Adafactor Optiomizer(BS 1,GA32)
optim="adafactor" adafactor優化器 ?
優化器狀態,默認的adaw優化器占用較大,可以用占用比較小的優化器5.0G406s
+Freeze Model(BS 1,GA32)前向激活值/梯度,凍結一部分參數,只訓練分類器部分,模型效果會變差3.5G178s
+DataLength(BS1,GA32,MaxLength64)
在數據集中的maxlength處進行修改
前向激活值,縮短數據長度3.4G126s

其中對于這個+Freeze Model(BS 1,GA32作用就是凍結這個模型的bert部分,只訓練這個模型的全連接層部分。

  • 這是因為:
    預訓練模型(bert)已經學了很多中文知識,像「詞典+語法」。
    我們的任務只是影評情感二分類,不想讓它從頭再學中文,只想讓它學「如何把已掌握的知識轉成情感標簽」。
    所以把 bert 的大部分權重「凍住」,只訓練后面新加的分類層,既省顯存省時間,還能防止過擬合。

  • 具體操作

    for name, param in model.bert.named_parameters():param.requires_grad = False
    model.bert 就是原始 BERT 的所有層
    循環把每一層的權重 param 設置成 requires_grad=False → 不再更新(梯度不計算)
    練時只有沒被凍結的層(例如你后面接的 classifier 或 pooler)才會更新。
    

實戰演練之命名實體識別

命名實體識別任務介紹

介紹

命名實體識別(Named Entity Recognition,簡稱NER)是指識別文本中具有特定意義的實體,
主要包括人名、地名、機構名、專有名詞等。通常包括兩部分:
(1)實體邊界識別(從哪里到哪里是一個實體);(2)確定實體類別(人名、地名、機構名或其他)

eg 小明在北京上班

實體類別實體
地點北京
人物小明
數據標注體系

常見的數據標注有IOB1、IOB2、IOE1、IOE2、IOBES、BILOU?

其中IOB2標注

  • I表示實體內部,,O表示實體外部,B表示實體開始
  • B/I-XXX,XXX表示具體的類別

IOBES標注

  • I或者M表示實體內部,O表示實體外部,B表示實體開始,E表示實體結束,S表示一個詞單獨形成一個
    命名實體

image

評估指標

Precision,Recall,f1

外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳

基于Transfromers的解決方案

  • ModelForTokenClassification的源碼分析,這個地方看不太懂,先放在這里

評估函數

  • 需要額外安裝seqeval

    • pip install seqeval
    • 安裝過程中報錯Microsoft Visual C++14.0 or greater is required.Getitwith
      "Microsoft C++ Build Tools
    • 進入https://my.visualstudio.com,下載C++buildtools,安裝
  • evaluate.load(“seqeval”)

代碼實戰演練

數據集:peoples_daily_ner

預訓練模型:hfl/chinese-macbert-base

代碼如下所示:

導入相關包,加載數據集
導包
import evaluate
from datasets import load_dataset
from transformers  import AutoTokenizer,AutoModelForTokenClassification,TrainingArguments,Trainer,DataCollatorForTokenClassification導入訓練集
ner_datasets = load_dataset("peoples_daily_ner",cache_dir="./data" ,trust_remote_code=True)
ner_datasets查看訓練集第0個數據
ner_datasets["train"][0]
查看訓練集數據的特征,包括模型是什么類型的數據,以及數據標注體系
ner_datasets["train"].features獲取模型的標注類型
label_list = ner_datasets["train"].features["ner_tags"].feature.names
label_list
數據集預處理

使用模型為:hfl/chinese-macbert-base

由于模型中的tokens是已經劃分好了, 直接用tokenizer進行分詞的話,它會將每一個劃分好的詞,當成一個句子
tokenizer = AutoTokenizer.from_pretrained("hfl/chinese-macbert-base")
tokenizer(ner_datasets["train"][0]["tokens"])
我們可以使用is_split_into_words=True 來講這個不要當成一個句子
tokenizer(ner_datasets["train"][0]["tokens"],is_split_into_words=True)

一個單詞可能被 tokenizer 拆成好幾塊積木(sub-word),我們要保證同一塊原單詞的每一塊積木都貼上同一個標簽

返回的字典里多了一組 “word_ids()” 索引,告訴你每塊積木屬于原列表里的第幾個單詞。

還有一個問題就是英文中可能會出現分詞現象,一個單詞被拆分成了多個,所以我們要寫代碼,進行判斷哪些id是屬于一個單詞的。例如下面這個
res = tokenizer("interesting word")
res就會講這個interestion劃分為id,但是interesting并不是單獨一個,而是多個值
res.word_ids(),這個word_ids可以用來判斷這些id哪些是一組的。

具體實現如下所示:(這段代碼的功能就類似于:給一串已經被切成小積木的樂高貼標簽的過程)

假設原始數據如下:

原始 tokens(已分詞)ner_tags(標簽)
[“我”, “去”, “北京”][O, O, B-LOC]
  • ?O 表示“不是實體”
  • ?B-LOC 表示“地點實體的開頭”
# 借助word_ids 實現標簽映射
def process_function(examples):tokenized_exmaples = tokenizer(examples["tokens"], max_length=128, truncation=True, is_split_into_words=True)labels = []# 遍歷這個標簽for i, label in enumerate(examples["ner_tags"]):# word_ids() 返回 [None, 0, 1, 2, 2, None],0 → 原詞列表第 0 個詞“我”,2 → 原詞列表第 2 個詞“北京”(被拆成兩塊積木,都標 2)word_ids = tokenized_exmaples.word_ids(batch_index=i)label_ids = []for word_id in word_ids:  # 逐塊積木if word_id is None: # [CLS]、[SEP]、PADlabel_ids.append(-100)else:# word_id=0 → 原詞0 → label[0]=O# word_id=1 → 原詞1 → label[1]=O# word_id=2 → 原詞2 → label[2]=B-LOClabel_ids.append(label[word_id])# 執行上述循環后,label_ids = [-100, O, O, B-LOC, B-LOC, -100],實際代碼里 O 和 B-LOC 會被替換成數字 id,如 0 和 1labels.append(label_ids)tokenized_exmaples["labels"] = labelsreturn tokenized_exmaplestokenized_datasets = ner_datasets.map(process_function, batched=True)
tokenized_datasets
print(tokenized_datasets["train"][0])
創建評估函數
  • predictions:模型猜的 數字標簽 id(一排排學號)

  • labels:真正的 數字標簽 id(一排排正確答案學號)

  • label_list:把數字翻譯成文字標簽的小詞典
    例:label_list = [“O”, “B-PER”, “I-PER”, “B-LOC”, “I-LOC”]

    • 其中這個[label_list[p] for p, l in zip(prediction, label) if l != -100]?
      1. 取一對 (p, l)?
      2. 如果 l 不是 -100(不是特殊符號)
      3. 就把 p 轉成文字標簽 label_list[p] 存進列表
# seqeval 是專門給序列標注任務打分的裁判,支持 BIO / IOB2 等格式。
seqeval = evaluate.load("seqeval_metric.py")
seqevalimport numpy as np
def eval_metric(pred):predictions, labels = predpredictions = np.argmax(predictions, axis=-1) #每個位置取分數最高的索引,得到“預測標簽 id”。# 將id轉換為原始的字符串類型的標簽true_predictions = [[label_list[p] for p, l in zip(prediction, label) if l != -100]for prediction, label in zip(predictions, labels) ]true_labels = [[label_list[l] for p, l in zip(prediction, label) if l != -100]for prediction, label in zip(predictions, labels) ]result = seqeval.compute(predictions=true_predictions, references=true_labels, mode="strict", scheme="IOB2")return {"f1": result["overall_f1"]}
創建訓練器
args = TrainingArguments(output_dir="models_for_ner",per_device_train_batch_size=64,per_device_eval_batch_size=128,eval_strategy="epoch",save_strategy="epoch",metric_for_best_model="f1",load_best_model_at_end=True,logging_steps=50,num_train_epochs=1
)trainer = Trainer(model=model,args=args,tokenizer=tokenizer,train_dataset=tokenized_datasets["train"],eval_dataset=tokenized_datasets["validation"],compute_metrics=eval_metric,data_collator=DataCollatorForTokenClassification(tokenizer=tokenizer)
)
模型訓練
trainer.train()
trainer.evaluate(eval_dataset=tokenized_datasets["test"])
模型預測
from transformers import pipeline# 使用pipeline進行推理,要指定id2label
model.config.id2label = {idx: label for idx, label in enumerate(label_list)}
model.config# 如果模型是基于GPU訓練的,那么推理時要指定device
# 對于NER任務,可以指定aggregation_strategy為simple,得到具體的實體的結果,而不是token的結果
ner_pipe = pipeline("token-classification", model=model, tokenizer=tokenizer, device=0, aggregation_strategy="simple")res = ner_pipe("小明在北京上班")
res# 根據start和end取實際的結果
ner_result = {}
x = "小明在北京上班"
for r in res:if r["entity_group"] not in ner_result:ner_result[r["entity_group"]] = []ner_result[r["entity_group"]].append(x[r["start"]: r["end"]])ner_result

后續

后續博主講的課還包括機器閱讀理解,多項選擇,文本相似度,檢索機器人,文本摘要,生成對話機器人等實戰演練課程。由于我沒有做這些實驗的需求,后續的實驗演練課程筆記就不再做了。

我只通過這個命名實體的識別來了解這個Transformer模型實驗的大致流程即可。后續如果有這些方面的實驗需要去做,可以通過繼續學習相關視頻知識

?

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

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

相關文章

深入(流批【牛批】框架)Flink的機制

flink本身是專注有狀態的無限流處理,有限流處理【batch批次】是無限流處理的一中特殊情況!應用場景實時ETL 集成流計算現有的諸多數據通道和SQL靈活的加工能力,對流式數據進行實時清洗、歸并和結構化 處理;同時,對離線…

Git 2.15.0 64位安裝步驟Windows詳細教程從下載到驗證(附安裝包下載)

一、下載后雙擊運行 安裝包下載:https://pan.quark.cn/s/7200b32a1ecf,找到下載好的文件:?Git-2.15.0-64-bit.exe?雙擊這個文件,就會彈出安裝向導窗口,點 ??“Next”(下一步)?? 二、選擇…

在職老D滲透日記day23:sqli-labs靶場通關(第29關-31關)http參數過濾

5.29.第29關 http參數過濾 閉合5.29.1.手動注入(1)判斷注入類型、注入點閉合(2)有回顯,優先用聯合查詢注入,判讀字段數?id1&id2 order by 3 -- ?id1&id2 order by 4 --(3)…

Spring Boot整合Amazon SNS實戰:郵件訂閱通知系統開發

Spring Boot整合Amazon SNS實戰引言配置服務總結新用戶可獲得高達 200 美元的服務抵扣金 亞馬遜云科技新用戶可以免費使用亞馬遜云科技免費套餐(Amazon Free Tier)。注冊即可獲得 100 美元的服務抵扣金,在探索關鍵亞馬遜云科技服務時可以再額…

LeetCode_動態規劃1

動態規劃1.動態規劃總結1.1 01背1.1.1 二維數組1.1.2 一維數組1.2 完全背包2.斐波那契數(力扣509)3.爬樓梯(力扣70)4.使用最小花費爬樓梯(力扣746)5.不同路徑(力扣62)6.不同路徑 II(力扣63)7.整數拆分(力扣343)8.不同的二叉搜索樹(力扣96)9.分割等和子集(力扣416)10.最后一塊石…

【STM32】HAL庫中的實現(九):SPI(串行外設接口)

SPI 接口通信原理 SPI(Serial Peripheral Interface)是全雙工主從通信協議,特點是: 信號線功能SCK串行時鐘MOSI主設備輸出,從設備輸入MISO主設備輸入,從設備輸出CS(NSS)片選信號&am…

Git常用操作大全(附git操作命令)

Git常用操作大全 一、基礎配置 1.1 設置用戶名和郵箱 git config --global user.name "你的名字" git config --global user.email "你的郵箱"1.2 查看配置 git config --list二、倉庫管理 2.1 初始化本地倉庫 git init2.2 克隆遠程倉庫 git clone <倉庫…

詳解flink table api基礎(三)

文章目錄1.使用flink的原因&#xff1a;2. Flink支持兩種模式&#xff1a;3. flink table api工作原理&#xff1a;4. Flink table api 使用5. select語句&flink table api&#xff1a;6. 使用flink table api 創建table7. 使用flink table api 寫流式數據輸出到表或sink8.…

Vue2+Vue3前端開發_Day5

參考課程: 【黑馬程序員 Vue2Vue3基礎入門到實戰項目】 [https://www.bilibili.com/video/BV1HV4y1a7n4] ZZHow(ZZHow1024) 自定義指令 基本語法&#xff08;全局 & 局部注冊&#xff09; 介紹&#xff1a;自己定義的指令&#xff0c;可以封裝一些 DOM 操作&#xff0c…

機器學習--決策樹2

目錄 第一代裁判&#xff1a;ID3 與信息增益的 “偏愛” 第二代裁判&#xff1a;C4.5 用 “增益率” 找平衡 第三代裁判&#xff1a;CART 的 “基尼指數” 新思路 遇到連續值&#xff1f;先 “砍幾刀” 再說 給決策樹 “減肥”&#xff1a;剪枝的學問 動手試試&#xff1…

yggjs_react使用教程 v0.1.1

yggjs_react是一個用于快速創建React項目的工具&#xff0c;它集成了Vite、TypeScript、Zustand和React Router等現代前端技術棧&#xff0c;幫助開發者快速搭建高質量的React應用。 快速入門 快速入門部分將指導您如何安裝yggjs_react工具、創建新項目并啟動開發服務器。 安…

vulhub可用的docker源

這一塊不太容易找&#xff0c;我試了好幾個源&#xff0c;下面是20250820測試可用源 編輯方法sudo mkdir -p /etc/docker sudo vim /etc/docker/daemon.json 配置內容 [1] {"registry-mirrors" : ["https://docker.registry.cyou", "https://docker-…

基于YOLOv8-SEAttention與LLMs融合的農作物害蟲智能診斷與防控決策系統

1. 引言 1.1 研究背景與意義 農作物蟲害是制約農業產量與質量的重要因素。據FAO報告&#xff0c;全球每年因病蟲害造成的糧食損失高達 20%–40%。傳統人工巡查與經驗診斷具有時效性差、成本高與專業人才不足等缺陷。近年來&#xff0c;計算機視覺特別是目標檢測技術在農業檢測…

從零開始構建GraphRAG紅樓夢知識圖譜問答項目(三)

文章結尾有CSDN官方提供的學長的聯系方式&#xff01;&#xff01; 歡迎關注B站從零開始構建一個基于GraphRAG的紅樓夢項目 第三集01 搭建后端服務 創建一個python文件server.py 完整源碼放到文章最后了。 1.1 graphrag 相關導入 # GraphRAG 相關導入 from graphrag.query.cont…

S32K328(Arm Cortex-M7)適配CmBacktrace錯誤追蹤

CmBacktrace 相當于重寫了hard_fault函數&#xff0c;在hard_fault函數里面去分析SCB寄存器的信息和堆棧信息&#xff0c;然后把這些信息打印出來(或者寫到flash)&#xff1b;通過使用串口輸出產生hard_fault的堆棧信息&#xff0c;然后利用addr2line工具反推出具體的代碼執行函…

AI研究引擎的簡單技術實現步驟

產品愿景與核心功能 1.1 產品使命 “洞見 Weaver”是一個全棧AI Web應用,旨在將用戶的復雜研究問題,通過AI驅動的動態思維導圖和結構化報告,轉化為一次沉浸式的、可追溯的視覺探索之旅。我們的使命是,將AI復雜的推理過程透明化,將人類的探索直覺與AI的分析能力無縫結合,…

open webui源碼分析5-Tools

本文從最簡單的時間工具入手&#xff0c;分析Tools相關的代碼。一、安裝工具git clone https://github.com/open-webui/openapi-servers cd openapi-servers# 進入時間工具目錄 cd servers/timepip install -r requirements.txt# 啟動服務 uvicorn main:app --host 0.0.0.0 --r…

windows下通過vscode遠程調試linux c/cpp程序配置

windows下通過vscode遠程調試linux c/cpp程序配置vscode插件配置linux依賴工具安裝launch.json配置vscode插件配置 CodeLLDB插件需要提前下載&#xff1a; linux依賴工具安裝 sudo apt update sudo apt install cmake clangdlaunch.json配置 {"version": "0…

IDEA報JDK版本問題

解決思路&#xff1a;1.找到配置jdk的IDEA配置位置settings和project structure2.先配置setting3.再修改項目結構

VirtualBox 安裝 Ubuntu Server 系統及 Ubuntu 初始配置

文章目錄簡介VirtualBoxUbuntu Server 簡介Ubuntu Server 下載安裝 Ubuntu Server首選項配置導入系統鏡像配置系統用戶配置內存 CPU 虛擬硬盤開始安裝 Ubuntu安裝完成登錄系統配置網絡Ubuntu 系統配置安裝常用工具安裝 SSH設置 root 密碼配置 IP 地址&#xff08;推薦自動分配I…