卷積神經網路「失陷」,CoordConv 來填坑

機器之心發表於2018-07-13

選自Uber,作者:Rosanne Liu等,機器之心編譯。

卷積神經網路擁有權重共享、區域性連線和平移等變性等非常優秀的屬性,使其在多種視覺任務上取得了極大成功。但在涉及座標建模的任務上(如目標檢測、影像生成等),其優勢反而成為了缺陷,並潛在影響了最終的模型效能。Uber 在這項研究中揭示出問題的本質就在於卷積的平移等變性,並據此提出了對應的解決方案 CoordConv。CoordConv 解決了座標變換問題,具有更好的泛化能力,訓練速度提高 150 倍,引數比卷積少 10-100 倍,並能極大提升多種視覺任務的表現。

Uber 利用卷積神經網路解決許多方面的問題,其中就包括座標變換。從自動駕駛汽車的設計到路標的自動檢測、再到地圖的繪製,Uber 都需要使用卷積網路完成座標變換。

在深度學習領域,沒有一種構想的影響力可與卷積匹敵。幾乎所有機器視覺領域的最新成果都依賴堆疊大量的卷積層,並作為不同模型的基本構建塊。既然這樣的架構非常普遍,我們應該期望它們在一些簡單的任務上表現出色,比如在一個微小的影像中繪製一個畫素。

然而,事實證明,卷積神經網路在完成一些小型簡單任務時也會遇到困難。我們的論文《An Intriguing Failing of Convolutional Neural Networks and the CoordConv Solution》揭示並分析了卷積神經網路在變換兩種空間表徵(笛卡爾空間座標 (i, j) 和 one-hot 畫素空間座標)時的常見缺陷。結果出人意料,因為這項任務看起來如此簡單,但其重要性非同一般,因為解決很多常見問題(如在影像中檢測目標、訓練影像生成模型、從畫素中訓練強化學習智慧體等)都要用到此類座標變換。結果表明,這些任務可能一直受到卷積缺陷的影響,而我們在使用之前提出的一個名為 CoordConv 的層作為解決方案時,展示了各方面的效能提升。

我們將自己的發現總結成了以下視訊:

第一個發現:監督渲染對於 CNN 來說並非易事

我們來設想一個簡單的任務——監督渲染,在該任務中,我們給出一個 (i, j) 位置作為網路的輸入,使其生成一個 64×64 的影像,並在確定位置繪有一個正方形,如圖 1a 所示,你要使用何種型別的網路來完成這個任務?

我們可以選用許多影像生成研究論文中使用的方法,使用一堆解卷積(轉置卷積)層繪製這個正方形。為了測試這一想法,我們建立了一個資料集,該資料集包含一些隨機放置的 9×9 的正方形和一個 64×64 的畫布,如圖 1b 所示。窮舉所有可能的完全可見的正方形得到一個含有 3136 個樣本的資料集。為評估模型的泛化能力,我們定義兩種訓練/測試分割:一種是均勻分割,即將所有可能的中心區域隨機分為訓練集和測試集,二者的比例為 8:2;另一種是象限分割,即畫布被分為四個象限:集中在前三個象限中的小方塊被放入訓練集,最後一個象限中的小方塊被放入測試集。兩種資料集分割方法的分佈見下圖 1c:

卷積神經網路「失陷」,CoordConv 來填坑

圖 1.(a)監督渲染任務要求網路根據正方形的 (i, j) 位置繪製正方形。(b)為示例資料點和、(c)展示了按均勻或象限分割訓練集與測試集的視覺化。

我們原本以為 CNN 可以輕而易舉地完成該任務,因為第一,這一任務如此簡單(整個資料集可能只需要兩行 Python 程式碼就能生成,如我們的論文所示),第二,這個資料集如此之小,我們可以輕易使用過引數化的模型。但結果表明,CNN 的表現令人大跌眼鏡。即使引數高達 1M 且訓練時間超過 90 分鐘的模型(圖 2b)也無法在均勻分割的測試集上獲得 0.83 以上的 IOU,或在象限分割上獲得 0.36 以上的 IOU(圖 2a)。

