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

卷積神經網絡擁有權重共享、局部連接和平移等變性等非常優秀的屬性,使其在多種視覺任務上取得了極大成功。但在涉及座標建模的任務上(如目標檢測、圖像生成等),其優勢反而成為了缺陷,並潛在影響了最終的模型性能。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) 位置作為網絡的輸入,使其生成一個 64x64 的圖像,並在確定位置繪有一個正方形,如圖 1a 所示,你要使用何種類型的網絡來完成這個任務?

我們可以選用許多圖像生成研究論文中使用的方法,使用一堆解卷積(轉置卷積)層繪製這個正方形。為了測試這一想法,我們創建了一個數據集,該數據集包含一些隨機放置的 9x9 的正方形和一個 64x64 的畫布,如圖 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 網絡、前沿生成模型時的影響。

如果大家喜歡這篇文章的話,希望大家能夠收藏,轉發 謝謝!更多相關資訊可以關注西安華美校區,免費獲得java零基礎教程!額外附送excel教程!


分享到:


相關文章: