習(xí)地圖:從神經(jīng)網(wǎng)絡(luò)到強(qiáng)化學(xué)習(xí))
簡(jiǎn)介這份微軟 AI-For-Beginners 中文版課程包面向零基礎(chǔ)到入門階段的學(xué)習(xí)者圍繞為期12周、24課的教學(xué)大綱組織內(nèi)容可用于系統(tǒng)了解符號(hào)人工智能、知識(shí)表示與推理、神經(jīng)網(wǎng)絡(luò)與深度學(xué)習(xí)以及計(jì)算機(jī)視覺(jué)、自然語(yǔ)言處理、遺傳算法和多智能體系統(tǒng)等主題。課程強(qiáng)調(diào)動(dòng)手實(shí)踐配有測(cè)驗(yàn)、實(shí)驗(yàn)與練習(xí)代碼并以 TensorFlow、PyTorch 示例幫助理解模型原理同時(shí)涉及道德 AI 原則。壓縮包共375個(gè)文件、約56.7MB主要由 md 講義、ipynb 交互式筆記本、py 腳本、json 配置及 png/jpg/gif 圖表素材構(gòu)成另有少量 html、vue、yml 等站點(diǎn)與運(yùn)行配置文件便于按課程模塊查閱和復(fù)現(xiàn)實(shí)驗(yàn)。已有140人學(xué)習(xí)適合希望用一套結(jié)構(gòu)完整的中文資料建立 AI 知識(shí)框架、邊讀講義邊跑代碼的初學(xué)者。1. AI-For-Beginners 中文版先看清這張課程地圖AI-For-Beginners 這套課程資源最容易被誤判的地方就在名字里那個(gè) “Beginners”——很多人以為它是一份概念速覽打開(kāi)才發(fā)現(xiàn)它按周排課、每節(jié)都配可運(yùn)行的練習(xí)代碼和前后自測(cè)從感知機(jī)一路鋪到 Transformer 和強(qiáng)化學(xué)習(xí)。它更像一套「課程骨架 可動(dòng)手作業(yè)」而不是看完就忘的科普合集。它適合兩類人一類是自學(xué)入門、需要?jiǎng)e人替自己把學(xué)習(xí)節(jié)奏排好的人另一類是知識(shí)點(diǎn)學(xué)得零散、正在復(fù)習(xí)或準(zhǔn)備面試需要一張地圖定位自己漏在哪的人。梳理下來(lái)會(huì)發(fā)現(xiàn)這套課真正的價(jià)值不是講得多深而是覆蓋面足夠完整把監(jiān)督學(xué)習(xí)、計(jì)算機(jī)視覺(jué)、自然語(yǔ)言處理、強(qiáng)化學(xué)習(xí)、AI 倫理這幾條線擺進(jìn)了同一個(gè)坐標(biāo)系。作為一份人工智能課程資源它更像大綱而不是終點(diǎn)。2. 神經(jīng)網(wǎng)絡(luò)與框架把前向、反向和訓(xùn)練循環(huán)拆開(kāi)看這一章是整個(gè)課程的物理底座。后面不管講圖像還是文本模型的基本結(jié)構(gòu)都是同一套東西輸入張量、若干層、一個(gè)損失函數(shù)、一個(gè)優(yōu)化器循環(huán)往復(fù)。學(xué)得糊的人通常糊在這里——能跑通別人的代碼但說(shuō)不清一次參數(shù)更新到底發(fā)生了什么。2.1 感知機(jī)到多層感知機(jī)三層結(jié)構(gòu)要背成條件反射感知機(jī)的全部邏輯可以壓成一句話對(duì)輸入做加權(quán)求和加偏置過(guò)一個(gè)非線性函數(shù)得到輸出。寫成式子就是 z w·x ba f(z)。它的致命限制是只能處理線性可分的問(wèn)題經(jīng)典的 XOR 反例就足以讓它失效四個(gè)點(diǎn)里沒(méi)有任何一條直線能把兩類分開(kāi)。這不是實(shí)現(xiàn)細(xì)節(jié)沒(méi)寫好而是模型容量不夠。多層感知機(jī)的補(bǔ)丁思路是把多個(gè)感知機(jī)疊起來(lái)中間加隱藏層并且在層間保留非線性激活。隱藏層的職責(zé)是學(xué)出一組新的特征表示把原始空間里不可分的問(wèn)題映射到一個(gè)可分的空間輸出層的職責(zé)才是做最終判別。反向傳播則是用鏈?zhǔn)椒▌t把輸出端的誤差一層層往前傳算出每個(gè)參數(shù)對(duì)誤差的偏導(dǎo)再按學(xué)習(xí)率往下走一步。結(jié)構(gòu)職責(zé)常見(jiàn)誤區(qū)輸入層接收原始特征或歸一化后的張量忘記歸一化導(dǎo)致訓(xùn)練發(fā)散隱藏層學(xué)習(xí)中間表示層數(shù)與寬度決定容量層加得越多越好忽略過(guò)擬合激活函數(shù)引入非線性決定梯度形態(tài)全用階躍函數(shù)梯度處處為零輸出層對(duì)接任務(wù)形式回歸/分類多分類忘記 softmax 配合交叉熵import numpy as np class Perceptron: def __init__(self, n_features, lr0.1): self.w np.zeros(n_features) # 權(quán)重維度等于單個(gè)樣本的特征數(shù) self.b 0.0 # 偏置決定判別面平移 self.lr lr # 學(xué)習(xí)率控制每次錯(cuò)分修正的步長(zhǎng) def predict(self, x): # 階躍函數(shù)z 0 判為 1否則為 0 return 1 if np.dot(self.w, x) self.b 0 else 0 def fit(self, X, y, epochs20): for _ in range(epochs): for xi, yi in zip(X, y): err yi - self.predict(xi) # 誤差只有 -1、0、1 三種取值 self.w self.lr * err * xi # 只在錯(cuò)分時(shí)更新分對(duì)了不動(dòng) self.b self.lr * err return self這段代碼的關(guān)鍵在 err 的取值設(shè)計(jì)它天然實(shí)現(xiàn)了「分對(duì)不更新、分錯(cuò)才修正」的邏輯。lr 太大會(huì)在兩類之間來(lái)回震蕩太小則幾輪下來(lái)權(quán)重幾乎沒(méi)有變化。用它在 XOR 的四個(gè)樣本上訓(xùn)練誤差不會(huì)收斂到零這個(gè)失敗結(jié)果是值得親手跑一遍的——它比任何文字解釋都更能說(shuō)明為什么需要隱藏層。2.2 同一件事的兩種寫法框架對(duì)照記憶表課程里的練習(xí)代碼通常會(huì)在兩個(gè)主流框架之間切換初學(xué)時(shí)最痛苦的是「概念都懂但兩個(gè)庫(kù)的函數(shù)名對(duì)不上」。有效率的做法不是分別背兩套 API而是先把訓(xùn)練循環(huán)拆成固定五步建模型、定義損失、選優(yōu)化器、前向算損失、反向更新權(quán)重然后做一張對(duì)照表把每一步在兩個(gè)框架里的寫法填進(jìn)去。環(huán)節(jié)抽象概念一種常見(jiàn)寫法另一種常見(jiàn)寫法建模型層堆疊成網(wǎng)絡(luò)繼承 Module 類在構(gòu)造函數(shù)里聲明層用 Sequential 順序堆疊層前向張量過(guò)網(wǎng)絡(luò)在 forward 方法里寫調(diào)用順序調(diào)用 model(x) 直接得到輸出損失標(biāo)量化誤差傳入 logits 與標(biāo)簽傳入 labels 與預(yù)測(cè)概率反向自動(dòng)求導(dǎo)loss.backward() 后 optimizer.step()fit() 內(nèi)部完成反向與更新數(shù)據(jù)批與打亂自定義 Dataset DataLoader直接傳數(shù)組并指定 batch_size形狀約定是另一個(gè)高頻翻車點(diǎn)。卷積網(wǎng)絡(luò)的張量在不同框架里可能是 (N, C, H, W)也可能是 (N, H, W, C)N 是批大小、C 是通道數(shù)、H 和 W 是高寬。把數(shù)據(jù)喂進(jìn)模型前先打印一次 shape 并對(duì)照文檔比在報(bào)錯(cuò)里猜十分鐘要快得多。2.3 損失、優(yōu)化器與過(guò)擬合訓(xùn)練曲線怎么讀損失函數(shù)的選擇只由任務(wù)形式?jīng)Q定不由模型結(jié)構(gòu)決定?;貧w用均方誤差二分類用二元交叉熵多分類用交叉熵多標(biāo)簽用逐標(biāo)簽的二元交叉熵。用錯(cuò)損失函數(shù)往往不會(huì)報(bào)錯(cuò)只是模型永遠(yuǎn)學(xué)不好這是最隱蔽的一類問(wèn)題。優(yōu)化器可以先只記兩個(gè)隨機(jī)梯度下降是基準(zhǔn)更新方向就是負(fù)梯度方向乘學(xué)習(xí)率自適應(yīng)方法在梯度的一階矩和二階矩上做滑動(dòng)平均對(duì)學(xué)習(xí)率不敏感一些適合快速跑通。入門階段不必糾結(jié)選擇先用默認(rèn)參數(shù)跑出一條能下降的曲線再考慮調(diào)。訓(xùn)練曲線的讀法比調(diào)參技巧更重要記住三種形態(tài)訓(xùn)練損失降、驗(yàn)證損失也降正常學(xué)習(xí)繼續(xù)。訓(xùn)練損失降、驗(yàn)證損失先降后升過(guò)擬合的典型信號(hào)上正則化、加 dropout、早停。兩條曲線都不降先懷疑學(xué)習(xí)率過(guò)大、數(shù)據(jù)未歸一化、標(biāo)簽與輸入錯(cuò)位這三件事。提示過(guò)擬合的判斷必須以驗(yàn)證集為準(zhǔn)訓(xùn)練集上的指標(biāo)永遠(yuǎn)會(huì)更好看它證明不了泛化能力。3. 視覺(jué)與文本CNN、詞向量到 Transformer 的模塊化串聯(lián)課程把視覺(jué)和文本分成兩條線講但兩條線的結(jié)構(gòu)其實(shí)同構(gòu)都是「先把原始輸入變成好的表示再在表示上做判別」??创┻@一點(diǎn)復(fù)習(xí)時(shí)就不需要記兩套邏輯。3.1 卷積與池化把圖像任務(wù)拆成特征提取加分類頭卷積層的三個(gè)核心特性值得單獨(dú)記局部連接每個(gè)輸出只看輸入的一小塊、權(quán)值共享同一個(gè)卷積核在整張圖上滑動(dòng)、平移等變目標(biāo)移動(dòng)位置特征圖跟著移動(dòng)。這三點(diǎn)合起來(lái)大幅削減了參數(shù)量——全連接層處理一張圖要連接每個(gè)像素卷積層只用一組小核。輸出尺寸的公式必須背下來(lái)(H ? K 2P) / S 1H 是輸入邊長(zhǎng)、K 是卷積核尺寸、P 是填充、S 是步長(zhǎng)。除不盡時(shí)向下取整這也是很多人手算層數(shù)對(duì)不上的原因。池化層不參與學(xué)習(xí)只做下采樣作用是降低分辨率、擴(kuò)大感受野、提供一定的平移魯棒性。import numpy as np def conv2d_naive(image, kernel, stride1, padding0): # image 為單通道二維數(shù)組kernel 為 K×K 的卷積核 if padding 0: image np.pad(image, padding, modeconstant) kh, kw kernel.shape out_h (image.shape[0] - kh) // stride 1 out_w (image.shape[1] - kw) // stride 1 out np.zeros((out_h, out_w)) for i in range(out_h): for j in range(out_w): patch image[i*stride:i*stridekh, j*stride:j*stridekw] out[i, j] np.sum(patch * kernel) # 對(duì)應(yīng)位置相乘再整體求和 return out edge np.array([[0, -1, 0], [-1, 4, -1], [0, -1, 0]]) # 四鄰域拉普拉斯核突出邊緣這段實(shí)現(xiàn)在輸入尺寸、卷積核尺寸、步長(zhǎng)、填充四個(gè)參數(shù)上完整復(fù)現(xiàn)了公式。手工算一遍 5×5 輸入經(jīng)過(guò) 3×3 核、步長(zhǎng) 1、無(wú)填充的結(jié)果是 3×3比背公式更有記憶點(diǎn)。課程配套的圖像練習(xí)通常先用 OpenCV 完成讀圖、縮放、顏色空間轉(zhuǎn)換、通道拆分這些預(yù)處理再交給模型把「預(yù)處理」和「建?!姑鞔_分成兩段這個(gè)分層習(xí)慣值得保留。3.2 文本表示詞袋、TF-IDF 到上下文嵌入的遞進(jìn)文本進(jìn)模型前必須先變成數(shù)。這條演進(jìn)線有清晰的動(dòng)機(jī)鏈詞袋只統(tǒng)計(jì)詞出現(xiàn)沒(méi)出現(xiàn)丟失順序和頻次TF-IDF 引入頻次和區(qū)分度常見(jiàn)詞降權(quán)、稀有詞升權(quán)詞向量把詞映射到稠密空間語(yǔ)義相近的詞距離近上下文嵌入再進(jìn)一步同一個(gè)詞在不同句子里得到不同向量。TF-IDF 的計(jì)算就是詞頻乘以逆文檔頻率其中逆文檔頻率用對(duì)數(shù)平滑形式避免除零并壓住高頻詞的權(quán)重。它的優(yōu)勢(shì)是可解釋、無(wú)需訓(xùn)練缺點(diǎn)是稀疏、詞序丟失作為基線足夠用作主模型就偏弱了。from sklearn.feature_extraction.text import TfidfVectorizer docs [ 圖像分類需要卷積網(wǎng)絡(luò), 文本分類常用詞袋和詞頻, 詞頻統(tǒng)計(jì)會(huì)忽略詞的區(qū)分度, ] # 中文沒(méi)有空格分隔先用字級(jí)別的 1-2 元組切分 vectorizer TfidfVectorizer(analyzerchar, ngram_range(1, 2)) X vectorizer.fit_transform(docs) print(X.shape) # 行數(shù)是文檔數(shù)列數(shù)是特征維度 print(vectorizer.get_feature_names_out()[:8])參數(shù)里 analyzer 決定切分單位ngram_range 決定是否保留相鄰字的組合。中文場(chǎng)景下按字切是省事的做法講究一些會(huì)先接分詞工具。X 是稀疏矩陣轉(zhuǎn)成稠密數(shù)組前先看維度特征維度一大就很容易把內(nèi)存吃滿。3.3 RNN 到 Transformer注意力為什么被需要循環(huán)網(wǎng)絡(luò)把序列按時(shí)間步展開(kāi)每一步的輸出依賴上一步的隱藏狀態(tài)。它的兩個(gè)問(wèn)題在入門階段就要認(rèn)清一是長(zhǎng)距離依賴會(huì)衰減序列一長(zhǎng)早期信息傳到最后幾乎消失二是按時(shí)間步串行計(jì)算無(wú)法在一條序列內(nèi)部并行。長(zhǎng)短期記憶網(wǎng)絡(luò)用輸入門、遺忘門、輸出門三個(gè)門控來(lái)控制信息保留與丟棄緩解了梯度消失但沒(méi)有解決串行計(jì)算。注意力機(jī)制換了思路不再依賴逐步傳遞而是讓每個(gè)位置直接和序列中所有位置計(jì)算相關(guān)性權(quán)重一次性聚合全局信息。多頭注意力則是在多個(gè)子空間里各算一遍最后拼接。這條動(dòng)機(jī)鏈的記法可以濃縮成一句循環(huán)網(wǎng)絡(luò)的瓶頸是「必須逐個(gè)傳」注意力解決的是「可以同時(shí)看」。至于位置編碼為什么必要答案是注意力本身對(duì)順序不敏感打亂詞序結(jié)果可能不變所以必須額外把位置信息注入。4. 三個(gè)易被跳過(guò)的分支遺傳算法、強(qiáng)化學(xué)習(xí)與多智能體這三塊在課程里所占篇幅不大被跳過(guò)的比例卻很高。跳過(guò)它們的代價(jià)是知識(shí)地圖出現(xiàn)空洞一旦面試或項(xiàng)目里碰到「用獎(jiǎng)勵(lì)信號(hào)訓(xùn)練智能體」這類問(wèn)題會(huì)覺(jué)得無(wú)從下嘴。4.1 遺傳算法四個(gè)部件構(gòu)成一個(gè)完整循環(huán)遺傳算法屬于啟發(fā)式搜索不依賴梯度適合解空間離散、目標(biāo)函數(shù)不可導(dǎo)的問(wèn)題。它的四個(gè)部件必須能默寫出來(lái)編碼把解表示成串或向量、適應(yīng)度函數(shù)給解打分、選擇按分?jǐn)?shù)高低決定誰(shuí)繁殖、交叉與變異產(chǎn)生新解并保持多樣性。參數(shù)只有四個(gè)值得記種群規(guī)模決定搜索廣度交叉率決定新解產(chǎn)生頻率變異率決定跳出局部最優(yōu)的能力代數(shù)決定什么時(shí)候停。變異率設(shè)得太低會(huì)早熟收斂設(shè)得太高則退化成隨機(jī)搜索。import random def fitness(x): # 目標(biāo)5 位二進(jìn)制里 1 的個(gè)數(shù)越多越好最優(yōu)解為 31 return bin(x).count(1) def mutate(x, rate0.05): for i in range(5): if random.random() rate: x ^ (1 i) # 按位異或?qū)崿F(xiàn)該位取反 return x適應(yīng)度函數(shù)的設(shè)計(jì)是這類算法里最見(jiàn)功力的一環(huán)它必須能區(qū)分個(gè)體的優(yōu)劣否則選擇壓力無(wú)從談起。變異用按位異或?qū)崿F(xiàn)rate 控制每一位被翻轉(zhuǎn)的概率這個(gè)寫法比生成全新隨機(jī)數(shù)更溫和能保留父代的多數(shù)基因。4.2 強(qiáng)化學(xué)習(xí)狀態(tài)、動(dòng)作、獎(jiǎng)勵(lì)與一次增量更新強(qiáng)化學(xué)習(xí)的建??蚣苁邱R爾可夫決策過(guò)程五個(gè)要素狀態(tài)集合、動(dòng)作集合、獎(jiǎng)勵(lì)函數(shù)、狀態(tài)轉(zhuǎn)移概率、折扣因子。與監(jiān)督學(xué)習(xí)最大的差別在于這里沒(méi)有標(biāo)準(zhǔn)答案只有延遲到來(lái)的獎(jiǎng)勵(lì)模型必須自己通過(guò)試錯(cuò)去估計(jì)「在某個(gè)狀態(tài)下做某個(gè)動(dòng)作長(zhǎng)期回報(bào)有多大」。Q 學(xué)習(xí)的更新式值得逐項(xiàng)拆開(kāi)新估計(jì)等于舊估計(jì)加上學(xué)習(xí)率乘以「即時(shí)獎(jiǎng)勵(lì)加折扣后的下一狀態(tài)最大 Q 值減去當(dāng)前 Q 值」。括號(hào)里的部分叫時(shí)序差分誤差學(xué)習(xí)率控制這次修正的幅度折扣因子控制對(duì)未來(lái)獎(jiǎng)勵(lì)的重視程度。import random import numpy as np Q np.zeros((n_states, n_actions)) for episode in range(episodes): s env.reset() done False while not done: if random.random() epsilon: # ε-greedy以一定概率隨機(jī)探索 a random.randrange(n_actions) else: a int(np.argmax(Q[s])) # 否則選當(dāng)前估值最高的動(dòng)作 s_next, r, done, _ env.step(a) target r gamma * np.max(Q[s_next]) * (not done) # 終止?fàn)顟B(tài)無(wú)后繼 Q[s, a] alpha * (target - Q[s, a]) # 朝目標(biāo)挪一小步 s s_nextalpha 是學(xué)習(xí)率gamma 是折扣因子epsilon 是探索概率通常會(huì)隨回合數(shù)衰減前期多探索、后期多利用。終止?fàn)顟B(tài)要乘 (not done) 把后繼價(jià)值清零漏掉這一項(xiàng)會(huì)讓智能體在終點(diǎn)附近反復(fù)打轉(zhuǎn)是典型的手寫實(shí)現(xiàn)翻車點(diǎn)。4.3 多智能體與仿真為什么入門課要放這一塊單個(gè)智能體的環(huán)境是靜態(tài)的多個(gè)智能體放在一起環(huán)境就變成了「別人的策略也在變」問(wèn)題立刻升級(jí)會(huì)出現(xiàn)競(jìng)爭(zhēng)、合作、博弈也會(huì)出現(xiàn)策略震蕩和難以復(fù)現(xiàn)的結(jié)果。課程把這塊放進(jìn)來(lái)目的不是讓你精通多智能體算法而是讓你知道「智能」在交互中會(huì)涌現(xiàn)出單體能解釋不了的行為。復(fù)習(xí)時(shí)的合理投入是理解概念和跑通示例不必陷進(jìn)調(diào)參。仿真環(huán)境的隨機(jī)種子、回合長(zhǎng)度、獎(jiǎng)勵(lì)塑形這三處最容易吃掉時(shí)間先把種子固定、把回合截?cái)嘣偃ビ^察行為變化。5. 易漏點(diǎn)排查五處最容易翻車的地方5.1 跳過(guò)課前自測(cè)直接進(jìn)正文易漏點(diǎn)在于課前的自測(cè)題被當(dāng)成形式。為什么漏多數(shù)人的習(xí)慣是先讀正文再做題把自測(cè)當(dāng)檢驗(yàn)而它的設(shè)計(jì)意圖是定位盲區(qū)。怎么補(bǔ)先盲做一遍錯(cuò)題標(biāo)紅再帶著問(wèn)題讀正文讀完立刻回看錯(cuò)題記憶留存率差別非常明顯。5.2 只跑代碼不看數(shù)據(jù)形狀與預(yù)處理易漏點(diǎn)在于數(shù)據(jù)從哪來(lái)、怎么歸一化、形狀怎么對(duì)齊課程往往一句帶過(guò)。為什么漏示例數(shù)據(jù)是備好的直接跑就出結(jié)果預(yù)處理環(huán)節(jié)被隱藏了。怎么補(bǔ)每個(gè)練習(xí)開(kāi)始前手工打印一次數(shù)據(jù)形狀、取值范圍、標(biāo)簽分布把歸一化那幾行代碼單獨(dú)抄一遍報(bào)錯(cuò)率會(huì)斷崖式下降。5.3 把訓(xùn)練集指標(biāo)當(dāng)成模型效果易漏點(diǎn)在于只報(bào)訓(xùn)練準(zhǔn)確率。為什么漏訓(xùn)練損失幾乎總在下降給人進(jìn)展順利的錯(cuò)覺(jué)。怎么補(bǔ)切出驗(yàn)證集先跑一個(gè)最笨的基線比如多數(shù)類預(yù)測(cè)模型必須明顯超過(guò)基線才算有效同時(shí)記錄訓(xùn)練與驗(yàn)證兩條曲線形成習(xí)慣。5.4 跳過(guò) AI 倫理與負(fù)責(zé)任 AI 模塊易漏點(diǎn)在于這部分看著不像技術(shù)容易被整段略過(guò)。為什么漏它沒(méi)有代碼、沒(méi)有指標(biāo)讀起來(lái)像務(wù)虛。怎么補(bǔ)把它當(dāng)成工程約束來(lái)記重點(diǎn)是偏見(jiàn)來(lái)源、數(shù)據(jù)代表性、可解釋性與隱私邊界這幾條落到具體問(wèn)題上就是「這個(gè)數(shù)據(jù)集對(duì)哪類樣本不友好」「模型出錯(cuò)時(shí)能不能解釋」。5.5 只收藏不落筆記兩周后歸零易漏點(diǎn)在于把「下載了」當(dāng)成「學(xué)會(huì)了」。為什么漏資源越完整越容易產(chǎn)生已掌握的錯(cuò)覺(jué)。怎么補(bǔ)每學(xué)完一節(jié)用自己的話寫三行——這節(jié)解決什么問(wèn)題、核心公式或結(jié)構(gòu)是什么、最容易錯(cuò)在哪三行寫不出來(lái)說(shuō)明這節(jié)其實(shí)沒(méi)進(jìn)去。注意以上五條里第三條和第五條造成的損失最大前者讓你誤判模型后者讓你誤判自己。6. 復(fù)習(xí)清單三遍過(guò)課與模塊自測(cè)表6.1 三遍過(guò)課法骨架、代碼、自測(cè)各走一遍第一遍只求骨架不碰代碼。把課程目錄當(dāng)成一張地圖每節(jié)用一句話寫清「它解決什么問(wèn)題」遇到公式先跳過(guò)推導(dǎo)只看結(jié)論。這一遍的目標(biāo)是能在白紙上畫(huà)出模塊之間的先后關(guān)系時(shí)間控制在總投入的兩成左右。第二遍只碰代碼不求全懂。每節(jié)的練習(xí)代碼親手跑通一次跑之前先改一處參數(shù)看結(jié)果怎么變——學(xué)習(xí)率調(diào)大十倍、批大小減半、卷積核換一個(gè)觀察報(bào)錯(cuò)或指標(biāo)變化。這一遍的核心產(chǎn)出是「失敗經(jīng)驗(yàn)」報(bào)錯(cuò)信息比成功運(yùn)行更有信息量。第三遍對(duì)著自測(cè)題回掃。錯(cuò)題回到對(duì)應(yīng)小節(jié)重讀只讀那一段不做全書(shū)重看。三遍走完多數(shù)人會(huì)發(fā)現(xiàn)真正卡住自己的點(diǎn)不超過(guò)五個(gè)把這五個(gè)寫成一張便簽貼在顯示器邊上比再刷一遍課程有效。6.2 模塊自測(cè)表對(duì)著清單打勾別憑感覺(jué)模塊能默寫出來(lái)的內(nèi)容自評(píng)神經(jīng)網(wǎng)絡(luò)前向公式、激活函數(shù)作用、反向傳播的鏈?zhǔn)椒▌t是/否框架訓(xùn)練循環(huán)五步、張量形狀約定、損失與任務(wù)對(duì)應(yīng)是/否視覺(jué)卷積三個(gè)特性、輸出尺寸公式、池化作用是/否文本詞袋到 TF-IDF 的動(dòng)機(jī)、詞向量與上下文嵌入的區(qū)別是/否序列RNN 的兩個(gè)瓶頸、注意力的計(jì)算對(duì)象、位置編碼的必要性是/否搜索與強(qiáng)化遺傳算法四部件、Q 學(xué)習(xí)更新式各符號(hào)含義是/否倫理偏見(jiàn)來(lái)源、數(shù)據(jù)代表性、可解釋性三條各舉一例是/否表格里任何一行打不了勾就回到對(duì)應(yīng)章節(jié)的第二遍流程只跑那一節(jié)的代碼。打勾的標(biāo)準(zhǔn)是「能不看資料講給別人聽(tīng)」不是「看著眼熟」。這一步我吃過(guò)虧曾經(jīng)把整門課刷完自覺(jué)覆蓋得挺全結(jié)果被問(wèn)「卷積輸出尺寸怎么算」時(shí)卡住才發(fā)現(xiàn)公式只是看過(guò)、從沒(méi)手算過(guò)。從那以后我每次復(fù)習(xí)這類課程資源都強(qiáng)制走一遍「白紙復(fù)述 手算一遍 跑一次代碼」這三件事任何一步跳過(guò)那個(gè)知識(shí)點(diǎn)基本就等于沒(méi)學(xué)。課程再完整也只是別人的骨架能不能長(zhǎng)成自己的知識(shí)樹(shù)取決于你有沒(méi)有親手把每個(gè)節(jié)點(diǎn)連一遍。希望幫到你。本文還有配套的精品資源點(diǎn)擊獲取