阿里雲面經之實習一面

阿里雲一面

  • 1、自我介紹
  • 2、DNN、CNN和RNN的區別?

一開始深度學習是全連接的DNN,反映出來的缺點是參數量爆炸。另外圖像固有的局部信息沒有得到充分應用,如眼睛、鼻子等。DNN還有一個問題是,無法對時間序列上的變化進行建模。然而樣本出現的順序對自然語言處理等應用尤爲重要。

CNN將圖像中的概念和網絡技術結合在一起,對於CNN來說,上層神經元和下層神經元不是完全連接在一起的,而是通過卷積核作爲媒介,同一個卷積核在圖像中所有位置是共享的,圖像通過卷積之後的仍然保持着原來的相對位置關係。CNN模型限制了參數數量,挖掘了局部特徵。

普通的DNN或者CNN中,每層的神經元信號只能向上一層傳播,樣本處理在任何時候相互獨立,因此叫做前向傳播網絡。而在RNN中,神經元的輸出在下一個時間戳直接作用到自己本身。既,第i個神經元在第m時刻的輸入,除了第i-1個神經元在m時刻的輸出外,還有第i個神經元在m-1時刻的輸出。所有歷史結果作用於輸出,達到了時間序列建模的目的。

RNN的深度是時間的深度,同樣存在梯度消失(發生在時間軸上)的問題(所有歷史共同作用只是一個理想情況)。爲了解決這一問題,LSTM應運而生,通過門的開關實現記憶功能,並防止梯度消失(不太明白)。另外還有雙向RNN之類的可以接收未來信息。

  • 3、神經網絡訓練時loss爲什麼有些時候會爆炸?有些時候會消失?

我解釋爲loss爆炸有幾個原因,(1)有時候有壞數據網絡會爆炸;(2)學習率太高,網絡不穩定可能會爆炸。

解釋loss消失的時候,我說網絡輸出層的損失肯定跟網絡最後幾層關聯性比較大,和前面幾層的關聯性比較小,所以網絡的loss傳到前面梯度就會很小。

面試官最後總結了一句,其實loss的爆炸和消失本質上都是一個原因,就是loss求導的問題。

loss消失,看網上有些回答:

對於sigmoid函數來說,在反向傳播時,每過一層,係數大約衰減0.25:

sigmoid(t) = \frac{1}{\left ( 1+e^{-t} \right )},         求導      {sigmoid(t)}' = \frac{e^{-t}}{(1+e^{-t})^{2}}

可以看到,sigmoid導數的最大值是0.25(t=0時)。

還有一些回答:

1、如果用標準化初始化權重,則權重都在0~1之間,求導根據鏈式法則,連乘導致係數非常非常小。如果初始化的權重比較大,加上激活函數的作用大於1的話,連乘起來梯度會越來越大。(這個回答應該比較標準,重點在於兩者的共同性)

2、對於目標函數,通常存在梯度變化很大的一個“懸崖”,在此處求梯度,很容易導致求解不穩定的梯度爆炸現象。

  • 4、怎麼解決梯度消失的問題?

我的回答是·1、提高學習率;2、增加skip跳轉連接。

網上說解決梯度爆炸問題可以通過:梯度截斷,增加正則項,良好的權值初始化方法(如He初始化),BN(防止訓練時中間某一層分佈發生變化導致梯度的消失或者爆炸)。

解決梯度消失問題可以通過:優化激活函數。

  • 5、kmeans不同損失函數對結果有什麼區別?

回答得真的是亂七八糟,因爲我真的不知道這是什麼?kmeans還有損失函數?

查到一個損失函數是,每個樣本點到中心的距離     J(a_{1},a_{2},\cdot \cdot \cdot ,a_{k}) = \frac{1}{2}\sum_{j=1}^{k}\sum_{i=1}^{n}(x_{i}-a_{j})^{2}

求偏導得到中心的更新方式   a_{j} = \frac{1}{n_{i}}\sum_{i=1}^{n_{i}}x_{i}

我覺得這道題提問的本質應該是想問不同損失函數在機器學習過程中帶來的影響。找到一篇阿里云云棲號的文章就是講這個的。

原文地址  https://www.jianshu.com/p/b715888f079b

(1)首先是均方差MSE和平均絕對誤差MAE

MSE = \frac{\sum_{i=1}^{n}(y_i-y_i^p)^2}{n},  MAE = \frac{\sum_{i=1}^{n}\left | y_i-y_i^p \right |}{n}

利用均方差更容易求解,但平方絕對誤差則對於異常值更穩健。當我們對所有觀測值進行處理時,如果利用MSE進行優化則我們會得到所有觀測的均值,而使用MAE則能得到所有觀測的中值。與均值相比,中值對於異常值的魯棒性更好,

但MAE也存在一個問題,特別是對於神經網絡來說,它的梯度在極值點處會有很大的躍變,即使很小的損失值也會產生很大的誤差,這很不利於學習過程。爲了解決這個問題,需要在解決極值點的過程中動態減小學習率。而MSE的梯度隨着損失函數的減小而減小,這一特性使得它在最後的訓練過程中能得到更精確的結果。

在實際訓練過程中,如果異常值對於實際業務十分重要需要進行檢測,MSE是更好的選擇,而如果在異常值極有可能是壞點的情況下MAE則會帶來更好的結果。

(2)Huber損失——平滑平均絕對誤差