卷積神經網路「失陷」,CoordConv 來填坑

圖 2:(a)在均勻分割和象限分割時的訓練和測試的監督渲染任務的 IoU 結果。沒有模型能達到 1.0 的 IOU,(b)訓練最好的模型之一需要花 90 分鐘類達到 0.8 的 IOU。

簡化任務和第二個發現:CNN 很難解決有監督座標分類

那麼為什麼有監督渲染如此困難?這一個問題值得我們更深入地探討以全面瞭解根因所在。因此如果通過直接監督訓練渲染如此困難,那麼當轉換為無監督學習將使問題變得更加具挑戰性,例如在相同資料上通過由鑑別器提供的損失訓練生成對抗網路(GAN)。

現在我們可以縮小問題範圍,以找出哪些因素給這個問題帶來了挑戰。我們現在要求網路生成一個簡單的畫素而不再是 9×9 的畫素。其實給定解決單畫素任務的方法,我們可以進一步使用轉置卷積將這一個畫素擴充套件到擁有較多畫素的方塊,這一直觀想法也通過我們的實驗得到證實。因此我們建立了有監督座標分類任務(圖 3a),其中資料集由成對的(i, j)座標軸和帶有單個啟用畫素的影像組成,如下圖 3b 所示:

卷積神經網路「失陷」,CoordConv 來填坑

圖 3:(a)有監督座標軸分類要求網路在給定位置(i, j)的情況下生成單個畫素。(b)展示了樣本資料點,(c)展示了分割訓練和測試集的視覺化。

我們使用不同的超引數訓練了非常多的網路,並觀察到即使一些網路能記住訓練集,但它們從沒有超過 86% 的測試準確率(圖 4a)。這樣的準確率花了一個多小時進行訓練才得到。

卷積神經網路「失陷」,CoordConv 來填坑

圖 4:(a)有監督座標分類任務中的訓練與測試準確率,訓練與測試集使用了均勻和按象限分割。雖然一些模型記住了訓練集,但在使用簡單的均勻分割下,它們在測試集上最高只能達到 86% 的準確率。這意味著即使只是用一個畫素,卷積也不能泛化到這種情況。(b)訓練這種網路達到 86% 的準確率需要花費一個多小時。

我們期望卷積能完美地處理這個問題,但實際上它並不行。為了弄清楚卷積網路到底是在做什麼,我們採用已訓練最好的網路並檢驗它的預測。

我們要求網路生成一張只有一個畫素的影像,即採用 one-hot 的方式生成的位置。為了檢視網路到底做了什麼,我們可以放大目標畫素周圍的小區域。在圖 5 中,目標畫素以紅色標出,我們展示了模型經過 SoftMax 啟用與直接使用 Logits 作為預測的結果。第一個畫素(頂行)是訓練集中的結果,如預期那樣模型有比較正確的預測,雖然在目標畫素外還是存在一些概率。下一個畫素(中間行偏右)在測試集中也是正確的,但因為目標的周圍畫素捕獲了相差不大的概率,所以模型僅僅只是勉強正確。而最後的畫素(底部偏右)則是完全錯誤的。這是非常令人驚訝的,因為作為 80/20 的分割結果,幾乎所有測試畫素都圍繞著訓練畫素。

卷積神經網路「失陷」,CoordConv 來填坑

圖 5:模型在較少相鄰畫素上的預測。網路出現了過擬合現象,即訓練準確率非常完美,而測試準確率最高才 86%。這極為驚人,因為幾乎所有測試畫素都被訓練畫素所圍繞。此外,網路很難擬合訓練集,因為除目標畫素外其它畫素還存在著顯著的概率。

逆向任務和第三個發現:監督迴歸對 CNN 來說也很難

那麼,在給定位置的情況下,為什麼高亮顯示一個畫素對網路來說如此困難?是因為將資訊從一個小空間擴充套件到較大空間比較困難嗎?在逆向任務上是否會容易一些?如果我們訓練卷積網路來將影像資訊壓縮為標量座標——更接近普通的影像分類,會怎樣?

