Tuesday, December 12, 2017

[deep learning] backlog: in practice

Activation Function:

  • RNN常用tanh,CNN常用relu。
  • 在Generative Model或者Regression Model時要特別注意,tanh會讓值域限縮在-1~1之間,relu會讓<0值的gradient整個歸0(如果有後續應用要非常小心可能造成inf或者nan)且值域限縮在0~inf之間(基本上input有作normalization就不應該沒有負的輸出)。
  • 2017年後出現Selu,可以有效的讓輸出控制在一個好的分布內 -> N(0,1),且有正有負,也有飽和特性,還有大於1的斜率。

WGAN:

  • 可以放一個supervised objective term在generator,可以有機會引導它學得更好。
  • 可以定期的多train幾次Critic,確保它保持在optimal。
  • Critic出來的分數有機會和真實度正相關。
  • Critic必須滿足EM distance上的限制。

CNN:

  • 如果網路全部由convolution組成,input的長度可變,只是output的feature map也會跟著變。RNN與其相比主要是有memory這個差別。inference速度和training時間會比RNN快很多。

Normalization:

  • 基本data的正規化。
  • 採用batch normalization來避免internal covariate shift問題。(不適用small batch)
  • 通常放在activation function前。

Gradient:

  • 對根號x取gradient要非常小心,x不可為0,否則產生inf或者nan。

Tensorflow:

  • name_scope和variable_scope差別:
    • name_scope用來將code和graph統整,會影響Operation的name。
    • variable_scope會同時影響Variable和Operation的name,要小心使用因為會牽涉到是否正確的reuse variable。
  • 建置graph的時候要特別留意重要的變數名稱,以及儘可能讓IO長度可變動。
    日後restore graph會方便很多。

Tensorflow中的兩大類RNN API:

  • static
    • 如果給定每筆資料的真實長度(data padding/zeroing 成同樣長度)gradient就會自動忽略超過的部份,不會去更新
  • dynamic
    • 只會unroll每個batch中最長的長度數量的LSTM Cell,可以更有效率的計算

Thursday, September 21, 2017

[Interview] 研替面試的經驗

我的研替旅程

蠻意外也不意外的,尋找研替的過程,收穫更多的是工作以外的價值。

記得一開始和一群社團學長聚餐,得知竟然有些人在五六月就確定offer,當下突然覺得恐慌,空閒時間準備好104履歷便開始找工作。
五六月時幾乎大部分的研替職缺都還沒有開放,104上更恐慌了,因為自己想找相關興趣的領域,工作機會顯得更加稀少。

我的背景:
  • 大學和碩班都是113
  • 成績約前40%
  • 大學沒什麼特別專案經驗,甚至大一到大三非常討厭寫code
  • 沒有實習經驗
  • 一直以來目標都不明確直到碩一才慢慢找到方向
  • 有一個非常難得的一年半學生新創經驗(大三到碩一)
  • 新創過程有帶TeamScrum的經驗
  • 研究所後有一兩個完整的深度學習專案經驗
  • 就是一般家庭一般背景

這是我一開始對研替的價值觀:
  • 深度學習資料科學相關領域
  • 希望是解決問題篇產品的工作內容
  • 覺得台積電聯發科什麼的大公司不可能會喜歡

研替面試的順序:
  • Appier <Machine Learning Scientist>:一面後感謝信 7/14
  • Synology <Software Engineer> 一面後通知備取 7/21
  • HTC <Deep Learning Research Engineer> 一面通知二面 7/28
  • MediaTek <軟韌體工程師/多媒體工程師> 一面通知二面 8/9
  • MediaTek <軟韌體工程師> 二面後無聲卡 8/24
  • MediaTek <多媒體工程師> 一面後錄取 9/7
  • TSMC <軟體工程師> 一面後婉拒 9/11
  • HTC <Deep Learning Research Engineer>:二面後婉拒 9/18
  • NVIDIA <Deep Learning Solution Architect>:電話面試後錄取 9/20
  • 當然也投了很多其他和deep learning相關的工作,包括新創,或大公司甚至MSRA,前前後後大概也有5~10家投遞後是完全無聲卡。(包含Garmin, Emotibot, Eland, ITRI, Viscovery等等)也有過很久後才通知面試的(包含Gorilla, Cyberlink 都過了兩個月後才通知),可能真的太早投履歷了,或者他們人才制度反應太慢?!

