A. #圖像識別演算法工程師(ocr)#坐標上海,為什麼感覺招ocr公司太少。我做這個都快三年了,最近面試
招的還是有的,只是這個東西是一家公司的核心的東西,所以可遇不可求,通常也是公司內部知根知底的人,慢慢培養出來的
來自職Q用戶:劉先生
演算法工程師,還是挺多招的啊 來自職Q用戶:劉女士
B. 為什麼一線互聯網公司的校招高薪都是演算法類
高端工程類崗位所需要的能力,高校很難培養出來。中低端工程類崗位,可能確實不太值錢。
。演算法類因為一些歷史遺留問題,大公司之前懂得人不多,而學校確實有些老師是行家裡手,學生也可以在某一個小領域,做到精通。
這推高了前兩年演算法領域的校招價。然而,隨著公司相關人才越來越多,演算法類的稀缺性也在下降。另外,現在很多技術比較好的組也比較認清了,高端演算法類畢業生已經不能靠論文數量,甚至已經不能靠發的會議質量了。
C. 計算機視覺演算法工程師常見面試題1
參考: https://www.hu.com/column/c_1170719557072326656
反卷積也稱為轉置卷積,如果用矩陣乘法實現卷積操作,將卷積核平鋪為矩陣,則轉置卷積在正向計算時左乘這個矩陣的轉置WT,在反向傳播是左乘W,與卷積操作剛好相反,需要注意的是,反卷積不是卷積的逆運算。
[知乎問題+caffe實現]
實現上采樣;近似重構輸入圖像,卷積層可視化。
只要激活函數選擇得當,神經元的數量足夠,至少有一個隱含層的神經網路可以 逼近閉區間上任意一個連續函數到任意指定的精度。
判別模型,直接輸出類別標簽,或者輸出類後驗概率p(y|x)
[ https://www.hu.com/question/268906476]
[ https://zhuanlan.hu.com/p/40024110]
[ https://zhuanlan.hu.com/p/159189617]
BN是在 batch這個維度上進行歸一化,GN是計算channel方向每個group的均值方差.
檢測結果與 Ground Truth 的交集比上它們的並集,即為檢測的准確率 IoU
內存/顯存佔用;模型收斂速度等
Hessian矩陣是n*n, 在高維情況下這個矩陣非常大,計算和存儲都是問題。
mini-batch太小會導致收斂變慢,太大容易陷入sharp minima,泛化性不好。
可以把dropout看成是 一種ensemble方法,每次做完dropout相當於從原網路中找到一個更瘦的網路。
pooling操作雖然能增大感受野,但是會丟失一些信息。空洞卷積在卷積核中插入權重為0的值,因此每次卷積中會skip掉一些像素點;
空洞卷積增大了卷積輸出每個點的感受野,並且不像pooling會丟失信息,在圖像需要全局信息或者需要較長sequence依賴的語音序列問題上有著較廣泛的應用。
表達式為:
使用BN的原因是網路訓練中每一層不斷改變的參數會導致後續每一層輸入的分布發生變化,而學習的過程又要使每一層去適應輸入的分布,因此不得不降低網路的學習率,並且要小心得初始化(internal covariant shift)
如果僅通過歸一化方法使得數據具有零均值和單位方差,則會降低層的表達能力(如使用Sigmoid函數時,只使用線性區域)
BN的具體過程(注意第三個公式中分母要加上epsilon)
最好的解釋是通過1 * 1卷積核能實現多個channel間的解耦合,解耦cross-channel correlation和spatial correlation。
【但是因為解耦不徹底,因此後續有了mobile net的組卷積方式和shuffle net組卷積方式】
由於 1×1 並不會改變 height 和 width,改變通道的第一個最直觀的結果,就是可以將原本的數據量進行增加或者減少。改變的只是 height × width × channels 中的 channels 這一個維度的大小而已。
1*1卷積核,可以在保持feature map尺度不變的(即不損失解析度)的前提下大幅增加非線性特性(利用後接的非線性激活函數),把網路做的很deep。
備註:一個filter對應卷積後得到一個feature map,不同的filter(不同的weight和bias),卷積以後得到不同的feature map,提取不同的特徵,得到對應的specialized neuron。
例子:使用1x1卷積核,實現降維和升維的操作其實就是channel間信息的線性組合變化,3x3,64channels的卷積核後面添加一個1x1,28channels的卷積核,就變成了3x3,28channels的卷積核,原來的64個channels就可以理解為跨通道線性組合變成了28channels,這就是通道間的信息交互
注意:只是在channel維度上做線性組合,W和H上是共享權值的sliding window
並不能說明這個模型無效導致模型不收斂的原因可能有
A. 在實際場景下,應盡量使用ADAM,避免使用SGD
B. 同樣的初始學習率情況下,ADAM的收斂速度總是快於SGD方法
C. 相同超參數數量情況下,比起自適應的學習率調整方式,SGD加手動調節通常會取得更好效果
D. 同樣的初始學習率情況下,ADAM比SGD容易過擬合
A.保證每一層的感受野不變,網路深度加深,使得網路的精度更高
B.使得每一層的感受野增大,學習小特徵的能力變大
C.有效提取高層語義信息,且對高層語義進行加工,有效提高網路准確度
D.利用該結構有效減輕網路的權重
A.計算簡單
B.非線性
C.具有飽和區
D.幾乎處處可微
【relu函數在0處是不可微的。】
A.Adam的收斂速度比RMSprop慢
B.相比於SGD或RMSprop等優化器,Adam的收斂效果是最好的
C.對於輕量級神經網路,使用Adam比使用RMSprop更合適
D.相比於Adam或RMSprop等優化器,SGD的收斂效果是最好的
【SGD通常訓練時間更長,容易陷入鞍點,但是在好的初始化和學習率調度方案的情況下,結果更可靠。如果在意更快的收斂,並且需要訓練較深較復雜的網路時,推薦使用學習率自適應的優化方法。】
A.使用ReLU做為激活函數,可有效地防止梯度爆炸
B.使用Sigmoid做為激活函數,較容易出現梯度消失
C.使用Batch Normalization層,可有效的防止梯度爆炸
D.使用參數weight decay,在一程度上可防止模型過擬合
對結果存疑。認為二者皆可防止。
A.SGD
B.FTRL
C.RMSProp
D.L-BFGS
L-BFGS(Limited-memory BFGS,內存受限擬牛頓法)方法:
所有的數據都會參與訓練,演算法融入方差歸一化和均值歸一化。大數據集訓練DNN,容易參數量過大 (牛頓法的進化版本,尋找更好的優化方向,減少迭代輪數)從LBFGS演算法的流程來看,其整個的核心的就是如何快速計算一個Hesse的近似:重點一是近似,所以有了LBFGS演算法中使用前m個近似下降方向進行迭代的計算過程;重點二是快速,這個體現在不用保存Hesse矩陣上,只需要使用一個保存後的一階導數序列就可以完成,因此不需要大量的存儲,從而節省了計算資源;重點三,是在推導中使用秩二校正構造了一個正定矩陣,即便這個矩陣不是最優的下降方向,但至少可以保證函數下降。
FTRL(Follow-the-regularized-Leader)是一種適用於處理超大規模數據的,含大量稀疏特徵的在線學習的常見優化演算法,方便實用,而且效果很好,常用於更新在線的CTR預估模型;FTRL在處理帶非光滑正則項(如L1正則)的凸優化問題上表現非常出色,不僅可以通過L1正則控制模型的稀疏度,而且收斂速度快;
A.LSTM在一定程度上解決了傳統RNN梯度消失或梯度爆炸的問題
B.CNN相比於全連接的優勢之一是模型復雜度低,緩解過擬合
C.只要參數設置合理,深度學習的效果至少應優於隨機演算法
D.隨機梯度下降法可以緩解網路訓練過程中陷入鞍點的問題
實際上,現在有很多針對小目標的措施和改良,如下:
最常見的是Upsample來Rezie網路輸入圖像的大小;
用dilated/astrous等這類特殊的卷積來提高檢測器對解析度的敏感度;(空洞卷積是針對圖像語義分割問題中下采樣會降低圖像解析度、丟失信息而提出的一種卷積思路。利用添加空洞擴大感受野,讓原本3 x3的卷積核,在相同參數量和計算量下擁有5x5(dilated rate =2)或者更大的感受野,從而無需下采樣。在保持參數個數不變的情況下增大了卷積核的感受野)
有比較直接的在淺層和深層的Feature Map上直接各自獨立做預測的,這個就是我們常說的尺度問題。
用FPN這種把淺層特徵和深層特徵融合的,或者最後在預測的時候,用淺層特徵和深層特徵一起預測;
SNIP(Scale Normalization for Image Pyramids)主要思路:
在訓練和反向傳播更新參數時,只考慮那些在指定的尺度范圍內的目標,由此提出了一種特別的多尺度訓練方法。
D. 諾瓦星雲演算法圖像工程師面試好過沒
好過。
1、諾瓦星雲演算法圖像工程師的面試首先是電話面試,回答一些基本問題。
2、然後是自我介紹和最後的反問,真正的面試時間就十幾分鍾,側重點在項目上,沒有關於通用能力的問題,所以好過。
E. 360圖像演算法二面後多久通知結果
一般3-7個工作日會收到通知。
1、首先,企業在結束面試後,會將所有候選人從專業技能,綜合素質,穩定性等方面結合起來,進行評估對比,擇優而選;
2、其次,選中候選人之後,還要結合候選人期望薪資,市場待遇,公司目前薪資水平,為候選人定薪,有些公司還會提前制定好試用期考核方案;
3、薪資定好之後,公司內部會走簽字流程,確定各個相關部門領導的同意。
F. 做圖像類演算法面試的時候會不會面試數學
我在《再談逗我是怎麼招程序員地》中比較保守地說過,逗問難的演算法題並沒有錯,錯的很多面試官只是在膚淺甚至錯誤地理解著面試演算法題的目的。地,今天,我想加強一下這個觀點——我反對純演算法題面試!(注意,我說的是純演算法題)圖片源Wikipedia(點擊圖片查看詞條)我再次引用我以前的一個觀點——能解演算法題並不意味著這個人就有能力就能在工作中解決問題,你可以想想,小學奧數題可能比這些題更難,但並不意味著那些奧數能手就能解決實際問題。好了,讓我們來看一個示例(這個示例是昨天在微博上的一個討論),這個題是——逗找出無序數組中第2大的數地,幾乎所有的人都用了O(n)的演算法,我相信對於我們這些應試教育出來的人來說,不用排序用O(n)演算法是很正常的事,連我都不由自主地認為O(n)演算法是這個題的標准答案。我們太習慣於標准答案了,這是我國教育最悲哀的地方。(廣義的洗腦就是讓你的意識依賴於某個標准答案,然後通過給你標准答案讓你不會思考而控制你)功能性需求分析試想,如果我們在實際工作中得到這樣一個題 我們會怎麼做看我一定會分析這個需求,因為我害怕需求未來會改變,今天你叫我找一個第2大的數,明天你找我找一個第4大的數,後天叫我找一個第100大的數,我不搞死了。需求變化是很正常的事。分析完這個需求後,我會很自然地去寫找第K大數的演算法——難度一下子就增大了。很多人會以為找第K大的需求是一種逗過早擴展地的思路,不是這樣的,我相信我們在實際編碼中寫過太多這樣的程序了,你一定不會設計出這樣的函數介面 —— Find2ndMaxNum(int* array, int len),就好像你不會設計出 DestroyBaghdad(); 這樣的介面,而是設計一個DestoryCity( City& ); 的介面,而把Baghdad當成參數傳進去!所以,你應該是聲明一個叫FindKthMaxNum(int* array, int len, int kth),把2當成參數傳進去。這是最基本的編程方法,用數學的話來說,叫代數!最簡單的需求分析方法就是把需求翻譯成函數名,然後看看是這個介面不是很二看!(註:不要糾結於FindMaxNum()或FindMinNum(),因為這兩個函數名的業務意義很清楚了,不像Find2ndMaxNum()那麼二)非功能性需求分析性能之類的東西從來都是非功能性需求,對於演算法題,我們太喜歡研究演算法題的空間和時間復雜度了。我們希望做到空間和時間雙豐收,這是演算法學術界的風格。所以,習慣於標准答案的我們已經失去思考的能力,只會機械地思考演算法之內的性能,而忽略了演算法之外的性能。如果題目是——逗從無序數組中找到第K個最大的數地,那麼,我們一定會去思考用O(n)的線性演算法找出第K個數。事實上,也有線性演算法——STL中可以用nth_element求得類似的第n大的數,其利用快速排序的思想,從數組S中隨機找出一個元素X,把數組分為兩部分Sa和Sb。Sa中的元素大於等於X,Sb中元素小於X。這時有兩種情況:1)Sa中元素的個數小於k,則Sb中的第 k-|Sa|個元素即為第k大數;2) Sa中元素的個數大於等於k,則返回Sa中的第k大數。時間復雜度近似為O(n)。搞學術的nuts們到了這一步一定會歡呼勝利!但是他們哪裡能想得到性能的需求分析也是來源自業務的!我們一說性能,基本上是個人都會問,請求量有多大看如果我們的FindKthMaxNum()的請求量是m次,那麼你的這個每次都要O(n)復雜度的演算法得到的效果就是O(n*m),這一點,是書獃子式的學院派人永遠想不到的。因為應試教育讓我們不會從實際思考了。工程式的解法根據上面的需求分析,有軟體工程經驗的人的解法通常會這樣:1)把數組排序,從大到小。2)於是你要第k大的數,就直接訪問 array[k]。排序只需要一次,O(n*log(n)),然後,接下來的m次對FindKthMaxNum()的調用全是O(1)的,整體復雜度反而成了線性的。其實,上述的還不是工程式的最好的解法,因為,在業務中,那數組中的數據可能會是會變化的,所以,如果是用數組排序的話,有數據的改動會讓我重新排序,這個太耗性能了,如果實際情況中會有很多的插入或刪除操作,那麼可以考慮使用B+樹。工程式的解法有以下特點:1)很方便擴展,因為數據排好序了,你還可以方便地支持各種需求,如從第k1大到k2大的數據(那些學院派寫出來的代碼在拿到這個需求時又開始撓頭苦想了)2)規整的數據會簡化整體的演算法復雜度,從而整體性能會更好。(公欲善其事,必先利其器)3)代碼變得清晰,易懂,易維護!(學院派的和STL一樣的近似O(n)復雜度的演算法沒人敢動)爭論你可能會和我有以下爭論,如果程序員做這個演算法題用排序的方式,他一定不會像你想那麼多。是的,你說得對。但是我想說,很多時候,我們直覺地思考,恰恰是正確的路。因為逗排序地這個思路符合人類大腦處理問題的方式,而使用學院派的方式是反大腦直覺的。反大腦直覺的,通常意味著晦澀難懂,維護成本上升。就是一道面試題,我就是想測試一下你的演算法技能,這也扯太多了。沒問題,不過,我們要清楚我們是在招什麼人看是一個只會寫演算法的人,還是一個會做軟體的人看這個只有你自己最清楚。這個演算法題太容易誘導到學院派的思路了。是的這道逗找出第K大的數地,其實可以變換為更為業務一點的題目——逗我要和別的商戶競價,我想排在所有競爭對手報價的第K名,請寫一個程序,我輸入K,和一個商品名,系統告訴我應該訂多少價看(商家的所有商品的報價在一數組中)地——業務分析,整體性能,演算法,數據結構,增加需求讓應聘者重構,這一個問題就全考了。你是不是在說演算法不重要,不用學看千萬別這樣理解我,搞得好像如果面試不面,我就可以不學。演算法很重要,演算法題能鍛煉我們的思維,而且也有很多實際用處。我這篇文章不是讓大家不要去學演算法,這是完全錯誤的,我是讓大家帶著業務問題去使用演算法。問你業務問題,一樣會問到演算法題上來。小結看過這上面的分析,我相信你明白我為什麼反對純演算法面試題了。原因就是純演算法的面試題根本不能反應一個程序的綜合素質!那麼,在面試中,我們應該要考量程序員的那些綜合素質呢看我以為有下面這些東西:會不會做需求分析看怎麼理解問題的看解決問題的思路是什麼看想法如何看會不會對基礎的演算法和數據結構靈活運用看另外,我們知道,對於軟體開發來說,在工程上,難是的下面是這些挑戰:軟體的維護成本遠遠大於軟體的開發成本。軟體的質量變得越來越重要,所以,測試工作也變得越來越重要。軟體的需求總是在變的,軟體的需求總是一點一點往上加的。程序中大量的代碼都是在處理一些錯誤的或是不正常的流程。所以,對於編程能力上,我們應該主要考量程序員的如下能力:設計是否滿足對需求的理解,並可以應對可能出現的需求變化。