Deep-Learning

為什麼resnet比vgg快

  • May 17, 2017

在 Kaiming He 在幻燈片 40 上的resnet 演示中,他說:“時間複雜度低於 VGG-16/19。” 當 resnet 更深時,為什麼會出現這種情況?

更新以解決@mrgloom 的評論

在我最初的回答中,我說 VGG-16 有大約 1.38 億個參數,而 ResNet 有 2550 萬個參數,因此它更快,這是不正確的。參數數量減少了存儲網絡所需的空間量,但這並不意味著它更快。Resnet 比 VGG 快,但原因不同。

此外,正如@mrgloom 指出的那樣,計算速度可能在很大程度上取決於實現。下面我將討論簡單的計算案例。此外,我將避免計算激活函數和池化層的 FLOP,因為它們的成本相對較低。

首先,卷積的速度將取決於輸入的大小。假設您有灰色(1 通道)100x100 圖像,並且您應用了一個 3x3 卷積濾波器,其步幅為 1,填充為 0。此操作將需要您 ~163k FLOPs。這很容易計算。如果您知道卷積是如何工作的,您應該知道從 100x100 圖像中您將獲得 98x98(使用上述設置)。為了從 98x98 輸出圖像中計算每個值,您需要進行 9 次乘法和 8 次加法,總共對應於每個值 17 次操作。如果你把所有的東西結合起來,你會得到 98 * 98 * 17,它等於 163,268。現在,假設您在更大的圖像上應用相同的濾鏡,比如 200x200。圖像的面積大了 4 倍,因此您將獲得大約 4 倍的 FLOP。

現在,我將從 VGG19 和 Resnet 34 之間的比較開始,因為這是他們在原始論文中使用的圖像。

在圖 3 中,他們將架構分解為一組用不同顏色標記的塊。最後,每個塊將高度和寬度減少兩倍。在前兩層中,Resnet 設法將圖像的高度和寬度降低了 4 倍。

vgg-vs-resnet-block-1

從 VGG19 可以看出,前兩層在完整的 224x224 圖像之上應用卷積,這非常昂貴。如果您應用與我在上面所做的類似計算,您會發現第一層執行 ~170M FLOPs,但它從 3x224x224 圖像產生 64x224x224 輸出。由於 layer 應用了相同的 conv 過濾器,您應該看到 FLOP 的數量應該接近 170M * (64 / 3)。事實上,它幾乎是 3.7B FLOPs。僅這一層就具有與整個 Resnet-34 一樣多的 FLOP。為了避免 Resnet 中的這個計算問題,他們在第一層解決了這個問題。它將行和列的數量減少了 2 倍,並且它僅使用 240M FLOP,並且下一個最大池操作應用了另一個 2 倍的減少。

相比之下,VGG19 中的這四個卷積層產生了大約 10B 的 FLOP。

接下來,Resnet 中的捲積過濾器會慢慢建立起來。您可以看到,與 VGG 相比,它們使用的內核更少,但它們中的更多內核在卷積運算和非線性激活函數之間交替堆疊。這是@mrgloom 指出的另一件事。他們利用了使用更薄但更深的網絡的想法。

vgg-vs-resnet-block-2

接下來的 Resnet 層遵循相同的策略,試圖使其更薄更深。

此外,從論文的表 1 中,您可以注意到 Renet 50、Resnet 101 和 Resnet 152 的捲積塊看起來有些不同。這就是它在視覺上的樣子。

使用它是為了進一步減少操作數量,同時在卷積層中使用具有更多過濾器的網絡。1x1 卷積層的想法允許在應用 3x3 卷積之前減少通道深度,然後將其放大回來。

引用自:https://stats.stackexchange.com/questions/280179

comments powered by Disqus