国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當(dāng)前位置: 首頁 > news >正文

咖啡網(wǎng)站開發(fā)背景怎么寫微博指數(shù)查詢

咖啡網(wǎng)站開發(fā)背景怎么寫,微博指數(shù)查詢,常見cms網(wǎng)站源碼下載,php做網(wǎng)站主題告別2023,迎接2024。大模型技術(shù)已成為業(yè)界關(guān)注焦點,你是否也渴望掌握這一領(lǐng)域卻又不知從何學(xué)起? 本篇文章將特別針對入門新手,以淺顯易懂的方式梳理大模型的發(fā)展歷程、核心網(wǎng)絡(luò)結(jié)構(gòu)以及數(shù)據(jù)微調(diào)等關(guān)鍵技術(shù)。 如果你在閱讀中收獲…

告別2023,迎接2024。大模型技術(shù)已成為業(yè)界關(guān)注焦點,你是否也渴望掌握這一領(lǐng)域卻又不知從何學(xué)起?

本篇文章將特別針對入門新手,以淺顯易懂的方式梳理大模型的發(fā)展歷程、核心網(wǎng)絡(luò)結(jié)構(gòu)以及數(shù)據(jù)微調(diào)等關(guān)鍵技術(shù)。

如果你在閱讀中收獲良多,期待你能積極地通過點贊、轉(zhuǎn)發(fā)與收藏給予支持,讓更多對此領(lǐng)域感興趣的朋友能夠共享這份學(xué)習(xí)資源,共同踏入大模型技術(shù)的廣闊天地。

大模型發(fā)展歷史&&相關(guān)基礎(chǔ)知識介紹

圖片
該圖從左到右 基于 傳統(tǒng)的詞向量模型以灰色線顯示:decoder-only 模型在藍(lán)色分支,encoder-only 模型在粉色分支,encoder-decoder 模型在綠色分支。模型在時間線上的垂直位置表示它們的發(fā)布日期。開源模型由實心方塊表示,而閉源模型由空心方塊表示。右下角的堆積條形圖顯示了各公司和機(jī)構(gòu)的模型數(shù)量。

國內(nèi)開源大模型:清華: chatglm系列; 阿里: Qwen系列; 百川: baichuan 零一萬物; vivo: BlueLM-7B; 智源: Aquila2-70B; 上海AI實驗室:InternLM 昆侖萬維: Skywork; meta: llama; google: gemini; openai: chatgpt

通俗易懂講解大模型系列

  • 用通俗易懂的方式講解:ChatGPT 開放的多模態(tài)的DALL-E 3功能,好玩到停不下來!

  • 用通俗易懂的方式講解:結(jié)合檢索和重排序模型,改善大模型 RAG 效果明顯

  • 用通俗易懂的方式講解:基于擴(kuò)散模型(Diffusion),文生圖 AnyText 的效果太棒了

  • 用通俗易懂的方式講解:在 CPU 服務(wù)器上部署 ChatGLM3-6B 模型

  • 用通俗易懂的方式講解:ChatGLM3-6B 功能原理解析

  • 用通俗易懂的方式講解:使用 LangChain 和大模型生成海報文案

  • 用通俗易懂的方式講解:一個強(qiáng)大的 LLM 微調(diào)工具 LLaMA Factory

  • 用通俗易懂的方式講解:ChatGLM3-6B 部署指南

  • 用通俗易懂的方式講解:LangChain Agent 原理解析

  • 用通俗易懂的方式講解:HugggingFace 推理 API、推理端點和推理空間使用詳解

  • 用通俗易懂的方式講解:使用 LangChain 封裝自定義的 LLM,太棒了

  • 用通俗易懂的方式講解:使用 FastChat 部署 LLM 的體驗太爽了

  • 用通俗易懂的方式講解:基于 Langchain 和 ChatChat 部署本地知識庫問答系統(tǒng)

  • 用通俗易懂的方式講解:使用 Docker 部署大模型的訓(xùn)練環(huán)境

  • 用通俗易懂的方式講解:在 Ubuntu 22 上安裝 CUDA、Nvidia 顯卡驅(qū)動、PyTorch等大模型基礎(chǔ)環(huán)境

  • 用通俗易懂的方式講解:Llama2 部署講解及試用方式

  • 用通俗易懂的方式講解:LangChain 知識庫檢索常見問題及解決方案

  • 用通俗易懂的方式講解:基于 LangChain 和 ChatGLM2 打造自有知識庫問答系統(tǒng)

  • 用通俗易懂的方式講解:代碼大模型盤點及優(yōu)劣分析

  • 用通俗易懂的方式講解:Prompt 提示詞在開發(fā)中的使用

技術(shù)交流

建了AIGC大模型技術(shù)交流群! 想要學(xué)習(xí)、技術(shù)交流、獲取如下原版資料的同學(xué),可以直接加微信號:mlc2060。加的時候備注一下:研究方向 +學(xué)校/公司+CSDN,即可。然后就可以拉你進(jìn)群了。

方式①、微信搜索公眾號:機(jī)器學(xué)習(xí)社區(qū),后臺回復(fù):加群
方式②、添加微信號:mlc2060,備注:來自CSDN + 技術(shù)交流

在這里插入圖片描述

Transformers網(wǎng)絡(luò)模型介紹

圖片

2017年,Google機(jī)器翻譯團(tuán)隊發(fā)表的《Attention is All You Need》https://arxiv.org/pdf/1706.03762.pdf; 首次提出基于transformers自注意機(jī)制來實現(xiàn)seq2seq任務(wù),被視為開山鼻祖。

網(wǎng)絡(luò)結(jié)構(gòu)主要分為下面幾塊;

  • 位置編碼模塊;

  • 多頭注意力機(jī)制模塊;

  • 前饋網(wǎng)絡(luò)結(jié)構(gòu)(FFN)模塊;

  • 解碼器模塊;

位置編碼總結(jié)

絕對位置編碼

Sinusoidal位置編碼是谷歌在Transformer模型中提出的一種絕對位置編碼,它的形式如下,其中 表示詞向量的維度, 表示位置索引, 和 表示位置向量的分量索引;

例如 和 分別表示位置的位置向量的第 和第 個分量:

圖片

Sinusoidal位置編碼的每個分量都是正弦或余弦函數(shù),所有每個分量的數(shù)值都具有周期性。Sinusoidal位置編碼還具有遠(yuǎn)程衰減的特點。對于兩個相同的詞向量,如果它們之間的距離越近,則他們的內(nèi)積分?jǐn)?shù)越高,反之則越低。如下圖所示,我們隨機(jī)初始化兩個向量x1和x2,pos的位置從0開始逐步變大,依次計算x1和x2之間的內(nèi)積。我們發(fā)現(xiàn)隨著x1和x2的相對距離的增加,它們之間的內(nèi)積分?jǐn)?shù)震蕩衰減。