自己的努力:從七月初開始
  • Coursera courses
  • 幾乎每天至少一題leetcode (easy, medium)
  • 持續學校老師的進度
  • 這兩個月以來的學習大概可以抵過一個學期的量。
  • 簡單整理github
  • 開始寫學習相關的 blog

簡記對不同公司的想法:
  • Appier
    印象非常深刻7/12當天才完成一個非常大的final project,但兩天後就要面試Appier,真的是趕鴨子上架,還記得面試過程中可能太緊張,我竟然叫錯面試官名字超過5次以上,最後果然失敗了XDAppier的人才策略非常積極,也非常有禮貌,很嚮往的公司之一。
  • Synology
    人資主動找我去面試,在leetcode還寫不到30題的狀態下,背了考古題(有幫助)就去面試了。
    非常印象深刻,關在小房間連續面試了6個小時還包中餐,白板提名不虛傳。可見對人才的重視。
    但進去才分部門比較讓人在意,對他們新的Surveillance單位很有興趣。
  • HTC
    原先對HTC有很多偏見(媒體渲染,同業的吐嘲),面試完後我還是覺得還是要看部門!個人覺得HTC還是台灣少數有遠見的公司。
    面試的部門是Health Care (又稱DeepQ),部門主管是Edward Chang!!!和他細談了一個半小時的價值觀,真的非常感動和佩服。clean up and make up your mind, lifelong learning.
    最後因為自己的志向目前不在reserach,選擇放棄。真的是非常有前景的新創單位,對research有興趣的人一定非常適合。
  • TSMC
    可能面試我的主管剛好很糟,對台積電印象非常差。該主管有點剛愎自用,認為全台灣只有台積電是好的公司(雖然的確是拉),但就覺得只是個躲在溫室裡20年一朵花,講的話看似很有遠見很有魅力,但連我這種菜鳥都感到反感,可能部門不對吧。
    對他們新的IT事業單位巨量資料分析處很有興趣,在後來得知原來是因為他們內部有某個流程上bug,讓中科的部門可以優先搶延替,枉費有認識的學長幫忙推薦,我似乎就這樣錯過了一個不錯的機會。
    再後即使已經確定去向了,巨量資料分析處還是找我去聊聊,可見大公司招聘流程中許多問題,缺人的部門找不到合適的人才,合適的人才找不到缺人的部門。人資對於人才的需求和部門還是有蠻大落差的。這個部門很像新創,很多都要自己來,要自己找題目去優化,資源很多要錢有錢要data有data,phd很多但很缺肯寫code的master,總之跟台積很多讓人有刻板印象的工作應該差蠻多的。
  • MediaTek
    主管都會遞名片,有一定的面試流程。感覺對人才是非常友善的,中規中矩的好公司,福利和待遇也都是台灣領先的。
    自己有興趣的單位是MM,非常珍惜這個offer。但真的是姻緣巧合,只好放棄。
  • NVIDIA
    非常戲劇化的經驗。履歷大概一個月前就投了吧,都沒有訊息,linkedin密人資也都沒有回應,想說大概是無聲卡吧。
    但竟然在拿到MTK offer後收到人資電話,告知人資即將在兩天後決定研替,當天兩位主管電話面試我30分鐘,就決定錄用了!後來和主管討論,原來我的期末專題作業(present一個專案且放在youtube上)有加分,主管才有信心電話訪談後就決定,也是蠻意外的。另外因為MTK offer的加持,讓我NVIDIApackage內容也不差。
    之前聽網路上的分享,甚至看到什麼七進七出的(面試七關我猜),覺的這次機會真的是天時人和。打破了我對面試的既有價值觀,面試真的有很多方法和門道甚至運氣,親身體驗了。因自已的興趣和職缺非常非常吻合,非常珍惜這個offer,就決定這間了!

