pytorch教程龙曲良26-30
26什么是梯度1
導(dǎo)數(shù)(在給定方向的變化量)和偏微分(在給定的自變量上的變化量)都是標(biāo)量,只有大小沒有方向
梯度就是所有偏微分的向量,有方向有大小
函數(shù)梯度是一個(gè)向量,向量方向表示這個(gè)函數(shù)在當(dāng)前點(diǎn)的一個(gè)增長方向,向量的模/長度表示增長速率
這里的a是lr,這里初始化(0,0)剛好取到極小值
當(dāng)lr太大的話會更新太快跳到箭頭所指的地方,顯然不是我們想要的情況
27什么是梯度2
總是有z1>z2,就是凸函數(shù)(碗一樣),可以找到全局最優(yōu)解,但是這種情況在現(xiàn)實(shí)中不常見
存在多個(gè)局部最小值
resnet56
網(wǎng)絡(luò)很深可能平面會很粗糙陷入局部最小值,resnet56加了shortcut(走捷徑)使得平面變得光滑,這樣可以找到全局最小值
陷入鞍點(diǎn)
不是最大值也不是最小值,或者在x維度取局部最小值,在y維度上取局部最大值,比搜索到局部最小值更可怕,可能就陷在鞍點(diǎn)
Optimizer Performance哪些因素會影響搜索全局最小值的過程
? initialization status
? learning rate
? momentum#動量 怎么逃離局部最小值
? etc.
initialization status
圖一初始狀態(tài)從左邊開始,找到局部最小值;
初始狀態(tài)從右邊開始,找到全局最小值,而且二者搜索的步數(shù)也不同
初始化可以按照主流的初始化方法,何愷明初始方法
learning rate
lr太大 ,即步長太大可能會直接跨過最小值跨到另一邊去,這樣可能不收斂,所以lr要設(shè)置小一點(diǎn),0.01,0.001,如果收斂可以大一點(diǎn)這樣收斂速度快一點(diǎn)。lr不僅影響速度還影響精度,lr過大可能會使得在最小值附近震蕩,不能達(dá)到最小值,所以應(yīng)該設(shè)置再小一點(diǎn)
momentum
逃出局部最小值
可能會在一個(gè)小坑里徘徊但是如果慣性夠大就可以沖出去,到達(dá)更小的坑去
28常見函數(shù)的梯度
單層感知機(jī)
29激活函數(shù)與loss的梯度1
問題:單層感知機(jī)激活函數(shù)不可導(dǎo)
sigmoid/logistic
sigmoid函數(shù)的求導(dǎo),可以求出一個(gè)其對x的導(dǎo)數(shù),且其連續(xù)光滑,把負(fù)無窮到正無窮的值壓縮在0-1之間,如概率和RGB像素點(diǎn)。問題是:趨向正無窮,導(dǎo)數(shù)接近于0,loss的值長時(shí)間得不到更新,梯度離散。
torch.nn.function as F
Tanh[-1,1]
Relu
非常適合做deep learning,所以都優(yōu)先使用relu函數(shù)
因?yàn)閤>0 梯度是1
保持梯度不變,減少出現(xiàn)梯度離散或梯度爆炸的情況
30激活函數(shù)與loss的梯度2
Typical Loss
? Mean Squared Error
? Cross Entropy Loss
? binary
? multi-class
? +softmax
? Leave it to Logistic Regression Part
如果使用torch.norm的函數(shù)要要這樣使用(因?yàn)槠淠J(rèn)是L2-norm,有開方),要加一個(gè)平方:torch.norm(y-pred,2).pow(2)
w初始化為一個(gè)長度為1 ,維度為1,值為2的一個(gè)tensor
backward會記錄這個(gè)圖的所有路徑,在最后結(jié)點(diǎn)調(diào)用backward會自動的從后往前傳播,完成這條路上所有需要梯度的計(jì)算,會把這些梯度信息附加每個(gè)tensor的成員.grad上 如w.grad和b.grad
注意要區(qū)分w.norm()還是w.grad.norm()
torch.autograd.grad()返回的是各個(gè)w的梯度的列表
loss.backward() 可是直接指定wi.grad
總結(jié)
以上是生活随笔為你收集整理的pytorch教程龙曲良26-30的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pytorch教程龙曲良21-25
- 下一篇: pytorch教程龙曲良31-35