深入理解大語言模型:從核心技術到極簡實現

零基礎的讀者建議先看《零基礎理解大語言模型:從生活例子到代碼實現》,本教程的完整代碼可以在GitHub上找到,如果你有任何問題或建議,歡迎交流討論。

引言

自ChatGPT橫空出世以來,大語言模型(Large Language Model,LLM)已經成為人工智能領域最熱門的話題。從文本生成到代碼編寫,從問答系統到創意寫作,LLM展現出了令人驚嘆的能力。然而,對于很多技術人員來說,LLM仍然像一個"黑盒子"——我們知道它很強大,但不清楚它是如何工作的。

本文將帶你深入了解LLM的核心技術原理,并通過一個簡潔的Python實現來幫助你快速理解和入門。我們不會陷入復雜的數學推導,而是專注于核心概念的理解和實際代碼的實現。

什么是大語言模型?

大語言模型本質上是一個基于深度學習的文本預測系統。給定一段文本,它能夠預測下一個最可能出現的詞語。通過不斷地預測"下一個詞",模型就能生成連貫的文本。

這聽起來很簡單,但要做好這件事卻需要模型理解語言的語法、語義、上下文關系,甚至是常識知識。這就是為什么現代LLM需要數十億甚至數千億個參數的原因。

從統計模型到神經網絡

在深入LLM之前,讓我們先了解語言模型的發展歷程:

N-gram模型:最早的語言模型基于統計方法,通過計算詞語序列的出現頻率來預測下一個詞。例如,Bigram模型假設每個詞只依賴于前一個詞。

循環神經網絡(RNN):引入了神經網絡,能夠處理變長序列,但在處理長序列時存在梯度消失問題。

長短期記憶網絡(LSTM):通過門控機制解決了RNN的長期依賴問題,但仍然難以并行化訓練。

Transformer架構:2017年Google提出的革命性架構,完全基于注意力機制,解決了并行化和長期依賴問題,成為現代LLM的基礎。

LLM的關鍵技術

1. Transformer架構

在這里插入圖片描述

Transformer是現代LLM的核心架構,它的成功主要歸功于以下幾個關鍵創新:

自注意力機制(Self-Attention)

自注意力機制是Transformer的核心。它允許模型在處理每個詞時,同時關注輸入序列中的所有其他詞,從而捕捉長距離的依賴關系。

自注意力的計算過程可以概括為三個步驟:

  1. 生成Query、Key、Value:將輸入向量通過三個不同的線性變換,得到查詢(Q)、鍵(K)、值(V)三個向量。

  2. 計算注意力分數:通過Q和K的點積計算注意力分數,表示當前詞對其他詞的關注程度。

  3. 加權求和:使用注意力分數對V進行加權求和,得到最終的輸出。

數學表達式為:
Attention(Q,K,V)=softmax(QKTdk)VAttention(Q,K,V) = softmax(\frac{QK^T}{\sqrt{d_k}})V Attention(Q,K,V)=softmax(dk??QKT?)V
其中dkd_kdk?是鍵向量的維度,除以dk\sqrt{d_k}dk??是為了防止點積值過大導致softmax函數進入飽和區域。

多頭注意力(Multi-Head Attention)

單個注意力頭可能只能捕捉到某種特定的關系模式。多頭注意力通過并行運行多個注意力頭,讓模型能夠同時關注不同類型的信息,比如語法關系、語義關系等。

位置編碼(Positional Encoding)

由于注意力機制本身不包含位置信息,Transformer需要額外的位置編碼來告訴模型每個詞在序列中的位置。常用的方法是使用正弦和余弦函數生成位置編碼,或者使用可學習的位置嵌入。

前饋網絡(Feed-Forward Network)

每個Transformer層還包含一個前饋網絡,通常由兩個線性變換和一個激活函數組成。這個網絡負責對注意力機制的輸出進行進一步的非線性變換。

殘差連接和層歸一化

為了解決深層網絡的訓練問題,Transformer使用了殘差連接和層歸一化。殘差連接允許梯度直接傳播到較早的層,而層歸一化則有助于穩定訓練過程。

2. 預訓練和微調范式

現代LLM通常采用"預訓練+微調"的兩階段訓練方式:

預訓練階段:在大規模無標注文本數據上進行自監督學習,學習語言的通用表示。主要任務是預測下一個詞(自回歸語言建模)。

微調階段:在特定任務的標注數據上進行有監督學習,讓模型適應特定的應用場景。

3. 涌現能力(Emergent Abilities)

當模型規模達到一定程度時,LLM會表現出一些在小模型中不存在的能力,這被稱為涌現能力。例如:

  • 少樣本學習:僅通過幾個示例就能理解新任務
  • 推理能力:能夠進行邏輯推理和數學計算
  • 代碼生成:能夠編寫和理解程序代碼
  • 多語言理解:在多種語言之間進行翻譯和理解

4. 關鍵技術要點總結

技術組件作用重要性
自注意力機制捕捉序列中的長距離依賴關系?????
多頭注意力并行捕捉不同類型的關系模式????
位置編碼為模型提供位置信息????
前饋網絡提供非線性變換能力???
殘差連接解決深層網絡訓練問題???
層歸一化穩定訓練過程???

最簡LLM的Python實現

理論知識固然重要,但動手實踐才能真正理解LLM的工作原理。下面我們將用不到200行Python代碼實現一個簡化版的LLM,包含Transformer的所有核心組件。

代碼結構概覽

我們的實現包含以下幾個主要組件:

  1. SimpleTokenizer:簡單的字符級分詞器
  2. MultiHeadAttention:多頭注意力機制
  3. TransformerBlock:Transformer塊
  4. SimpleLLM:完整的語言模型

1. 分詞器實現

class SimpleTokenizer:"""簡單的字符級分詞器"""def __init__(self, text):# 獲取所有唯一字符并排序,構建詞匯表self.chars = sorted(list(set(text)))self.vocab_size = len(self.chars)# 字符到索引的映射self.char_to_idx = {ch: i for i, ch in enumerate(self.chars)}# 索引到字符的映射self.idx_to_char = {i: ch for i, ch in enumerate(self.chars)}def encode(self, text):"""將文本編碼為token索引列表"""return [self.char_to_idx[ch] for ch in text]def decode(self, indices):"""將token索引列表解碼為文本"""return ''.join([self.idx_to_char[i] for i in indices])

這個分詞器采用字符級別的編碼方式,雖然效率不如現代的子詞分詞器(如BPE),但足以演示LLM的核心原理。在實際應用中,GPT系列模型使用更復雜的BPE分詞器。

2. 多頭注意力機制實現

class MultiHeadAttention(nn.Module):"""多頭注意力機制 - Transformer的核心組件"""def __init__(self, d_model, n_heads):super().__init__()self.d_model = d_modelself.n_heads = n_headsself.head_dim = d_model // n_heads# 線性變換層:將輸入投影為Query、Key、Valueself.q_linear = nn.Linear(d_model, d_model)self.k_linear = nn.Linear(d_model, d_model)self.v_linear = nn.Linear(d_model, d_model)self.out_linear = nn.Linear(d_model, d_model)def forward(self, x):batch_size, seq_len, d_model = x.shape# 生成Query、Key、ValueQ = self.q_linear(x)K = self.k_linear(x)V = self.v_linear(x)# 重塑為多頭形式Q = Q.view(batch_size, seq_len, self.n_heads, self.head_dim).transpose(1, 2)K = K.view(batch_size, seq_len, self.n_heads, self.head_dim).transpose(1, 2)V = V.view(batch_size, seq_len, self.n_heads, self.head_dim).transpose(1, 2)# 計算注意力分數scores = torch.matmul(Q, K.transpose(-2, -1)) / math.sqrt(self.head_dim)# 應用因果掩碼(確保只能看到之前的token)mask = torch.triu(torch.ones(seq_len, seq_len), diagonal=1).bool()scores.masked_fill_(mask, float('-inf'))# 應用softmax獲得注意力權重attention_weights = F.softmax(scores, dim=-1)# 應用注意力權重到Valueattention_output = torch.matmul(attention_weights, V)# 重塑并通過輸出線性層attention_output = attention_output.transpose(1, 2).contiguous().view(batch_size, seq_len, d_model)return self.out_linear(attention_output)