!pip install -q mplfonts
!pip install -q mpl-font
!mplfonts init
from mplfonts import use_font
use_font('Noto Sans Mono CJK SC')
import torch
import torch.nn as nn
import numpy as np
import matplotlib.pyplot as plt
import mpl_font.notoclass SinPositionEncoding(nn.Module):def __init__(self, max_sequence_length, d_model, base=10000):super().__init__()self.max_sequence_length = max_sequence_lengthself.d_model = d_modelself.base = basedef forward(self):even_i = torch.arange(0, self.d_model, 2).float()odd_i = torch.arange(1, self.d_model, 2).float()position = torch.arange(self.max_sequence_length, dtype=torch.float).reshape(-1, 1)even_pe = torch.sin(position / torch.pow(self.base, even_i/self.d_model))odd_pe = torch.cos(position / torch.pow(self.base, (odd_i-1)/self.d_model))stacked = torch.stack([even_pe, odd_pe], dim=2)return torch.flatten(stacked, start_dim=1, end_dim=2)
seq_len = 80
d_model = 128
spe = SinPositionEncoding(max_sequence_length=seq_len, d_model=d_model)()
print(spe.shape)fig,ax =plt.subplots(1,1,figsize=(6,10),dpi=120)
im1= ax.imshow(spe,vmin=spe.min(), vmax=spe.max(),cmap=plt.cm.rainbow)
# add space for colour bar
fig.subplots_adjust(right=0.85)
cbar_ax = fig.add_axes([0.86, 0.35, 0.04, 0.28])
plt.colorbar(im1, cax=cbar_ax)
plt.show()
plt.close(fig)
torch.Size([80, 128])

圖片

fig,axes =plt.subplots(1,2,figsize=(15,6),dpi=120)
out = torch.matmul(spe,spe.T)
print(out.shape)
# 不同位置的位置編碼點積可視化。
im1 = axes[0].imshow(out ,vmin=out.min(), vmax=out.max(),cmap=plt.cm.cool)
fig.subplots_adjust(right=0.85)
cbar_ax = fig.add_axes([0.45, 0.30, 0.02, 0.5])
fig.colorbar(im1, cax=cbar_ax)
axes[0].set_title("序列長度80,編碼向量128,不同位置的位置編碼點積可視化")# 遠(yuǎn)程位置衰減
base = 40
seq_len = 80
d_model = 128
color_list=['#55B7E6','#193E8F','#E53528','#F09739']
for index,dim in enumerate([32, 64,128, 256][::-1]):spe = SinPositionEncoding(max_sequence_length=seq_len, d_model=dim)()k_list = [-index for index in range(1, base)][::-1] + [index for index in range(base)]value = [torch.matmul(spe[base-k],spe[base+k].T ).tolist() for k in k_list]axes[1].plot(k_list, value, label='dim_%d'%dim,color=color_list[index])
axes[1].legend()
axes[1].set_title("兩向量內(nèi)積和向量之間的相對位置趨勢圖呈現(xiàn)遠(yuǎn)程位置衰減")
axes[1].set_xlabel("兩向量直接的位置距離")
plt.show()
plt.close(fig)
torch.Size([80, 80])

圖片

Sinusoidal位置編碼中的正弦余弦函數(shù)具備周期性,并且具備遠(yuǎn)程衰減的特性,所以理論上也具備一定長度外推的能力。

旋轉(zhuǎn)位置編碼(RoPE)

可以看到,RoPE形式上和Sinusoidal位置編碼有點相似,只不過Sinusoidal位置編碼是加性的,而RoPE可以視為乘性的。在θi 的選擇上,我們同樣沿用了Sinusoidal位置編碼的方案,即,它可以帶來一定的遠(yuǎn)程衰減性。

  • Transformer升級之路:2、博采眾長的旋轉(zhuǎn)式位置編碼

  • https://spaces.ac.cn/archives/8265/comment-page-1

