演進(jìn)與實(shí)操落地:從Transformer到私有化部署全解析)
1. 大模型技術(shù)演進(jìn)的全景脈絡(luò)1.1 從統(tǒng)計(jì)語言模型到神經(jīng)語言模型的范式轉(zhuǎn)換要聊大模型的發(fā)展史得先把時(shí)間軸拉回到統(tǒng)計(jì)學(xué)習(xí)占主導(dǎo)的年代。早期做自然語言處理主流思路是N-gram語言模型給定前N-1個(gè)詞預(yù)測第N個(gè)詞的概率。這個(gè)思路本身沒問題但它有兩個(gè)致命傷——數(shù)據(jù)稀疏和上下文窗口太短。你想想當(dāng)N取3或者5的時(shí)候模型能看到的上下文極其有限稍微長一點(diǎn)的依賴關(guān)系就捕捉不到了。而且隨著N增大參數(shù)空間呈指數(shù)級(jí)膨脹語料根本覆蓋不全大量N-gram組合的概率為零。2003年Bengio等人提出神經(jīng)網(wǎng)絡(luò)語言模型用詞向量的方式把離散的詞映射到連續(xù)空間算是打開了新世界的大門。但真正讓神經(jīng)語言模型具備實(shí)用價(jià)值的是2013年Word2Vec的誕生。Word2Vec通過CBOW和Skip-gram兩種訓(xùn)練方式把詞映射成低維稠密向量語義相近的詞在向量空間中距離也近。這個(gè)思路影響深遠(yuǎn)直到今天Embedding層依然是所有大模型的基礎(chǔ)組件。不過Word2Vec有個(gè)根本局限它是靜態(tài)詞向量。也就是說“蘋果”這個(gè)詞不管出現(xiàn)在“吃蘋果”還是“蘋果發(fā)布會(huì)”里向量表示完全一樣。這顯然不合理。于是ELMo出現(xiàn)了用雙向LSTM做上下文相關(guān)的動(dòng)態(tài)詞向量。ELMo的思路是先在大規(guī)模語料上預(yù)訓(xùn)練一個(gè)語言模型然后在下游任務(wù)中把預(yù)訓(xùn)練模型的中間層輸出作為特征。這個(gè)“預(yù)訓(xùn)練微調(diào)”的范式后來被BERT和GPT發(fā)揚(yáng)光大。1.2 Transformer架構(gòu)的顛覆性意義2017年絕對是值得載入史冊的一年。Google團(tuán)隊(duì)發(fā)表了那篇著名的論文《Attention Is All You Need》提出了Transformer架構(gòu)。這篇論文的核心貢獻(xiàn)在于徹底拋棄了循環(huán)結(jié)構(gòu)完全基于自注意力機(jī)制來建模序列。為什么這件事這么重要因?yàn)镽NN和LSTM有個(gè)天然缺陷它們是串行計(jì)算的第t步的計(jì)算必須等第t-1步完成這意味著無法充分利用GPU的并行計(jì)算能力。序列一長訓(xùn)練效率就急劇下降。Transformer的自注意力機(jī)制允許每個(gè)位置直接和序列中所有其他位置計(jì)算關(guān)聯(lián)權(quán)重一步到位捕捉全局依賴。而且整個(gè)計(jì)算過程可以完全并行化訓(xùn)練速度提升了好幾個(gè)數(shù)量級(jí)。具體來說自注意力的計(jì)算過程是這樣的每個(gè)輸入token被映射成Query、Key、Value三個(gè)向量然后用Q和K的點(diǎn)積計(jì)算注意力分?jǐn)?shù)經(jīng)過softmax歸一化后對V加權(quán)求和。公式就是那個(gè)經(jīng)典的Attention(Q,K,V) softmax(QK^T/√d_k)V。除以√d_k是為了防止點(diǎn)積結(jié)果過大導(dǎo)致softmax梯度消失。Transformer還引入了多頭注意力機(jī)制讓模型可以同時(shí)從不同的表示子空間關(guān)注不同的信息。比如一個(gè)頭關(guān)注語法關(guān)系另一個(gè)頭關(guān)注語義相似度。這種設(shè)計(jì)極大地增強(qiáng)了模型的表達(dá)能力。再加上殘差連接、層歸一化、位置編碼這些工程技巧Transformer在機(jī)器翻譯任務(wù)上直接刷新了當(dāng)時(shí)的SOTA。1.3 預(yù)訓(xùn)練范式的確立與分化Transformer出來之后很快就有人意識(shí)到與其針對每個(gè)下游任務(wù)單獨(dú)設(shè)計(jì)模型不如先在大規(guī)模無標(biāo)注語料上預(yù)訓(xùn)練一個(gè)通用模型然后微調(diào)到具體任務(wù)上。這個(gè)思路催生了兩條技術(shù)路線。一條是以GPT為代表的自回歸路線。GPT用的是Transformer的Decoder部分訓(xùn)練目標(biāo)是標(biāo)準(zhǔn)的語言模型目標(biāo)——根據(jù)前面的詞預(yù)測下一個(gè)詞。這種方式的優(yōu)勢是天然適合生成任務(wù)因?yàn)樯蛇^程就是從左到右逐個(gè)token往外蹦。GPT-1只有1.17億參數(shù)到了GPT-2漲到15億GPT-3直接干到1750億。參數(shù)量的指數(shù)級(jí)增長帶來了質(zhì)的飛躍GPT-3展現(xiàn)出了驚人的少樣本學(xué)習(xí)能力——給它幾個(gè)示例它就能完成翻譯、問答、寫代碼等任務(wù)不需要更新任何參數(shù)。另一條是以BERT為代表的自編碼路線。BERT用的是Transformer的Encoder部分訓(xùn)練目標(biāo)是掩碼語言模型——隨機(jī)遮住輸入中的一些詞讓模型根據(jù)上下文預(yù)測被遮住的詞。這種雙向編碼方式讓BERT在理解類任務(wù)上表現(xiàn)極佳比如文本分類、命名實(shí)體識(shí)別、問答系統(tǒng)。BERT還引入了下一句預(yù)測任務(wù)讓模型學(xué)會(huì)判斷兩個(gè)句子是否連續(xù)。BERT-Base有1.1億參數(shù)BERT-Large有3.4億參數(shù)在GLUE基準(zhǔn)上直接把之前的模型甩開一大截。這兩條路線的分化本質(zhì)上反映了NLP任務(wù)的兩大類型理解和生成。理解類任務(wù)需要雙向上下文信息生成類任務(wù)需要自回歸的因果結(jié)構(gòu)。后來的T5試圖用Encoder-Decoder架構(gòu)統(tǒng)一兩者但實(shí)際應(yīng)用中GPT系列和BERT系列依然各占半壁江山。2. 大模型核心技術(shù)的深度拆解2.1 自注意力機(jī)制的工作原理與計(jì)算細(xì)節(jié)自注意力是Transformer的靈魂值得掰開揉碎講清楚。假設(shè)輸入序列長度為n每個(gè)token的嵌入維度為d那么輸入矩陣X的維度就是n×d。通過三個(gè)線性變換矩陣W_Q、W_K、W_V分別得到QXW_Q、KXW_K、VXW_V維度都是n×d_kd_k通常等于d/hh是頭數(shù)。注意力分?jǐn)?shù)的計(jì)算分三步第一步Q乘以K的轉(zhuǎn)置得到n×n的矩陣第i行第j列的元素表示第i個(gè)token對第j個(gè)token的關(guān)注程度。第二步除以√d_k做縮放防止梯度消失。第三步對每一行做softmax歸一化得到注意力權(quán)重矩陣。最后用這個(gè)權(quán)重矩陣乘以V得到輸出。用生活化的類比來說這就像你在讀一句話的時(shí)候每個(gè)詞都會(huì)“掃視”整句話的所有詞然后決定把注意力放在哪些詞上。比如讀到“它”這個(gè)代詞時(shí)模型會(huì)自動(dòng)把注意力分配給前面出現(xiàn)的名詞從而理解“它”指代的是什么。多頭注意力就是同時(shí)用多組W_Q、W_K、W_V讓模型從不同角度去關(guān)注信息最后把多個(gè)頭的輸出拼接起來再做一次線性變換。這里有個(gè)實(shí)操中容易踩的坑位置編碼的選擇。因?yàn)樽宰⒁饬Ρ旧聿话恢眯畔⒈仨氼~外注入。原始Transformer用的是正弦余弦位置編碼后來BERT用的是可學(xué)習(xí)的位置嵌入再后來RoPE旋轉(zhuǎn)位置編碼成為主流。RoPE的核心思想是通過旋轉(zhuǎn)矩陣把位置信息編碼到Query和Key中使得注意力分?jǐn)?shù)天然包含相對位置信息。這個(gè)改進(jìn)讓模型在處理長序列時(shí)表現(xiàn)更穩(wěn)定也是目前大多數(shù)開源大模型的標(biāo)準(zhǔn)配置。2.2 預(yù)訓(xùn)練目標(biāo)的演進(jìn)從MLM到因果語言模型BERT的掩碼語言模型有個(gè)問題預(yù)訓(xùn)練時(shí)看到的是帶[MASK]的句子但下游任務(wù)中根本不會(huì)出現(xiàn)[MASK]標(biāo)記這就造成了預(yù)訓(xùn)練和微調(diào)之間的不一致。而且BERT假設(shè)被遮住的詞之間是相互獨(dú)立的這顯然不符合語言事實(shí)——一句話中被遮住的幾個(gè)詞往往是有關(guān)聯(lián)的。GPT的因果語言模型就沒有這個(gè)問題。它始終是根據(jù)前面的詞預(yù)測下一個(gè)詞預(yù)訓(xùn)練和生成過程完全一致。但因果語言模型只能看到單向上下文在理解類任務(wù)上天然吃虧。于是后來出現(xiàn)了各種改進(jìn)方案XLNet用排列語言模型把句子隨機(jī)排列后做自回歸預(yù)測既能看到雙向上下文又保持自回歸形式ELECTRA用替換詞檢測把生成器替換的詞讓判別器去判斷訓(xùn)練效率比MLM高很多DeBERTa用解耦注意力把內(nèi)容和位置信息分開處理。到了GPT-3時(shí)代大家發(fā)現(xiàn)一個(gè)有意思的現(xiàn)象當(dāng)模型足夠大、數(shù)據(jù)足夠多的時(shí)候因果語言模型在理解任務(wù)上也能表現(xiàn)得很好。這說明模型規(guī)??梢詮浹a(bǔ)架構(gòu)上的某些不足。GPT-3的1750億參數(shù)在SuperGLUE基準(zhǔn)上零樣本表現(xiàn)就已經(jīng)接近微調(diào)過的BERT-Large。這個(gè)發(fā)現(xiàn)直接推動(dòng)了后續(xù)大模型軍備競賽。2.3 縮放定律與模型規(guī)模的科學(xué)2020年OpenAI發(fā)表了縮放定律的論文系統(tǒng)研究了模型性能與參數(shù)量、數(shù)據(jù)量、計(jì)算量之間的關(guān)系。核心結(jié)論是模型性能與這三個(gè)因素都呈冪律關(guān)系而且存在最優(yōu)的分配比例。具體來說在計(jì)算預(yù)算固定的情況下參數(shù)量和數(shù)據(jù)量應(yīng)該同步增長而不是只堆參數(shù)。這個(gè)發(fā)現(xiàn)糾正了早期的一個(gè)誤區(qū)很多人以為只要把模型做大就能變強(qiáng)。實(shí)際上如果數(shù)據(jù)量跟不上大模型反而容易過擬合。Chinchilla的工作進(jìn)一步驗(yàn)證了這一點(diǎn)在相同計(jì)算預(yù)算下一個(gè)70B參數(shù)、用1.4T token訓(xùn)練的模型性能可以超過一個(gè)280B參數(shù)、用300B token訓(xùn)練的模型。這意味著數(shù)據(jù)質(zhì)量和數(shù)量與參數(shù)規(guī)模同等重要。從工程角度看縮放定律給了我們一個(gè)可預(yù)測的框架在訓(xùn)練之前就可以估算出不同規(guī)模模型的預(yù)期性能從而做出更合理的資源分配決策。但縮放定律也有失效的時(shí)候——當(dāng)模型規(guī)模超過某個(gè)閾值后性能提升會(huì)放緩而且某些能力如數(shù)學(xué)推理、代碼生成似乎需要特定的訓(xùn)練策略才能激發(fā)出來單純靠堆規(guī)模不夠。3. 大模型實(shí)操落地的關(guān)鍵環(huán)節(jié)3.1 從零搭建一個(gè)Transformer模型的完整流程如果你想親手實(shí)現(xiàn)一個(gè)Transformer建議從PyTorch入手。整個(gè)流程可以拆成幾個(gè)模塊輸入嵌入層、位置編碼層、多頭注意力層、前饋網(wǎng)絡(luò)層、殘差連接和層歸一化、輸出層。輸入嵌入層負(fù)責(zé)把token ID映射成稠密向量。這里有個(gè)細(xì)節(jié)嵌入維度通常取512、768或1024具體取決于模型規(guī)模。位置編碼層可以用正弦余弦函數(shù)生成也可以用可學(xué)習(xí)參數(shù)。多頭注意力層是核心需要實(shí)現(xiàn)Q、K、V的線性變換、縮放點(diǎn)積注意力、多頭拼接和輸出投影。前饋網(wǎng)絡(luò)通常是兩層全連接中間維度是嵌入維度的4倍激活函數(shù)用ReLU或GELU。殘差連接和層歸一化的順序有兩種Post-LN原始Transformer和Pre-LN后續(xù)改進(jìn)。Post-LN把歸一化放在殘差連接之后訓(xùn)練時(shí)需要warmup策略來穩(wěn)定梯度。Pre-LN把歸一化放在子層輸入之前訓(xùn)練更穩(wěn)定是目前的主流選擇。代碼實(shí)現(xiàn)時(shí)要注意幾個(gè)坑第一mask的處理。對于padding位置注意力分?jǐn)?shù)要設(shè)成負(fù)無窮softmax之后權(quán)重為零。對于因果語言模型還要加上三角mask防止看到未來的token。第二權(quán)重的初始化。Transformer對初始化很敏感通常用Xavier或Kaiming初始化。第三學(xué)習(xí)率調(diào)度。warmup加余弦退火是比較穩(wěn)妥的方案。訓(xùn)練一個(gè)小型Transformer做正弦波預(yù)測是個(gè)很好的練手項(xiàng)目。你可以生成一批正弦序列數(shù)據(jù)用前一半預(yù)測后一半觀察模型是否能學(xué)到周期性和相位關(guān)系。這個(gè)任務(wù)足夠簡單單卡幾十分鐘就能跑出結(jié)果但涵蓋了序列建模的所有核心要素。3.2 大模型微調(diào)與私有化部署的實(shí)操要點(diǎn)企業(yè)落地大模型通常有兩條路調(diào)用API或者私有化部署。調(diào)用API的好處是省事不用管硬件和運(yùn)維但數(shù)據(jù)要出企業(yè)內(nèi)網(wǎng)而且長期成本可能很高。私有化部署的好處是數(shù)據(jù)安全可控可以深度定制但需要GPU集群和專業(yè)的運(yùn)維團(tuán)隊(duì)。私有化部署的第一步是選模型。開源模型里L(fēng)LaMA系列、Qwen系列、DeepSeek系列都是熱門選擇。選型時(shí)要考慮幾個(gè)因素參數(shù)量7B、13B、70B對應(yīng)不同的硬件需求、上下文長度4K、8K、32K、128K、中文能力、許可證類型。7B模型在單張24G顯存的卡上就能推理70B模型至少需要4張A100 80G。部署框架方面vLLM是目前推理效率最高的方案之一核心是PagedAttention技術(shù)把KV Cache分頁管理顯存利用率能提升好幾倍。TensorRT-LLM是NVIDIA的官方方案性能極致但配置復(fù)雜。Ollama適合個(gè)人開發(fā)者快速體驗(yàn)一條命令就能跑起來但生產(chǎn)環(huán)境不太夠用。微調(diào)方面全量微調(diào)需要大量顯存通常用LoRA或QLoRA做參數(shù)高效微調(diào)。LoRA的思路是在原始權(quán)重旁邊加一個(gè)低秩分解矩陣只訓(xùn)練這個(gè)小矩陣參數(shù)量能降到原來的千分之一。QLoRA進(jìn)一步把原始權(quán)重量化到4bit讓單張消費(fèi)級(jí)顯卡也能微調(diào)7B模型。微調(diào)數(shù)據(jù)質(zhì)量比數(shù)量重要幾百條高質(zhì)量指令數(shù)據(jù)往往比幾萬條噪聲數(shù)據(jù)效果好。3.3 提示工程與上下文長度管理的實(shí)戰(zhàn)經(jīng)驗(yàn)大模型的上下文長度是個(gè)硬約束。早期GPT-3只有2048個(gè)token現(xiàn)在主流模型能到32K甚至128K。但上下文不是越長越好——中間部分的信息容易被忽略這就是所謂的“迷失在中間”現(xiàn)象。實(shí)際使用中關(guān)鍵信息最好放在開頭或結(jié)尾。提示工程的核心原則是清晰、具體、給示例。與其說“幫我寫個(gè)總結(jié)”不如說“請用三句話總結(jié)以下文章的核心觀點(diǎn)每句話不超過30字”。Few-shot示例能顯著提升輸出質(zhì)量但示例的選擇很講究——要選和當(dāng)前任務(wù)最相關(guān)的而且示例的格式要一致。思維鏈提示是另一個(gè)實(shí)用技巧。對于推理類任務(wù)讓模型“一步一步思考”能大幅提升準(zhǔn)確率。比如數(shù)學(xué)題直接問答案往往出錯(cuò)但讓模型寫出解題步驟正確率能翻倍。這個(gè)技巧的本質(zhì)是把隱式的推理過程顯式化讓模型有更多的計(jì)算步驟來得出正確答案。上下文長度管理還有個(gè)工程技巧滑動(dòng)窗口加摘要。當(dāng)對話歷史超過模型窗口時(shí)把最早的幾輪對話壓縮成摘要保留關(guān)鍵信息然后拼接到當(dāng)前上下文中。這樣既能保持長期記憶又不會(huì)超出窗口限制。4. 大模型生態(tài)中的常見問題與排查思路4.1 模型輸出質(zhì)量問題的診斷與優(yōu)化模型輸出質(zhì)量差原因可能有很多。最常見的是提示不夠清晰。模型不是人它不會(huì)揣摩你的意圖。你覺得你說清楚了但模型可能理解成了另一個(gè)意思。解決辦法是把任務(wù)拆解成明確的步驟給出具體的輸出格式要求必要時(shí)提供示例。第二個(gè)常見原因是模型能力不足。7B模型和70B模型的能力差距是客觀存在的。如果任務(wù)需要復(fù)雜的推理或多步計(jì)算小模型確實(shí)力不從心。這時(shí)候要么換大模型要么用思維鏈把任務(wù)拆解成小模型能處理的子任務(wù)。第三個(gè)原因是訓(xùn)練數(shù)據(jù)偏差。如果微調(diào)數(shù)據(jù)里某種類型的樣本特別多模型就會(huì)偏向輸出那種類型的結(jié)果。解決辦法是平衡數(shù)據(jù)分布或者在推理時(shí)用懲罰項(xiàng)抑制過度代表的輸出。還有一個(gè)容易被忽略的因素溫度參數(shù)。溫度越高輸出越隨機(jī)溫度越低輸出越確定。創(chuàng)意寫作需要高溫度事實(shí)問答需要低溫度。很多人在同一個(gè)任務(wù)里用固定的溫度參數(shù)效果自然不理想。4.2 部署與推理中的性能瓶頸排查推理速度慢首先要看是計(jì)算瓶頸還是顯存瓶頸。計(jì)算瓶頸表現(xiàn)為GPU利用率高但吞吐量低解決辦法是量化FP16轉(zhuǎn)INT8或INT4、算子融合、批處理。顯存瓶頸表現(xiàn)為OOM或者頻繁的顯存交換解決辦法是減少批大小、用PagedAttention管理KV Cache、或者用模型并行把模型切到多張卡上。首token延遲是另一個(gè)關(guān)鍵指標(biāo)。對于流式輸出場景用戶對首token延遲非常敏感。優(yōu)化首token延遲的關(guān)鍵是預(yù)填充階段的效率。vLLM的連續(xù)批處理能把不同請求的預(yù)填充階段重疊起來顯著降低平均延遲。還有一個(gè)常見問題是顯存泄漏。長時(shí)間運(yùn)行后顯存占用越來越高最終OOM。這通常是KV Cache沒有正確釋放導(dǎo)致的。排查方法是監(jiān)控顯存占用曲線如果呈鋸齒狀上升基本可以確定是泄漏。解決辦法是檢查推理框架的版本或者手動(dòng)管理KV Cache的生命周期。4.3 常見問題速查表問題現(xiàn)象可能原因排查方法解決方案輸出重復(fù)啰嗦溫度過低、重復(fù)懲罰不足檢查temperature和repetition_penalty參數(shù)提高溫度到0.7-0.9設(shè)置重復(fù)懲罰1.1-1.2輸出答非所問提示不清晰、上下文混淆簡化提示檢查上下文是否包含干擾信息重寫提示清理無關(guān)上下文推理速度慢批大小過大、未量化監(jiān)控GPU利用率和顯存占用減小批大小啟用量化使用vLLM顯存OOM模型太大、KV Cache過長檢查模型參數(shù)量和上下文長度換小模型啟用量化限制上下文長度微調(diào)后效果變差學(xué)習(xí)率過高、數(shù)據(jù)質(zhì)量差對比微調(diào)前后的loss曲線降低學(xué)習(xí)率清洗訓(xùn)練數(shù)據(jù)中文輸出夾雜英文訓(xùn)練數(shù)據(jù)中英混合檢查微調(diào)數(shù)據(jù)語言分布增加中文數(shù)據(jù)比例或加語言約束提示5. 大模型技術(shù)社區(qū)與學(xué)習(xí)資源5.1 值得關(guān)注的技術(shù)社區(qū)與交流渠道大模型領(lǐng)域發(fā)展太快閉門造車肯定不行。國內(nèi)比較活躍的技術(shù)社區(qū)有DeepSeek技術(shù)社區(qū)、魔搭社區(qū)、OpenBMB社區(qū)等。這些社區(qū)不僅有官方文檔和模型下載還有大量實(shí)踐者的經(jīng)驗(yàn)分享。GitHub上的awesome系列倉庫也是很好的資源比如awesome-llm、awesome-chatgpt-prompts整理了大量的論文、工具和教程。論文閱讀方面arXiv是必看的但每天新增的論文太多全看根本不現(xiàn)實(shí)。建議關(guān)注幾個(gè)核心方向模型架構(gòu)改進(jìn)、訓(xùn)練效率優(yōu)化、推理加速、對齊技術(shù)。每個(gè)方向挑幾篇高引論文精讀比泛讀一百篇都有用。實(shí)操學(xué)習(xí)方面Hugging Face的Transformers庫是最好的入門材料。它的文檔詳細(xì)示例豐富而且社區(qū)活躍。從pipeline接口開始逐步深入到模型源碼是比較合理的學(xué)習(xí)路徑。Kaggle上的NLP競賽也是練手的好機(jī)會(huì)能看到別人是怎么調(diào)參和優(yōu)化的。5.2 從理論到實(shí)踐的進(jìn)階路線建議如果你剛接觸大模型建議按這個(gè)順序來第一周跑通Hugging Face的pipeline體驗(yàn)文本分類、問答、生成等基礎(chǔ)任務(wù)。第二周讀Transformer論文和BERT論文理解自注意力和預(yù)訓(xùn)練的原理。第三周手寫一個(gè)簡單的Transformer在小型數(shù)據(jù)集上訓(xùn)練。第四周學(xué)習(xí)LoRA微調(diào)用自己的數(shù)據(jù)微調(diào)一個(gè)7B模型。進(jìn)階階段可以深入幾個(gè)方向推理優(yōu)化vLLM、TensorRT-LLM、分布式訓(xùn)練DeepSpeed、Megatron-LM、對齊技術(shù)RLHF、DPO、多模態(tài)CLIP、LLaVA。每個(gè)方向都有大量的開源項(xiàng)目和論文可以參考。我個(gè)人在實(shí)際操作中的體會(huì)是不要一開始就追求大而全先把一個(gè)點(diǎn)做深做透。比如你把LoRA微調(diào)搞明白了再去看其他微調(diào)方法就很容易理解。你把vLLM的PagedAttention原理搞清楚了再看其他推理框架也能觸類旁通。大模型這個(gè)領(lǐng)域底層原理是相通的關(guān)鍵是建立自己的知識(shí)框架。最后再分享一個(gè)小技巧養(yǎng)成寫實(shí)驗(yàn)記錄的習(xí)慣。每次跑實(shí)驗(yàn)把配置、參數(shù)、結(jié)果、遇到的問題都記下來。過一段時(shí)間回頭看你會(huì)發(fā)現(xiàn)很多當(dāng)時(shí)沒想明白的問題后來自然就通了。而且這些記錄在寫論文或做分享的時(shí)候都是寶貴的素材。