
# 關(guān)于計(jì)算機(jī)視覺(jué)神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)李飛飛Stanford CS231n公開(kāi)課的筆記。 #首先從完全沒(méi)有接觸過(guò)神經(jīng)網(wǎng)絡(luò)及計(jì)算機(jī)學(xué)習(xí)中的高等數(shù)學(xué)慢慢一步一步學(xué)習(xí)記錄學(xué)習(xí)中的疑點(diǎn)難點(diǎn)。前置一點(diǎn)之前學(xué)習(xí)python的時(shí)候還沒(méi)能理解numpy這個(gè)庫(kù)存在的意義因?yàn)楫?dāng)時(shí)覺(jué)得python不是一種編程語(yǔ)言嘛怎么還需要內(nèi)嵌一個(gè)數(shù)學(xué)庫(kù)。后面才慢慢發(fā)現(xiàn)其實(shí)好像數(shù)學(xué)才是代碼的底層邏輯了。進(jìn)入正題吧首先之前完全沒(méi)有接觸過(guò)深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò)我指的沒(méi)有接觸過(guò)是指沒(méi)有認(rèn)真了解過(guò)其本質(zhì)而不是單純的知道這個(gè)詞匯然后泛泛而談就像當(dāng)初AICG一樣其實(shí)真正應(yīng)該是AIGCArtificial Intelligence Gernerated Content人工智能生成內(nèi)容之所以一直以為是AICG就是因?yàn)槎际窃谠~匯上泛泛而談以為是ai生成的cg圖。所以啊一定要了解事物背后的本質(zhì)。其實(shí)這次學(xué)習(xí)的是計(jì)算機(jī)深度學(xué)習(xí)里面的一環(huán)就是關(guān)于視覺(jué)學(xué)習(xí)的原理之前看李飛飛教授主要是驚訝于她們團(tuán)隊(duì)使用的圖片生成3D高斯?jié)姙R技術(shù)后來(lái)就來(lái)搜關(guān)于李飛飛教授的課程了才有了這次Stanford CS231n的公開(kāi)課。圖像分類(lèi)器所謂的圖像分類(lèi)器其實(shí)就是輸入一張圖片輸出這張圖片屬于哪一個(gè)類(lèi)別的程序 / 數(shù)學(xué)模型。比如輸入一張照片輸出青蛙、汽車(chē)、貓、狗。向量那么這里就有一個(gè)非常關(guān)鍵的知識(shí)點(diǎn)了就是計(jì)算機(jī)是通過(guò)什么來(lái)感知或者說(shuō)看懂圖像之間的差異的呢。這里潛藏著一個(gè)十分核心的要素那就是向量在往后的學(xué)習(xí)當(dāng)中會(huì)慢慢發(fā)現(xiàn)其實(shí)所謂的神經(jīng)網(wǎng)絡(luò)深度學(xué)習(xí)其實(shí)非常依賴(lài)一樣?xùn)|西就是向量的轉(zhuǎn)換把原始輸入像素 / 文字 / 音頻→轉(zhuǎn)換成數(shù)字向量。只有轉(zhuǎn)化為數(shù)字向量這才是計(jì)算機(jī)能讀懂的語(yǔ)言才能進(jìn)行后續(xù)的一系列操作。圖像分類(lèi)發(fā)展階段模板向量距離匹配L1/L2手工特征 SVM傳統(tǒng) CVSIFT、HOG單層線(xiàn)性分類(lèi)多層全連接 MLP帶 ReLU基礎(chǔ) CNNAlexNet深度改良 CNNVGG、ResNet、EfficientNet、ConvNeXtVision TransformerViT、Swin多模態(tài)大模型CLIP 等零樣本分類(lèi)、自監(jiān)督預(yù)訓(xùn)練1.模板向量距離匹配我們首先來(lái)看看關(guān)于模板向量距離匹配的機(jī)制其實(shí)就是把待測(cè)圖片和標(biāo)準(zhǔn)答案圖片模板圖片所有像素上的RGB數(shù)值進(jìn)行向量轉(zhuǎn)換并且實(shí)現(xiàn)flatten鋪平通過(guò)L1、L2向量距離計(jì)算公式來(lái)比對(duì)二者圖片間的向量差從而獲得二者圖像吻合度來(lái)判斷待測(cè)圖片是否是標(biāo)準(zhǔn)答案圖片的類(lèi)別。這就是非常古早的圖像分類(lèi)階段了。值得提一嘴的是往后所有的關(guān)于向量的計(jì)算待測(cè)圖片和模板圖片的向量元素必須是一致才能計(jì)算這是很基礎(chǔ)的數(shù)學(xué)底層邏輯就是2*2像素RGB通道的圖片不能和4*4像素CMYK的圖片進(jìn)行向量計(jì)算。L1距離計(jì)算曼哈頓距離 ManhattanL1距離計(jì)算其實(shí)就是把待測(cè)圖片和模板圖片所有像素點(diǎn)上的RGB值分別進(jìn)行相減并取絕對(duì)值然后把所有常量相加在一起此時(shí)相加的和越小說(shuō)明二者越接近。L2 距離計(jì)算歐氏距離 EuclideanL2距離計(jì)算其實(shí)是把待測(cè)土坯那和模板圖片所有像素點(diǎn)上的RGB值分別進(jìn)行相減再平方求和后再開(kāi)根同樣的值越小說(shuō)明二者越接近。在python中的代碼呈現(xiàn)就是import numpy as np # L1距離 l1_dist np.sum(np.abs(x - x_temp)) # L2距離 l2_dist np.sqrt(np.sum((x - x_temp)**2))L1、L2 向量距離計(jì)算是很初階的傳統(tǒng)計(jì)算機(jī)視覺(jué)比對(duì)手段直接計(jì)算兩張圖像向量之間的差異。之后進(jìn)階到線(xiàn)性分類(lèi)器有可訓(xùn)練的權(quán)重\(W、b\)依靠標(biāo)簽、損失、梯度下降迭代優(yōu)化正式邁入機(jī)器學(xué)習(xí)。 但線(xiàn)性分類(lèi)只是單層線(xiàn)性變換缺少非線(xiàn)性激活不屬于深度學(xué)習(xí)。真正的深度學(xué)習(xí)從多層網(wǎng)絡(luò) 非線(xiàn)性激活ReLU開(kāi)始只有同時(shí)具備多層可訓(xùn)練權(quán)重并且插入非線(xiàn)性激活函數(shù)模型才擁有擬合復(fù)雜現(xiàn)實(shí)模式的能力才算深度學(xué)習(xí)。2.手工特征 SVM這是深度學(xué)習(xí)大規(guī)模爆發(fā)之前工業(yè)界主流的圖像分類(lèi)流水線(xiàn)介于「原始像素 L1/L2 模板匹配」和「神經(jīng)網(wǎng)絡(luò)」中間的一代技術(shù)。手工特征hand?crafted feature直接拿原始像素做 L1/L2 距離效果很差圖片稍微平移、亮度變化距離直接亂掉。 于是人設(shè)計(jì)算法從圖片里提取更穩(wěn)定的信息HOG提取圖像邊緣、梯度方向物體輪廓SIFT提取關(guān)鍵點(diǎn)旋轉(zhuǎn)、縮放、光照變化依然相對(duì)穩(wěn)定流程輸入原圖 →運(yùn)行 HOG/SIFT 算法 →輸出一段特征向量。SVM 支持向量機(jī)Support Vector MachineSVM 是一個(gè)機(jī)器學(xué)習(xí)分類(lèi)器。 輸入上面提取好的特征向量輸出類(lèi)別青蛙 / 汽車(chē)。SVM 有可訓(xùn)練參數(shù)用標(biāo)注數(shù)據(jù)訓(xùn)練找到一個(gè)最優(yōu)的分割超平面把不同類(lèi)別分開(kāi)。SVM 干的活和我們之前學(xué)的線(xiàn)性分類(lèi)器非常像數(shù)學(xué)內(nèi)核都是找超平面做分類(lèi)只是損失函數(shù)不一樣。SVM是使用Hinge來(lái)計(jì)算損失函數(shù)而線(xiàn)性分類(lèi)s xW b是使用Softmax交叉熵?fù)p失。 把得分 s 轉(zhuǎn)成概率分布懲罰 “正確類(lèi)別概率不夠高”。from sklearn.svm import LinearSVC #線(xiàn)性SVM3.1單層線(xiàn)性分類(lèi)核心公式關(guān)于鋪平Flatten的概念贅述我們假設(shè)一張圖片是橫向2像素縱向2像素的RGB三通道圖片那么必定在每一個(gè)像素點(diǎn)上都會(huì)有對(duì)應(yīng)的RGB數(shù)值這樣就會(huì)形成一個(gè)矩陣而把這樣的一個(gè)矩陣平鋪成一個(gè)數(shù)組序列如[R1,,G1,B1,R2,G2,B2,R3,G3,B3,R4,G4,B4]就是所謂的鋪平Flatten把一個(gè)在二維層面的空間信息全部丟掉只保留所有元素的數(shù)值所以能夠看到當(dāng)張量shape 223被鋪平之后就會(huì)變成一維有序序列。其實(shí)對(duì)于單層線(xiàn)性分類(lèi)整體的核心公式并不難理解W是提前訓(xùn)練好的權(quán)重系數(shù)它里面包含了若干圖像標(biāo)簽的權(quán)重系數(shù)可以看作是標(biāo)準(zhǔn)答案利用鋪平后的一維向量與W權(quán)重系數(shù)進(jìn)行矩陣相乘。得出數(shù)值再和b偏置系數(shù)相加就得出該待測(cè)圖片與當(dāng)前標(biāo)簽的得分得分越高越屬于那一類(lèi)標(biāo)簽項(xiàng)。矩陣乘法那么接下來(lái)就慢慢搞懂幾個(gè)概念先首先是xW這里其實(shí)是矩陣乘法。其實(shí)更加標(biāo)準(zhǔn)應(yīng)該寫(xiě)成舉一個(gè)最極端的例子假設(shè)我們的待測(cè)圖片為橫向1像素縱向1像素RGB三通道圖片那么該圖片x.shape 1133個(gè)元素分別為R、G、B。我們W權(quán)重系數(shù)是2種分類(lèi)分別為青蛙和汽車(chē)所以要能對(duì)應(yīng)我們待測(cè)圖片使用的W權(quán)重系數(shù)必定也是每列三個(gè)元素。那么如果這個(gè)矩陣被鋪平將會(huì)得到一個(gè)一維序列[RGB]接下來(lái)需要和W權(quán)重系數(shù)進(jìn)行矩陣其實(shí)就是W權(quán)重當(dāng)中的W r_frog * R W g_frog * G W b_frog * B 這樣會(huì)得出S frog也就是待測(cè)圖片的得分?jǐn)?shù)值如下圖實(shí)際運(yùn)算就是這樣可以看出使用這套W權(quán)重計(jì)算結(jié)果Sfrog 19Scar 12.5明顯19更大所以待測(cè)圖片更加偏向于是Frog。那么問(wèn)題就來(lái)了對(duì)于x我們可以顯然易見(jiàn)得到假設(shè)待測(cè)圖片為橫向32像素縱向32像素RGB三通道圖片那么x.shape (32,32,3)一共3072維向量。3.2W權(quán)重系數(shù)但是W權(quán)重系數(shù)是怎么得來(lái)得呢這就很值得考究了。整體流程總覽初始化 W隨機(jī)給初始小數(shù)拿一批訓(xùn)練圖片前向傳播算出得分用損失函數(shù)衡量當(dāng)前這套 W 預(yù)測(cè)錯(cuò)得有多離譜求損失對(duì) W 每個(gè)元素的梯度往哪個(gè)方向改 W損失會(huì)變小使用梯度下降更新 W 里面每一個(gè)數(shù)值循環(huán) 2?5反復(fù)迭代直到損失不再明顯下降最后拿到訓(xùn)練完成的權(quán)重矩陣 WW 的初始化起點(diǎn)從哪里來(lái)W shape(輸入特征數(shù),類(lèi)別數(shù))例如 3 像素二分類(lèi)W(3,2)。 一開(kāi)始 W 全部填很小的隨機(jī)數(shù)不能全部填 0。如果 W 全部初始化為 0所有輸出得分全部一樣梯度全部為 0模型學(xué)不到任何東西。# numpy偽代碼 W 0.01 * np.random.randn(3,2) b np.zeros((2,))訓(xùn)練數(shù)據(jù)集修改 W 的依據(jù)我們手里有大量標(biāo)注好的圖片圖片 正確標(biāo)簽青蛙 / 汽車(chē)。W 不是憑空算出來(lái)W 的好壞完全由訓(xùn)練數(shù)據(jù)決定。 同樣網(wǎng)絡(luò)換一套訓(xùn)練圖片訓(xùn)練結(jié)束得到完全不一樣的 W 矩陣。每次循環(huán)拿若干張圖片mini?batch送入網(wǎng)絡(luò)\(X_{batch}\)每一行是一張鋪平后的圖片向量輸出 S 每一行是一張圖片各個(gè)類(lèi)別的得分。損失函數(shù) Loss衡量現(xiàn)在 W 有多差核心損失就是一把尺子數(shù)值越大 當(dāng)前 W 預(yù)測(cè)結(jié)果越離譜。 我們的目標(biāo)不斷修改 W讓 Loss 盡可能變小。修正W的兩大核心分別是數(shù)據(jù)損失和懲罰項(xiàng)。兩種常見(jiàn)損失① Softmax 交叉熵?fù)p失最常用把得分 s 經(jīng)過(guò) softmax 映射成 0~1 的概率再拿真實(shí)標(biāo)簽計(jì)算損失。如果正確類(lèi)別得分很高錯(cuò)誤類(lèi)別得分低 → loss 很小如果正確類(lèi)別得分很低其他類(lèi)別得分高 → loss 很大② SVM 鉸鏈損失看正確類(lèi)別得分要比錯(cuò)誤類(lèi)別得分高出一個(gè)安全間隔 margin達(dá)不到就產(chǎn)生損失。??Loss 是全部樣本的平均損失。 另外還要加上正則懲罰項(xiàng)L1/L2得到總損失所謂的正則化懲罰其實(shí)是為了防止W權(quán)重為了過(guò)渡貼合現(xiàn)有樣本當(dāng)出現(xiàn)新樣本與W權(quán)重系數(shù)差異很大但實(shí)際上又真的是該標(biāo)簽時(shí)W權(quán)重系數(shù)矩陣相乘出來(lái)得分就會(huì)出現(xiàn)誤判。值得注意的是這里的L1、L2是正則化計(jì)算跟最初階段的L1、L2向量距離計(jì)算不是同一樣?xùn)|西。很明顯看到L1、L2的正則化公式只針對(duì)W權(quán)重進(jìn)行計(jì)算與此前的向量距離計(jì)算很大不同。這里需要說(shuō)明下在當(dāng)中是作為人工寫(xiě)入的叫做正則化強(qiáng)度超參數(shù)用來(lái)控制「正則懲罰項(xiàng)」到底有多強(qiáng)。梯度告訴我們 W 往哪個(gè)方向調(diào)整其實(shí)之所以上一個(gè)步驟得到損失函數(shù)的目的L total其實(shí)最大的作用就是為了接下來(lái)判斷W該怎么再優(yōu)化調(diào)整.其實(shí)我是這么理解的,就是要求出W的正負(fù)變化對(duì)整體L total的影響是正還是負(fù),正如豆包所說(shuō)的,其實(shí)求導(dǎo)的最大目的并非是要知道怎么去調(diào)整W,更多的反而是知道我們現(xiàn)在這樣去調(diào)整W方向上是否正確,求導(dǎo)是要知道調(diào)整方向而并非知道調(diào)整量!!!這是最重要的點(diǎn).梯度下降更新 W獲取到dW之后,知道了W該往哪個(gè)方向調(diào)整之后,我們要開(kāi)始對(duì)W進(jìn)行調(diào)整,那么W需要循環(huán)優(yōu)化到什么地步為之最接近正確W呢.這就需要類(lèi)似計(jì)算邊際效用一樣去計(jì)算了,正如截圖中所示,和我們之前見(jiàn)過(guò)的其實(shí)都屬于人工超參數(shù),其邏輯都有點(diǎn)像永真循環(huán)中的跳出機(jī)制,為了避免計(jì)算無(wú)休止地進(jìn)行下去.然后這里會(huì)涉及到包括局部最小值和鞍點(diǎn)的知識(shí)點(diǎn),其最核心含義都是為了計(jì)算W在循環(huán)優(yōu)化中的函數(shù)曲線(xiàn)什么時(shí)候達(dá)到最平緩,最平緩就證明W權(quán)重系數(shù)已經(jīng)相當(dāng)接近最優(yōu)解了,那就可以停止運(yùn)算了.但是也值得注意鞍點(diǎn)和局部最小值的區(qū)別,兩者還是有差異的,這里就不作過(guò)多深入探討了.以上是計(jì)算梯度下降常用的工具.循環(huán)迭代epoch不斷重復(fù) 前向計(jì)算得分 → 算總損失 → 求梯度 dW → 更新 W 循環(huán)成千上萬(wàn)次。隨著迭代進(jìn)行 W 里面每一個(gè)數(shù)字被一點(diǎn)點(diǎn)打磨修改。 訓(xùn)練損失會(huì)持續(xù)下降模型分類(lèi)效果越來(lái)越好。什么時(shí)候停止訓(xùn)練訓(xùn)練集損失不再明顯下降看驗(yàn)證集精度當(dāng)驗(yàn)證集精度不再提升甚至開(kāi)始變差代表出現(xiàn)過(guò)擬合就要停止訓(xùn)練。不能只看訓(xùn)練集 loss訓(xùn)練 loss 很低但驗(yàn)證變差就是過(guò)擬合。這正是我們引入正則化的意義。其實(shí)這里就是接我們剛剛上一個(gè)步驟提到的利用梯度下降的規(guī)律來(lái)不斷循環(huán)計(jì)算優(yōu)化W權(quán)重系數(shù),等到W權(quán)重系數(shù)在優(yōu)化函數(shù)曲線(xiàn)中不再下降,達(dá)到平緩曲率就可以停止優(yōu)化了.超參數(shù)的定義全部不能梯度自動(dòng)算出需要人工調(diào)參其實(shí)在W權(quán)重系數(shù)的整體優(yōu)化運(yùn)算中,都會(huì)有好些人工填入的參數(shù),這里做一個(gè)簡(jiǎn)單的了解即可.訓(xùn)練完成之后W 拿來(lái)干什么見(jiàn)到來(lái)說(shuō)訓(xùn)練停止保存最終的 W、b。 訓(xùn)練到此結(jié)束不再修改 W。 推理預(yù)測(cè)新圖片 新圖片 flatten 得到 x執(zhí)行 \(\boldsymbol sxWb\)取得分最大類(lèi)別作為輸出。3.3單層線(xiàn)性分類(lèi)知識(shí)點(diǎn)梳理3.4單層線(xiàn)性分類(lèi)案例