這是我後來對研替的價值觀:
  • 台灣的工作環境真的不太好...
  • 大學教育和職場的落差...
  • 台積電聯發科還是台灣目前的指標企業,社會地位也很高。
  • 自己原來還沒有做研發的心理準備,雖然有一些可惜,畢竟有繼續研發的學習機會和興趣,目前還是希望偏應用和產品的工作內容。
  • 一般企業或許會看重潛力,但頂尖新創公司的需求是即戰力。
  • 一般找到的工作往往還是會和研究所所學大不相同。

小技巧:
很多面試技巧是可以提早準備的,像我就是在前面幾次的面試失利後才意識到...
 (即使有人提早指導過我,但自己是屬於那種要親身經歷才能懂的人...)
  • 任何面試後不管順利與否,都可以寄信詢問feedback。面試真的是很難得的經驗,因為過程中會不斷被檢視,生活中很難有這種機會,讓閱歷豐富的人檢視你,給自己意見。我自己到面試後期才發現feedback的價值,有根據的調整後讓我後期的面試更順利。
  • 千萬不要太早投遞最喜歡的公司,不熟練的面試經驗不管如何都不會加分,且往往讓能力打折。
  • 八股式的問題一定要提早準備。八股文的面試考的是對面試的準備,雖不認為這種考題有很高的價值,但面試會問也是必然,不然素未謀面的也不能問什麼。
  • 自我介紹的投影片是一定要作的,沒有深入了解的或疏遠的專案絕不可以放。
  • google考古題, ptt, glassdoor等等都是很好的管道瞭解工作和企業。
  • 自己想要什麼樣的工作非常重要,即使一開始不明確,只要有好好思考終究會慢慢明確的。
  • 工作真的不分貴賤,一定要找個open minded的人給建議,否則很可能會錯過往內心深處靠攏的機會,每個人適合的工作肯定是不同的。
  • 沒背景的求職者,機會只能靠自己爭取,千萬不能客氣。

早找工作
優點:早面試不怕職缺先被佔走?早點找到,就早點回歸畢業論文準備。
缺點:有些公司或部門尚未開出職缺。面試時間會拖非常長。(因為公司都想多比較不同的應徵者)

感念
找工作的路程上,有很多人的幫助,有很熟的學長指導面試技巧,也有平常沒聯繫卻願意幫忙的學長和朋友,還有聽我碎念的女友。真的很感念自己有這樣的福氣,相對很多人而言自己其實只付出了該作的努力,就有機會拿到了滿意的短期目標。
現在想起來,以前很多的活動經歷,志工背包客社團幹部學生創業,在面試的時候都浮現出來,彷彿自己的存在和價值,就是以前的那些過程,讓我想起柯p<生死的智慧>說過的
你問我,什麼是人生,我的回答是,追求這個問題的答案就是這個問題的答案。

面試真的是很靠運氣的過程,如果沒有先被Appier打槍,不會知道好公司面試的強度有多少,如果沒有面試HTC,不會知道原來自己暫時不想走研發,如果沒有面試Synology,不知道自己對寫code的程度,沒有面試TSMC,MTK就不知道大公司優缺點的地方,也就沒有NVIDIA這麼好的package,不管哪個環節少了,我想都無法有現在這合適的選擇,既符合工作內容,又符合薪資期望的好歸屬。

有時真的不用想多,多想只是多迷惘,勇敢追究對了,因為答案就在追的過程中。最大的收穫莫過於在這經驗中,慢慢確立職場和自己特質的連結,認識自己在社會中的價值,也更了解自己的優缺點及人生目標。

Sunday, August 27, 2017

[Interview] @ MediaTek

20170816 @ MediaTek 

