<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          在“內卷”、“紅?!钡?020 年,開墾計算機視覺領域的知識荒原:BatchNorm

          共 10065字,需瀏覽 21分鐘

           ·

          2020-08-06 00:14

          加入極市專業(yè)CV交流群,與?10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度?等名校名企視覺開發(fā)者互動交流!

          同時提供每月大咖直播分享、真實項目需求對接、干貨資訊匯總,行業(yè)技術交流。關注?極市平臺?公眾號?,回復?加群,立刻申請入群~

          作者丨縱橫@知乎
          來源丨h(huán)ttps://zhuanlan.zhihu.com/p/166101119
          2020 年已經要迎來了第二學期,內卷、紅海、賽馬似乎仍是 CV 領域的主旋律。不考慮 ddl 的話,在這樣的主旋律下做一個 C(ctrl c)V (ctrl v)研究生也樂得清閑自在。然而,就在本周的劃水星期五,筆者發(fā)現(xiàn) Normalization 領域(如果能叫領域的話)似乎還留有一片知識的荒原,阻礙了 ctrl c + ctrl v 的進程。
          這里,沒有 survey,沒有 toolbox,甚至連 awesome list 都沒有。因此,本著周五(劃水)精神,筆者重新調研了一下 Normalization 的相關技術,順便總結了一下自己的實踐/魔改經驗,希望能夠拋磚引玉~
          首先,在筆者看來,“批量歸一化”這個名稱有些失敗。歸一化,意味著把 tensor 中的每個 element(或其 L1 范數(shù))規(guī)范化到 [0, 1] 區(qū)間內(或者使其均值為 0 方差為 1)。按照這種叫法,在形式自由主義者看來,Sigmoid 是歸一化,Tanh 也是歸一化。歸一化反倒成了一種特殊的激活函數(shù)。
          這顯然不是我們想表達的。筆者認為,批量歸一化的真正精妙之處在于,在歸一化的過程中,BN 用一種極為節(jié)能的方式建模了整體與個體的相對關系。而 Sigmoid、Tanh 等激活函數(shù)雖然借助于其非線性性將每個 element(個體)規(guī)范化了,但是 element-wise 的操作始終涉及到整體的統(tǒng)計特征
          至于整體是什么的整體,這種相對關系帶來了哪些好處,每個魔改的 BN 都給出了不同的回答。筆者相信未來也會有更多的答案。

          從 Batch Normalization 看魔改方向

          Batch Normalization 在提出時包含以下四步:
          1. 計算/更新均值
          2. 計算/更新方差
          3. 使用均值和方差將每個元素標準化
          4. 對標準化的結果進行縮放(可選)
          為了方便后續(xù)的魔改,筆者用 vanilla pytorch 實現(xiàn)了 BatchNorm2d。對于一個形狀為 (N, C, H, W) 的 input(其中 N 為 batch size, C 為通道數(shù),H 為高,W 為寬),Batch Normalization 的計算方法如下:
          ...if self.training: # 計算當前 batch 的均值 mean = input.mean([0, 2, 3]) # 計算當前 batch 的方差 var = input.var([0, 2, 3], unbiased=False) n = input.numel() / input.size(1) with torch.no_grad(): # 使用移動平均更新對數(shù)據集均值的估算 self.running_mean = exponential_average_factor * mean\ + (1 - exponential_average_factor) * self.running_mean # 使用移動平均更新對數(shù)據集方差的估算 self.running_var = exponential_average_factor * var * n / (n - 1)\ + (1 - exponential_average_factor) * self.running_varelse: mean = self.running_mean var = self.running_var
          # 使用均值和方差將每個元素標準化input = (input - mean[None, :, None, None]) / (torch.sqrt(var[None, :, None, None] + self.eps))
          # 對標準化的結果進行縮放(可選)if self.affine: input = input * self.weight[None, :, None, None] + self.bias[None, :, None, None]...
          其中明顯可以改動的部分有:
          1、BN 時作用于 batch 中所有樣本 feature map 的歸一化方法,統(tǒng)計 (N, H, W) 的均值和方差;這里,統(tǒng)計的對象可以魔改;
          2、在規(guī)范化每個元素時,BN 使用了減均值除以方差的方法;這里,規(guī)范化的方式可以魔改;
          3、對標準化的結果進行縮放時,BN 使用了一個簡單的仿射變換(線性變換),這里仿射變換的方式可以魔改。
          其實在實現(xiàn)細節(jié)中可以魔改的地方還有很多,例如,我們是否可以預先估計數(shù)據集的均值和方差呢?這實際上就是均值和方差初始化的魔改。我們可以先在數(shù)據集上運行一遍模型,只使用移動平均更新 BN,得到數(shù)據集均值和方差的估計,再進行正常地訓練。筆者經常用這種方法初始化成對樣本訓練的模型,對于穩(wěn)定模型性能很有幫助。
          下面筆者將介紹這幾種魔改方向的典型案例,希望能夠拋磚引玉。由于篇幅有限,更多歸一化方法請參考awesome-list(鏈接:https://github.com/tczhangzhi/awesome-normalization-techniques)。如果你已經有 idea 或正在參加比賽,可以使用其中的 code collections 進行魔改或 CV 研究,對于每種 Normalization,代碼示例如下:
          import torchimport torch.nn as nnimport torch.nn.functional as F
          # 實現(xiàn)細節(jié)盡量貼合 official,使用習慣盡量貼合 pytorchclass AdaptiveBatchNorm2d(nn.Module): """Adaptive Batch Normalization Parameters num_features – C from an expected input of size (N, C, H, W) eps – a value added to the denominator for numerical stability. Default: 1e-5 momentum – the value used for the running_mean and running_var computation. Can be set to None for cumulative moving average (i.e. simple average). Default: 0.1 affine – a boolean value that when set to True, this module has learnable affine parameters. Default: True Shape: Input: (N, C, H, W) Output: (N, C, H, W) (same shape as input) Examples: >>> m = AdaptiveBatchNorm2d(100) >>> input = torch.randn(20, 100, 35, 45) >>> output = m(input) """ def __init__(self, num_features, eps=1e-5, momentum=0.1, affine=True): super(AdaptiveBatchNorm2d, self).__init__() self.bn = nn.BatchNorm2d(num_features, eps, momentum, affine) self.a = nn.Parameter(torch.FloatTensor(1, 1, 1, 1)) self.b = nn.Parameter(torch.FloatTensor(1, 1, 1, 1))
          def forward(self, x): return self.a * x + self.b * self.bn(x)
          # 這里是測試用例,可以作為示例使用if __name__ == '__main__': m = AdaptiveBatchNorm2d(100) input = torch.randn(20, 100, 35, 45) output = m(input)

          統(tǒng)計對象的魔改

          筆者看來,該方向算是歷史最久,研究最深入的魔改方向了。包括 Group Normization 在內的 5 個經典的魔改,僅通過修改統(tǒng)計對象的維度就在相應任務中取得了不錯的結果。近年來,仍不斷有新的工作結合語義信息在 feature map 上進一步劃分統(tǒng)計范圍,也讓人耳目一新。
          Layer Normization
          Layer Normalization 是作用于每個本上 (C, H, W) 的歸一化方法(即計算 (C, H, W) 上的均值和方差),這樣的歸一化方式,使 batch 中的每個樣本均可利用其本身的數(shù)據的進行歸一化操作。更高效方便,也不存在更新均值和方差時,batch 內均值和方差不穩(wěn)定的問題。在 NLP 中(Transformer)比較常用,CNN 上作用不大。
          Instance Normization
          Instance Normalization 是作用于每個樣本的每個通道上的歸一化方法(即計算 (H, W) 上的均值和方差)。由于其計算均值和方差的粒度較細,在 low-level 的任務中(例如風格遷移)通常表現(xiàn)突出。在 GAN 網絡的生成器中使用,IN 會降低生成圖像中的網格感,使其更加自然。
          Group Normization
          在分類任務中,Layer Normalization 的粒度太粗,Instance Normalization 的粒度又顯得過細。因此,Group Normalization 對二者進行了平衡,在一定數(shù)目的 channel 上進行歸一化(即計算 (c, H, W) 上的均值和方差)。當 batch size 小于 8 的時候,通常使用 Group Normalization 代替 Batch Normalization,對訓練好的模型 fineture,效果還不錯。
          Switchable Normalization
          Switchable Normalization 是將 Batch Normalization、Layer Normalization 和 Instance Normalization 自動結合的懶人版。其歸一化操作是上述三個歸一化操作結果的加權和,加權系數(shù)由網絡自己學習(softmax)。這種設計允許模型自適應地選擇歸一化的粒度完成指定任務。個人較少使用,會影響收斂速度。
          Sync Batch Normalization
          Sync Batch Normalization 是為跨卡(GPU)同步提出的 Batch Normalization。SN 能夠幫助我們屏蔽多卡訓練的分布式細節(jié),將分散在每個 GPU 上的 batch 合并,視為一個機器上的一個 batch。其關鍵是在前向運算的時候,計算并同步全局(所有 GPU 上 batch)的均值和方差;在反向運算時候,同步相應的全局梯度。筆者會在比賽中使用,以更快得到初步結果,但是在研究中往往不需要那么大 batch。
          Sparse Switchable Normalization
          Sparse Switchable Normalization 是 Switchable Normalization 的改進版。通過稀疏約束,使用 sparsestmax 替代了 softmax,在保持性能的同時減少了 switchable 的計算量,增加了魯棒性。文章的行文很棒,推薦一讀。
          Region Normalization
          Region Normalization 在 Batch Normalization 的基礎上進一步對 (N, H, W) 中的 (H, W) 進行了劃分。Region Normalization 根據輸入掩碼將空間像素劃分為不同的區(qū)域,并計算每個區(qū)域的均值和方差以進行歸一化。實現(xiàn)時只需將輸入先進行 mask,再輸入 BN 即可。
          Local Context Normalization
          Local Context Normalization 在 Layer Normalization 的基礎上對 (C, H, W) 進行了劃分。Local Context Normalization 根據每個特征值所在的局部鄰域,計算鄰域的均值和方差以進行歸一化。實現(xiàn)時作者借助了空洞卷積獲取 window 內均值和方差,比較巧妙。
          Cross-Iteration Batch Normalization
          Cross-Iteration Batch Normalization 在 Batch Normalization 的基礎上,希望使用多個 iteration 的 batch 組成更大的樣本空間,形成對均值和方差更準確的估計。文章主要解決的問題是,第 個 iteration 中統(tǒng)計的均值和方差是基于當時的網絡權重和特征圖計算的,直接用于第 個 iteration 反而會影響第 個 iteration 的估計。作者借助 個 iteration 的梯度解決了該問題。
          Split Batch Normalization
          Split Batch Normalization 根據樣本是否有標簽,在 sample 層面將 batch 內的樣本分為了兩組,分別進行統(tǒng)計。這種分組的思想是 stable 的,筆者在實踐過程中發(fā)現(xiàn)還可以根據 class 或者 feature 分組,不過該文章似乎沒有進行過多的探討。
          Domain-Specific Batch Normalization
          Domain-Specific Batch Normalization 與 Split Batch Normalization 類似,都針對 sample 的不同進行了分組。不同的是,在 Domain adaptation 任務中,Domain-Specific Batch Normalization 選擇對 source domain 和 target domain 進行分組。在計算時,干脆創(chuàng)建了兩個 Batch Normalization,根據 domain 選擇相應的分支輸入。
          Channel Normalization
          顧名思義,在 channel 維度求統(tǒng)計量,對 tensor 進行歸一化。作者生成,這種設計可以在一定程度上解決梯度彌散的問題。然而,在具體 task 中用梯度彌散來描述問題似乎過于泛泛而談了,因此筆者恐怕很難用到這個方法。

          規(guī)范化方式的魔改

          隨著這一塊研究的深入,筆者愈發(fā)崇拜 BN 的精妙之處。筆者也嘗試了使用不同的方式,利用整體的統(tǒng)計特征,將 element 規(guī)范化到 [0, 1] 之間。但性能都與 BN 沒什么差異,反而消耗了大量的計算時間??赡苓@就是深度學習所推崇的 "simple is the best" 吧。向在這個道路上努力的大佬致敬~
          Filter Response Normalization
          Filter Response Normalization 改進了 Instance Normalization,在 (H, W) 維度上計算統(tǒng)計量。不同的是,F(xiàn)ilter Response Normalization 并不計算平均值,在規(guī)范化的過程中,直接使用每個元素除以 (H, W) 維度二范數(shù)的平均值。由于缺少減去均值的操作,因此歸一化的結果可能會產生偏移(不以 0 為中心),這對于后續(xù)的 ReLU 激活是不利的。因此,作者還提出了配套的激活函數(shù) TLU。(其實 TLU 單獨使用也挺好用的)
          Extended Batch Normalization
          Extended Batch Normalization 改進了 Batch Normalization。雖然仍使用均值和方差進行規(guī)范化,不同之處在于,Extended Batch Normalization 在 (N, H, W) 的維度上求平均值,在 (N, C, H, W) 的維度上求方差。直觀上看,統(tǒng)計元素數(shù)量的增多使得方差更為穩(wěn)定,因而能夠在小 batch 上取得較好的效果。
          Kalman Normalization
          Kalman Normalization 改進了 Batch Normalization,使得不同層之間的統(tǒng)計量得以相互關聯(lián)。在 Kalman Normalization,當前歸一化層的均值和方差是通過和上一個歸一化層的均值和方差進行卡爾曼濾波得到的(可以簡單理解當前狀態(tài)為加權歷史狀態(tài)),其在大尺度物體檢測和風格任務上都取得了較好的效果。筆者猜測其能夠在融合不同尺度信息上表現(xiàn)出一定優(yōu)勢,但經過嘗試沒有發(fā)現(xiàn)提高。
          L1-Norm Batch Normalization
          L1-Norm Batch Normalization 將 Batch Normalization 中的求方差換成了 L1 范數(shù)。在 GAN 中表現(xiàn)出了較好的效果。感興趣的同學可以使用上文中提到的代碼倉庫中的 startkit 修改一下 var 操作感受一下魔改的快樂~(逃
          Cosine Normalization
          提出使用 cosine similarity 進行歸一化,文章使用 PCC 將其轉化為了公式 13。雖然目前受到的關注有限,但是筆者猜測其可以用在 domain adaption 等領域中(雖然筆者的嘗試失敗了)。

          仿射變換方式的魔改

          學習,可以說是深度學習最擅長的領域了。最初的仿射變換,當然也可以學習其他更多的特征。盡管這個方向的魔改發(fā)展最為迅速,筆者仍站在舊勢力的陣營:誰知道這是不是"聰明的漢斯"呢?畢竟參數(shù)量為王。不過不可否認的是,該領域的工作確實為引入其他先驗信息的方式開辟了一條新的道路,我們手里的武器不再只有 "feature map 層面" 的 fusion 和 attention 了~

          Conditional Batch/Instance Normalization

          Conditional Batch Normalization 在 Batch Normalization 的基礎上改進了仿射變換的部分。它使用 LSTM 和多層感知器,將自然語言映射為一組特征向量,作為仿射變換的權重 γ 和偏置 β 引導后續(xù)任務。Conditional Instance Normalization 則是對 style 信息進行編碼,使用在風格遷移中(正如之前所介紹的,Instance Normalization 在 low-level 任務中更有優(yōu)勢)。筆者認為,二者都可以看作使用 attention 機制引入了外部信息。
          Adaptive Instance Normalization
          Adaptive Instance Normalization 進一步放寬了權重 γ 和偏置 β 在風格遷移中的估計方法。作者提出的方法不再需要一個單獨的 style 特征提取模塊,對于給定的風格圖像和原始圖像都使用相同的 backbone (VGG)提取特征,用風格圖像算出權重 γ 和偏置?β ,用于原始圖像的仿射變換中。
          Adaptive Convolution-based Normalization
          Adaptive Convolution-based Normalization 是 Adaptive Instance Normalization 的改良版。不同之處在于,Adaptive Convolution-based Normalization 在仿射變換的過程中,使用一個動態(tài)的卷積層完成。這時的仿射變換已經漏出了卷積的獠牙,傳統(tǒng)意義上的仿射變換名存實亡。
          Spatially-Adaptive Normalization
          Spatially-Adaptive Normalization 在使用均值和方差將每個元素標準化到 [0,1] 后,在仿射變換層融入了 mask 引導的 attention 機制。作者首先使用卷積層對 mask 進行變換,在得到的 feature map 上分別使用兩個卷積層得到權重 γ 和偏置 β 的估計。最后使用權重?γ 和偏置 β 的估計對歸一化的結果進行 element-wise 的乘加操作,完成歸一化。
          Region-Adaptive Normalization
          Region-Adaptive Normalization 在 Spatially-Adaptive Normalization 的基礎上進行了 style map 和 segmentation mask 兩個 branch 的 fusion。分別使用 style map 和 mask 套用 Spatially-Adaptive Normalization 得到權重 γ 和偏置 β 的估計,再將兩個 branch 的估計加權平均,得到最終的估計。而后進行仿射變換完成歸一化。
          Instance Enhancement Batch Normalization
          Instance Enhancement Batch Normalization 對權重 γ 的估計則更為簡單粗暴。在使用時,不需要引入 mask 等額外信息做引導,由網絡自適應地學習。作者借鑒了 SENet 的思路,通過池化、變換、Sigmoid 得到一組權重 γ 。這使得 Instance Enhancement Batch Normalization 具有很強的通用性,盡管參數(shù)量有所提升,但是即插即用無痛漲點。
          Attentive Normalization
          Attentive Normalization 與 Instance Enhancement Batch Normalization 的方法類似。筆者認為 Attentive Normalization 這個名稱似乎更加形象一些。

          后記

          由于近期雜七雜八的工作很多,筆者閱讀文獻和復現(xiàn)代碼的時間并不多。有很多優(yōu)秀的工作只來得及總結到 awesome list 中,并未閱讀。因此這里只能拋磚引玉,等大佬們能為我等 ctrl c+ctrl v 工程師開路了~感興趣的同學可以參考 awesome-list,歡迎大家提 issue 和 pr 呀~
          其實,有些藍海只是還未受到關注的紅海,今天愛理不理,明天可能就高攀不起了,譬如深度學習的安全領域??赡苡行r候,還是需要一些科研直覺的吧。當大佬拍腦袋的時候,筆者只能拍大腿:當時為啥我就想不到呢......


          推薦閱讀


          添加極市小助手微信(ID : cv-mart),備注:研究方向-姓名-學校/公司-城市(如:目標檢測-小極-北大-深圳),即可申請加入極市技術交流群,更有每月大咖直播分享、真實項目需求對接、求職內推、算法競賽、干貨資訊匯總、行業(yè)技術交流,一起來讓思想之光照的更遠吧~

          △長按添加極市小助手

          △長按關注極市平臺,獲取最新CV干貨

          覺得有用麻煩給個在看啦~??
          瀏覽 61
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  艹逼视频免费观看 | 五月天丁香花 | 国内精品久久久久久久星 | 九九九九九九九九九九九九九九十九 免费 琪琪先锋 torrent magnet | 日韩无码影音先锋 |