這個實現的關鍵點:

  • 因果掩碼:通過上三角矩陣確保模型只能看到當前位置之前的token,這對于自回歸生成至關重要
  • 縮放點積注意力:除以head_dim防止softmax進入飽和區域
  • 多頭并行:通過reshape和transpose操作實現多頭的并行計算

3. Transformer塊實現

class TransformerBlock(nn.Module):"""Transformer塊 - 包含注意力機制和前饋網絡"""def __init__(self, d_model, n_heads, d_ff):super().__init__()self.attention = MultiHeadAttention(d_model, n_heads)self.norm1 = nn.LayerNorm(d_model)self.norm2 = nn.LayerNorm(d_model)# 前饋網絡self.feed_forward = nn.Sequential(nn.Linear(d_model, d_ff),nn.ReLU(),nn.Linear(d_ff, d_model))def forward(self, x):# 注意力機制 + 殘差連接 + 層歸一化attn_output = self.attention(x)x = self.norm1(x + attn_output)# 前饋網絡 + 殘差連接 + 層歸一化ff_output = self.feed_forward(x)x = self.norm2(x + ff_output)return x

Transformer塊采用了"Post-LN"的結構,即先進行殘差連接,再進行層歸一化。這種結構在訓練穩定性和性能之間取得了良好的平衡。

4. 完整模型實現

class SimpleLLM(nn.Module):"""簡化版大語言模型"""def __init__(self, vocab_size, d_model=128, n_heads=4, n_layers=2, max_seq_len=64):super().__init__()self.vocab_size = vocab_sizeself.d_model = d_modelself.max_seq_len = max_seq_len# Token嵌入層:將token索引轉換為向量self.token_embedding = nn.Embedding(vocab_size, d_model)# 位置嵌入層:為每個位置添加位置信息self.position_embedding = nn.Embedding(max_seq_len, d_model)# Transformer塊堆疊self.transformer_blocks = nn.ModuleList([TransformerBlock(d_model, n_heads, d_model * 4) for _ in range(n_layers)])# 輸出層:將隱藏狀態映射到詞匯表大小self.output_projection = nn.Linear(d_model, vocab_size)def forward(self, x):batch_size, seq_len = x.shape# 生成位置索引positions = torch.arange(seq_len, device=x.device).unsqueeze(0).expand(batch_size, -1)# Token嵌入 + 位置嵌入token_emb = self.token_embedding(x)pos_emb = self.position_embedding(positions)x = token_emb + pos_emb# 通過Transformer塊for transformer_block in self.transformer_blocks:x = transformer_block(x)# 輸出投影到詞匯表logits = self.output_projection(x)return logits

5. 文本生成實現

def generate(self, tokenizer, prompt, max_new_tokens=50, temperature=1.0):"""生成文本"""self.eval()# 編碼輸入提示input_ids = tokenizer.encode(prompt)input_tensor = torch.tensor([input_ids])generated_ids = input_ids.copy()with torch.no_grad():for _ in range(max_new_tokens):# 確保輸入長度不超過最大序列長度if len(generated_ids) >= self.max_seq_len:input_tensor = torch.tensor([generated_ids[-self.max_seq_len:]])else:input_tensor = torch.tensor([generated_ids])# 前向傳播logits = self.forward(input_tensor)# 獲取最后一個位置的logitsnext_token_logits = logits[0, -1, :] / temperature# 應用softmax并采樣probs = F.softmax(next_token_logits, dim=-1)next_token = torch.multinomial(probs, 1).item()generated_ids.append(next_token)return tokenizer.decode(generated_ids)

生成過程使用了溫度采樣,temperature參數控制生成的隨機性:

  • temperature = 1.0:標準采樣
  • temperature < 1.0:更確定性的生成
  • temperature > 1.0:更隨機的生成

代碼運行結果

讓我們看看這個簡化版LLM的實際表現:

=== 最簡LLM實現演示 ===
詞匯表大小: 86
模型參數數量: 426,838開始訓練...
Epoch 0, Loss: 4.5614
Epoch 20, Loss: 2.5134
Epoch 40, Loss: 1.4478
Epoch 60, Loss: 0.9644
Epoch 80, Loss: 0.6311
訓練完成!=== 文本生成測試 ===
輸入: '人工智能'
生成: 人工智能的能以做出反應的智能機器學習并生產出決策或預測。輸入: '機器學習'
生成: 機器學習并做出決策或預測。深度學習是深度學習的一個子集,它使輸入: '深度學習'
生成: 深度學習并做出決策或預測。大在自然語言模型是人工智能的工智

雖然生成的文本質量還有待提高,但我們可以看到模型確實學會了一些基本的語言模式和詞匯關聯。

代碼解析與關鍵要點

為什么這個實現有效?

我們的簡化版LLM雖然只有不到200行代碼,但包含了現代大語言模型的所有核心組件:

  1. 注意力機制:讓模型能夠關注輸入序列中的相關信息
  2. 位置編碼:為模型提供序列中的位置信息
  3. 多層堆疊:通過多個Transformer塊增加模型的表達能力
  4. 殘差連接:幫助深層網絡的訓練
  5. 自回歸生成:通過預測下一個token來生成文本

與真實LLM的差距

當然,我們的實現與GPT-4這樣的大型模型還有很大差距:

規模差異

  • 我們的模型:約42萬參數
  • GPT-3:1750億參數
  • GPT-4:估計超過1萬億參數

訓練數據

  • 我們的模型:幾百個字符的中文文本
  • 真實LLM:數萬億token的多語言文本

架構優化

  • 真實模型使用了更多的優化技術,如RMSNorm、SwiGLU激活函數、RoPE位置編碼等

訓練技巧

  • 學習率調度、梯度裁剪、混合精度訓練等

性能分析

讓我們分析一下我們模型的性能特點:

指標數值說明
參數量426,838相對較小,適合學習和實驗
詞匯表大小86字符級別,覆蓋基本中文字符
最大序列長度64足夠處理短文本
訓練時間<1分鐘在普通CPU上即可快速訓練
內存占用<100MB資源需求很低

進階學習建議

如果你想深入學習LLM技術,建議按以下路徑進行:

1. 理論基礎強化

  • 深入學習Transformer論文:《Attention Is All You Need》
  • 了解GPT系列發展:GPT-1到GPT-4的技術演進
  • 學習訓練技巧:優化器、學習率調度、正則化等

2. 實踐項目進階

  • 擴展當前實現:增加更多層、使用更大的數據集
  • 實現現代優化:使用RMSNorm、SwiGLU等現代技術
  • 多任務學習:在多個NLP任務上訓練模型

3. 工程實踐

  • 使用專業框架:學習使用Transformers庫、DeepSpeed等
  • 分布式訓練:了解如何在多GPU/多機上訓練大模型
  • 模型部署:學習模型量化、推理優化等技術

4. 前沿技術跟蹤

  • 新架構探索:Mamba、RetNet等新興架構
  • 效率優化:MoE(專家混合)、稀疏注意力等
  • 對齊技術:RLHF、Constitutional AI等

總結

通過本文,我們從理論到實踐全面了解了大語言模型的核心技術。雖然我們的實現相對簡單,但它包含了LLM的所有關鍵組件,幫助我們理解了這些"智能"系統的工作原理。

LLM的成功不是魔法,而是基于扎實的數學基礎、精巧的架構設計和大規模的工程實踐。理解了這些基礎原理,我們就能更好地使用、改進和創新這些技術。

記住,最好的學習方式就是動手實踐。建議你運行本文提供的代碼,嘗試修改參數,觀察不同設置對模型性能的影響。只有通過實際操作,才能真正掌握這些技術的精髓。


完整代碼獲取:本文的完整代碼(git地址)已經過測試,可以直接運行。代碼簡潔明了,適合學習和教學使用。

技術交流:如果你在學習過程中遇到問題,歡迎交流討論。技術的進步需要我們共同努力。

本文旨在幫助讀者理解LLM的核心原理,代碼實現僅用于教學目的。在實際應用中,建議使用成熟的開源框架和預訓練模型。

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

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

相關文章

7月13日日記

看來每天寫一篇日記對我來說還是一個不小的挑戰。主要是和惰性做抗爭吧。但是這個東西說實話也沒有什么難度&#xff0c;也并不占用時間&#xff0c;一篇日記大概十幾分鐘就可以寫完。可能更多的是健忘。忘了每天有一個這樣的小任務。忘了前幾天日記寫沒寫了&#xff0c;三下鄉…