#position_id = m-n 相對位置;
import numpy as np
def s(position_id, d=128):theta_i = lambda i: 10000**(-2*i/d)return np.mean([np.abs(np.sum(np.exp(1j*position_id*theta_i(np.arange(0, j))))) for j in range(0, d//2)])
seq_len = np.arange(256) # 
ys = [s(x) for x in seq_len]
# # # #從圖中我們可以可以看到隨著相對距離的變大,內(nèi)積結(jié)果有衰減趨勢的出現(xiàn)
plt.plot(seq_len, ys, c='#55B7E6')plt.show()

圖片

基于attention map的位置編碼(Alibi)

使用正弦位置編碼的transformer的外推能力非常弱。雖然旋轉(zhuǎn)位置編碼比正弦方法有所改進(jìn),但仍未達(dá)到令人滿意的結(jié)果。

為了解決長度外推的問題,作者提出了一種更簡單、更有效的位置方法,即具有線性偏置的注意力ALiBi。ALiBi不向詞嵌入添加位置嵌入,相反,它通過與距離成比例的懲罰來偏置query-key注意力分?jǐn)?shù)。

在這里插入圖片描述

import math
import torch
from torch import nndef get_slopes(n_heads: int):n = 2 ** math.floor(math.log2(n_heads))m_0 = 2.0 ** (-8.0 / n)m = torch.pow(m_0, torch.arange(1, 1 + n))if n < n_heads:m_hat_0 = 2.0 ** (-4.0 / n)m_hat = torch.pow(m_hat_0, torch.arange(1, 1 + 2 * (n_heads - n), 2))m = torch.cat([m, m_hat])return m@torch.no_grad()
def get_alibi_biases(n_heads: int, mask: torch.Tensor):m = get_slopes(n_heads).to(mask.device)seq_len = mask.size(0)distance = torch.tril(torch.arange(0, -seq_len, -1).view(-1, 1).expand(seq_len, seq_len))print(distance)return distance[:, :, None] * m[None, None, :]seq_len = 10
n_heads = 8m = get_slopes(n_heads)
print("input shape:", m.shape)alibi_biases = torch.zeros(seq_len,seq_len)
for j in range(1,seq_len):for i in range(j, seq_len):alibi_biases[i, i - j] = -j
print(alibi_biases)print(alibi_biases[:, :, None].shape, m[None, None, :].shape)
output =  alibi_biases[:, :, None] * m[None, None, :]
output.shape
input shape: torch.Size([8])
tensor([[ 0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],[-1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],[-2., -1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],[-3., -2., -1.,  0.,  0.,  0.,  0.,  0.,  0.,  0.],[-4., -3., -2., -1.,  0.,  0.,  0.,  0.,  0.,  0.],[-5., -4., -3., -2., -1.,  0.,  0.,  0.,  0.,  0.],[-6., -5., -4., -3., -2., -1.,  0.,  0.,  0.,  0.],[-7., -6., -5., -4., -3., -2., -1.,  0.,  0.,  0.],[-8., -7., -6., -5., -4., -3., -2., -1.,  0.,  0.],[-9., -8., -7., -6., -5., -4., -3., -2., -1.,  0.]])
torch.Size([10, 10, 1]) torch.Size([1, 1, 8])torch.Size([10, 10, 8])

位置編碼的類型需要指定為float32

a = torch.tensor(255,dtype=torch.bfloat16)
b = a + 1
c = a + 2
d = a + 3
e = a + 4
a,b,c,d,e
(tensor(255., dtype=torch.bfloat16),tensor(256., dtype=torch.bfloat16),tensor(256., dtype=torch.bfloat16),tensor(258., dtype=torch.bfloat16),tensor(260., dtype=torch.bfloat16))
# self.inv_freq.dtype == torch.bfloat16 when bfloat16 is enabled during training
t = torch.arange(4096, dtype=torch.float32)
plt.scatter(t[-100:], t[-100:].to(torch.bfloat16).float(),s=1,c=t[-100:],cmap=plt.cm.cool)
plt.xlabel('position in float32')
plt.ylabel('position in bfloat16')
Text(0, 0.5, 'position in bfloat16')

在這里插入圖片描述

從上圖可以看出使用bfloat16和float16進(jìn)行位置編碼的時候,容易出現(xiàn)位置碰撞,因此位置編碼需要指定float32類型

注意力機(jī)制(MHA,MQA,GQA)

MHA(Multi-head Attention)是多頭注意力機(jī)制的標(biāo)準(zhǔn)形式,其中包括h個Query、Key和Value矩陣。

MQA(Multi-Query Attention)是多查詢注意力的一種變體,專為自回歸解碼設(shè)計。與MHA不同,MQA讓所有頭共享同一份Key和Value矩陣,而每個頭僅保留獨立的Query參數(shù)。這種設(shè)計顯著減少了Key和Value矩陣的參數(shù)數(shù)量,提高了計算效率。

GQA(Grouped-Query Attention)是另一注意力機(jī)制,它將查詢頭分為G組。每組共享一個Key和Value矩陣。GQA-G表示具有G組的GQA,而GQA-1相當(dāng)于一個單一組,因此其Key和Value矩陣與MQA相同。相反,GQA-H具有與頭數(shù)相等的組,等同于MHA。GQA在MHA和MQA之間提供了一個折衷方案。

總體而言,MHA、MQA和GQA在處理輸入數(shù)據(jù)和生成輸出時采用不同的策略。MHA注重并行處理以提高表示能力,MQA側(cè)重于減少參數(shù)數(shù)量以增強(qiáng)計算效率,而GQA則通過分組查詢來平衡這兩方面的需求。

在這里插入圖片描述

GQA:Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints

FlashAttention總結(jié)

FlashAttention是解決Transformer計算速度慢和存儲占用高問題的關(guān)鍵技術(shù)。不同于其他Efficient Transformer僅關(guān)注降低FLOPS,FlashAttention將優(yōu)化重心放在降低存儲訪問開銷(MAC)上。

FLOPS直接決定了模型核心計算的密集程度,從而影響計算速度。學(xué)術(shù)界已經(jīng)研發(fā)出許多技巧來降低Transformer的FLOPS,而由這些技巧改進(jìn)得到的模型被稱為Efficient Transformer。

然而,大多數(shù)Efficient Transformer僅關(guān)注FLOPS。FlashAttention的作者們發(fā)現(xiàn),盡管這些Efficient Transformer能有效降低FLOPS,但計算速度并未顯著提升。主要原因是計算速度不僅與FLOPS有關(guān),還與MAC緊密相連。尤其在計算效率已很高的情況下,MAC的重要性更加凸顯。MAC的開銷主要來自兩個方面:從存儲中讀取數(shù)據(jù)和向存儲中寫入數(shù)據(jù)。在GPU中,當(dāng)需要進(jìn)行計算時,需要從顯存中讀取數(shù)據(jù)并由計算單元進(jìn)行處理。計算完成后,再將結(jié)果寫回到顯存中。

  • FlashAttentionV1: Fast and Memory-Efficient Exact Attention with IO-Awareness

  • FlashAttentionV2: Faster Attention with Better Parallelism and Work Partitioning

在這里插入圖片描述

Feed Forward層

Feed Forward層一般是有2層簡單的前饋神經(jīng)網(wǎng)絡(luò)層組成。例如chatglm3_6b的ffn層網(wǎng)絡(luò)定義;

在這里插入圖片描述

MoE介紹

這兩天 Mistral 7B /w 8 experts 的 checkpoint 釋出,徹底引爆了 AI 社區(qū)對 MoE 的熱情。本質(zhì)來說,MoE 是一種高效的 scaling 技術(shù),用較少的 compute 實現(xiàn)更大的模型規(guī)模,從而獲得更好的性能。MoE工作的主要動機(jī):保持相同訓(xùn)練和推理資源的同時,通過增加模型的體積代價來提升模型學(xué)習(xí)效果。

Scaling laws for neural language models揭示了模型規(guī)模、數(shù)據(jù)集大小以及所需計算資源之間的緊密聯(lián)系,并指出在數(shù)據(jù)集容量不變的前提下,最大限度地增加模型參數(shù)數(shù)量是充分利用計算力的高效策略。這里的“規(guī)?!敝饕改P退膮?shù)總量及其所需的計算復(fù)雜度,通常情況下,參數(shù)數(shù)量的增加會伴隨著計算需求的增長。

而MoE(Mixture of Experts)結(jié)構(gòu)則通過引入專家機(jī)制實現(xiàn)了一次關(guān)鍵性的解耦操作,它能夠在保持所需計算量相對穩(wěn)定的基礎(chǔ)上顯著提升模型參數(shù)的數(shù)量。因此,采用MoE架構(gòu)的模型性能提升符合scaling law規(guī)律,即使在不額外增加計算成本的情況下也能借助更多的參數(shù)來提升模型表現(xiàn)。

圖片

其中代表作品為Switch Transformers: Scaling to Trillion Parameter Models with Simple and Efficient Sparsity

作者觀點指出,FFN(全連接前饋神經(jīng)網(wǎng)絡(luò))在某種程度上可以類比為鍵值對(KV對),其中K表示文本中的模式信息,而V則代表了這些模式的分布情況。隨著網(wǎng)絡(luò)層次的加深,模型能夠?qū)W習(xí)到愈發(fā)復(fù)雜的模式特征;但同時,也發(fā)現(xiàn)越靠近輸出層的部分,其學(xué)習(xí)能力往往顯得相對不足。

基于這兩個觀察點,可以提出這樣一個假設(shè):這種學(xué)習(xí)不充分的現(xiàn)象可能是由于模型容量的局限性所導(dǎo)致的,尤其是對于較深層而言,對模型參數(shù)容量的需求更為顯著。為了驗證這一假設(shè),一個相關(guān)的實驗現(xiàn)象是,當(dāng)僅使用一個MoE(專家混合)層時,將其置于網(wǎng)絡(luò)結(jié)構(gòu)的更后位置往往可以獲得更好的性能表現(xiàn)。

此外,從直觀理解上,復(fù)雜模式的數(shù)量級理論上可能遠(yuǎn)超過簡單模式,呈現(xiàn)出指數(shù)增長的特性,這就意味著需要更多的參數(shù)來適應(yīng)和擬合這些多樣且復(fù)雜的模式組合。

MoE結(jié)構(gòu)介紹

Mixture of Experts (MoE) 模型是一種創(chuàng)新的機(jī)器學(xué)習(xí)架構(gòu),它通過整合多個專業(yè)化“專家”網(wǎng)絡(luò)以提升模型的整體效能和效率。該模型的基本理念在于將復(fù)雜的任務(wù)劃分為多個細(xì)分子任務(wù),然后交由各個專門設(shè)計的專家網(wǎng)絡(luò)(即小型神經(jīng)網(wǎng)絡(luò))來分別處理,這些專家網(wǎng)絡(luò)可能包括全連接層、卷積層等多種類型。

