論文閱讀—第一篇《ImageNet Classification with Deep Convolutional Neural Networks》

知凹發表於2023-03-15

ImageNet Classification with Deep Convolutional Neural Networks

論文地址

1.研究背景:

在計算機視覺領域,識別大規模影像集合是一個重要的任務。然而,由於資料量大,多樣性複雜,傳統的機器學習方法在此任務上面臨著許多挑戰。深度學習方法的出現解決了這一問題,其中卷積神經網路(CNNs)被證明在大規模視覺識別任務中非常有效。

2.研究內容:

本文介紹了一個基於卷積神經網路的深度學習模型,名為AlexNet。該模型透過在大規模視覺識別挑戰(ILSVRC)上獲得了最好的成績,使得深度學習在視覺識別領域受到了廣泛的關注。

3.研究方法:

AlexNet是一個由8個神經網路層組成的深度卷積神經網路模型,用於大規模視覺識別任務。
image

3.1 卷積層和池化層

AlexNet使用了5個卷積層和3個池化層,每個卷積層後面緊跟一個ReLU啟用函式和一個區域性響應歸一化(LRN)層。這些卷積層和池化層的作用是透過提取影像的特徵,逐漸降低影像的解析度和複雜性,從而使得後續的全連線層可以更好地處理影像的特徵。

3.2 全連線層

AlexNet使用了3個全連線層,其中第三個全連線層的輸出是1000個類別的機率分佈,對應著ImageNet資料集中的1000個類別。全連線層的作用是將卷積層和池化層提取的特徵轉化為分類器可以處理的形式。

3.3 啟用函式和正則化

AlexNet使用了ReLU啟用函式,相比於傳統的sigmoid函式,ReLU可以在訓練過程中加速收斂,並且減少梯度消失問題。此外,為了防止過擬合,AlexNet還採用了Dropout技術和LRN層。Dropout可以隨機地丟棄一些神經元,從而減少模型的複雜度,避免過擬合。LRN層可以對神經元的輸出進行標準化,使得神經元對輸入資料的變化更加魯棒。

3.4 資料增強

AlexNet還使用了資料增強技術來擴充訓練資料集。資料增強的方法包括:隨機裁剪、水平翻轉、色彩變換等。這些方法可以使得模型更好地適應各種影像變換,提高模型的泛化能力。

4.研究結果:

在ImageNet LSVRC-2010資料集上,AlexNet模型取得了16.4%的top-5錯誤率,比排名第二的模型低10.8%。該模型的表現證明了深度卷積神經網路在大規模視覺識別任務中的效果,並且使得深度學習在視覺識別領域受到廣泛關注。

5. AlexNet程式碼實現(Pytorch)

import torch
import torch.nn as nn

class AlexNet(nn.Module):
    def __init__(self, num_classes=1000):
        super(AlexNet, self).__init__()
        self.features = nn.Sequential(
            nn.Conv2d(3, 64, kernel_size=11, stride=4, padding=2),
            nn.ReLU(inplace=True),
            nn.LocalResponseNorm(size=5),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.Conv2d(64, 192, kernel_size=5, padding=2),
            nn.ReLU(inplace=True),
            nn.LocalResponseNorm(size=5),
            nn.MaxPool2d(kernel_size=3, stride=2),
            nn.Conv2d(192, 384, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(384, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.Conv2d(256, 256, kernel_size=3, padding=1),
            nn.ReLU(inplace=True),
            nn.MaxPool2d(kernel_size=3, stride=2),
        )
        self.avgpool = nn.AdaptiveAvgPool2d((6, 6))
        self.classifier = nn.Sequential(
            nn.Dropout(),
            nn.Linear(256 * 6 * 6, 4096),
            nn.ReLU(inplace=True),
            nn.Dropout(),
            nn.Linear(4096, 4096),
            nn.ReLU(inplace=True),
            nn.Linear(4096, num_classes),
        )

    def forward(self, x):
        x = self.features(x)
        x = self.avgpool(x)
        x = torch.flatten(x, 1)
        x = self.classifier(x)
        return x

在該程式碼中定義了一個名為AlexNet的類,該類繼承自nn.Module。在該類的建構函式中,定義了該模型的各個層和引數,其中features是卷積和池化和LRN層,avgpool是自適應平均池化層,classifier是全連線層。在forward函式中,將輸入x傳入features和avgpool層,並將輸出結果壓縮成一個向量,最後透過全連線層得到預測結果。

6.總結與思考

6.1 文章中用了哪些手段來提高模型效能?這些手段今天是否還試用?

答:AlexNet使用了以下技術手段來提高模型效能:

  • 資料增強:隨機裁剪、隨機水平翻轉等方法,可以增加訓練樣本,提高模型的泛化能力。
  • Dropout:隨機將一部分神經元的輸出設為0,可以減少模型的過擬合,提高模型的泛化能力。
  • ReLU啟用函式:相比於傳統的Sigmoid和tanh啟用函式,ReLU啟用函式具有更快的收斂速度和更好的表達能力。
  • LRN層:用於抑制神經元響應的飽和現象,並且可以提高模型的泛化能力,有效避免過擬合。
    這些技術手段在現代深度學習中仍然被廣泛使用。
6.2 至今為止,除了文章中提到的還有哪些常用的提高模型效能或者防止過擬合的手段?

答:有

  • 權重衰減(weight decay):在損失函式中加入權重的平方範數(L2正則化)或絕對值範數(L1正則化)作為正則化項,以懲罰較大的權重,防止模型過擬合。
  • 早停(提早停止)
  • Batch Normalization:在每個小批次的資料上對輸入進行標準化,使得每層的輸入具有相似的統計分佈,從而加速模型的訓練,同時也可以減少模型的過擬合。
  • 整合學習(ensemble learning):透過將多個模型的預測結果結合起來,得到更準確的預測結果,從而減少模型的過擬合風險。
    等。
6.3 為什麼ReLU表現的會比傳統的Sigmoid和tanh啟用函式更好呢?

答:

  • 快速收斂:Sigmoid和tanh函式的梯度在兩端接近0,容易出現梯度消失問題,導致訓練速度變慢。而ReLU函式的梯度在正區間一直為1,可以保證梯度傳播時不會出現梯度消失問題,從而加速模型的收斂速度。
  • 更好的表達能力:Sigmoid和tanh函式在輸入較大或較小時,輸出接近飽和,無法提供更多資訊。而ReLU函式在正區間內輸出恆為正數,可以提供更多的資訊,更好地表達資料的特徵。
6.4 由於模型過大和當時的算力限制,作者使用了兩個GPU來進行訓練,現在多GPU訓練還有必要嗎?

答:由於GPU算力飛快發展,在大部分任務中好像已經不需要在進行這樣的操作了,但是在自然語言處理領域也可能會出現引數過多模型過大導致單個GPU無法訓練的情況,這時候還是要採取多GPU聯合訓練的方法的。

相關文章