《Stata面板數據分析:數據檢驗、回歸模型與診斷技術 - 以NLSW工資研究(公開數據)為例》

本教程旨在全面介紹使用 Stata 進行面板數據分析的方法和技巧。我們將以美國國家縱向調查(NLSW)的數據為例,系統地探討從基礎 OLS 回歸到高級固定效應模型的分析過程。 NLSW 數據集是公開的,可以免費獲取,這為讀者提供了實踐和復現的機會。 通過這個教程,您將掌握使用 …

【VSCode+LaTeX】科研寫作環境搭建

文章目錄0 引言為什么選擇LaTeXVSCode&#xff1f;為什么不選擇Overleaf&#xff1f;1 TeXLive安裝1.1 下載安裝包1.2 運行安裝程序1.3 通過鏡像安裝2 VSCode安裝與配置2.1 下載VSCode安裝包2.2 安裝VSCode2.3 安裝中文語言包2.4 配置LaTeX核心擴展2.5 加載TeX模版文件2.6 編譯…

Surfer軟件入門與等值線繪制實操教程

本文還有配套的精品資源&#xff0c;點擊獲取 簡介&#xff1a;本教程將指導初學者如何使用Surfer軟件進行地質繪圖&#xff0c;重點在于等值線的繪制技巧和提升圖形質量。內容涵蓋Surfer界面介紹、數據導入、等值線繪制方法、樣式設置、地圖增強技術以及輸出保存方法&#…

攻防世界——Web題 very_easy_sql

目錄 payload1 payload2 payload3 看到了題目是sql就猜測是sql注入和萬能密碼了&#xff0c;但怎么試貌似都沒有反應&#xff0c;看源代碼發現了use.php 訪問use.php頁面 可以猜測這里是SSRF&#xff0c;可以訪問到我們本不能訪問的界面&#xff0c;比如&#xff1a;服務器…

基于 SpringBoot 的 REST API 與 RPC 調用的統一封裝

一、為何需要統一封裝&#xff1f; 在討論統一封裝之前&#xff0c;我們先看看 REST 和 RPC 各自的適用場景。 REST API 基于 HTTP 協議&#xff0c;采用 JSON 作為數據交換格式&#xff0c;可讀性好且跨語言&#xff0c;非常適合對外提供服務。 RPC&#xff08;如 Dubbo、gRPC…

【SpringBoot】 整合MyBatis+Postgresql

MyBatis 是一個輕量級的持久化框架&#xff0c;用于簡化數據庫訪問和操作。它通過將 SQL 語句與 Java 代碼分離&#xff0c;允許開發者使用 XML 或注解來配置 SQL 語句&#xff0c;并將結果映射為 Java 對象。MyBatis 提供了靈活的 SQL 控制&#xff0c;適合需要精細控制 SQL 的…

無縫銜接直播流體驗

文章目錄前言&#x1f9e0; 1. 為什么能“無縫銜接”&#xff1f;&#x1f9f0; 2. Flutter 實現方案? 總體策略&#x1f3af; 核心技術點? a. 使用全局播放器管理器&#xff08;單例模式&#xff09;? b. 廣場頁中的直播卡片使用播放器? c. 詳情頁復用控制器? d. 頁面切換…

[論文閱讀] 軟件工程 | 首個德語軟件工程情感分析黃金標準數據集:構建與價值解析

首個德語軟件工程情感分析黃金標準數據集&#xff1a;構建與價值解析 論文標題&#xff1a;A German Gold-Standard Dataset for Sentiment Analysis in Software EngineeringarXiv:2507.07325 A German Gold-Standard Dataset for Sentiment Analysis in Software Engineering…

PyTorch編程實踐:一文就入門的上手開發!

引言 PyTorch作為當今深度學習領域最流行的框架之一&#xff0c;以其動態計算圖、直觀的Python接口和強大的GPU加速能力&#xff0c;贏得了眾多研究人員和工程師的青睞。本文將深入探討PyTorch的編程實踐&#xff0c;從基礎概念到高級應用&#xff0c;幫助讀者全面掌握這一強大…