MoE 模型的核心組件主要包括:

  • 門控機(jī)制:作為 MoE 模型的關(guān)鍵組成部分,門控機(jī)制負(fù)責(zé)根據(jù)輸入數(shù)據(jù)的特征動態(tài)決定每個數(shù)據(jù)應(yīng)由哪個或哪些專家網(wǎng)絡(luò)進(jìn)行處理,從而優(yōu)化模型的學(xué)習(xí)與預(yù)測性能。

  • 專家網(wǎng)絡(luò):這些是模型中實際執(zhí)行數(shù)據(jù)處理的單元。每一個專家網(wǎng)絡(luò)都經(jīng)過訓(xùn)練,專注于處理特定類型的數(shù)據(jù)或任務(wù)。在 MoE 架構(gòu)中,可配置任意數(shù)量的專家網(wǎng)絡(luò),且每個專家都可以是一個獨立構(gòu)建的神經(jīng)網(wǎng)絡(luò)。

  • 融合層:融合層的主要職責(zé)是集成來自所有專家網(wǎng)絡(luò)的輸出結(jié)果?;陂T控機(jī)制的任務(wù)分配及各專家的輸出響應(yīng),融合層綜合生成最終的模型輸出。

MoE 模型的優(yōu)勢體現(xiàn)在其高度的靈活性與擴(kuò)展性上。由于能夠動態(tài)調(diào)整專家網(wǎng)絡(luò)的數(shù)量和類型,MoE 能夠有效應(yīng)對大規(guī)模復(fù)雜數(shù)據(jù)集的挑戰(zhàn)。此外,借助并行處理不同的專家網(wǎng)絡(luò),MoE 模型還能顯著提升計算效率。在實際應(yīng)用情境下,MoE 模型廣泛應(yīng)用于對計算資源需求較大的任務(wù),如自然語言處理、圖像識別以及復(fù)雜的預(yù)測問題等。通過將大型難題拆解為更小、更易管理的部分,MoE 模型可以提供更為高效精準(zhǔn)的解決方案。

相關(guān)參考文檔:https://zhuanlan.zhihu.com/p/671873012

解碼流程

目前主流的LLM模型都是基于tansformers的decoder網(wǎng)絡(luò)結(jié)構(gòu)?;谶@類的生成式generative模型的推理過程很有特點,都采用“Next Token Prediction,NTP”方式。我們給一個輸入文本,模型會輸出一個回答(長度為N),其實該過程中執(zhí)行了N次推理過程。即GPT類模型一次推理只輸出一個token,輸出token會與輸入tokens 拼接在一起,然后作為下一次推理的輸入,這樣不斷反復(fù)直到遇到終止符。其中會涉及解碼方式。

解碼方法

主要分為三大類;greedy search(貪心搜索), beam search, sample(采樣)。

  • greedy search(貪心搜索);
  1. 只考慮當(dāng)前詞對應(yīng)的最大概率,忽略整體的最大概率。
  • beam search:
  1. 在解碼過程中,它始終堅持存儲當(dāng)前概率最高的num_beams個完整序列候選(不僅限于單個詞,而是充分考慮了詞組和短語的整體概率);

  2. 這種策略尤其適用于諸如句子級機(jī)器翻譯或短文本生成等任務(wù)場景;

  3. beam search在實踐中存在明顯的復(fù)讀現(xiàn)象,即有可能生成重復(fù)的n-gram結(jié)構(gòu),盡管直接禁止重復(fù)n-gram的方法可以緩解這一問題,但這種方法過于簡單粗暴,可能會影響整體生成效果;

  4. 本質(zhì)上,beam search通過選取top n的高概率候選結(jié)果進(jìn)行迭代擴(kuò)展,因此,在追求高概率路徑的同時,生成的回復(fù)往往缺乏新穎性和意外性,難以帶給用戶驚喜。

  • sample(采樣解碼):
  1. 可以通過溫度(temperate)參賽修改,讓原本高概率的概率更高,低概率的概率更低,這樣就可以盡量采樣出高概率的詞,在隨機(jī)性和surprise之間做trade-off。

  2. 注意temperate越大越隨機(jī),如果temperate=0,就沒有隨機(jī)了,就是貪心算法。

如果使用huggingface庫的model.generate方法來預(yù)測輸出內(nèi)容。則有下面的幾種參數(shù)配置;

  • 如果num_beams=1且do_sample=False,則使用貪婪搜索,調(diào)用~generation.GenerationMixin.greedy_search。

  • 如果penalty_alpha>0且top_k>1,則使用對比搜索,調(diào)用~generation.GenerationMixin.contrastive_search。

  • 如果num_beams=1且do_sample=True,則使用多概率采樣,調(diào)用~generation.GenerationMixin.sample。

  • 如果num_beams>1且do_sample=False,則使用beam搜索,調(diào)用~generation.GenerationMixin.beam_search。

  • 如果num_beams>1且do_sample=True,則使用beam搜索多概率采樣,調(diào)用~generation.GenerationMixin.beam_sample。

  • 如果num_beams>1且num_beam_groups>1,則使用分群束搜索,調(diào)用~generation.GenerationMixin.group_beam_search。

  • 如果num_beams>1且constraints!=None或force_words_ids!=None,則使用約束束搜索,調(diào)用~generation.GenerationMixin.constrained_beam_search。

例如用chatglm2_6b采用多概率采樣的方式輸出
%%time 
query = '現(xiàn)有雞兔22只,共有48只腳,請問雞比兔多了幾只?'
history= []
gen_kwargs = {"max_length": 1024, "num_beams": 1, "do_sample": True, "top_p": 0.8,"temperature": 0.1, "logits_processor": None}
inputs = model.build_inputs(tokenizer, query, history=history)
print(inputs)
# {'input_ids': tensor([[64790, 64792,   790, 30951,   517, 30910, 30939, 30996,    13,    13,
#          54761, 31211, 39701,    13,    13, 55437, 31211]], device='cuda:0'), 
#  'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], device='cuda:0'),
#  'position_ids': tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]], device='cuda:0')}print(model.process_response(tokenizer.decode(inputs['input_ids'][0])))outputs = model.generate(**inputs, **gen_kwargs)
outputs = outputs.tolist()[0][len(inputs["input_ids"][0]):]
print(outputs)
# [64790, 64792, 790, 30951, 517, 30910, 30939, 30996, 13, 13, 54761, 31211, 39701, 13, 13, 55437,
# 31211, 36474, 54591, 243, 162, 148, 142, 31404, 33030, 34797, 42481, 22011, 10461, 30944, 30943,
# 30941, 30978, 30949, 31123, 48895, 35214, 54622, 31123, 32616, 39905, 31901, 31639, 31155, 2]response = tokenizer.decode(outputs)
response = model.process_response(response)
response
    {'input_ids': tensor([[64790, 64792,   790, 30951,   517, 30910, 30939, 30996,    13,    13,54761, 31211, 34470, 55672, 56766, 30943, 30943, 54768, 31123, 33684,30972, 30973, 54768, 55673, 31123, 42693, 55672, 54703, 56766, 33851,55013, 54768, 30987,    13,    13, 55437, 31211]], device='cuda:0'), 'attention_mask': tensor([[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]], device='cuda:0'), 'position_ids': tensor([[ 0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17,18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35,36]], device='cuda:0')}[Round 1]問:現(xiàn)有雞兔22只,共有48只腳,請問雞比兔多了幾只?答:CPU times: user 6.23 s, sys: 478 ms, total: 6.71 sWall time: 6.74 s'假設(shè)雞有 x 只,兔子有 22 - x 只。\n\n每只雞有 2 只腳,每只兔子有 4 只腳。因此,所有雞和兔子的腳的總數(shù)為:\n\n2x + 4(22 - x) = 48\n\n化簡得:\n\n2x + 88 - 4x = 48\n\n-2x = -40\n\nx = 20\n\n因此,有 20 只雞,22 - 20 = 2 只兔子。\n\n所以,雞比兔子多了 20 - 2 = 18 只。'

