本文是《從零手搓大模型實(shí)戰(zhàn)》學(xué)習(xí)的第一篇個(gè)人學(xué)習(xí)筆記,記錄下學(xué)習(xí)內(nèi)容以及相關(guān)心得。
注:相關(guān)學(xué)習(xí)內(nèi)容來(lái)自datawhalechina/tiny-universe
本次的學(xué)習(xí)主要是通過(guò)深入剖析大模型本身原理,進(jìn)一步了解大模型LLM底層的網(wǎng)絡(luò)結(jié)構(gòu),通過(guò)學(xué)習(xí)Qwen2相關(guān)代碼,了解了LLM模型結(jié)構(gòu)內(nèi)部。
1. Qwen模型與Transformer架構(gòu)
Qwen是一個(gè)基于Transformer架構(gòu)的預(yù)訓(xùn)練模型焊切。
Transformer是2017年出現(xiàn)的一種革命性的神經(jīng)網(wǎng)絡(luò)架構(gòu)扮授,主要依賴于注意力機(jī)制來(lái)處理序列數(shù)據(jù)。
Transformer的主要特點(diǎn):
- 自注意力機(jī)制(Self-Attention):這是Transformer的核心部分专肪,允許模型在處理序列數(shù)據(jù)時(shí)能夠關(guān)注到輸入中不同位置的信息刹勃。自注意力通過(guò)計(jì)算Query、Key和Value之間的點(diǎn)積嚎尤,得到一個(gè)權(quán)重分布荔仁,這個(gè)分布表示序列中每個(gè)元素與其他元素的關(guān)系。
- 多頭注意力(Multi-Head Attention):為了捕捉序列中更復(fù)雜的關(guān)系诺苹,Transformer使用了多個(gè)注意力頭咕晋。每個(gè)頭關(guān)注不同的信息,然后將這些信息合并起來(lái)收奔,形成一個(gè)更加豐富的表示掌呜。
- 編碼器-解碼器架構(gòu)(Encoder-Decoder):Transformer由編碼器和解碼器兩部分組成。編碼器將輸入序列轉(zhuǎn)換為一個(gè)連續(xù)的表示坪哄,而解碼器則基于這個(gè)表示生成輸出序列质蕉。
- 位置編碼(Positional Encoding):由于Transformer不使用循環(huán)或卷積結(jié)構(gòu),它需要一種方法來(lái)理解序列中的位置信息翩肌。位置編碼通過(guò)為每個(gè)位置添加特定的向量來(lái)實(shí)現(xiàn)這一點(diǎn)模暗,使得模型能夠識(shí)別序列中的單詞順序。
- 并行化訓(xùn)練:Transformer的設(shè)計(jì)允許它在不同的序列位置上并行處理信息念祭,這大大提高了訓(xùn)練和推理的效率兑宇。
2. Qwen模型基本架構(gòu)
Qwen模型基本架構(gòu)概述
-
文本輸入(Text Input)
- Tokenizer層:將輸入的文本序列轉(zhuǎn)換為單詞或子詞標(biāo)記的序列。
- Input_ids層:將Tokenizer生成的標(biāo)記轉(zhuǎn)換為唯一的ID序列粱坤。
-
Embedding層
- 將每個(gè)ID映射到一個(gè)固定維度的向量隶糕,生成一個(gè)向量序列作為模型的初始輸入表示。
-
Decoder Layer
- 包含多個(gè)重復(fù)的堆疊層(Layers1, Layers..., Layersn)站玄,每層內(nèi)部可能包含以下組件:
-
Self-Attention機(jī)制
- Query, Key, Value(QKV):計(jì)算輸入序列內(nèi)部的不同部分之間的相關(guān)性枚驻。
- Dot_attn:計(jì)算Q和K的點(diǎn)積,然后應(yīng)用Softmax函數(shù)得到Attention_weight株旷。
- Attention_weight:用于縮放Value的權(quán)重再登,生成加權(quán)和作為Attention的輸出。
-
Feed-Forward Network (MLP)
- 接收Attention的輸出晾剖,并通過(guò)一到兩個(gè)全連接層進(jìn)行變換锉矢。
-
Residual Connection
- 將輸入(Hidden_states)與MLP的輸出相加,以保持梯度在反向傳播時(shí)的穩(wěn)定性齿尽。
-
Normalization層(如RMSNorm)
- 對(duì)Hidden_states進(jìn)行歸一化沈撞,以加速訓(xùn)練和提高模型的泛化能力。
-
Rotary Position Embedding
- 為序列中的每個(gè)位置添加位置信息雕什,以幫助模型理解序列中單詞的順序缠俺。
-
Self-Attention機(jī)制
- 包含多個(gè)重復(fù)的堆疊層(Layers1, Layers..., Layersn)站玄,每層內(nèi)部可能包含以下組件:
-
輸出層(Output Layer)
- Linear層:將最后一層Decoder的輸出轉(zhuǎn)換為任務(wù)所需的維度。
- Softmax或Sigmoid等激活函數(shù):根據(jù)任務(wù)的性質(zhì)(如分類或回歸)贷岸,應(yīng)用適當(dāng)?shù)募せ詈瘮?shù)壹士。
-
損失函數(shù)(Loss Function)
- 根據(jù)任務(wù)的目標(biāo)定義損失函數(shù),如交叉熵?fù)p失(用于分類任務(wù))或均方誤差損失(用于回歸任務(wù))偿警。
-
其他優(yōu)化策略
- Dropout:在訓(xùn)練過(guò)程中隨機(jī)丟棄部分神經(jīng)元躏救,以防止過(guò)擬合。
- 權(quán)重初始化:使用適當(dāng)?shù)臋?quán)重初始化策略螟蒸,如Xavier或He初始化盒使,以加快訓(xùn)練速度。
注意七嫌,這里上圖只是一個(gè)簡(jiǎn)化的概述少办,Qwen架構(gòu)實(shí)際包含更多的細(xì)節(jié)。
3. Qwen2Model Qwen2Config
Qwen2Config中包含一些自定義的超參數(shù)诵原,例如vocab_size,hidden_size,num_hidden_layers, num_attention_heads等英妓。類似于dict可以調(diào)用里面的超參數(shù):config.pad_token_id
- vocab_size:詞匯表大小,即模型能夠理解的唯一詞匯的數(shù)量绍赛。這個(gè)參數(shù)決定了模型能夠處理的詞匯范圍蔓纠,對(duì)于不同的語(yǔ)言或任務(wù),可能需要調(diào)整詞匯表的大小以適應(yīng)特定的需求吗蚌。
- hidden_size:隱藏層的大小腿倚,即模型中隱藏層的神經(jīng)元數(shù)量。這個(gè)參數(shù)影響模型的復(fù)雜度和表示能力蚯妇。較大的隱藏層可以提供更豐富的表示敷燎,但也可能導(dǎo)致過(guò)擬合和計(jì)算成本的增加。
- num_hidden_layers:隱藏層的數(shù)量侮措。這個(gè)參數(shù)決定了模型的深度懈叹。更深的模型可能具有更強(qiáng)的表示能力,但也可能更難訓(xùn)練分扎,并且需要更多的數(shù)據(jù)和計(jì)算資源澄成。
- num_attention_heads:注意力機(jī)制中“頭”的數(shù)量。在Transformer架構(gòu)中畏吓,多頭注意力機(jī)制允許模型同時(shí)關(guān)注輸入序列的不同部分墨状。增加注意力頭的數(shù)量可能有助于提高模型的表示能力,但也可能增加計(jì)算復(fù)雜度和訓(xùn)練時(shí)間菲饼。
該方法設(shè)置了模型的兩個(gè)屬性:padding_idx(用于指定填充標(biāo)記的索引)肾砂,vocab_size(詞匯表的大小)并初始化模型的嵌入層宏悦、解碼器層镐确、歸一化層
4. Qwen2DecoderLayer
Qwen2DecoderLayer是模型的核心結(jié)構(gòu)