deep_learning - cccnqu/ai106b GitHub Wiki

主題:深度學習

文章

影片

實作

書籍

CNN -- 捲積神經網路

RNN -- 循環神經網路

  1. RNN 的訓練要用 BPTT (Back Propagation Through Time)
  2. 學習的時候要做 Clipping ,限制梯度範圍,這樣才不會一下飛出去!(導致 NaN : Not a Number 發生)

影片

文章:

  1. The Unreasonable Effectiveness of Recurrent Neural Networks
  2. Understanding LSTM Networks

Attention -- hierarchical neural attention encoder

GAN -- 生成對抗網路

輸出入:

  1. Generator : 用 vector 產生樣本 (向量 => 圖片)
  2. Discriminator : 對樣本打分數 (圖片 => 數值)

概念:

  1. Generator : Bottom-Up
  2. Discriminator : Top-Down

實作:

  1. Generator : 每張圖片賦予一個 vector (先 learn a Auto-Encoder),然後再開始 GAN 的學習。
    • Learn a Auto-Encoder : 圖 1 => (Encoder) => vector => (Decoder) => 圖 2 (圖 2 要盡可能和圖 1 一樣)
    • 兩個字母 1 的向量 v1, v2, 一個左斜,一個右斜,但 0.5 v1 + 0.5 v2 並不會產生不傾斜的 1。
    • 解決辦法可用 Variational Auto-Encoder,在訓練時就加入雜訊,訓練出容錯的 Encoder。
  2. Discriminator : 只有好的圖片是不夠的,也要有《不夠好的圖片》。
    • Generator 用 random 產生的雜訊圖片,通常可以用來當第一版《不夠好的圖片》
    • Generator 用 x' = arg max_x D(x) 產生更好的 x' ,這些 x' 就成為第 k+1 版的《不夠好的圖片》
    • Discriminator 持續用更好的 generator 結果來強化自己的辨識能力!
  3. Generator 接 Discriminator 形成一個兩倍大的網路,Generator 的輸出是一張圖片, Discriminator 的輸出是一個好壞值。
    • Generator 優化讓目前 Discriminator Dt() 所得到的分數值,優化完之後:
    • Discriminator 將正確影像輸出值設為 1,Generator 產生的影像輸出值設為 0,然後進行學習,之後產生下一輪的 Dt+1()。
  4. 整體來看,這仍然是一種迭代優化方法,和 EM 演算法很像!

相關文件

生成對抗網路 = 警察 vs. 偽造者

研究人員並非訓練單一神經網路,而是訓練兩個相互競爭的神經網路。繼續以貓咪為例,生成器網路試著創作出看起來像真貓的假貓圖片,而判別器網路則是檢視貓咪圖片並試著判斷真假。

GAN 大幅減少訓練深度學習演算法所需的資料量,解決了這個問題,且提供一套訓練深度學習演算法的獨特方法,也就是從現有資料建立加上標籤的資料(在多數情況下就是影像)。

訓練 GAN 時不需要圖形的類別標記,但是必須要擁有一堆真圖,這樣就能提供《是真圖還是假圖》的資訊。 (所以並不能算是《無指導者》阿!)

在GAN裡面會有兩個導航方向,一個是讓偵探(discriminator)往柯南的方向移動,另一個是讓工匠(generator)往魯班的方向移動。

    createNoise() {
      const latentSize = 100
      const noiseVector = []
      for (let i = 0; i < latentSize; i++) {
        // uniform random between -1 and 1
        noiseVector.push(2 * Math.random() - 1)
      }
      this.noiseVector = noiseVector
    },
    async runModel() {
      const inputData = {
        input_2: new Float32Array(this.noiseVector),
        input_3: new Float32Array([this.digit])
      }
      const outputData = await this.model.predict(inputData)
      this.output = outputData['conv2d_7']
      this.drawOutput()
    },
...
    onGenerateNewNoise() {
      if (this.modelLoading || this.modelInitializing) return
      this.createNoise()
      this.runModel()
      this.drawNoise()
    }

有人說 GAN 不過就是 Monte Carlo 中的 Reject Sampling ...

是有點相近的感覺,但又差很大 ...

參考文獻