導(dǎo)讀
本文總結(jié)了一些秋招面試中會遇到的問題和一些重要的知識點,適合面試前突擊和鞏固基礎(chǔ)知識。
前言
最近這段時間正臨秋招,這篇文章是老潘在那會找工作過程中整理的一些重要知識點,內(nèi)容比較雜碎,部分采集于網(wǎng)絡(luò),簡單整理下發(fā)出來,適合面試前突擊,當(dāng)然也適合鞏固基礎(chǔ)知識。另外推薦大家一本叫做《百面機(jī)器學(xué)習(xí)》的新書,2018年8月份出版的,其中包括了很多機(jī)器學(xué)習(xí)、深度學(xué)習(xí)面試過程中會遇到的問題,比較適合需要準(zhǔn)備面試的機(jī)器學(xué)習(xí)、深度學(xué)習(xí)方面的算法工程師,當(dāng)然也同樣適合鞏固基礎(chǔ)~有時間一定要需要看的書籍:
- 程序員的數(shù)學(xué)系列,適合重溫知識,回顧一些基礎(chǔ)的線性代數(shù)、概率論。
- 深度學(xué)習(xí)花書,總結(jié)類書,有基礎(chǔ)知識的講解,比較全面。
- 統(tǒng)計學(xué)習(xí)方法,總結(jié)類書,篇幅不長,都是核心。
- Pattern Recognition and Machine Learning,條理清晰,用貝葉斯的方式來講解機(jī)器學(xué)習(xí)。
- 機(jī)器學(xué)習(xí)西瓜書,適合當(dāng)教材,內(nèi)容較廣但是不深。
常見的常識題
- L1正則可以使少數(shù)權(quán)值較大,多數(shù)權(quán)值為0,得到稀疏的權(quán)值;L2正則會使權(quán)值都趨近于0但非零,得到平滑的權(quán)值;
- 在AdaBoost算法中,被錯分的樣本的權(quán)重更新比例的公式相同;
- Boosting和Bagging都是組合多個分類器投票的方法,但Boosting是根據(jù)單個分類器的正確率決定其權(quán)重,Bagging是可簡單地設(shè)置所有分類器權(quán)重相同;
- EM算法不能保證找到全局最優(yōu)值;
- SVR中核函數(shù)寬度小欠擬合,寬度大容易過擬合
- PCA和LDA都是經(jīng)典的降維算法。PCA是無監(jiān)督的,也就是訓(xùn)練樣本不需要標(biāo)簽;LDA是有監(jiān)督的,也就是訓(xùn)練樣本需要標(biāo)簽。PCA是去除掉原始數(shù)據(jù)中冗余的維度,而LDA是尋找一個維度,使得原始數(shù)據(jù)在該維度上投影后不同類別的數(shù)據(jù)盡可能分離開來。
PCA是一種正交投影,它的思想是使得原始數(shù)據(jù)在投影子空間的各個維度的方差最大。假設(shè)我們要將N維的數(shù)據(jù)投影到M維的空間上(M
關(guān)于K近鄰算法的知識有很多,比如算法執(zhí)行的步驟、應(yīng)用領(lǐng)域以及注意事項,不過相信很多人對K近鄰算法的使用注意事項不是很清楚。在這篇文章中我們針對這個問題進(jìn)行解答,帶大家來好好了解一下k近鄰算法的注意事項以及K近鄰算法的優(yōu)點與缺點。
K近鄰算法的使用注意事項具體就是使用距離作為度量時,要保證所有特征在數(shù)值上是一個數(shù)量級上,以免距離的計算被數(shù)量級大的特征所主導(dǎo)。在數(shù)據(jù)標(biāo)準(zhǔn)化這件事上,還要注意一點,訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集一定要使用同一標(biāo)準(zhǔn)的標(biāo)準(zhǔn)化。其中的原因總的來說就有兩點內(nèi)容,第一就是標(biāo)準(zhǔn)化其實可以視為算法的一部分,既然數(shù)據(jù)集都減去了一個數(shù),然后除以一個數(shù),這兩個數(shù)對于所有的數(shù)據(jù)來說,就要一視同仁。第二就是訓(xùn)練數(shù)據(jù)集其實很少,在預(yù)測新樣本的時候,新樣本就更少得可憐,如果新樣本就一個數(shù)據(jù),它的均值就是它自己,標(biāo)準(zhǔn)差是0,這根本就不合理。
K近鄰算法的優(yōu)點具體體現(xiàn)在四方面。第一就就是k近鄰算法是一種在線技術(shù),新數(shù)據(jù)可以直接加入數(shù)據(jù)集而不必進(jìn)行重新訓(xùn)練,第二就是k近鄰算法理論簡單,容易實現(xiàn)。第三就是準(zhǔn)確性高,對異常值和噪聲有較高的容忍度。第四就是k近鄰算法天生就支持多分類,區(qū)別與感知機(jī)、邏輯回歸、SVM。
K近鄰算法的缺點,基本的 k近鄰算法每預(yù)測一個“點”的分類都會重新進(jìn)行一次全局運(yùn)算,對于樣本容量大的數(shù)據(jù)集計算量比較大。而且K近鄰算法容易導(dǎo)致維度災(zāi)難,在高維空間中計算距離的時候,就會變得非常遠(yuǎn);樣本不平衡時,預(yù)測偏差比較大,k值大小的選擇得依靠經(jīng)驗或者交叉驗證得到。k的選擇可以使用交叉驗證,也可以使用網(wǎng)格搜索。k的值越大,模型的偏差越大,對噪聲數(shù)據(jù)越不敏感,當(dāng) k的值很大的時候,可能造成模型欠擬合。k的值越小,模型的方差就會越大,當(dāng) k的值很小的時候,就會造成模型的過擬合。
如果讓你寫一個高斯模糊的函數(shù),你該怎么寫呢?
kmeans的收斂性?
其實是這樣的,先分布到n臺機(jī)器上,要保證k個初始化相同,經(jīng)過一次迭代后,拿到k*n個新的mean,放到一臺新的機(jī)器上,因為初始化相同,所以mean的排列相同,然后對屬于每個類的n個mean做加權(quán)平均,再放回每臺機(jī)器上做下一步迭代。
K值的選擇:
KNN中的K值選取對分類的結(jié)果影響至關(guān)重要,K值選取的太小,模型太復(fù)雜。K值選取的太大,導(dǎo)致分類模糊。那么K值到底怎么選取呢?有人用Cross Validation,有人用貝葉斯,還有的用bootstrap。而距離度量又是另外一個問題,比較常用的是選用歐式距離??墒沁@個距離真的具有普適性嗎?《模式分類》中指出歐式距離對平移是敏感的,這點嚴(yán)重影響了判定的結(jié)果。在此必須選用一個對已知的變換(比如平移、旋轉(zhuǎn)、尺度變換等)不敏感的距離度量。書中提出了采用切空間距離(tangent distance)來替代傳統(tǒng)的歐氏距離。
有監(jiān)督:
無監(jiān)督:
生成式模型:LDA KNN 混合高斯 貝葉斯 馬爾科夫 深度信念 判別式模型:SVM NN LR CRF CART
邏輯回歸即LR。LR預(yù)測數(shù)據(jù)的時候,給出的是一個預(yù)測結(jié)果為正類的概率,這個概率是通過sigmoid函數(shù)將wTx映射到[0,1]得到的,對于wTx正的很大時(可以認(rèn)為離決策邊界很遠(yuǎn)),得到為正類的概率趨近于1;對于wTx負(fù)的很大時(可以認(rèn)為離決策邊界很遠(yuǎn)),得到為正類的概率趨近于0。在LR中,跟“與決策邊界距離”扯得上關(guān)系的僅此而已。在參數(shù)w求解過程中完全沒有與決策邊界距離的影子,所有樣本都一視同仁。和感知機(jī)的不同之處在于,LR用到與決策邊界的距離,是用來給預(yù)測結(jié)果一個可以看得到的置信區(qū)間。感知機(jī)里面沒有這一考慮,只根據(jù)符號來判斷。而SVM更進(jìn)一步,在參數(shù)的求解過程中,便舍棄了距離決策邊界過遠(yuǎn)的點。LR和感知機(jī)都很容易過擬合,只有SVM加入了L2范數(shù)之后的結(jié)構(gòu)化風(fēng)險最小化策略才解決了過擬合的問題??偨Y(jié)之:
邏輯回歸只能解決二分類問題,多分類用softmax。相關(guān)參考鏈接
Bagging和Boosting的區(qū)別:
Bagging 是 Bootstrap Aggregating 的簡稱,意思就是再取樣 (Bootstrap) 然后在每個樣本上訓(xùn)練出來的模型取平均,所以是降低模型的 variance. Bagging 比如 Random Forest 這種先天并行的算法都有這個效果。Boosting 則是迭代算法,每一次迭代都根據(jù)上一次迭代的預(yù)測結(jié)果對樣本進(jìn)行加權(quán),所以隨著迭代不斷進(jìn)行,誤差會越來越小,所以模型的 bias 會不斷降低High variance 是model過于復(fù)雜overfit,記住太多細(xì)節(jié)noise,受outlier影響很大;high bias是underfit,model過于簡單,cost function不夠好。boosting是把許多弱的分類器組合成一個強(qiáng)的分類器。弱的分類器bias高,而強(qiáng)的分類器bias低,所以說boosting起到了降低bias的作用。variance不是boosting的主要考慮因素。bagging是對許多強(qiáng)(甚至過強(qiáng))的分類器求平均。在這里,每個單獨(dú)的分類器的bias都是低的,平均之后bias依然低;而每個單獨(dú)的分類器都強(qiáng)到可能產(chǎn)生overfitting的程度,也就是variance高,求平均的操作起到的作用就是降低這個variance。Bagging算法的代表:RandomForest隨機(jī)森林算法的注意點:
咱們機(jī)器學(xué)習(xí)升級版的隨機(jī)森林章節(jié),我用白板寫了寫這個公式:p = 1 - (1 - 1/N)^N,其意義是:一個樣本在一次決策樹生成過程中,被選中作為訓(xùn)練樣本的概率,當(dāng)N足夠大時,約等于63.2%。簡言之,即一個樣本被選中的概率是63.2%,根據(jù)二項分布的的期望,這意味著大約有63.2%的樣本被選中。即有63.2%的樣本是不重復(fù)的,有36.8%的樣本可能沒有在本次訓(xùn)練樣本集中。隨機(jī)森林是一個包含多個決策樹的分類器,并且其輸出的類別是由個別樹輸出的類別的眾數(shù)而定。隨機(jī)森林的隨機(jī)性體現(xiàn)在每顆樹的訓(xùn)練樣本是隨機(jī)的,樹中每個節(jié)點的分裂屬性集合也是隨機(jī)選擇確定的。有了這2個隨機(jī)的保證,隨機(jī)森林就不會產(chǎn)生過擬合的現(xiàn)象了。隨機(jī)森林是用一種隨機(jī)的方式建立的一個森林,森林是由很多棵決策樹組成的,每棵樹所分配的訓(xùn)練樣本是隨機(jī)的,樹中每個節(jié)點的分裂屬性集合也是隨機(jī)選擇確定的。
相關(guān)的notebook除了cs231n也可以看這里。
面試見得比較少,感興趣的可以看下:
降采樣是手段不是目的:
降采樣的理論意義,我簡單朗讀一下,它可以增加對輸入圖像的一些小擾動的魯棒性,比如圖像平移,旋轉(zhuǎn)等,減少過擬合的風(fēng)險,降低運(yùn)算量,和增加感受野的大小。相關(guān)鏈接:為什么深度學(xué)習(xí)中的圖像分割要先編碼再解碼?
最大池化提取邊緣等“最重要”的特征,而平均池化提取的特征更加smoothly。對于圖像數(shù)據(jù),你可以看到差異。雖然兩者都是出于同樣的原因使用,但我認(rèn)為max pooling更適合提取極端功能。平均池有時不能提取好的特征,因為它將全部計入并計算出平均值,這對于對象檢測類型任務(wù)可能不好用但使用
在實際使用中,全連接層可由卷積操作實現(xiàn):對前層是全連接的全連接層可以轉(zhuǎn)化為卷積核為1x1的卷積;而前層是卷積層的全連接層可以轉(zhuǎn)化為卷積核為hxw的全局卷積,h和w分別為前層卷積結(jié)果的高和寬使用 global average pooling 全局平均池化來代替卷積
那么,1*1卷積的主要作用有以下幾點:
看這個問題的回答https://www.zhihu.com/question/56024942/answer/369745892
看這個問題的回答https://www.zhihu.com/question/41037974/answer/150522307
對于兩路輸入來說,如果是通道數(shù)相同且后面帶卷積的話,add等價于concat之后對應(yīng)通道共享同一個卷積核。下面具體用式子解釋一下。由于每個輸出通道的卷積核是獨(dú)立的,我們可以只看單個通道的輸出。假設(shè)兩路輸入的通道分別為X1, X2, ..., Xc和Y1, Y2, ..., Yc。那么concat的單個輸出通道為(*表示卷積):
而add的單個輸出通道為:
因此add相當(dāng)于加了一種prior,當(dāng)兩路輸入可以具有“對應(yīng)通道的特征圖語義類似”(可能不太嚴(yán)謹(jǐn))的性質(zhì)的時候,可以用add來替代concat,這樣更節(jié)省參數(shù)和計算量(concat是add的2倍)。FPN[1]里的金字塔,是希望把分辨率最小但語義最強(qiáng)的特征圖增加分辨率,從性質(zhì)上是可以用add的。如果用concat,因為分辨率小的特征通道數(shù)更多,計算量是一筆不少的開銷。https://www.zhihu.com/question/306213462/answer/562776112
SSD是直接分類,而FasterRcnn是先判斷是否為背景再進(jìn)行分類。一個是直接細(xì)分類,一個是先粗分類再細(xì)分類。
反向傳播原理看CS231n中的BP過程,以及Jacobian的傳播。
在百面深度學(xué)習(xí)中有相應(yīng)的章節(jié)。
有一篇文章比較好的介紹了,還有在那本電子版CNNbook中也有。
多層神經(jīng)網(wǎng)絡(luò)通常存在像懸崖一樣的結(jié)構(gòu),這是由于幾個較大的權(quán)重相乘導(dǎo)致的。遇到斜率很大的懸崖結(jié)構(gòu),梯度更新會很大程序地改變參數(shù)值,通常會完全跳過這類懸崖的結(jié)構(gòu)?;〞鳳177.
http://ai.51cto.com/art/201710/555389.htm
https://blog.csdn.net/xs11222211/article/details/82931120#commentBox
這個講的比較好(TP與FP和ROC曲線):
精確率是指分類正確的正樣本個數(shù)占分類器判定為正樣本的樣本個數(shù)的比例。召回率是指分類正確的正樣本個數(shù)占真正的正樣本個數(shù)的比例。Precision值和Recall值是既矛盾又統(tǒng)一的兩個指標(biāo),為了提高Precision值,分類器需要盡量在“更有把握”時才把樣本預(yù)測為正樣本,但此時往往會因為過于保守而漏掉很多“沒有把握”的正樣本,導(dǎo)致Recall值很低。如何權(quán)衡這兩個值,所以出現(xiàn)了PR曲線、ROC曲線以及F1 score等更多的標(biāo)準(zhǔn)來進(jìn)行判斷。https://www.cnblogs.com/xuexuefirst/p/8858274.html
Yolov2相比Yolov1因為采用了先驗框(Anchor Boxes),模型的召回率大幅提升,同時map輕微下降了0.2。
https://segmentfault.com/a/1190000014829322
https://www.cnblogs.com/eilearn/p/9071440.html
https://blog.csdn.net/zdh2010xyz/article/details/54293298
空洞卷積一般都伴有padding,如果dilation=6,那么padding也等于6。通過空洞卷積后的卷積特征圖的大小不變,但是這個卷積的感受野比普通同等大小的卷積大。不過通道數(shù)是可以改變的。
但是要注意,由于空洞卷積本身不會增大運(yùn)算量,但是后續(xù)的分辨率沒有減小,后面的計算量就間接變大了。https://zhuanlan.zhihu.com/p/52476083
具體問題具體分析。
如果模型的實際容量比較大,那么可以說模型可以完全學(xué)習(xí)到整個數(shù)據(jù)集,會發(fā)生過擬合。這時候再添加新的數(shù)據(jù)進(jìn)去,模型的性能會進(jìn)一步提升,說明模型還沒有被撐死。期望風(fēng)險是模型關(guān)于聯(lián)合分布的期望損失,經(jīng)驗風(fēng)險是模型關(guān)于訓(xùn)練數(shù)據(jù)集的平均損失。根據(jù)大樹定律,當(dāng)樣本容量N趨于無窮時,經(jīng)驗風(fēng)險趨于期望風(fēng)險。但是當(dāng)樣本的容量比較小的的時候,經(jīng)驗風(fēng)險最小化學(xué)習(xí)的效果未必就會很好,會產(chǎn)生“過擬合”的現(xiàn)象。結(jié)構(gòu)風(fēng)險最小化是為了防止過擬合而提出的策略。
https://lilianweng.github.io/lil-log/2019/03/14/are-deep-neural-networks-dramatically-overfitted.html
https://www.jianshu.com/p/97aafe479fa1(重要)
在Pytorch中只能在optim中設(shè)置weight_decay,目前只支持L2正則,而且這個正則是針對模型中所有的參數(shù),不論是w還是b,也包括BN中的W和b。
就是因為 batch norm 過后, weight 影響沒那么重了,所以 l2 weight decay 的效果就不明顯了。證明了L2正則化與歸一化相結(jié)合時沒有正則化效應(yīng)。相反,正則化會影響權(quán)重的范圍,從而影響有效學(xué)習(xí)率。
https://www.cnblogs.com/makefile/p/batch-norm.html?utm_source=debugrun&utm_medium=referral
空間金字塔池化(SSP)可以使不同尺寸的圖像產(chǎn)生固定的輸出維度。借題也問個問題,為什么fast rcnn的roi pooling是一個max pooling呢?roi pooling后面也是做單個roi的classification,為啥不和classification的pooling不同?我直覺是看feature map中的一個channel,提取全局特征(如,做classification)用average pooling,提取提取全局信息;提取局部特征(如,roi pooling)應(yīng)該用max pooling,提取局部最明顯的特征,成為7×7的grid后交給后面的fc來做classification。相關(guān)介紹:
https://zhuanlan.zhihu.com/p/71231560
因為作者提出了一種方案,同時改變了多個條件/參數(shù),他在接下去的消融實驗中,會一一控制一個條件/參數(shù)不變,來看看結(jié)果,到底是哪個條件/參數(shù)對結(jié)果的影響更大。下面這段話摘自知乎,@人民藝術(shù)家:你朋友說你今天的樣子很帥,你想知道發(fā)型、上衣和褲子分別起了多大的作用,于是你換了幾個發(fā)型,你朋友說還是挺帥的,你又換了件上衣,你朋友說不帥了,看來這件衣服還挺重要的。
https://oldpan.me/archives/write-hard-nms-c
線性回歸:通過均方誤差來尋找最優(yōu)的參數(shù),然后通過最小二乘法來或者梯度下降法估計:
注意:
來源文章:
對于凸函數(shù)來說,局部最優(yōu)就是全局最優(yōu),相關(guān)鏈接:http://sofasofa.io/forum_main_post.php?postid=1000329
http://sofasofa.io/forum_main_post.php?postid=1000322Logistic classification with cross-entropy
https://zhuanlan.zhihu.com/p/61440116
https://www.zhihu.com/question/65044831/answer/227262160
不看必進(jìn)坑~不論是訓(xùn)練還是部署都會讓你踩坑的Batch Normalization
Batch size過小會使Loss曲線振蕩的比較大,大小一般按照2的次冪規(guī)律選擇,至于為什么?沒有答出來,面試官后面解釋是為了硬件計算效率考慮的,海哥后來也說GPU訓(xùn)練的時候開的線程是2的次冪個神經(jīng)網(wǎng)絡(luò)的本質(zhì)是學(xué)習(xí)數(shù)據(jù)的分布,如果訓(xùn)練數(shù)據(jù)與測試數(shù)據(jù)的分布不同則會大大降低網(wǎng)絡(luò)的泛化能力。隨著網(wǎng)絡(luò)訓(xùn)練的進(jìn)行,每個隱層的變化使得后一層的輸入發(fā)生變化,從而每一批訓(xùn)練的數(shù)據(jù)的分布也會變化,致使網(wǎng)絡(luò)在每次迭代過程中都需要擬合不同的數(shù)據(jù)分布,增加數(shù)據(jù)訓(xùn)練的復(fù)雜度和過擬合的風(fēng)險。
對數(shù)據(jù)的劇烈變化有抵抗能力。
要注意BN在卷積網(wǎng)絡(luò)層中,因為參數(shù)的共享機(jī)制,每一個卷積核的參數(shù)在不同位置的神經(jīng)元當(dāng)中是共享的,因此也應(yīng)該被歸一化。(具體看一下實現(xiàn)過程)https://leonardoaraujosantos.gitbooks.io/artificial-inteligence/batch_norm_layer.html但是在訓(xùn)練過程中如果batch-size不大的話,可以不使用BN(MaskRcnn這樣說的)。至此,關(guān)于Batch Normalization的理論與實戰(zhàn)部分就介紹道這里??偟膩碚f,BN通過將每一層網(wǎng)絡(luò)的輸入進(jìn)行normalization,保證輸入分布的均值與方差固定在一定范圍內(nèi),減少了網(wǎng)絡(luò)中的Internal Covariate Shift問題,并在一定程度上緩解了梯度消失,加速了模型收斂;并且BN使得網(wǎng)絡(luò)對參數(shù)、激活函數(shù)更加具有魯棒性,降低了神經(jīng)網(wǎng)絡(luò)模型訓(xùn)練和調(diào)參的復(fù)雜度;最后BN訓(xùn)練過程中由于使用mini-batch的mean/variance作為總體樣本統(tǒng)計量估計,引入了隨機(jī)噪聲,在一定程度上對模型起到了正則化的效果。
BN與貝葉斯的關(guān)系:
在實踐中,我發(fā)現(xiàn),跨卡同步的BN對于performance相當(dāng)有用。尤其是對于detection,segmentation任務(wù),本來Batch size較小。如果Batch Norm能跨卡同步的話,就相當(dāng)于增大了Batch Norm的batch size 這樣能估計更加準(zhǔn)確的mean和variance,所以這個操作能提升performance。
跨卡同步BN的關(guān)鍵是在前向運(yùn)算的時候拿到全局的均值和方差,在后向運(yùn)算時候得到相應(yīng)的全局梯度。最簡單的實現(xiàn)方法是先同步求均值,再發(fā)回各卡然后同步求方差,但是這樣就同步了兩次。實際上只需要同步一次就可以,我們使用了一個非常簡單的技巧,改變方差的公式(公式是圖片,具體大家自己網(wǎng)上搜一下SyncBN)。這樣在前向運(yùn)算的時候,我們只需要在各卡上算出與,再跨卡求出全局的和即可得到正確的均值和方差, 同理我們在后向運(yùn)算的時候只需同步一次,求出相應(yīng)的梯度與。我們在最近的論文Context Encoding for Semantic Segmentation 里面也分享了這種同步一次的方法。有了跨卡BN我們就不用擔(dān)心模型過大用多卡影響收斂效果了,因為不管用多少張卡只要全局的批量大小一樣,都會得到相同的效果。
出現(xiàn)因素:
原因,誤差傳播公式可以寫成參數(shù)W和導(dǎo)數(shù)F連乘的形式,當(dāng)誤差由第L層傳播到輸入以外的第一個隱含層的時候,會涉及到很多很多的參數(shù)和導(dǎo)數(shù)的連乘,這時誤差很容易產(chǎn)生消失或者膨脹,導(dǎo)致不容易學(xué)習(xí),擬合能力和泛化能力較差。殘差層中的F層只需要擬合輸入x與目標(biāo)輸出H的殘差H-x即可,如果某一層的輸出已經(jīng)較好地擬合了期望結(jié)果,那么多一層也不回使得模型變得更差,因為該層的輸出直接被短接到兩層之后,相當(dāng)于直接學(xué)習(xí)了一個恒等映射,而跳過的兩層只需要擬合上層輸出和目標(biāo)之間的殘差即可。
resnet其實無法真正的實現(xiàn)梯度消失,這里面有很強(qiáng)的先驗假設(shè),并且resnet真正起作用的層只在中間,深層作用比較小(到了深層就是恒等映射了),feature存在利用不足的現(xiàn)象,add的方式阻礙了梯度和信息的流通。
L1正則可以使少數(shù)權(quán)值較大,多數(shù)權(quán)值為0,得到稀疏的權(quán)值;L2正則會使權(quán)值都趨近于0但非零,得到平滑的權(quán)值;https://zhuanlan.zhihu.com/p/35356992
目前的權(quán)重初始化分為三類:
初始化,說白了就是構(gòu)建一個平滑的局部幾何空間從而使得優(yōu)化更簡單xavier分布解析:
假設(shè)使用的是sigmoid函數(shù)。當(dāng)權(quán)重值(值指的是絕對值)過小,輸入值每經(jīng)過網(wǎng)絡(luò)層,方差都會減少,每一層的加權(quán)和很小,在sigmoid函數(shù)0附件的區(qū)域相當(dāng)于線性函數(shù),失去了DNN的非線性性。當(dāng)權(quán)重的值過大,輸入值經(jīng)過每一層后方差會迅速上升,每層的輸出值將會很大,此時每層的梯度將會趨近于0. xavier初始化可以使得輸入值x 方差經(jīng)過網(wǎng)絡(luò)層后的輸出值y方差不變。
在pytorch中默認(rèn)的權(quán)重初始化方式是何凱明的那個,舉個例子:
差不多這幾個懂了就OK。
可以看老潘的這篇文章:
那么,如何用softmax和sigmoid來做多類分類和多標(biāo)簽分類呢?
1、如何用softmax做多分類和多標(biāo)簽分類 現(xiàn)假設(shè),神經(jīng)網(wǎng)絡(luò)模型最后的輸出是這樣一個向量logits=[1,2,3,4], 就是神經(jīng)網(wǎng)絡(luò)最終的全連接的輸出。這里假設(shè)總共有4個分類。用softmax做多分類的方法:
2、如何用sigmoid做多標(biāo)簽分類 sigmoid一般不用來做多類分類,而是用來做二分類的,它是將一個標(biāo)量數(shù)字轉(zhuǎn)換到[0,1]之間,如果大于一個概率閾值(一般是0.5),則認(rèn)為屬于某個類別,否則不屬于某個類別。那么如何用sigmoid來做多標(biāo)簽分類呢?其實就是針對logits中每個分類計算的結(jié)果分別作用一個sigmoid分類器,分別判定樣本是否屬于某個類別。同樣假設(shè),神經(jīng)網(wǎng)絡(luò)模型最后的輸出是這樣一個向量logits=[1,2,3,4], 就是神經(jīng)網(wǎng)絡(luò)最終的全連接的輸出。這里假設(shè)總共有4個分類。
為了消除數(shù)據(jù)特征之間的量綱影響在實際應(yīng)用中,通過梯度下降法求解的模型通常是需要數(shù)據(jù)歸一化的,包括線性回歸、邏輯回歸、支持向量機(jī)、神經(jīng)網(wǎng)絡(luò)等,但是決策模型不是很適用。
首先,假設(shè)你知道訓(xùn)練集和測試集的關(guān)系。簡單來講是我們要在訓(xùn)練集上學(xué)習(xí)一個模型,然后拿到測試集去用,效果好不好要根據(jù)測試集的錯誤率來衡量。但很多時候,我們只能假設(shè)測試集和訓(xùn)練集的是符合同一個數(shù)據(jù)分布的,但卻拿不到真正的測試數(shù)據(jù)。這時候怎么在只看到訓(xùn)練錯誤率的情況下,去衡量測試錯誤率呢?
由于訓(xùn)練樣本很少(至少不足夠多),所以通過訓(xùn)練集得到的模型,總不是真正正確的。(就算在訓(xùn)練集上正確率100%,也不能說明它刻畫了真實的數(shù)據(jù)分布,要知道刻畫真實的數(shù)據(jù)分布才是我們的目的,而不是只刻畫訓(xùn)練集的有限的數(shù)據(jù)點)。而且,實際中,訓(xùn)練樣本往往還有一定的噪音誤差,所以如果太追求在訓(xùn)練集上的完美而采用一個很復(fù)雜的模型,會使得模型把訓(xùn)練集里面的誤差都當(dāng)成了真實的數(shù)據(jù)分布特征,從而得到錯誤的數(shù)據(jù)分布估計。這樣的話,到了真正的測試集上就錯的一塌糊涂了(這種現(xiàn)象叫過擬合)。但是也不能用太簡單的模型,否則在數(shù)據(jù)分布比較復(fù)雜的時候,模型就不足以刻畫數(shù)據(jù)分布了(體現(xiàn)為連在訓(xùn)練集上的錯誤率都很高,這種現(xiàn)象較欠擬合)。過擬合表明采用的模型比真實的數(shù)據(jù)分布更復(fù)雜,而欠擬合表示采用的模型比真實的數(shù)據(jù)分布要簡單。
在統(tǒng)計學(xué)習(xí)框架下,大家刻畫模型復(fù)雜度的時候,有這么個觀點,認(rèn)為Error = Bias + Variance。這里的Error大概可以理解為模型的預(yù)測錯誤率,是有兩部分組成的,一部分是由于模型太簡單而帶來的估計不準(zhǔn)確的部分(Bias),另一部分是由于模型太復(fù)雜而帶來的更大的變化空間和不確定性(Variance)。
所以,這樣就容易分析樸素貝葉斯了。它簡單的假設(shè)了各個數(shù)據(jù)之間是無關(guān)的,是一個被嚴(yán)重簡化了的模型。所以,對于這樣一個簡單模型,大部分場合都會Bias部分大于Variance部分,也就是說高偏差而低方差。
在實際中,為了讓Error盡量小,我們在選擇模型的時候需要平衡Bias和Variance所占的比例,也就是平衡over-fitting和under-fitting。
https://zhuanlan.zhihu.com/p/42122107
https://zhuanlan.zhihu.com/p/59640437
傳統(tǒng)的目標(biāo)檢測一般分為以下幾個步驟:
經(jīng)典的結(jié)構(gòu):
傳統(tǒng)方法的缺點:
可以看學(xué)習(xí)OpenCV第三版中的相關(guān)內(nèi)容,搜索erode、dilation
在網(wǎng)絡(luò)結(jié)構(gòu)進(jìn)行特征融合的時候,雙線性插值的方式比轉(zhuǎn)置卷積要好一點。因為轉(zhuǎn)置卷積有一個比較大的問題就是如果參數(shù)配置不當(dāng),很容易出現(xiàn)輸出feature map中帶有明顯棋盤狀的現(xiàn)象。
雙線性插值也分為兩類:
一般來說,使用align_corners=True可以保證邊緣對齊,而使用align_corners=False則會導(dǎo)致邊緣突出的情況。這個講的非常好:
代碼實現(xiàn)的講解:
為了避免梯度爆炸而做出的改進(jìn),注意要和提前終止區(qū)別開來。(提前終止是一種正則化方法,因為當(dāng)訓(xùn)練有足夠能力表示甚至?xí)^擬合的大模型時,訓(xùn)練誤差會隨著時間的推移逐漸降低但驗證集的誤差會再次上升。這意味著只要我們返回使驗證集誤差最低的參數(shù)設(shè)置即可)第一種做法很容易理解,就是先設(shè)定一個 gradient 的范圍如 (-1, 1), 小于 -1 的 gradient 設(shè)為 -1, 大于這個 1 的 gradient 設(shè)為 1.
實現(xiàn)卷積一般用的是im2col的形式,但是面試中我們簡單實現(xiàn)一個滑窗法就行了。比如:用3x3的卷積核(濾波盒)實現(xiàn)卷積操作。NCNN中在PC端卷積的源碼也是這樣的。
參考:
看看Pytorch的源碼與caffe的源碼,都是將卷積計算轉(zhuǎn)化為矩陣運(yùn)算,im2col,然后gemm。https://blog.csdn.net/mrhiuser/article/details/52672824
https://cloud.tencent.com/developer/article/1363619
1x1卷積可以改變上一層網(wǎng)絡(luò)的通道數(shù)目。卷積核大于1x1,意味著提特征需要鄰域信息。
所以對懶人來說,最優(yōu)核的尺寸的期望是正方形。至于
注意,resnet中是先降維再升維,而mobilenetv2中是先升維后降維(所以稱之為inversed)。
很簡單但是也很容易錯的問題:
依據(jù)采用動態(tài)計算或是靜態(tài)計算的不同,可以將這些眾多的深度學(xué)習(xí)框架劃分成兩大陣營,當(dāng)然也有些框架同時具有動態(tài)計算和靜態(tài)計算兩種機(jī)制(比如 MxNet 和最新的 TensorFlow)。動態(tài)計算意味著程序?qū)凑瘴覀兙帉懨畹捻樞蜻M(jìn)行執(zhí)行。這種機(jī)制將使得調(diào)試更加容易,并且也使得我們將大腦中的想法轉(zhuǎn)化為實際代碼變得更加容易。而靜態(tài)計算則意味著程序在編譯執(zhí)行時將先生成神經(jīng)網(wǎng)絡(luò)的結(jié)構(gòu),然后再執(zhí)行相應(yīng)操作。從理論上講,靜態(tài)計算這樣的機(jī)制允許編譯器進(jìn)行更大程度的優(yōu)化,但是這也意味著你所期望的程序與編譯器實際執(zhí)行之間存在著更多的代溝。這也意味著,代碼中的錯誤將更加難以發(fā)現(xiàn)(比如,如果計算圖的結(jié)構(gòu)出現(xiàn)問題,你可能只有在代碼執(zhí)行到相應(yīng)操作的時候才能發(fā)現(xiàn)它)。盡管理論上而言,靜態(tài)計算圖比動態(tài)計算圖具有更好的性能,但是在實踐中我們經(jīng)常發(fā)現(xiàn)并不是這樣的。
這個可以看CS231n中的第九課以及
正式總結(jié)下:
shufflenet:https://blog.csdn.net/u011974639/article/details/79200559
正太分布:https://blog.csdn.net/yaningli/article/details/78051361
MaxPool導(dǎo)致的訓(xùn)練震蕩(通過在MaxPool之后加上L2Norm)//mp.weixin.qq.com/s/QR-KzLxOBazSbEFYoP334Q
https://zhuanlan.zhihu.com/p/64510297
感受野計算有兩個公式,一個普通公式一個通項公式:
需要注意,卷積和池化都可以增加感受野。
http://zike.io/posts/calculate-receptive-field-for-vgg-16/PCA和LDA
KNN K近鄰
二維高斯核函數(shù)
`def gaussian_2d_kernel(kernel_size = 3,sigma = 0):
kernel = np.zeros([kernel_size,kernel_size])
center = kernel_size // 2
if sigma == 0:
sigma = ((kernel_size-1)*0.5 - 1)*0.3 + 0.8
s = 2*(sigma**2)
sum_val = 0
for i in range(0,kernel_size):
for j in range(0,kernel_size):
x = i-center
y = j-center
kernel[i,j] = np.exp(-(x**2+y**2) / s)
sum_val += kernel[i,j]
#/(np.pi * s)
sum_val = 1/sum_val
return kernel*sum_val
`
訓(xùn)練采樣方法
Kmean和GMM原理、區(qū)別、應(yīng)用場景
如何在多臺計算機(jī)上做kmeans
KNN算法以及流程
無監(jiān)督學(xué)習(xí)和有監(jiān)督學(xué)習(xí)的區(qū)別
邏輯回歸與SVM區(qū)別
bagging boosting 和 提升樹
SVM
凸集、凸函數(shù)、凸優(yōu)化
為什么深度學(xué)習(xí)中的圖像分割要先編碼后解碼
(全局)平均池化average pooling和(全局)最大池化max pooling的區(qū)別
平均池化
的一個動機(jī)是每個空間位置具有用于期望特征
的檢測器,并且通過平均每個空間位置,其行為類似于平均輸入圖像的不同平移的預(yù)測(有點像數(shù)據(jù)增加)。Resnet不是采用傳統(tǒng)的完全連通層進(jìn)行CNN分類,而是直接從最后一個mlp轉(zhuǎn)換層輸出特征圖的空間平均值,作為通過全局平均合并層的類別置信度,然后將得到的矢量輸入到 softmax層。相比之下,Global average更有意義且可解釋,因為它強(qiáng)制實現(xiàn)了feature和類別之間的對應(yīng)關(guān)系,這可以通過使用網(wǎng)絡(luò)的更強(qiáng)大的本地建模來實現(xiàn)。此外,完全連接的層易于過擬合并且嚴(yán)重依賴于 dropout 正則化,而全局平均池化本身就是起到了正則化作用,其本身防止整體結(jié)構(gòu)的過擬合。
全連接的作用,與1x1卷積層的關(guān)系
1*1的卷積,那么結(jié)果的大小為500*500*20
。
concat與add(sum)的區(qū)別
SSD怎么改動變成FasterRCNN
反向傳播的原理
GD、SGD、mini batch GD的區(qū)別
偏差、方差
為什么會梯度爆炸,如何防止
分布式訓(xùn)練,多卡訓(xùn)練
精確率和召回率以及PR曲線
空洞卷積
數(shù)據(jù)不好怎么辦,數(shù)據(jù)不均衡怎么處理、只有少量帶標(biāo)簽怎么處理
訓(xùn)練過程中需要過擬合情況怎么辦
正則化
BN層和L2正則化一起有什么后果
ROIPooling和ROIAlign的區(qū)別
自己實現(xiàn)圖像增強(qiáng)算法
圖像分類的tricks
消融實驗(Ablation experiment)
手?jǐn)]NMS與soft-NMS
邏輯回歸和線性回歸
而邏輯回歸的原型:對數(shù)幾率回歸:邏輯回歸和對數(shù)幾率回歸是一樣的,通過變形就可以得到,另外邏輯回歸使用極大似然概率進(jìn)行估計。簡單總結(jié):
什么是attention,有哪幾種
深度學(xué)習(xí)的線性和非線性
梯度消失和梯度爆炸的問題
Batch-norm層的作用
BN跨卡訓(xùn)練怎么保證相同的mean和var
如何實現(xiàn)SyncBN
ResNet為什么好用
Resnet的缺點
L1范數(shù)和L2范數(shù) 應(yīng)用場景
網(wǎng)絡(luò)初始化有哪些方式,他們的公式初始化過程
resnet中權(quán)重的初始化
for m in self.modules():
if isinstance(m, nn.Conv2d):
nn.init.kaiming_normal_(m.weight, mode='fan_out', nonlinearity='relu')
elif isinstance(m, nn.BatchNorm2d):
nn.init.constant_(m.weight, 1)
nn.init.constant_(m.bias, 0)
# Zero-initialize the last BN in each residual branch,
# so that the residual branch starts with zeros, and each residual block behaves like an identity.
# This improves the model by 0.2~0.3% according to https://arxiv.org/abs/1706.02677
if zero_init_residual:
for m in self.modules():
if isinstance(m, Bottleneck):
nn.init.constant_(m.bn3.weight, 0)
elif isinstance(m, BasicBlock):
nn.init.constant_(m.bn2.weight, 0)
求解模型參數(shù)量
def model_info(model): # Plots a line-by-line description of a PyTorch model
n_p = sum(x.numel() for x in model.parameters()) # number parameters
n_g = sum(x.numel() for x in model.parameters() if x.requires_grad) # number gradients
print('
%5s %50s %9s %12s %20s %12s %12s' % ('layer', 'name', 'gradient', 'parameters', 'shape', 'mu', 'sigma'))
for i, (name, p) in enumerate(model.named_parameters()):
name = name.replace('module_list.', '')
print('%5g %50s %9s %12g %20s %12.3g %12.3g' % (
i, name, p.requires_grad, p.numel(), list(p.shape), p.mean(), p.std()))
print('Model Summary: %d layers, %d parameters, %d gradients' % (i + 1, n_p, n_g))
print('ModelSize:%fMBparameters,%fMBgradients
'%(n_p*4/1e6,n_g*4/1e6))
卷積計算量
多標(biāo)簽和多分類
tf.argmax(tf.softmax(logits))
首先用softmax將logits轉(zhuǎn)換成一個概率分布,然后取概率值最大的作為樣本的分類,這樣看似乎,tf.argmax(logits)同樣可以取得最大的值,也能得到正確的樣本分類,這樣的話softmax似乎作用不大.那么softmax的主要作用其實是在計算交叉熵上,首先樣本集中y是一個one-hot向量,如果直接將模型輸出logits和y來計算交叉熵,因為logits=[1,2,3,4],計算出來的交叉熵肯定很大,這種計算方式不對,而應(yīng)該將logits轉(zhuǎn)換成一個概率分布后再來計算,就是用tf.softmax(logits)和y來計算交叉熵,當(dāng)然我們也可以直接用tensorflow提供的方法sofmax_cross_entropy_with_logits來計算 這個方法傳入的參數(shù)可以直接是logits,因為這個根據(jù)方法的名字可以看到,方法內(nèi)部會將參數(shù)用softmax進(jìn)行處理,現(xiàn)在我們?nèi)〉母怕史植贾凶畲蟮淖鳛樽罱K的分類結(jié)果,這是多分類。我們也可以取概率的top幾個,作為最終的多個標(biāo)簽,或者設(shè)置一個閾值,并取大于概率閾值的。這就用softmax實現(xiàn)了多標(biāo)簽分類。tf.sigmoid(logits)
sigmoid應(yīng)該會將logits中每個數(shù)字都變成[0,1]之間的概率值,假設(shè)結(jié)果為[0.01, 0.05, 0.4, 0.6],然后設(shè)置一個概率閾值,比如0.3,如果概率值大于0.3,則判定類別符合,那這里,樣本會被判定為類別3和類別4都符合。
數(shù)據(jù)的輸入為什么要?dú)w一化
為什么說樸素貝葉斯是高偏差低方差?
Canny邊緣檢測,邊界檢測算法有哪些
傳統(tǒng)的目標(biāo)檢測
腐蝕膨脹、開運(yùn)算閉運(yùn)算
一些濾波器
Resize雙線性插值
gradient clipping 梯度裁剪
實現(xiàn)一個簡單的卷積
`/*
輸入:imput[IC][IH][IW]
IC = input.channels
IH = input.height
IW = input.width
卷積核: kernel[KC1][KC2][KH][KW]
KC1 = OC
KC2 = IC
KH = kernel.height
KW = kernel.width
輸出:output[OC][OH][OW]
OC = output.channels
OH = output.height
OW = output.width
其中,padding = VALID,stride=1,
OH = IH - KH + 1
OW = IW - KW + 1
也就是先提前把Oh和Ow算出來,然后將卷積核和輸入數(shù)據(jù)一一對應(yīng)即可
*/
for(int ch=0;ch<output.channels;ch++)
{
for(int oh=0;oh<output.height;oh++)
{
for(int ow=0;ow<output.width;ow++)
{
float sum=0;
for(int kc=0;kc<kernel.channels;kc++)
{
for(int kh=0;kh<kernel.height;kh++)
{
for(int kw=0;kw<kernel.width;kw++)
{
sum += input[kc][oh+kh][ow+kw]*kernel[ch][kc][kh][kw];
}
}
}
//if(bias) sum +=bias[]
output[ch][oh][ow]=sum;
}
}
}
`
卷積的過程
轉(zhuǎn)置卷積的計算過程
1*1
的卷積核有什么用,3*3
的卷積核和一個1*3
加一個3*1
的有什么區(qū)別1*n
和n*1
,它們一般是搭配使用的,從而實現(xiàn)n*n卷積核的感受野,可以在減少參數(shù)的同時增加層數(shù),在CNN的較高層中使用可以帶來一定的優(yōu)勢。卷積核并非都是正方形的,還可以是矩形,比如3*5,在文本檢測和車牌檢測當(dāng)中就有應(yīng)用,這種設(shè)計主要針對文本行或者車牌的形狀,能更好的學(xué)習(xí)特征。其實我覺得方形矩形影響不大,網(wǎng)絡(luò)的學(xué)習(xí)能力是非常強(qiáng)的。當(dāng)然我們也可以學(xué)習(xí)卷積的形狀,類似于deformable convolution
,老潘后續(xù)會講下。
ResNet中bottlenet與mobilenetv2的inverted結(jié)構(gòu)對比
卷積特征圖大小的計算
動態(tài)圖和靜態(tài)圖的區(qū)別
歷年來所有的網(wǎng)絡(luò)
depthwise Separable Conv
讓人眼前一亮。https://www.jianshu.com/p/4708a09c4352
一些統(tǒng)計知識
關(guān)于如何訓(xùn)練(訓(xùn)練過程中的一些問題)
全連接層的好伴侶:空間金字塔池化(SPP)
感受野計算
-
算法
+關(guān)注
關(guān)注
23文章
4631瀏覽量
93406 -
機(jī)器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8442瀏覽量
133107 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5516瀏覽量
121586
原文標(biāo)題:機(jī)器學(xué)習(xí)、深度學(xué)習(xí)面試知識點匯總
文章出處:【微信號:vision263com,微信公眾號:新機(jī)器視覺】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
傳統(tǒng)機(jī)器學(xué)習(xí)方法和應(yīng)用指導(dǎo)
![傳統(tǒng)<b class='flag-5'>機(jī)器</b><b class='flag-5'>學(xué)習(xí)</b>方法和應(yīng)用指導(dǎo)](https://file1.elecfans.com/web3/M00/04/33/wKgZPGdx9NKAcZdAAABMVybzcFI029.png)
【面試題】人工智能工程師高頻面試題匯總:機(jī)器學(xué)習(xí)深化篇(題目+答案)
![【<b class='flag-5'>面試</b>題】人工智能工程師高頻<b class='flag-5'>面試</b>題匯總:<b class='flag-5'>機(jī)器</b><b class='flag-5'>學(xué)習(xí)</b>深化篇(題目+答案)](https://file1.elecfans.com/web3/M00/02/6E/wKgZPGdfvdCAVXXcAAApnpClxuY394.png)
人工智能工程師高頻面試題匯總——機(jī)器學(xué)習(xí)篇
![人工智能工程師高頻<b class='flag-5'>面試</b>題匯總——<b class='flag-5'>機(jī)器</b><b class='flag-5'>學(xué)習(xí)</b>篇](https://file1.elecfans.com/web3/M00/01/10/wKgZO2dQGfCAa4fBAABvNSbOFYo347.png)
GPU深度學(xué)習(xí)應(yīng)用案例
AI大模型與深度學(xué)習(xí)的關(guān)系
深度學(xué)習(xí)中的時間序列分類方法
深度學(xué)習(xí)中的無監(jiān)督學(xué)習(xí)方法綜述
深度學(xué)習(xí)在視覺檢測中的應(yīng)用
深度學(xué)習(xí)與nlp的區(qū)別在哪
人工智能、機(jī)器學(xué)習(xí)和深度學(xué)習(xí)是什么
TensorFlow與PyTorch深度學(xué)習(xí)框架的比較與選擇
深度學(xué)習(xí)模型訓(xùn)練過程詳解
深度學(xué)習(xí)的模型優(yōu)化與調(diào)試方法
深度學(xué)習(xí)與傳統(tǒng)機(jī)器學(xué)習(xí)的對比
為什么深度學(xué)習(xí)的效果更好?
![為什么<b class='flag-5'>深度</b><b class='flag-5'>學(xué)習(xí)</b>的效果更好?](https://file.elecfans.com/web2/M00/4E/DC/poYBAGLCjeiALm_WAAAYmfR7Qec474.png)
評論