限制采樣Trick總結(jié)

主要有top_p&&top_k等參數(shù)

  • top_p:每個時間步,按照字出現(xiàn)的概率由高到底排序,當(dāng)概率之和大于top-p的時候,就不取后面的樣本了。然后對取到的這些字的概率重新歸一化后,進(jìn)行采樣。參數(shù):top_p (取值范圍:0-1)。top-P采樣方法往往與top-K采樣方法結(jié)合使用,每次選取兩者中最小的采樣范圍進(jìn)行采樣,可以減少預(yù)測分布過于平緩時采樣到極小概率單詞的幾率。

  • top_k: 每個時間步,會保留topK個字,然后對topk個字的概率重新歸一化,最后在重新歸一化后的這K個字中進(jìn)行采樣。缺點:在分布陡峭的時候仍會采樣到概率小的單詞,或者在分布平緩的時候只能采樣到部分可用單詞。

  • Temperature:通過溫度,控制每個詞的概率分布曲線。溫度越低,分布曲線越陡峭,越容易采樣到概率大的字。溫度越高,分布曲線越平緩,增加了低概率字被采樣到的機(jī)會。參數(shù):temperature(取值范圍:0-1)設(shè)的越高,生成文本的自由創(chuàng)作空間越大;溫度越低,生成的文本越偏保守。

  • 限制n-gram在生成結(jié)果中出現(xiàn)次數(shù);

kv cache

在預(yù)測階段,Transformer模型常采用KV cache技術(shù)以提高推理效率。具體而言,在Decoder進(jìn)行逐詞解碼的過程中,若每生成一個token就需將已解碼的所有tokens重新拼接為輸入,并據(jù)此預(yù)測下一個token,則會導(dǎo)致大量的重復(fù)計算。

為此,在解碼過程中,Transformer利用KV cache存儲先前計算得到的Key和Value,這樣一來,在后續(xù)生成步驟中,無需反復(fù)處理相同部分的輸入數(shù)據(jù),從而有效提升了模型推理速度并降低了計算成本。假如現(xiàn)在有一個任務(wù)是要寫一首詩;

在解碼過程中:

  • input: 寫一首詩:output: 輕

  • input: 寫一首詩:輕 output: 舟

  • input: 寫一首詩:輕舟 output: 已

  • input: 寫一首詩:輕舟已 output: 過

  • input: 寫一首詩:輕舟已過 output: 萬

  • input: 寫一首詩:輕舟已過萬 output: 重

  • input: 寫一首詩:輕舟已過萬重 output: 山

最終完整輸出:輕舟已過萬重山;

可以利用緩存的方式,把之前的計算結(jié)果(“寫一首詩:輕舟已過萬重”的K values | V values)緩存起來,下一次解碼的時候直接利用緩存的結(jié)果,這樣就可以大大加快解碼的速度。

啟用KV Cache后,Transformer的推理過程可以細(xì)分為兩個核心階段:

  • 預(yù)填充階段:在生成首個輸出token時,由于Cache為空,系統(tǒng)需要為每個Transformer層分別計算并初始化Key和Value緩存。這個階段涉及大量的矩陣乘法(GEMM)操作,其FLOPs與未使用KV Cache的情況相仿,故推理速度相對較慢。

  • KV Cache利用階段:自第二個輸出token直至最后一個token的生成過程中,模型能夠復(fù)用已填充好的Cache內(nèi)容。此時,每一輪解碼僅需讀取先前存儲的Key和Value,并將當(dāng)前輪次新產(chǎn)生的Key、Value信息更新至Cache中。此階段的FLOPs有所減少,原本的矩陣乘法(GEMM)操作轉(zhuǎn)換為向量-矩陣乘法(GEMV),從而顯著提升推理效率。這一階段計算主要受內(nèi)存訪問限制(Memory-bound),相較于預(yù)填充階段,推理速度有明顯提升。

實現(xiàn)自定義的new_logits_processor添加違禁詞

from transformers import AutoTokenizer, AutoModelForSeq2SeqLM, TextStreamer
from transformers.generation.logits_process import LogitsProcessor, LogitsProcessorList
from typing import List
import torchclass new_logits_processor(LogitsProcessor):"""forbid_token_id_list是不讓模型生成詞語的id映射列表,對于這些抑制生成的詞語,在自定義logits_processor時將其概率推向負(fù)無窮大即可。"""def __init__(self, forbid_token_id_list: List[int] = None):self.forbid_token_id_list = forbid_token_id_listdef __call__(self, input_ids: torch.LongTensor, scores: torch.FloatTensor) -> torch.FloatTensor:for id_ in self.forbid_token_id_list:scores[:, id_] = -float('inf')return scores# model_path = "THUDM/chatglm2-6b"
# tokenizer = AutoTokenizer.from_pretrained(model_path, trust_remote_code=True)
# model = AutoModelForSeq2SeqLM.from_pretrained(model_path, trust_remote_code=True).to('mps')def add_forbid_words():'''添加需要抑制的詞語,這里簡單添加了數(shù)字和幾個詞語進(jìn)行對比:return:list'''forbid_words = []for i in range(10):forbid_words.append(tokenizer.convert_tokens_to_ids(str(i)))forbid_words.append(tokenizer.convert_tokens_to_ids("首先"))forbid_words.append(tokenizer.convert_tokens_to_ids("積極"))forbid_words.append(tokenizer.convert_tokens_to_ids("回答"))forbid_words.append(tokenizer.convert_tokens_to_ids("勇敢"))forbid_words.append(tokenizer.convert_tokens_to_ids("勇氣"))return forbid_wordslogits_processor = LogitsProcessorList()
logits_processor.append(new_logits_processor(add_forbid_words()))streamer = TextStreamer(tokenizer, skip_prompt=True, skip_special_tokens=True)
%%timequery = "列舉出10個積極的詞語:"outputs = model.generate(tokenizer(query, return_tensors='pt').input_ids.to("cuda"),max_new_tokens=1024,logits_processor=logits_processor,  # 不開啟注釋即可streamer=streamer
)
decode_text = tokenizer.batch_decode(outputs, streamer=streamer)[0]
print(decode_text)
- 積極主動
- 樂觀向上
- 自信
- 自律
- 誠實守信
- 樂于助人
- 勇于嘗試
- 堅韌不拔
- 樂觀開朗
- 團(tuán)結(jié)一心
列舉出10個積極的詞語:- 積極主動
- 樂觀向上
- 自信
- 自律
- 誠實守信
- 樂于助人
- 勇于嘗試
- 堅韌不拔
- 樂觀開朗
- 團(tuán)結(jié)一心
CPU times: user 1.67 s, sys: 25.5 ms, total: 1.69 s
Wall time: 1.68 s