結果發現,在監督迴歸任務上同樣效果不佳。在圖 10 中,左邊的點表示正確的畫素座標,中間的點表示模型預測。拋開一些細節不說,整個模型在測試集上也表現不佳,並且明顯難以預測訓練集。

總之,任務型別並不重要。

看似簡單的座標轉移任務在兩類任務上展現卷積的問題:從笛卡爾(i, j)空間到 one-hot 畫素空間以及反過來,即從 one-hot 畫素空間至笛卡爾空間。即使在監督下訓練,在只畫一個畫素的情況下,當訓練樣本均圍繞測試樣本時,卷積仍然無法學習笛卡爾空間和畫素空間之間的平滑函式。並且,效能最好的卷積模型很大,充其量只能勉強工作,而且需要很長的時間來訓練。

解決辦法:CoordConv

結果發現,有一個簡單的辦法可以解決這個問題。

卷積是等變的,意味著當每個濾波器被應用於輸入以產生輸出時,它並不知道每個濾波器的位置。我們可以通過讓濾波器瞭解自己的位置來幫助卷積。為此,我們在輸入中新增了兩個通道——一個 i 座標,一個 j 座標。我們將由此產生的層稱為 CoordConv,如下圖所示:

卷積神經網路「失陷」,CoordConv 來填坑

圖 6:卷積層和 CoordConv 的對比。CoordConv 層將帶有座標資訊的附加通道作為輸入,此處指 i 座標和 j 座標。

提出的 CoordConv 層是對標準卷積層的簡單擴充套件,其中卷積以座標為條件。允許卷積濾波器觀察到座標會破壞平移等變性,這似乎是個壞主意。平移等變性不是卷積的標誌性優勢嗎

我們認為,卷積獲得成功的重要因素有三:使用的學習引數相對較少;在現代 GPU 上計算速度快;學習了平移等變性函式。

CoordConv 層保留了前兩個屬性——引數較少和計算效率高,並且它的等變程度也可以學習。如果座標中的權重學習為零,CoordConv 的表現將與標準卷積一樣。另一方面,如果平移依賴對下游任務有用,那它也能學習這個。

CoordConv 涉及很多已有方法,如區域性連線層、組合模式生成網路以及語言建模中使用的位置嵌入。以下展示了作者實現的核心程式碼,檢視原論文可以瞭解有關此概念的更多討論。

from tensorflow.python.layers import base
import tensorflow as tf


class AddCoords(base.Layer):
    """Add coords to a tensor"""
    def __init__(self, x_dim=64, y_dim=64, with_r=False):
        super(AddCoords, self).__init__()
        self.x_dim = x_dim
        self.y_dim = y_dim
        self.with_r = with_r


    def call(self, input_tensor):
    """
    input_tensor: (batch, x_dim, y_dim, c)
    """
    batch_size_tensor = tf.shape(input_tensor)[0]
    xx_ones = tf.ones([batch_size_tensor, self.x_dim], dtype=tf.int32)
    xx_ones = tf.expand_dims(xx_ones, -1)

    xx_range = tf.tile(tf.expand_dims(tf.range(self.x_dim), 0), [batch_size_tensor, 1])
    xx_range = tf.expand_dims(xx_range, 1)

    xx_channel = tf.matmul(xx_ones, xx_range)
    xx_channel = tf.expand_dims(xx_channel, -1)

    yy_ones = tf.ones([batch_size_tensor, self.y_dim], dtype=tf.int32)
    yy_ones = tf.expand_dims(yy_ones, 1)

    yy_range = tf.tile(tf.expand_dims(tf.range(self.y_dim), 0), [batch_size_tensor, 1])
    yy_range = tf.expand_dims(yy_range, -1)

    yy_channel = tf.matmul(yy_range, yy_ones)
    yy_channel = tf.expand_dims(yy_channel, -1)
    xx_channel = tf.cast(xx_channel, ’float32’) / (self.x_dim - 1)
    yy_channel = tf.cast(yy_channel, ’float32’) / (self.y_dim - 1)
    xx_channel = xx_channel*2 - 1
    yy_channel = yy_channel*2 - 1

    ret = tf.concat([input_tensor, xx_channel, yy_channel], axis=-1)

    if self.with_r:
        rr = tf.sqrt( tf.square(xx_channel-0.5) + tf.square(yy_channel-0.5))
        ret = tf.concat([ret, rr], axis=-1)
    return ret