基本關:9:00 ~ 10:00

  1. C語言
    1. p++, ++p, #macro... etc.
  2. 上機(IDE實在有夠難用)
    1. 把出現指定prefix的字串刪掉
    2. 把矩陣transpose

部門面試(多媒體,網路,處理器):10:10 ~ 11:50

  • 完全圍繞著投影片詢問問題,希望知道每個專案經驗,合作經驗的細節和想法。
    • 為什麼這個步驟這樣解決?
    • 從這個結果你學到了什麼?
    • 成績單上不同的修課狀況原因?

部門面試(多媒體,智慧電視):13:30 ~ 15:00

  • 表上寫會有四個部門,但不知道如何指出現兩位,而且表定一點整,分別晚到20, 40分鐘,似乎不知道今天有約面試一樣...。
  • 這場的投影片技術細節問的比較少,反而有口頭詢問OS一些基本觀念,其中很特別的是thread和process中的差異,就我認知threads間的共享記憶體應該除了stack(local variable)以外的segment都有共享,面試官似乎很質疑這一點...。
  • 口頭問code,如果要反轉一個string你會怎麼作...。

感想:

  • 發科面試感覺又和前面幾間非常不一樣,大多是經理或技術副理,可能和我的專業領域有差,問的東西都比較抽象一些,像是著重解決問題的思考過程,每個過程中你學到什麼,即使面試官可能也不太清楚你講出來的細節,有種抽象對談的感覺。印象只有一兩位比較有問到點上的感覺。接下來就是看成績,專案經驗和實務經驗是面試的根本,幸好有一些專案經驗,對多媒體部門都蠻有興趣的,也有DL的研發和應用,希望有機會囉。

二面:(智慧電視)

  • 是一級主管,人超好的,談的也很愉快。主要問一些新創帶team的經驗,團隊領導慾問題處理態度。感覺是少數欣賞我新創經驗的面試主管!也有問一些成績學習較差的科目,面對壓力的處理方法,自己的研究興趣和職涯想法。
  • 重視的應該是學習能力,基礎能力,興趣,團隊合作能力,善於應用等特質。

感想:

  • 不知道運氣好還是不好,原本以爲喜歡自己的部門沒機會,原以為不喜歡自己的部門卻有機會,相關的找不相關,不相關的找相關,總覺得沒有到符合預期,但也許將會是一種有趣安排吧。

20170907 @ MediaTek

一面:(多媒體)
  • 平平順順的討論我的自我介紹,主管對我的專案很有興趣,即使主管對DL沒有到非常熟悉,但可以看出公司內部的風氣,大家都有各自花時間對新技術了解,可能也是趨勢。
  • 比較特別的插曲,原以為終於有白板題的面試,結果只要求我用python寫一個class的基本架構。
  • 很幸運主管非常肯定我,當場就口頭給了我正面回應。後來竟然連二面都沒有,就拿到Offer了。蠻好奇之為什麼會有這個機會,也很好奇之前二面的電視部門主管為什麼後來沒消息。這些看來都不得而知了。


Friday, August 4, 2017

[Log], [Entropy], [KL Divergence], [Cross Entropy]

探討Machine Learning中常用的KL Divergence,Cross Entropy, Maximum Likel意義

[Log]

  • 「log math」的圖片搜尋結果
  • 訊息量:通常會用log來描述某個機率隨機變數X發生x事件的訊息量。
    I(X=x) = -log( P(X=x) )
    I -> 訊息量
    P(X=x) -> 發生x事件的機率,介於0~1之間
    log -> 當輸入介於0~1之間,函數輸出 0 => -INF, 1 => 0
  • 取負號-log使函數保有特性,機率越大的事件訊息量越小,反之則越大

