所謂AI,其實指的是人工智慧,試圖通過計算機模擬人類意識和思維的全過程。說白了就是模擬人類神經結構和功能的數學模型或計算模型,通過大量的人工神經元進行計算。目前手機真正能用到AI(也就是神經網路)的功能也集中在圖像識別領域。各大廠商新加入的各種拍照演算法的優化也是因為手機圖像識別能力的提升。AI手機是晶元、智能系統、AI應用的結合體,缺一不可。AI演算法還能正確區分不同的聲音,讓對方清晰地接聽你的電話;語音功能方面,手機AI語音助手可以成為新的人機交互入口;在圖像識別方面,可以實現AI人臉識別、AI掃描、一鍵購物。
AI指的是人工智慧,把范圍縮小到硬體層面。是指模擬人腦結構的人工神經網路。它是模擬人類神經結構和功能的數學模型或計算模型,由大量人工神經元計算得出。與傳統的邏輯推理不同,基於大量數據統計的人工神經網路具有一定的判斷力,在語音識別和圖像識別方面尤其具有優勢。AI是「人工智慧」的英文縮寫,中文翻譯是人工智慧。人工智慧是計算機科學的一個分支,它試圖理解智能的本質,並產生一種新的智能機器,能夠以類似於人類智能的方式做出反應。
B. AI面試題第二彈(神經網路基礎)
提取主要特徵,減小網路參數量,減小計算量
層層傳遞的梯度>1 梯度爆炸
層層傳遞的梯度<1 梯度消失
與權重有很大關系,激活函數的影響較小。
每次訓練一層隱節點,訓練時將上一層隱節點的輸出作為輸入,而本層隱節點的輸出作為下一層隱節點的輸入,此過程就是逐層「預訓練」(pre-training);在預訓練完成後,再對整個網路進行「微調」(fine-tunning)。Hinton在訓練深度信念網路(Deep Belief Networks中,使用了這個方法,在各層預訓練完成後,再利用BP演算法對整個網路進行訓練。
這個方案主要是針對梯度爆炸提出的,其思想是設置一個梯度剪切閾值,然後更新梯度的時候,如果梯度超過這個閾值,那麼就將其強制限制在這個范圍之內。這可以防止梯度爆炸。
比較常見的是l1l1l1正則,和l2l2l2正則,在各個深度框架中都有相應的API可以使用正則化
反向傳播中,經過每一層的梯度會乘以該層的權重。
舉個簡單例子:
為了得到一致假設而使假設變得過度復雜稱為過擬合(overfitting), 過擬合表現在訓練好的模型在訓練集上效果很好,但是在測試集上效果差 。也就是說模型的泛化能力弱。
過擬合主要由兩個原因造成,數據集太小或模型太復雜
(1). 數據集擴增(Data Augmentation)
(2). 改進模型
·Early Stopping。在模型效果比較好的時候便提前停止訓練
·正則化(regularization)
L1:稀疏參數
L2:更小參數
·Dropout
·多任務學習
深度學習中兩種多任務學習模式:隱層參數的硬共享和軟共享
硬共享機制是指在所有任務中共享隱藏層,同時保留幾個特定任務的輸出層來實現。硬共享機制降低了過擬合的風險。多個任務同時學習,模型就越能捕捉到多個任務的同一表示,從而導致模型在原始任務上的過擬合風險越小。
軟共享機制是指每個任務有自己的模型,自己的參數。模型參數之間的距離是正則化的,以便保障參數相似性。
見後文
leaky relu
輸入是x輸出是y,正常的流程是:我們首先把x通過網路前向傳播,然後把誤差反向傳播以決定如何更新參數讓網路進行學習。使用Dropout之後,過程變成如下:
(1)首先隨機(臨時)刪掉網路中一半的隱藏神經元,輸入輸出神經元保持不變(圖中虛線為部分臨時被刪除的神經元)
(2) 然後把輸入x通過修改後的網路前向傳播,然後把得到的損失結果通過修改的網路反向傳播。一小批訓練樣本執行完這個過程後,在沒有被刪除的神經元上按照隨機梯度下降法更新對應的參數(w,b)。
(3)然後繼續重復這一過程:
恢復被刪掉的神經元(此時被刪除的神經元保持原樣,而沒有被刪除的神經元已經有所更新)
從隱藏層神經元中隨機選擇一個一半大小的子集臨時刪除掉(備份被刪除神經元的參數)。
對一小批訓練樣本,先前向傳播然後反向傳播損失並根據隨機梯度下降法更新參數(w,b) (沒有被刪除的那一部分參數得到更新,刪除的神經元參數保持被刪除前的結果)。
不斷重復這一過程。
沒有對數據進行歸一化
忘記檢查輸入和輸出
沒有對數據進行預處理
沒有對數據正則化
使用過大的樣本
使用不正確的學習率
在輸出層使用錯誤的激活函數
網路中包含壞梯度
初始化權重錯誤
過深的網路
隱藏單元數量錯誤
網路設計不合理(任務-網路不匹配)
機器學習有個很重要的假設:就是假設訓練數據和測試數據是滿足獨立同分布的,這保障了通過訓練數據獲得的優秀模型也能夠在測試集獲得好的效果。但是在機器學習訓練中輸入層的每個批量(X,Y)中X的分布是不一致的,並且神經網路的隱藏層的輸入分布在每次訓練迭代中發生變化。 BatchNorm就是在深度神經網路訓練過程中使得每一層神經網路的輸入保持相同分布的。
BN的基本思想其實相當直觀:因為深層神經網路在做非線性變換前(激活前)的 輸入值 (就是那個x=WU+B,U是輸入) 隨著網路深度加深或者在訓練過程中,其分布逐漸發生偏移或者變動,之所以訓練收斂慢,一般是整體分布逐漸往非線性函數的取值區間的上下限兩端靠近 (對於Sigmoid函數來說,意味著激活輸入值WU+B是大的負值或正值),所以這 導致反向傳播時低層神經網路的梯度消失 ,這是訓練深層神經網路收斂越來越慢的 本質原因 , 而BN就是通過一定的規范化手段,把每層神經網路任意神經元這個輸入值的分布強行拉回到均值為0方差為1的標准正態分布 ,其實就是把越來越偏的分布強制拉回比較標準的分布,這樣使得激活輸入值落在非線性函數對輸入比較敏感的區域,這樣輸入的小變化就會導致損失函數較大的變化,意思是 這樣讓梯度變大,避免梯度消失問題產生,而且梯度變大意味著學習收斂速度快,能大大加快訓練速度。
但是接下來的問題是:如果都通過BN,那麼不就跟把非線性函數替換成線性函數效果相同了,意味著網路的非線性表達能力下降了, 所以BN為了保證非線性的獲得,對變換後的滿足均值為0方差為1的x又進行了scale加上shift操作(y=scale*x+shift), 每個神經元增加了兩個參數scale和shift參數,這兩個參數是通過訓練學習到的,意思是通過scale和shift把這個值從標准正態分布左移或者右移一點並長胖一點或者變瘦一點,每個實例挪動的程度不一樣,這樣等價於激活前的值經過標准正太分布歸一化後再從正中心周圍的線性區往非線性區動了動。核心思想應該是想找到一個線性和非線性的較好平衡點,既能享受非線性的較強表達能力的好處,又避免太靠非線性區兩頭使得網路收斂速度太慢
Batch Normalization 好處:(1)提高了訓練速度,收斂速度也大大加快(2)另外調參過程也簡單多了,對於初始化要求沒那麼高,而且可以使用大的學習率等 (3)可以防止梯度消失(4)BN類似於Dropout的一種防止過擬合的正則化表達方式,可以有效防止過擬合,不用太依賴dropou和正則化
以下情況最好不要使用BN:(1)數據不平衡(2)batch_size太小
batch_size是機器學習中的一個重要參數,決定了梯度下降的方向,如果數據集比較小,完全可以採用全數據集的形式計算梯度,由全數據集確定的梯度方向能夠更好地代表樣本總體,從而更准確地朝向極值所在的方向。對於大型數據集則需要使用mini-batch_size,因為隨著數據集的海量增長和內存限制,一次性載入所有的數據進來變得越來越不可行。
當batch_size=1,即在線學習,模型難以達到收斂 。
合理增加batch_size好處 :
(1)內存利用率提高了,大矩陣乘法的並行化效率提高
(2)跑完一次 epoch(全數據集)所需的迭代次數減少,對於相同數據量的處理速度進一步加快。
(3)在一定范圍內,一般來說 Batch_Size 越大,其確定的下降方向越准,引起訓練震盪越小
盲目增大 Batch_Size 壞處 :
(1)內存利用率提高了,但是內存容量可能撐不住了
(2)跑完一次 epoch(全數據集)所需的迭代次數減少,要想達到相同精度所需要的 epoch 數量越來越多,花費的時間越長
(3)大的batchsize收斂到sharp minimum,而小的batchsize收斂到flat minimum,後者具有更好的泛化能力。
總之batchsize在變得很大(超過一個臨界點)時,會降低模型的泛化能力。在這個臨界點之下,模型的性能變換隨batch size通常沒有學習率敏感
目標所在的真實框(ground truth) 與演算法預測的目標所在的框(bounding box)的交集與並集的比值,我們會用IOU閾值來判定預測的bounding box是否有效。一般閾值會設定在0.5,當IOU的值大於等於0.5時,我們會把這個預測的bounding box 歸為正類,而小於0.5的歸為負類。
牛頓法使用的是目標函數的二階導數,在高維情況下這個Hessian(n*n維度)矩陣非常大,計算復雜度是n*n,計算和存儲都是問題
(1) 通過控制卷積核個數實現升維或者降維,從而減少模型參數和計算量
(2) 用於不同channel上特徵的融合
(3)1x1的卷積相當於全連接層的計算過程,並且加入了非線性激活函數,從而增加了網路的非線性,使得網路可以表達更加復雜的特徵。
它能夠把輸入的連續實值變換為0和1之間的輸出,如果是非常大的負數,那麼輸出就是0;如果是非常大的正數,輸出就是1
缺點:
(1)函數的飽和區,導致梯度幾乎為0,造成梯度消失問題
(2)Sigmoid 的 output 不是0均值,具體解釋見 https://blog.csdn.net/tyhj_sf/article/details/79932893
(3)其解析式中含有冪運算,計算機求解時相對來講比較耗時。對於規模比較大的深度網路,這會較大地增加訓練時間。
它解決了Sigmoid函數的不是零均值輸出問題,然而,梯度消失(gradient vanishing)的問題和冪運算的問題仍然存在。
(1)在正區間解決了梯度消失的問題
(2)函數簡單,計算速度快,收斂速度遠快於sigmoid和tanh
缺點:
(1)Relu函數輸出不是0均值
(2)神經元壞死問題:指的是某些神經元可能永遠不會被激活,導致相應的參數永遠不能被更新,有兩個主要原因導致這種狀況發生
(1) 非常不幸的參數初始化,這種情況比較少見
(2) learning rate太高導致在訓練過程中參數更新太大,不幸使網路進入這種狀態。解決方法是可以採用Xavier初始化方法,以及避免將learning rate設置太大或使用adagrad等自動調節learning rate的演算法
為了解決ReLU函數帶來的神經元壞死問題 , 提出了將ReLU的前半段設為αx,α通常設為0.01,,另外一種直觀的想法是基於參數的方法PReLU函數, α可由方向傳播演算法學習出來。
ELU也是為解決ReLU存在的問題而提出,顯然,ELU有ReLU的基本所有優點,以及:(1)不會有神經元壞死現象(2)函數輸出均值接近於0
但是ELU的小問題就是計算量稍微有點大。
1、使用不同的激活函數,比如Relu,Leak-Relu,PRelu,elu等激活函數代替sigmoid函數
2、使用Batch Normalizaion(批量歸一化)
3、使用殘差網路
4、預訓練加微調
1、梯度裁剪
2、權重正則化
兩個3x3的卷積核的感受野比5x5的卷積核的感受野大,在保持相同感受野的同時,用3x3的卷積核可以提升網路的深度,可以很明顯的減少計算量。
1、局部連接
2、權值共享:減小參數量
3、池化操作:增大感受野
4、多層次結構:可以提取low-level以及high-level的信息
1、數據集太小,數據樣本不足時,深度學習相對其它機器學習演算法,沒有明顯優勢。
2、數據集沒有局部相關特性,目前深度學習表現比較好的領域主要是圖像/語音/自然語言處理等領域,這些領域的一個共性是局部相關性。圖像中像素組成物體,語音信號中音位組合成單詞,文本數據中單片語合成句子,這些特徵元素的組合一旦被打亂,表示的含義同時也被改變。對於沒有這樣的局部相關性的數據集,不適於使用深度學習演算法進行處理。舉個例子:預測一個人的健康狀況,相關的參數會有年齡、職業、收入、家庭狀況等各種元素,將這些元素打亂,並不會影響相關的結果。
作用 :對輸入的特徵圖進行壓縮,
一方面使特徵圖變小,簡化網路計算復雜度;
一方面進行特徵壓縮,提取主要特徵。
通常來講,max-pooling的效果更好,雖然max-pooling和average-pooling都對數據做了下采樣,但是 max-pooling感覺更像是做了特徵選擇,選出了分類辨識度更好的特徵,提供了非線性 。 pooling的主要作用一方面是去掉冗餘信息,一方面要保留feature map的特徵信息,在分類問題中,我們需要知道的是這張圖像有什麼object,而不大關心這個object位置在哪,在這種情況下顯然max pooling比average pooling更合適。在 網路比較深的地方,特徵已經稀疏了,從一塊區域里選出最大的,比起這片區域的平均值來,更能把稀疏的特徵傳遞下去 。
average-pooling更強調對整體特徵信息進行一層下采樣,在減少參數維度的貢獻上更大一點,更多的體現在 信息的完整傳遞這個維度 上,在一個很大很有代表性的模型中,比如說DenseNet中的模塊之間的連接大多採用average-pooling,在減少維度的同時,更有利信息傳遞到下一個模塊進行特徵提取。
average-pooling在 全局平均池化操作 中應用也比較廣,在ResNet和Inception結構中最後一層都使用了平均池化。有的時候在模型接近 分類器的末端使用全局平均池化還可以代替Flatten操作 ,使輸入數據變成一位向量。
CNN網路中另外一個不可導的環節就是Pooling池化操作,因為Pooling操作使得feature map的尺寸變化,假如做2×2的池化(步長也為2),假設那麼第l+1層的feature map有16個梯度,那麼第l層就會有64個梯度,這使得梯度無法對位的進行傳播下去。其實解決這個問題的思想也很簡單,就是把1個像素的梯度傳遞給4個像素,但是需要保證傳遞的loss(或者梯度)總和不變。根據這條原則,mean pooling和max pooling的反向傳播也是不同的
mean pooling的前向傳播就是把一個patch中的值求取平均來做pooling,那麼反向傳播的過程也就是把 某個元素的梯度等分為n份分配給前一層,這樣就保證池化前後的梯度(殘差)之和保持不變 ,圖示如下 :
(2) max pooling
max pooling也要滿足梯度之和不變的原則 ,max pooling的前向傳播是把patch中最大的值傳遞給後一層,而其他像素的值直接被舍棄掉。那麼 反向傳播也就是把梯度直接傳給前一層某一個像素,而其他像素不接受梯度,也就是為0。 所以max pooling操作和mean pooling操作不同點在於需要記錄下池化操作時到底哪個像素的值是最大,也就是max id,這個變數就是記錄最大值所在位置的,因為在反向傳播中要用到,那麼假設前向傳播和反向傳播的過程就如下圖所示 :
28、細粒度分類
29、LSTM&RNN
30、解釋LSTM結構(相對於RNN)的好處
31、RNN的梯度消失原因和解決辦法
32、Object Detection
33、Unet的介紹
34、FCN和Unet的區別
35、RCNN系列的演算法流程和區別
36、Fast RCNN中 bbox 回歸的損失函數什麼
37、解釋 ROI Pooling 和 ROI Align
38、Mask RCNN中 mask branch 如何接入 Faster RCNN中
39、解釋 FPN
40、解釋 ROI Align
41、簡述 YOLO 和 SSD
42、簡述 Hough 直線檢測、Sobel 邊緣檢測演算法流程
43、Mask RCNN中的anchors如何判定為正負樣本
44、簡述 NMS 演算法流程
45、attention起源是用在哪裡?pixel還是frame,是soft還是hard
46、anchor的正負樣本比是多少
47、演算法和激活函數等
48、BN的原理和作用
49、BN層反向傳播,怎麼求導
50、BN 的作用和缺陷,以及針對batch_size小的情況的改進(GN)
51、BN層,先加BN還是激活,有什麼區別
52、手推BP
53、優化演算法舉例和他們的區別(SGD、SGDM、RMSprop、Adam)
54、隨機梯度下降和梯度下降
55、訓練不收斂的原因有哪些
56、簡述 SVM 流程、核函數尋參及常見的核函數舉例
57、batch_size 和 learning rate 的關系(怎麼平衡和調整二者)
58、解釋過擬合和欠擬合,以及解決方法
59、激活函數有哪些,各自區別
60、損失函數有哪些
61、Sigmoid 和 ReLu 對比(各自優缺點)
62、為什麼不用sigmoid而用relu?做出了哪些改進?
63、梯度消失和梯度爆炸的原因和解決方法
64、Precision 和 Recall 的定義
65、精確率高、召回率低是為什麼
66、SVM,線性回歸和邏輯回歸的原理及區別
67、PCA原理,PCA和SVD的區別和聯系
68、正則化怎麼選擇,有哪些方式
69、L1、L2范數,區別
70、boost、Adaboost
71、dropout和batch normalization
72、講一下決策樹和隨機森林
73、講一下GBDT的細節,寫出GBDT的目標函數。 GBDT和Adaboost的區別與聯系
74、偏差、方差
75、距離度量公式哪些,區別
76、多標簽識別怎麼做
77、data argumentation怎麼處理的
78、數據不均衡怎麼處理、只有少量帶標簽怎麼處理
79、權重初始化方法都有哪些
80、權值衰減這個參數怎麼設置
81、分類問題有哪些評價指標?每種的適用場景。
82、無監督學習了解哪些
83、圖像處理Opencv
84、邊緣檢測運算元有哪些
85、霍夫變換
86、直方圖是什麼
87、canny運算元是怎麼做的
88、圖像的特徵提取有哪些演算法,適用范圍、優缺點
參考:
https://blog.csdn.net/bluesliuf/article/details/89389117
https://zhuanlan.hu.com/p/107279000
https://zhuanlan.hu.com/p/56475281