網(wǎng)絡(luò)模型微調(diào)總結(jié)

數(shù)據(jù)格式

數(shù)據(jù)集作為驅(qū)動大模型效能提升的“三駕馬車”之一,與模型結(jié)構(gòu)和算力資源并駕齊驅(qū),起著至關(guān)重要的決定性作用。在深度學(xué)習(xí)領(lǐng)域,豐富的高質(zhì)量數(shù)據(jù)集如同基石一般,為構(gòu)建強(qiáng)大、泛化的機(jī)器學(xué)習(xí)模型提供了必不可少的基礎(chǔ)支撐。

一個大型的數(shù)據(jù)集不僅涉及龐大的數(shù)據(jù)規(guī)模,更重要的是其內(nèi)在的多樣性和全面性。它涵蓋了多種場景、多元特征以及廣泛標(biāo)注的信息,能夠有效幫助模型理解和學(xué)習(xí)復(fù)雜的規(guī)律及模式,從而提高模型在實際應(yīng)用中的準(zhǔn)確率和魯棒性。同時,數(shù)據(jù)集的質(zhì)量直接影響模型訓(xùn)練的效果,高質(zhì)量的數(shù)據(jù)集能夠顯著減少噪聲干擾,確保模型在訓(xùn)練過程中能更好地挖掘深層次的知識關(guān)聯(lián)。

因此,在大模型的研發(fā)過程中,精心設(shè)計和持續(xù)優(yōu)化的數(shù)據(jù)集構(gòu)建策略是不可或缺的一環(huán),這包括但不限于:數(shù)據(jù)采集的全面性、數(shù)據(jù)清洗的嚴(yán)謹(jǐn)性、數(shù)據(jù)增強(qiáng)的有效性以及針對特定任務(wù)進(jìn)行的精細(xì)化標(biāo)注等環(huán)節(jié)。只有當(dāng)數(shù)據(jù)、模型和算力這三者達(dá)到高度協(xié)同與融合時,才能最大程度地發(fā)揮出人工智能技術(shù)的強(qiáng)大潛力。

多輪對話的數(shù)據(jù)格式

  • 常見的對話類型,帶工具調(diào)用的類型 Firefly項目訓(xùn)練多輪對話模型時,采取了一種更加充分高效的方法。如下圖所示,我們將一條多輪對話數(shù)據(jù)拼接之后,輸入模型,并行計算每個位置的loss,只有Assistant部分的loss參與權(quán)重更新。

圖片

圖片

這種做法之所以可行,關(guān)鍵在于因果語言模型中采用的attention mask機(jī)制。以GPT為代表的因果語言模型,其核心特點在于其使用的注意力掩碼是一個對角形式的矩陣。在該結(jié)構(gòu)下,每個token在編碼階段僅能訪問和考慮它之前出現(xiàn)的所有token信息,而無法獲取后續(xù)token的內(nèi)容。因此,在處理對話序列時,User1部分經(jīng)過編碼后的輸出只能依賴于User1本身的文本內(nèi)容,無法預(yù)測或參考其后面出現(xiàn)的文本(如Assistant1的回答)。相應(yīng)地,對于User2部分,其編碼結(jié)果能夠基于已知的User1、Assistant1以及自身的文本內(nèi)容來預(yù)測Assistant2的回應(yīng),以此類推。

通過這樣的設(shè)計,對于整個對話序列,只需一次性輸入模型,即可利用并行計算的優(yōu)勢,分別獲得每個位置對應(yīng)的logits值,進(jìn)而用于計算loss及優(yōu)化模型參數(shù)。這樣既確保了模型預(yù)測的因果一致性,也大大提高了訓(xùn)練和推理效率。組成的對話格式如下

<s>user1</s>Assistant1</s>user2</s>Assistant2</s>...

chatglm2_6b的數(shù)據(jù)格式

[gMASK]sop[Round1]問:你好答:我是chatglm2助手[Round2]問:現(xiàn)有雞兔22只,共有48只腳,請問雞比兔多了幾只?答:

chatglm3_6b的數(shù)據(jù)格式