關于學習docker中遇到的問題

Cannot connect to the Docker daemon at unix:///home/pc/.docker/desktop/docker.sock. Is the docker daemon running?如何配置新的路徑 #運行這條命令&#xff0c;查看docker狀態 sudo systemctl status docker如圖所示表示監聽路徑不對&#xff0c;因此修改路徑即可&…

無法打開windows安全中心解決方案

系統還原或重置&#xff1a;如果以上方法均無效&#xff0c;可嘗試系統還原&#xff0c;使用之前創建的還原點恢復系統。或在設置中選擇 “系統> 恢復 > 重置此電腦”&#xff0c;選擇 “保留我的文件” 以避免數據丟失。創建新用戶賬戶&#xff1a;按下 Win I 打開設置…

復習筆記 33

緒論 《幻術》 張葉蕾 我該怎么承認&#xff0c; 一切都是幻境。 函數的基本性質和無窮小量及其階的比較 我感覺強化課我要跟上的話&#xff0c;我需要把基礎&#xff0c;強化的講義&#xff0c;還有練習冊上面的所有題都刷爛。不然我感覺自己考 140 完全就是癡人說夢。搞笑呢。…

算法學習筆記:12.快速排序 ——從原理到實戰,涵蓋 LeetCode 與考研 408 例題

快速排序是計算機科學中最經典的排序算法之一&#xff0c;由 Tony Hoare 在 1960 年提出。它憑借平均時間復雜度 O (nlogn)、原地排序&#xff08;空間復雜度 O (logn)&#xff0c;主要來自遞歸棧&#xff09;以及良好的實際性能&#xff0c;成為工業界處理大規模數據排序的首選…

unity 有打擊感的圖片,怎么做動畫,可以表現出良好的打擊效果

完整實現腳本:using UnityEngine; using UnityEngine.UI; using System.Collections;[RequireComponent(typeof(Image))] public class HitEffectController : MonoBehaviour {[Header("基礎設置")]public float hitDuration 0.5f; // 打擊效果總時長[Header("…

cuda編程筆記(7)--多GPU上的CUDA

零拷貝內存 在流中&#xff0c;我們介紹了cudaHostAlloc這個函數&#xff0c;它有一些標志&#xff0c;其中cudaHostAllocMapped允許內存映射到設備&#xff0c;也即GPU可以直接訪問主機上的內存&#xff0c;不用額外再給設備指針分配內存 通過下面的操作&#xff0c;即可讓設…

IP地址混亂?監控易IPAM實現全網地址自動化管理與非法接入告警

IP地址出現混亂狀況&#xff1f;監控易IPAM能夠達成對全網地址予以自動化管理的目標&#xff0c;同時還可針對非法接入的情況發出告警信息。辦公室毫無預兆地突然斷網了&#xff0c;經過一番仔細排查之后&#xff0c;發現原來是IP地址出現了沖突的情況。有人私自接了路由器&…

安全監測預警平臺的應用場景

隨著城市化進程加快和基礎設施規模擴大&#xff0c;各類安全風險日益突出。安全監測預警平臺作為現代安全管理的重要工具&#xff0c;通過整合物聯網、大數據、人工智能等先進技術&#xff0c;實現對各類安全隱患的實時監測、智能分析和精準預警。本文將詳細探討安全監測預警平…

007_用例與應用場景

用例與應用場景 目錄 內容創作編程開發數據分析客戶服務教育培訓商業智能研究輔助 內容創作 文案撰寫 應用場景&#xff1a; 營銷文案和廣告語產品描述和說明書社交媒體內容郵件營銷內容 實際案例&#xff1a; 任務&#xff1a;為新款智能手表撰寫產品描述 輸入&#x…

Unity物理系統由淺入深第一節:Unity 物理系統基礎與應用

Unity物理系統由淺入深第一節&#xff1a;Unity 物理系統基礎與應用 Unity物理系統由淺入深第二節&#xff1a;物理系統高級特性與優化 Unity物理系統由淺入深第三節&#xff1a;物理引擎底層原理剖析 Unity物理系統由淺入深第四節&#xff1a;物理約束求解與穩定性 Unity 引擎…