class CoordConv(base.Layer):
    """CoordConv layer as in the paper."""
    def __init__(self, x_dim, y_dim, with_r, *args, **kwargs):
        super(CoordConv, self).__init__()
        self.addcoords = AddCoords(x_dim=x_dim, y_dim=y_dim, with_r=with_r)
        self.conv = tf.layers.Conv2D(*args, **kwargs)

    def call(self, input_tensor):
    ret = self.addcoords(input_tensor)
    ret = self.conv(ret)
    return ret
複製程式碼

CoordConv 解決之前的監督任務

首先我們回顧一下以前的任務,然後看 CoordConv 如何發揮作用的。

如圖 7、8 所示,CoordConv 模型在監督式座標分類和監督式渲染任務的兩種訓練/測試分割中都具備完美的訓練和測試效能。此外,CoordConv 模型的引數數量是效能最好的標準 CNN 引數數量的 1/100 – 1/10,且訓練時間僅需數秒,比後者快 150 倍(標準 CNN 訓練時間需要一個多小時)。

卷積神經網路「失陷」,CoordConv 來填坑

圖 7:在監督式座標分類任務上,CoordConv 在訓練集和測試集上均可以快速獲得完美的效能。

卷積神經網路「失陷」,CoordConv 來填坑

圖 8:在監督式渲染任務中,很多 CoordConv 模型在訓練集和測試集上均可以快速獲得完美的效能。

為了進一步驗證,圖 9 展示了在繪製相鄰畫素時普通解卷積與 CoordConv 的效能對比。

卷積神經網路「失陷」,CoordConv 來填坑

圖 9:如前所示,解卷積在監督式座標分類任務上效能不好,而 CoordConv 獲得了 100% 的訓練和測試準確率。解決方案從視覺上看也簡單得多。

在使用卷積來繪製畫素時,我們觀察到偽影和過擬合。而 CoordConv 在訓練集和測試集上都取得了完美的效能。同樣的事情還發生在相反的任務上。卷積在迴歸座標時遇到困難,而 CoordConv 可以很好地建模函式,如圖 10 所示:

卷積神經網路「失陷」,CoordConv 來填坑

圖 10:卷積在建模監督式迴歸任務時遇到困難,而 CoordConv 可以實現很好的建模。

CoordConv 在多個領域中都能提供幫助

至此 Uber 展示了卷積網路在解決某類簡單問題時的失敗,並提出了 CoordConv 層形式的修正。很自然地,我們會想知道:該缺點僅存在於這個簡單問題中嗎?還是說這是一個在其它任務中隱匿存在的核心問題,並阻礙了效能優化?為了回答這個問題,Uber 將 CoordConv 層嵌入多種任務的網路架構中訓練。以下是 Uber 研究發現的總結,在論文中有更詳盡的細節。

目標檢測

由於目標檢測通過觀察影像畫素在笛卡爾座標空間上輸出邊框,它們似乎天然地適合應用 CoordConv。並且研究者發現他們的直覺是正確的:在一個簡單的檢測空白背景中零散 MNIST 數字的問題中,他們發現,使用 CoordConv 時 Faster R-CNN 的 IoU 提升了大約 24%。

影像分類

在所有視覺任務中,當使用 CoordConv 替代卷積時,我們期望影像分類的效能變化儘可能的小,因為分類任務中更加關心「是什麼」而不是在哪裡。實際上當新增一個 CoordConv 層到 ResNet-50 的底層並在 ImageNet 上訓練時,我們發現僅有小量的提高。

生成模型

在諸如 GAN 和 VAE 的生成式模型中,畫素是從隱引數空間中「畫」出來的,在理想情況下或許能編碼高階概念,例如位置。直觀來說,CoordConv 也可能提供幫助。使用基於 Sort-of-CLEVR 形狀的簡單資料集,我們訓練了 GAN 和 VAE 並展示了潛在空間之間的插值。