[gMASK]sop<|system|>[gMASK]sop
[gMASK]sop你是一位高級python程序員,按照用戶輸入的任務(wù)轉(zhuǎn)換為對應(yīng)的python代碼,請以```的格式作為開始和結(jié)尾。<|user|>[gMASK]sop
[gMASK]你好<|assistant|>

微調(diào)(三步走)

  • 在深度學(xué)習(xí)中,微調(diào)是一種重要的技術(shù),即通過訓(xùn)練部分參數(shù)來提高模型的性能。微調(diào)可以分為全微調(diào)和部分微調(diào)兩種方法:

? 全微調(diào)(Full Fine-tuning):全微調(diào)是指對整個預(yù)訓(xùn)練模型進(jìn)行微調(diào),包括所有的模型參數(shù)。在這種方法中,預(yù)訓(xùn)練模型的所有層和參數(shù)都會被更新和優(yōu)化,以適應(yīng)目標(biāo)任務(wù)的需求。這種微調(diào)方法通常適用于任務(wù)和預(yù)訓(xùn)練模型之間存在較大差異的情況,或者任務(wù)需要模型具有高度靈活性和自適應(yīng)能力的情況。Full Fine-tuning需要較大的計算資源和時間,但可以獲得更好的性能。

? 部分微調(diào)(Repurposing):部分微調(diào)是指在微調(diào)過程中只更新模型的頂層或少數(shù)幾層,而保持預(yù)訓(xùn)練模型的底層參數(shù)不變。這種方法的目的是在保留預(yù)訓(xùn)練模型的通用知識的同時,通過微調(diào)頂層來適應(yīng)特定任務(wù)。Repurposing通常適用于目標(biāo)任務(wù)與預(yù)訓(xùn)練模型之間有一定相似性的情況,或者任務(wù)數(shù)據(jù)集較小的情況。由于只更新少數(shù)層,Repurposing相對于Full Fine-tuning需要較少的計算資源和時間,但在某些情況下性能可能會有所降低。

隨著LLM模型參數(shù)量巨大,往往參數(shù)量在幾十億的參數(shù),甚至更大。在消費級顯卡中無法完成全量微調(diào)。PEFT(Parameter-Efficient Fine-Tuning)是hugging face開源的一個參數(shù)高效微調(diào)大模型的工具,里面集成了多種微調(diào)大模型的方法,可以通過微調(diào)少量參數(shù)就達(dá)到接近微調(diào)全量參數(shù)的效果,使得在GPU資源不足的情況下也可以微調(diào)大模型。

第一步:預(yù)訓(xùn)練微調(diào)

大模型首先會在大量的無標(biāo)簽數(shù)據(jù)上進(jìn)行無監(jiān)督的訓(xùn)練,其中預(yù)訓(xùn)練的最終目的是讓模型學(xué)習(xí)到語言的統(tǒng)計規(guī)律和基礎(chǔ)知識。得到的預(yù)訓(xùn)練模型一般稱為基座模型base model.例如;baichuan2_13b_base, chatglm3_6b_base

第二步: 指令監(jiān)督微調(diào)(SFT)

  • 參考論文

當(dāng)前以 ChatGPT 為代表的預(yù)訓(xùn)練語言模型(PLM)規(guī)模變得越來越大,在消費級硬件上進(jìn)行全量微調(diào)(Full Fine-Tuning)變得不可行。此外,為每個下游任務(wù)單獨存儲和部署微調(diào)模型變得非常昂貴,因為微調(diào)模型與原始預(yù)訓(xùn)練模型的大小相同。參數(shù)高效微調(diào)方法(Parameter-Efficient Fine-Tuning,PEFT)方法被提出來解決這兩個問題,PEFT 可以使 PLM 高效適應(yīng)各種下游應(yīng)用任務(wù),而無需微調(diào)預(yù)訓(xùn)練模型的所有參數(shù)。微調(diào)大規(guī)模 PLM 所需的資源成本通常高得令人望而卻步。在這方面,PEFT 方法僅微調(diào)少量或額外的模型參數(shù),固定大部分預(yù)訓(xùn)練參數(shù),大大降低了計算和存儲成本,同時最先進(jìn)的 PEFT 技術(shù)也能實現(xiàn)了與全量微調(diào)相當(dāng)?shù)男阅堋?/p>

PEFT 方法可以分為三類,不同的方法對 PLM 的不同部分進(jìn)行下游任務(wù)的適配:

  • Prefix/Prompt-Tuning:在模型的輸入或隱層添加n個額外可訓(xùn)練的前綴 tokens(這些前綴是連續(xù)的偽 tokens,不對應(yīng)真實的 tokens),只訓(xùn)練這些前綴參數(shù);

  • Adapter-Tuning:將較小的神經(jīng)網(wǎng)絡(luò)層或模塊插入預(yù)訓(xùn)練模型的每一層,這些新插入的神經(jīng)模塊稱為 adapter(適配器),下游任務(wù)微調(diào)時也只訓(xùn)練這些適配器參數(shù);

  • LoRA:通過學(xué)習(xí)小參數(shù)的低秩矩陣來近似模型權(quán)重矩陣的參數(shù)更新,訓(xùn)練時只優(yōu)化低秩矩陣參數(shù)。

圖片

下面將依次介紹幾種常見的微調(diào)方法實現(xiàn)大模型的SFT過程。

LoRa方法介紹
  • lora論文

LoRA的本質(zhì)是在原模型的基礎(chǔ)上插入若干新的參數(shù),稱之為adapter。在訓(xùn)練時,凍結(jié)原始模型的參數(shù),只更新adapter的參數(shù)。對于不同的基座模型,adapter的參數(shù)量一般為幾百萬~幾千萬。具體的原理如下

假設(shè),作者認(rèn)為參數(shù)更新過程中存在一個內(nèi)在秩,對于權(quán)重可以通過低秩分解來表示參數(shù)更新,即

即最終的參數(shù)量由 降至 ;假設(shè) , 則參數(shù)量為:

圖片

圖片

圖片

圖片

圖片

AdaLoRa方法介紹

AdaLoRA基于SVD的形式參數(shù)化增量更新,這種基于SVD的參數(shù)化形式可以在規(guī)避SVD復(fù)雜的計算的同時高效裁剪不重要的奇異值,從而降低計算量。該方法提出的作者認(rèn)為在一個模型中,不同模塊擁有著不同的貢獻(xiàn),那么在使用LoRA時如果我們能夠根據(jù)它們重要性的不同為不同的模塊分配不同的秩,那么將會帶來很多好處。首先,我們?yōu)橹匾愿偷哪K分配更小的秩,那么將有效的減少模型的計算量。其次,如果我們能夠為更重要的特征分配更大的秩,那么將能夠更有效的捕捉特征的細(xì)節(jié)信息。這也就是AdaLoRA的提出動機(jī)。

假設(shè),

其中,為的左右奇異向量,為的奇異矩陣。

圖片

圖片

圖片

圖片

QLoRa方法介紹

LoRA的本質(zhì)是在原模型的基礎(chǔ)上插入若干新的參數(shù),稱之為adapter。在訓(xùn)練時,凍結(jié)原始模型的參數(shù),只更新adapter的參數(shù)。對于不同的基座模型,adapter的參數(shù)量一般為幾百萬~幾千萬。LoRA存在的問題:

  • 參與訓(xùn)練的參數(shù)量較少,解空間較小,效果相比全量微調(diào)有一定的差距。

  • 微調(diào)大模型成本高:對于上百億參數(shù)量的模型,LoRA微調(diào)的成本還是很高。精度損失。

QLoRa相當(dāng)于Quantization量化+LoRa(AdaLoRa)技術(shù),具有下面的特點;

  • 4-bit NormalFloat:提出一種理論最優(yōu)的4-bit的量化數(shù)據(jù)類型,優(yōu)于當(dāng)前普遍使用的FP4與Int4。

  • Double Quantization:相比于當(dāng)前的模型量化方法,更加節(jié)省顯存空間。每個參數(shù)平均節(jié)省0.37bit,對于65B的LLaMA模型,大約能節(jié)省3GB顯存空間。Paged Optimizers:使用NVIDIA統(tǒng)一內(nèi)存來避免在處理小批量的長序列時出現(xiàn)的梯度檢查點內(nèi)存峰值。

  • 增加Adapter:4-bit的NormalFloat與Double Quantization,節(jié)省了很多空間,但帶來了性能損失,作者通過插入更多adapter來彌補這種性能損失。在LoRA中,一般會選擇在query和value的全連接層處插入adapter。

  • 而QLoRA則在所有全連接層處都插入了adapter,增加了訓(xùn)練參數(shù),彌補精度帶來的性能損失。

QLoRA(int8+adalora)

圖片

圖片

圖片

QLoRa(4bits+Adalora)

圖片

圖片

圖片

P-tuningV2方法介紹
  • P-Tuning v2: Prompt Tuning Can Be Comparable to Finetuning Universally Across Scales and TasksP-tuning v2被設(shè)計用于生成和知識探索,但最重要的改進(jìn)之一是將連續(xù)提示應(yīng)用于預(yù)訓(xùn)練模型的每個層,而不僅僅是輸入層。

圖片

圖片

圖片

第三步: 基于RLHF的微調(diào)(DPO,PPO)

獎勵模型(reward model)

獎勵模型 (RM) 微調(diào)類似于第一階段有監(jiān)督微調(diào) (SFT) 。但是,RM 和 SFT 微調(diào)之間存在幾個關(guān)鍵差異:

  • 訓(xùn)練數(shù)據(jù)差異:對于 SFT 微調(diào),數(shù)據(jù)是查詢(query)和答案(answer)拼接在一起。然而,對于 RM 微調(diào),每批數(shù)據(jù)由兩個查詢-答案對組成,即具有高分答案和低分答案的相同查詢。這也導(dǎo)致了如下所述的第二個差異。

  • 訓(xùn)練目標(biāo)差異:對于 RW,訓(xùn)練目標(biāo)是 pairwise ranking score,即對于兩個查詢-答案對,RM 應(yīng)該給更好的答案更高的分?jǐn)?shù)。有多種方法可以實現(xiàn)這一目標(biāo)。在DeepSpeed Chat的實現(xiàn)中,使用序列的結(jié)束標(biāo)記或第一個填充標(biāo)記作為聚合分?jǐn)?shù)并比較它們。當(dāng)然,也可以使用整個答案的平均分?jǐn)?shù)作為替代。

reward模型本質(zhì)就是一個句子級的分類,難點在于如何收集偏好數(shù)據(jù),具體需要樣本高質(zhì)量,足夠多:盡可能覆蓋各種場景,例如不同長度,避免在RL階段出現(xiàn)OOD。

圖片

PPO算法介紹

LLM模型微調(diào)通常有三個步驟如下圖DeepSpeedChat流程;

圖片

分別為actor model、reference model、critic model、reward model(reward model是為了避免critic model的value變化太大)。其中actor model和reference model是同一個模型,來源于sft操作。critic model和reward model來源于rw模型訓(xùn)練。

DPO算法介紹

圖片

斯坦福大學(xué)研究團(tuán)隊Direct Preference Optimization提出了一項名為Direct Preference Optimization(DPO)的創(chuàng)新算法,旨在探尋更簡潔高效的大規(guī)模語言模型優(yōu)化解決方案。與傳統(tǒng)的強(qiáng)化學(xué)習(xí)方法不同,DPO能夠直接對語言模型行為進(jìn)行精準(zhǔn)調(diào)控,無需復(fù)雜的強(qiáng)化學(xué)習(xí)過程。該算法巧妙地建立了獎勵函數(shù)與最優(yōu)策略之間的內(nèi)在聯(lián)系,將原本復(fù)雜的約束獎勵最大化問題簡化為一次性策略訓(xùn)練任務(wù)。

DPO的獨特之處在于其不僅省去了對獎勵模型的擬合步驟,還在微調(diào)過程中免除了從語言模型中采樣或精細(xì)調(diào)整關(guān)鍵超參數(shù)的需求。實驗結(jié)果顯示,DPO在諸如情感調(diào)節(jié)、文本摘要和單輪對話等任務(wù)上表現(xiàn)出了與現(xiàn)有RLHF方法相當(dāng)甚至更好的性能,成功實現(xiàn)了從人類偏好中有效學(xué)習(xí)。

作為一種隱式優(yōu)化策略,DPO與當(dāng)前RLHF方法共享相同的目標(biāo)導(dǎo)向,但具備更高的實現(xiàn)便捷性和訓(xùn)練友好性。針對單純基于相對概率可能導(dǎo)致模型性能下降的問題,DPO引入了動態(tài)權(quán)重機(jī)制來體現(xiàn)每個示例回復(fù)的重要性。盡管同樣依賴于理論上的偏好模型以評估獎勵函數(shù)與實際偏好數(shù)據(jù)的一致性,但DPO獨樹一幟地通過變量變換,將偏好損失直接定義為策略函數(shù)的一部分。因此,DPO能依據(jù)給定的偏好數(shù)據(jù)和模型生成的回復(fù),僅利用簡單的二進(jìn)制交叉熵作為目標(biāo)函數(shù)來進(jìn)行策略優(yōu)化。

相較于現(xiàn)有的基于人類反饋的方法,DPO在大語言模型微調(diào)時更加高效且直接。傳統(tǒng)方法通常需要先擬合一個獎勵模型到包含提示和人類偏好的數(shù)據(jù)集上,再運用對比學(xué)習(xí)找到最大化所學(xué)獎勵的策略。而DPO則摒棄了這一復(fù)雜流程,僅通過直觀的分類目標(biāo)即可直接針對最符合人類偏好的策略進(jìn)行優(yōu)化,無需明確指定獎勵函數(shù)或應(yīng)用強(qiáng)化學(xué)習(xí)技術(shù)。

圖片

實戰(zhàn)教程

最后給大家介紹2個關(guān)于大模型應(yīng)用的案例,分別是推理優(yōu)化和注入新知識到大模型中。

chatglm2_6b分層加載權(quán)重推理(使用3G顯存實現(xiàn)推理)

chatglm2_6b按照半精度加載到GPU中,大約會占12G左右。通過使用分層加載推理技術(shù)(重構(gòu)chaglm2_6b模型的層權(quán)重加載架構(gòu),使用逐層加載推理釋放來實現(xiàn)這一過程),只需要3g左右的內(nèi)存既可實現(xiàn)6b模型按照半精度類型加載推理。

圖片

圖片

圖片

few_shot examples進(jìn)行SFT微調(diào)

給大模型新增知識,通過構(gòu)造簡單的幾條樣本注入大模型中。下面將展示微調(diào)前后的效果對比;

案例1展示;

圖片

案例2展示;

圖片

http://aloenet.com.cn/news/28171.html

相關(guān)文章:

  • 自己電腦做服務(wù)器發(fā)布網(wǎng)站電商營銷推廣有哪些?
  • 我自己做的網(wǎng)站打開很慢鄭州seo哪家好
  • 網(wǎng)站備案 視頻百度引流免費推廣怎么做
  • 設(shè)計一個網(wǎng)站西安發(fā)布最新通知
  • 網(wǎng)站開發(fā)發(fā)展前景seo推廣和百度推廣的區(qū)別
  • wordpress模板怎么添加菜單百度seo排名優(yōu)化教程
  • 如何做新政府網(wǎng)站欄目網(wǎng)站建設(shè)制作流程
  • 湖南省建設(shè)安監(jiān)局官網(wǎng)站朋友圈推廣文案
  • 全國建筑業(yè)四庫一平臺seo賺錢暴利
  • 河南鄭州網(wǎng)站推廣優(yōu)化淘寶優(yōu)化關(guān)鍵詞的步驟
  • 找人開發(fā)一個app多少錢網(wǎng)站建設(shè)排名優(yōu)化
  • 做公司網(wǎng)站需要多外包網(wǎng)絡(luò)推廣公司推廣網(wǎng)站
  • 網(wǎng)站后期運營方案步驟十大電商代運營公司
  • 是在百度中建設(shè)網(wǎng)站?百度的網(wǎng)頁地址
  • 如何搭建一個論壇網(wǎng)站黑帽seo技術(shù)培訓(xùn)
  • 網(wǎng)站充值提現(xiàn)公司賬務(wù)怎么做網(wǎng)站建設(shè) 全網(wǎng)營銷
  • 秦皇島城鄉(xiāng)建設(shè)局電話桂平seo關(guān)鍵詞優(yōu)化
  • 護(hù)欄板銷售網(wǎng)站怎么做百度競價可以自學(xué)嗎
  • 網(wǎng)站建設(shè)的完整流程成人再就業(yè)培訓(xùn)班
  • 網(wǎng)站建設(shè)步驟實踐報告廣州市新聞最新消息
  • 深圳做app網(wǎng)站建設(shè)seo研究中心vip課程
  • vue.js 可以做網(wǎng)站嗎百度拉新推廣平臺
  • 彩票走勢圖網(wǎng)站是用什么程序做的搜索引擎優(yōu)化的目標(biāo)
  • 海外 網(wǎng)站 推廣百度一下百度知道
  • 網(wǎng)站是否被百度收錄網(wǎng)址信息查詢
  • 怎嗎做網(wǎng)站掙錢揭陽seo快速排名
  • 如何用騰訊云做網(wǎng)站seo百度關(guān)鍵詞優(yōu)化
  • 聊城做網(wǎng)站好的公司淘寶網(wǎng)店代運營正規(guī)公司
  • 做網(wǎng)站美工廣州seo推廣公司
  • 山西傳染病最新消息今天唐山seo排名外包