Pytorch Document学习笔记
Pytorch Document學(xué)習(xí)筆記
- Pytorch Document學(xué)習(xí)筆記
- 1. 網(wǎng)絡(luò)層
- 1.1 torch.nn.Conv2d
- 1.2 torch.nn.MaxPool2d / torch.nn.MaxUnpool2d
- 1.3 torch.nn.ReLU
- 1.4 torch.nn.BatchNorm2d
- 2. 優(yōu)化器
- 2.1 torch.optim.SGD
- 2.2 torch.optim.Adagrad
- 2.3 torch.optim.RMSprop
- 2.4 torch.optim.Adam
- 3. 損失函數(shù)
- 3.1 torch.nn.L1Loss
- 3.2 torch.nn.MSELoss
- 3.3 torch.nn.CrossEntropyLoss
- 4. 初始化
- 4.1 torch.nn.init.uniform
- 4.2 torch.nn.init.normal
- 4.3 torch.nn.init.constant
- 4.4 torch.nn.init.xavier_uniform / torch.nn.init.xavier_normal
- 4.5 torch.nn.init.kaiming_uniform / torch.nn.init.kaiming_normal
Pytorch Document學(xué)習(xí)筆記
最近花了些時(shí)間補(bǔ)充了Pytorch相關(guān)的知識(shí),正好借著Pytorch的官方文檔補(bǔ)充下深度學(xué)習(xí)的基礎(chǔ)知識(shí),主要是看看Pytorch中封裝有哪些庫函數(shù),搞清楚這些庫函數(shù)后面具體使用的算法,由于面比較廣,可能深度不是很夠
1. 網(wǎng)絡(luò)層
1.1 torch.nn.Conv2d
卷積層的目的主要是提取特征,in_channels和out_channels分別控制著輸入通道和輸出通道的數(shù)量,kerner_size, stride和padding組合控制這卷積后輸出特征層的大小,另外:
dilation為空洞卷積的間隔,在圖像分割領(lǐng)域,在dilation提出來之前,主要通過pooling和up sampling來提高單個(gè)像素的感受野,dilation的主要作用就是在不用pooling的情況下也能夠增大像素的感受野,以達(dá)到更好的分割效果,如下圖所示:
groups為分組卷積,所謂分組卷積就是將32通道的卷積任務(wù)分為兩個(gè)16通道卷積進(jìn)行,主要作用是減少參數(shù)量,因?yàn)闇p少了參數(shù)量,對(duì)于網(wǎng)絡(luò)來說相當(dāng)于進(jìn)行了正則化。
bias為卷積偏置,偏置的存在主要是為兩個(gè)更好地?cái)M合數(shù)據(jù)
1.2 torch.nn.MaxPool2d / torch.nn.MaxUnpool2d
池化層的作用主要是去掉特征中的冗余信息,相當(dāng)于下采樣操作,當(dāng)return_indices設(shè)置為True時(shí),函數(shù)會(huì)輸出最大值的序號(hào),而最大反池化則等同于上采樣,輸入為最大池化操作的輸出以及序號(hào),將非最大值部分設(shè)置為0
pytorch中出來最大池化操作,池化操作還包括AvgPool2d, FractionalMaxPool2d, LPPool2d, AdaptiveMaxPool2d, AdaptiveAvgPool2d
1.3 torch.nn.ReLU
非線性激活層存在的目的是為了讓網(wǎng)絡(luò)對(duì)非線性的數(shù)學(xué)模型具有擬合效果,與其類似的激活函數(shù)還包括ELU, PReLU, LeakyReLU, Threshold, Sigmoid, Tanh等等等等
1.4 torch.nn.BatchNorm2d
批歸一化層相對(duì)來說會(huì)復(fù)雜一些,起主要目的是改變小批量數(shù)據(jù)的分布(均值和方差),批歸一化的位置如果放在激活層之前則是對(duì)節(jié)點(diǎn)的輸出進(jìn)行歸一化,如果放在激活后則是對(duì)下一個(gè)節(jié)點(diǎn)的輸入進(jìn)行歸一化,都是可以的,批歸一化層的公式如下y=x?mean?[x]Var?[x]+??gamma?+beta?y=\frac{x-\operatorname{mean}[x]}{\sqrt{\operatorname{Var}[x]}+\epsilon} * \text { gamma }+\text { beta } y=Var[x]?+?x?mean[x]???gamma?+?beta?其中meanmeanmean和varvarvar分別為批數(shù)據(jù)的均值和方差,gammagammagamma和betabetabeta為可以學(xué)習(xí)的參數(shù),在訓(xùn)練過程中通過反向傳播更新該參數(shù),而在預(yù)測過程中則將該參數(shù)固定,Batch Normalization(BN)超詳細(xì)解析對(duì)批歸一化層進(jìn)行了詳細(xì)的解釋,參考其總結(jié)一下加入批歸一層帶來的好處:
2. 優(yōu)化器
2.1 torch.optim.SGD
隨機(jī)梯度下降法的定義是隨機(jī)選取批量數(shù)據(jù)中單個(gè)樣本梯度進(jìn)行梯度下降,其優(yōu)勢是算法收斂速度快,但是精度會(huì)有所損失,在實(shí)際應(yīng)用為了權(quán)衡速度和精度,通常我們是批量樣本中隨機(jī)選取小批量樣本進(jìn)行梯度計(jì)算,例如我們隨機(jī)隨機(jī)了mmm個(gè)樣本{x(1),…,x(m)}\left\{x^{(1)}, \ldots, x^{(m)}\right\}{x(1),…,x(m)},對(duì)應(yīng)的目標(biāo)為y(i)y^{(i)}y(i),進(jìn)行梯度估計(jì)有g←1m?w∑iL(f(x(i);w),y(i))g \leftarrow \frac{1}{m} \nabla_{w} \sum_{i} L\left(f\left(x^{(i)} ;w \right), y^{(i)}\right)g←m1??w?i∑?L(f(x(i);w),y(i))進(jìn)行權(quán)重更新有w←w+gw \leftarrow w+gw←w+g隨機(jī)梯度下降法中有如下幾個(gè)參數(shù):
動(dòng)量因子momentum,在上面例子的基礎(chǔ)上,多了一步速度更新v←αv??gv \leftarrow \alpha v-\epsilon gv←αv??g然后在進(jìn)行權(quán)重更新w←w+vw \leftarrow w+vw←w+v這樣改進(jìn)之后,當(dāng)前時(shí)刻的梯度與歷史時(shí)刻梯度相似時(shí),這種趨勢在當(dāng)前時(shí)刻會(huì)加強(qiáng),如果不同,則當(dāng)前時(shí)刻的梯度方向減弱,由此動(dòng)量因子可以讓那些因?yàn)閷W(xué)習(xí)率太大而來回?cái)[動(dòng)的參數(shù)梯度前后抵消,從而阻止發(fā)散。
權(quán)重衰減系數(shù)weight_decay,該系數(shù)和L2正則化有關(guān),所謂L2正則化就是在代價(jià)函數(shù)后面再加上一個(gè)正則化項(xiàng)C=C0+λ2n∑ww2C=C_{0}+\frac{\lambda}{2 n} \sum_{w} w^{2} C=C0?+2nλ?w∑?w2L2正則化的作用主要是的權(quán)重www變小,防止過擬合。我們對(duì)加入L2正則化后的代價(jià)函數(shù)進(jìn)行推導(dǎo)有:?C?w=?C0?w+λnw\frac{\partial C}{\partial w}=\frac{\partial C_{0}}{\partial w}+\frac{\lambda}{n} w ?w?C?=?w?C0??+nλ?w?C?b=?C0?b\frac{\partial C}{\partial b}=\frac{\partial C_{0}}{\partial b}?b?C?=?b?C0??我們發(fā)現(xiàn),L2正則化后對(duì)偏置bbb沒有影響,但是對(duì)于權(quán)重www的更新有影響:KaTeX parse error: Undefined control sequence: \alphaC at position 56: …frac{\partial \?a?l?p?h?a?C?_{0}}{\partial …在不適用L2正則化時(shí),求導(dǎo)結(jié)果中的www之前的系數(shù)是1,而1?ηλn1-\frac{\eta \lambda}{n}1?nηλ?小于1,其效果是減小www,這就是權(quán)重衰減系數(shù)的由來,在he實(shí)際應(yīng)用中,學(xué)習(xí)率衰減通常有線性衰減(間隔固定epoch學(xué)習(xí)率減半)和指數(shù)衰減(間隔固定epoch學(xué)習(xí)率乘以0.9998)兩種。
Nesterov加速梯度是在動(dòng)量因子的基礎(chǔ)上可以進(jìn)一步加快收斂速度,使得收斂曲線更加穩(wěn)定,經(jīng)典動(dòng)量的公式如下:vt=αvt?1??g(wt?1)v_{t}=\alpha v_{t-1}-\epsilon g\left(w_{t-1}\right) vt?=αvt?1???g(wt?1?)wt=wt?1+vtw_{t}=w_{t-1}+v_{t} wt?=wt?1?+vt?
而Nesterov加速梯度后的公式如下:wt?1ahead=wt?1+μvt?1w_{t-1}^{a h e a d}=w_{t-1}+\mu v_{t-1} wt?1ahead?=wt?1?+μvt?1?vt=αvt?1??g(wt?1ahead)v_{t}=\alpha v_{t-1}-\epsilon g\left(w_{t-1}^{a h e a d}\right) vt?=αvt?1???g(wt?1ahead?)wt=wt?1+vtw_{t}=w_{t-1}+v_{t} wt?=wt?1?+vt?即Nesterov加速梯度中計(jì)算的梯度是在當(dāng)前權(quán)重加上累計(jì)速度后的梯度
2.2 torch.optim.Adagrad
Adagrad算法相對(duì)SGD算法能夠更加有效地收斂,能夠在數(shù)據(jù)分布系數(shù)的場景,更好利用系數(shù)梯度的信息,我們計(jì)算梯度有:g←1m?w∑iL(f(x(i);w),y(i))g \leftarrow \frac{1}{m} \nabla_{\boldsymbol{w}} \sum_{i} L\left(f\left(\boldsymbol{x}^{(i)} ; \boldsymbol{w}\right), \boldsymbol{y}^{(i)}\right) g←m1??w?i∑?L(f(x(i);w),y(i))累積平方梯度:r←r+g⊙gr \leftarrow r+g \odot g r←r+g⊙g計(jì)算更新Δθ←??δ+r⊙g\Delta \boldsymbol{\theta} \leftarrow-\frac{\epsilon}{\delta+\sqrt{r}} \odot g Δθ←?δ+r???⊙g應(yīng)用更新θ←θ+Δθ\theta \leftarrow \theta+\Delta \theta θ←θ+Δθ通常Adagrad算法一開始是激勵(lì)收斂的,后面慢慢就變成懲罰收斂,這也就導(dǎo)致了會(huì)出現(xiàn)學(xué)習(xí)綠收縮到太小而無法進(jìn)行有效收斂的情況
2.3 torch.optim.RMSprop
RMSprop算法與Adagrad算法唯一的不同就在于累積平方梯度的方法不同,其累積平方梯度的方式為:r←ρr+(1?ρ)g⊙gr \leftarrow \rho r+(1-\rho) g \odot g r←ρr+(1?ρ)g⊙g其實(shí)就是添加了一個(gè)衰減系數(shù)來控制歷史信息獲取多少,在該函數(shù)中同樣可以配置動(dòng)量因子momentum以及權(quán)重衰減系數(shù)weight_decay
2.4 torch.optim.Adam
Adam算法全稱為adaptive moment estimation,Adam算法其實(shí)就是momentum和RMSporp的結(jié)合,其通過計(jì)算梯度的一階矩估計(jì)和二階矩估計(jì)而為不同的參數(shù)設(shè)計(jì)獨(dú)立的自適應(yīng)學(xué)習(xí)率,具體算法如下,同樣先估計(jì)梯度:g←1m?w∑iL(f(x(i);w),y(i))\boldsymbol{g} \leftarrow \frac{1}{m} \nabla_{\boldsymbol{w}} \sum_{i} L\left(f\left(\boldsymbol{x}^{(i)} ; \boldsymbol{w}\right), \boldsymbol{y}^{(i)}\right) g←m1??w?i∑?L(f(x(i);w),y(i))然后是更新一階矩估計(jì),也就是momenturm項(xiàng):s←ρ1s+(1?ρ1)gs \leftarrow \rho_{1} s+\left(1-\rho_{1}\right) g s←ρ1?s+(1?ρ1?)g更新二階矩估計(jì),相當(dāng)于二階矩估計(jì):r←ρ2r+(1?ρ2)g⊙gr \leftarrow \rho_{2} r+\left(1-\rho_{2}\right) g \odot g r←ρ2?r+(1?ρ2?)g⊙g然后分別修正一階矩偏差和二階矩偏差s^←s1?ρ1t\hat{\boldsymbol{s}} \leftarrow \frac{\boldsymbol{s}}{1-\rho_{1}^{t}} s^←1?ρ1t?s?r^←r1?ρ2t\hat{\boldsymbol{r}} \leftarrow \frac{\boldsymbol{r}}{1-\rho_{2}^{t}} r^←1?ρ2t?r?然后逐元素計(jì)算更新Δθ=??s^r^+δ\Delta \theta=-\epsilon \frac{\hat{\boldsymbol{s}}}{\sqrt{\hat{\boldsymbol{r}}}+\delta} Δθ=??r^?+δs^?最后應(yīng)用更新:θ←θ+Δθ\theta \leftarrow \theta+\Delta \theta θ←θ+ΔθAdam算法的優(yōu)勢是適合解決大規(guī)模數(shù)據(jù)的參數(shù)優(yōu)化問題,同時(shí)適用于非穩(wěn)態(tài)目標(biāo)
pytorch中還有的優(yōu)化方法有Adadelta,Adamax,ASGD,LBFGS以及RProp
3. 損失函數(shù)
3.1 torch.nn.L1Loss
計(jì)算輸入xxx和目標(biāo)yyy之間的絕對(duì)值的平均值loss?(x,y)=1/n∑∣xi?yi∣\operatorname{loss}(x, y)=1 / n \sum \mid x_{i}-y_{i}| loss(x,y)=1/n∑∣xi??yi?∣
3.2 torch.nn.MSELoss
計(jì)算輸入xxx和目標(biāo)yyy之間的均方誤差loss?(x,y)=1/n∑(xi?yi)2\operatorname{loss}(x, y)=1 / n \sum\left(x_{i}-y_{i}\right)^{2} loss(x,y)=1/n∑(xi??yi?)2
3.3 torch.nn.CrossEntropyLoss
用于多分類器的交叉熵?fù)p失loss?(x,class?)=?log?exp?(x[class?])∑jexp?(x[j]))=?x[class?]+log?(∑jexp?(x[j]))\operatorname{loss}(x, \text { class })=-\log \frac{\exp (x[\text { class }])}{\left.\sum_{j} \exp (x[j])\right)} \quad=-x[\text { class }]+\log \left(\sum_{j} \exp (x[j])\right) loss(x,?class?)=?log∑j?exp(x[j]))exp(x[?class?])?=?x[?class?]+log(j∑?exp(x[j]))
pytorch中還有的損失函數(shù)有NLLLoss,KLDivLoss,BCELoss,MarginRankingLoss,HingeEmbeddingLoss,MultiLabelMarginLoss,SmoothL1Loss,SoftMarginLoss,MultiLabelSoftMarginLOss,CosineEmbeddingLoss,MultiMarginLoss
4. 初始化
4.1 torch.nn.init.uniform
從給定的上下界的均勻分布中生成值,然后填充入張量或者變量進(jìn)行初始化
4.2 torch.nn.init.normal
從給定的均值和方差的正態(tài)分布中生成值,然后填充入張量或者變量進(jìn)行初始化
4.3 torch.nn.init.constant
將給定的常量填充入張量或者變量進(jìn)行初始化
4.4 torch.nn.init.xavier_uniform / torch.nn.init.xavier_normal
為了使得網(wǎng)絡(luò)中信息更好的流動(dòng),每一層輸出的方差應(yīng)該盡量相同,這就是xavier算法的核心思想,對(duì)于一層卷積有
y=w1x1+?+wnixni+by=w_{1} x_{1}+\cdots+w_{n_{i}} x_{n_{i}}+b y=w1?x1?+?+wni??xni??+b其中nin_ini?表示輸入個(gè)數(shù),根據(jù)概率統(tǒng)計(jì)知識(shí)我們有如下方差公式:Var?(wixi)=E[wi]2Var?(xi)+E[xi]2Var?(wi)+Var?(wi)Var?(xi)\operatorname{Var}\left(w_{i} x_{i}\right)=E\left[w_{i}\right]^{2} \operatorname{Var}\left(x_{i}\right)+E\left[x_{i}\right]^{2} \operatorname{Var}\left(w_{i}\right)+\operatorname{Var}\left(w_{i}\right) \operatorname{Var}\left(x_{i}\right) Var(wi?xi?)=E[wi?]2Var(xi?)+E[xi?]2Var(wi?)+Var(wi?)Var(xi?)特別地,當(dāng)我們假設(shè)輸入和權(quán)重都是0均值時(shí)有Var?(wixi)=Var?(wi)Var?(xi)\operatorname{Var}\left(w_{i} x_{i}\right)=\operatorname{Var}\left(w_{i}\right) \operatorname{Var}\left(x_{i}\right) Var(wi?xi?)=Var(wi?)Var(xi?)進(jìn)一步假設(shè)輸入的xxx和www都是獨(dú)立同分布,則有:Var?(y)=niVar?(wi)Var?(xi)\operatorname{Var}(y)=n_{i} \operatorname{Var}\left(w_{i}\right) \operatorname{Var}\left(x_{i}\right) Var(y)=ni?Var(wi?)Var(xi?)于是,為了保證輸入與輸出方差一致,則應(yīng)該有:Var?(wi)=1ni\operatorname{Var}\left(w_{i}\right)=\frac{1}{n_{i}} Var(wi?)=ni?1?對(duì)于一個(gè)多層網(wǎng)絡(luò),某一層的方差可以用累計(jì)的形式表達(dá):Var?[zi]=Var?[x]∏i′=0i?1ni′Var?[Wi′]\operatorname{Var}\left[z^{i}\right]=\operatorname{Var}[x] \prod_{i^{\prime}=0}^{i-1} n_{i^{\prime}} \operatorname{Var}\left[W^{i^{\prime}}\right] Var[zi]=Var[x]i′=0∏i?1?ni′?Var[Wi′]反向傳播時(shí)具有類似的形式:Var?[?Cost??si]=Var?[?Cost??sd]∏i′=idni′+1Var?[Wi′]\operatorname{Var}\left[\frac{\partial \text { Cost }}{\partial s^{i}}\right]=\operatorname{Var}\left[\frac{\partial \text { Cost }}{\partial s^ozvdkddzhkzd}\right] \prod_{i^{\prime}=i}^ozvdkddzhkzd n_{i^{\prime}+1} \operatorname{Var}\left[W^{i^{\prime}}\right] Var[?si??Cost??]=Var[?sd??Cost??]i′=i∏d?ni′+1?Var[Wi′]則為了保證前向傳播和反向傳播時(shí)每一層的方差一致,則應(yīng)該滿足?i,niVar?[Wi]=1\forall i, \quad n_{i} \operatorname{Var}\left[W^{i}\right]=1 ?i,ni?Var[Wi]=1?i,ni+1Var?[Wi]=1\forall i, \quad n_{i+1} \operatorname{Var}\left[W^{i}\right]=1 ?i,ni+1?Var[Wi]=1但是實(shí)際中輸入和輸出的個(gè)數(shù)通常不相等,因此最終我們的權(quán)重方差應(yīng)該滿足:?i,Var?[Wi]=2ni+ni+1\forall i, \quad \operatorname{Var}\left[W^{i}\right]=\frac{2}{n_{i}+n_{i+1}} ?i,Var[Wi]=ni?+ni+1?2?對(duì)于[a, b]區(qū)間中的均勻分布的方差為:Var?=(b?a)212\operatorname{Var}=\frac{(b-a)^{2}}{12} Var=12(b?a)2?那么,滿足xavier算法的均勻分布是W~U[?6nj+nj+1,6nj+nj+1]W \sim U\left[-\frac{\sqrt{6}}{\sqrt{n_{j}+n_{j+1}}}, \frac{\sqrt{6}}{\sqrt{n_{j}+n_{j+1}}}\right] W~U[?nj?+nj+1??6??,nj?+nj+1??6??]同理我們可知滿足xavier算法的高斯分布是W~N[0,2nj+nj+1]W\sim N\left[0, \frac{\sqrt{2}}{\sqrt{n_{j}+n_{j+1}}}\right]W~N[0,nj?+nj+1??2??]
4.5 torch.nn.init.kaiming_uniform / torch.nn.init.kaiming_normal
上述xavier初始化的問題主要在只適用于線性激活函數(shù),但實(shí)際上,對(duì)于深層神經(jīng)網(wǎng)絡(luò)來說,線性激活函數(shù)沒有價(jià)值。kaiming算法就是針對(duì)是非線性的Relu激活函數(shù)設(shè)計(jì)的一種初始化方法。對(duì)于均值為0的輸出來說,Relu激活函數(shù)會(huì)將小于零的部分都置為0,這樣上述xavier初始化中均值為0的假設(shè)就不成立了,具體的推到可以參考論文Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification
pytorch中還有的初始化方式有eye,dirac,sparse
與50位技術(shù)專家面對(duì)面20年技術(shù)見證,附贈(zèng)技術(shù)全景圖總結(jié)
以上是生活随笔為你收集整理的Pytorch Document学习笔记的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 双目视觉——SGM中的动态规划
- 下一篇: Eigen有哪些需要注意的操作