以一個簡單的生成彩色形狀的任務為例。插值的視訊如圖 11 所示,左邊是普通的 GAN,右邊是 CoordConv GAN,展示了 CoordConv 如何提升了生成模型的效能。

在生成模型中,我們在潛在空間的點之間使用插值,以探究 CoordConv 的影響,這是用於評估生成模型泛化能力的常用方法。

卷積神經網路「失陷」,CoordConv 來填坑

圖 11:普通 GAN(左)和 CoordConv GAN(右)在潛在空間中的移動(插值)。在普通的 GAN 中,我們觀察到很明顯的失真(就像黏在背景上),以及少量的目標偽影。通過 CoordConv GAN,目標變得連貫,並且移動變得更加平滑。

對於左邊的普通 GAN,目標的運動在起初還好。但當更仔細觀察的時候,可以注意到目標的所有部分不是一起運動;視覺失真很高(就像黏在背景上),並且目標的某些部分出現褪色(消失)。當把 CoordConv 放入生成器和判別器時,移動變得更加平滑了。可以看到目標保持連貫,並平滑地移動。

訓練 VAE 的時候也能發現類似的問題。通過卷積,我們發現影像中的目標部分出現了偽影,但利用 CoordConv,目標移動變得更加平滑。

卷積神經網路「失陷」,CoordConv 來填坑

圖 12:普通卷積 VAE(左)和 CoordConv VAE(右)在潛在空間中的插值(移動)。在普通 VAE 中,目標會出現偽影,而在 CoordConv VAE 中它們的移動更加平滑。

當使用更大型的 GAN 來生成大規模房間場景的場景理解(LSUN)時,通過卷積我們再次觀察到了僵硬的目標偽影。加入 CoordConv 後,幾何變換變得更加平滑,包括平移和變形。

卷積神經網路「失陷」,CoordConv 來填坑

圖 13:在 LSUN 房間資料集上訓練的利用普通的卷積 GAN(左)和 CoordConv GAN(右)實現的潛在空間變換。通過卷積我們再次觀察到了僵硬的目標在影像中的偽影。加入 CoordConv 後,幾何變換變得更加平滑,包括平移和變形。

強化學習

強化學習是一個有趣的研究領域,CoordConv 可能對其有所幫助。我們訓練了一些智慧體來玩 Atari 遊戲,例如吃豆人。我們認為如果一個卷積濾波器能夠同時識別吃豆人且提取她在迷宮中的位置,它就有助於學習更好的策略。

我們嘗試在《Distributed Prioritized Experience Replay》(Ape-X)論文實現中加入 CoordConv,但 CoordConv 並沒有即刻表現出效能提升。我們也在策略梯度方法 A2C 上嘗試了 CoordConv,有助於提升結果的時候比較多。這可能反映了學習顯性策略和學習 Q 函式兩種方法之間的不同。在測試的 9 種遊戲中,使用 CoordConv 的 A2C 在 6 種遊戲上的表現優於常規卷積網路(訓練更快或得分更高)。也如同預期的那樣,我們注意到 CoordConv 在吃豆人遊戲上的得分有極大的提升。在兩種遊戲上,CoordConv 表現差不多。在一種遊戲上,CoordConv 表現變得更差。整體來說,這些結果表明,CoordConv 對強化學習非常有幫助。

卷積神經網路「失陷」,CoordConv 來填坑

圖 14:使用 A2C 在 Atari 遊戲上訓練的結果。在 9 個遊戲中,(a)CoordCov 改進了卷積在 6 種遊戲上的表現,(b)在 2 種遊戲上的表現差別不大,(c)在一種任務上結果變的更差。

展望

本文證明了 CNN 不能對座標變換任務進行建模,且我們以 CoordConv 層的形式做了簡單的修整。我們的結果表明,加入這些層後可以極大地提升網路在大量應用中的表現。未來研究將進一步評估 CoordConv 在大規模資料集中的優勢,探索其在檢測任務、語言任務、視訊預測,以及配合空間 transformer 網路、前沿生成模型時的影響。

原文連結:eng.uber.com/coordconv/

相關文章