Huber損失函數克服了MAE和MSE的缺點,不僅可以保持損失函數具有連續的導數,同時可以利用MSE梯度隨誤差減小的特性來得到更精確的最小值,也對異常值具有更好的魯棒性。

而Huber損失函數的良好表現得益於精心訓練的超參數δ。

(3)Log-Cosh損失函數

Log-Cosh損失函數是一種比L2更爲平滑的損失函數,利用雙曲餘弦來計算預測誤差

 

其中,雙曲餘弦函數長這樣

\cosh (x)=\frac{e^{x}+e^{-x}}{2},是一個大於1的函數,所以log大於0.

可以在擁有MSE優點的同時也不會受到異常值的太多影響。它擁有Huber的所有優點,並且在每一個點都是二次可導的。二次可導在很多機器學習模型中是十分必要的。

但是Log-cosh損失並不是完美無缺的,它還是會在很大誤差的情況下梯度和hessian變成了常數。

(4)分位數損失函數

預測出一個取值區間而不是一個個具體的取值點

90%的預測值起上下邊界分別是用γ值爲0.95和0.05計算得到的。

  • 6、給你一個1T的int型數據,和一個8G的電腦,你怎麼找出這些數據中的中位數?

我的回答有點傻,說了快速排序的方法,沒考慮內存,因爲也不知道該怎麼回答。

正確答案搜了一下,大概是(1)把int型的0~2^{32}-1種數分爲幾個區段,一個區段負責一個範圍的計數;(2)遍歷一遍數組,每遍歷到一個數,它屬於哪個區間就往哪個區段計數加一;(3)從前往後累加,如果一旦超過0.5T,記下到前一個區段爲止的數量n;(4)刪掉所有內存,爲這個區段的每一個數創造一個計數空間,再次遍歷數組,按時從前往後累加,若到某一個數n+m>=0.5T,則該數爲中位數。(當然如果數字不重複的話就更快,但是一個T不可能不重複)

原文  https://blog.csdn.net/weixin_30723433/article/details/96788227


突然想到快速排序有更好地思路,也許沒有那麼快,像上面那個方法只需要遍歷兩次,但是簡單有效。

(1)還是隨機挑一個數,遍歷數組對大於和小於這個數的數字計數,哪一邊超過0.5T說明,中位數位於這個區間,一次少一半。O(log_{2}n)

(2)每次處理完之後遍歷數組,把中位數所在的區間留下,其它刪掉,記下另外一邊的數量。

(3)循環直到,中位數所在區間小於8個G了,然後就快樂的快速排序了。

時間複雜度稍微有點高,大概是O(2nlog_{2}n),最前面那個2是因爲排序時需要遍歷一遍數組(雖然會逐步小於n),篩選區間時需要還遍歷一遍數組。


  • 7、樹的深度搜索和廣度搜索用的什麼數據結構?

棧先進後出,適合從根部一直找到葉節點再從葉節點開始取值。

隊列先進先出,適合從同一層的節點加進去再從頭一個一個取。

  • 8、問你現在處理的最多的數據大概有多少?

60000的COCO數據那樣,接着問給你多一千萬倍的數據,還是現在這個硬件,你怎麼處理?

我回答的是集成學習的方式,用多個弱分類器構建強分類器。但這是基於有多幾臺電腦的情況。或者得一遍一遍訓練,得到多個模型。

說明訓練出來得到分類結果之後,怎麼進行最後的集成?

我回答了三種方式:(1)投票機制。每個分類器給一個結果進行投票;(2)每個分類器對每個類的概率進行加和;(3)按照每個分類器對驗證集的驗證精度,對每個分類器制定一個權重,最後將結果按權相加。

網上的專業答案(感覺很有道理):

(1)漸進式訓練,遷移學習等;

(2)抽取小樣本,對算法做快速地抽查、看到結果在前後的變化(相對於模型技巧,做一個數據大小的敏感性分析。或許,對於你的隨機小樣本,有一個天然的邊際效應遞減分水嶺。越過這個關口,繼續增加的數據規模帶來的好處微乎其微。)

(3)python中pandas可以流式處理數據(不太明白):轉數據類型,字符唯一值映射什麼的。

  • 9、檢測流程是什麼?

數據輸入網絡,提取特徵,如果是兩分支的話,會有一個區域提取的環節,之後是全連接層的分類迴歸。

接着問,提取特徵提取的是什麼特徵?怎麼提取特徵?

這段回答得亂七八糟,好像一直不明白面試官在說什麼,一直被打斷。

我的回答大概是提取抽象的本質特性,通過神經元乘以權重。

網上搜了一下答案,大概也是設計卷積核呀什麼的,把RGB的信息疊加濾波成爲特徵量。

  • 10、手撕代碼

給你一個數組[2,1,3,0,0,1,2]

每個位置上面的數代表到了這個位置最多可以走幾步,求從第一個能不能走到最後一個?

我剛開始用了遞歸的方法,每次傳該數下一步的位置開始的數組。後來讓我分析時間複雜度,我發現時間複雜度有點高,應該有O(n^{2})。其實遞歸會帶來很多重複計算,比如2可以走3,也可以走1再走3,3這裏就重複計算了。

我問面試官可不可以用輔助數組解決這個重複問題,他說優先考慮時間優先,輔助空間都可以用。這個之後再自己編編看。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章