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