[Entropy]

  • 就是對訊息量求取的期望值,希望知道某機率隨機變數的不確定程度,數值越大,不確定信越高,訊息越多,所需要的編碼也會越多。又成”
  • H(X)=Ep[ -logp(x)] =xXp(x)logp(x) 
    The formula for entropy in the case of a two-valued variable is as follows:
    Entropy = -( p * log(p) + (1-p) * log(1-p) )
    舉例BOB考試有50%會及格,STEVE有90%會及格:
    H-
    BOB(X) = - ( 0.5 * log0.5 + (1 - 0.5) * log(1 - 0.5) ) = 0.3
    H-
    STEVE(X) = - ( 0.9 * log0.9 + (1 - 0.9) * log(1 - 0.9) ) = 0.14
    BOB 不確定性遠大於 STEVE
  • 「log entropy」的圖片搜尋結果
    (以上的log皆為base-2 logarithm) -> (可以想成電腦bit的轉換)

[KL Divergence] (Kullback-Leibler) (Relative Entropy)

  • 兩個隨機p(真實)和q(估計)機率分佈之間差距的度量!
  • 記為DKL(p||q),度量q分佈的無效性。
  • DKL(p||q)=Ep[logp(x)q(x)]=xp(x)logp(x)q(x)  // E[log p(x) - log q(x)] 訊息量差的期望值
    =x[p(x)logp(x)p(x)logq(x)]
    =xp(x)logp(x)xp(x)logq(x) 
    =H(p)xp(x)logq(x) 
    =H(p)+Ep[logq(x)] 
    =Hp(q)H(p) // 推倒成兩個分部的entorpy差距,不穩定性的相差,相對
  • 確保連續性的假設:
    0log0

    0
    =00log0q=0plogp0=
     
  • if p==q, DKL(p||q)=0
  • Hp(q)表示在p的機率分佈下,使用q分佈進行編碼的不穩定性,需要的bit編碼數量,H(p)表示真實需要的編碼數。
  • KL Divergence其實很直覺的想法就是衡量估計的q來對p編碼和真實的p編碼兩者分佈的差異,以編碼數量的差,穩定性的差來表達。

[Cross Entropy]

  • 交叉熵容易和相對熵搞混,兩者關係非常緊密,但有所區別。
  • 定義如下:
    CEH(p,q)=Ep[logq]=xp(x)logq(x)=H(p)+DKL(p||q) 
  • 從上面的相對熵解釋中就可以看出來,兩個根本就是差不多的東西,只是描述的目標不同。交叉善就是Hp(q前面已經解釋過了。
  • 特别的,在logistic regression中, (B: Bernoulli distribution)
    p:真實樣本分佈,服從參數分佈為p的0-1分布,即XB(1,p) 
    q:估計出的分佈,服從參數分佈為q的0-1分布,即XB(1,q) 
  • 兩者的交叉熵:CEH(p,q) 
    =xp(x)logq(x) 
    =[Pp(x=1)logPq(x=1)+Pp(x=0)logPq(x=0)] 
    =[plogq+(1p)log(1q)] 
    =[yloghθ(x)+(1y)log(1hθ(x))] 
    對所有訓練樣本取平均: 
    1mi=1m[y(i)loghθ(x(i))+(1y(i))log(1hθ(x(i)))] 
    對這格結果與通過最大似然估計方法(Maximum Likelihood)求出的結果一致。

[Maximum Likelihood]

  • 就是從現有的樣本(機率分佈q)中分析最接近真實(機率分佈p)的方法
  • 應用:Generative Model就可以用Maximum Likelihood來表達學習現有的資料,來模擬真實資料的機率分佈,進而產生結果。
  • <Maximum Likelihood>
    找出一組參數θ,可以讓 樣本機率分佈q 最大化近似 真實機率分佈p
    相當於
    <KL Divergence>
    找出一組參數θ,可以 最小化 樣本機率分佈q 和 真實機率分佈p 所需編碼的差距最小

Cross Entropy vs Mean Square Error

  • 在分類時CE比MSE更適合,最直覺的想法就是分類網路最後的輸出會經過softmax,此時的數值會介於0~1之間,此時如果用MSE去計算loss,只會越來越小,最後導致gradient小到無法訓練。

REF: