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,可以更有效率的計算

No comments:

Post a Comment