前言

對於我們之前介紹過的圖像風格遷移[2]這類的注重每個像素的任務來說,每個樣本的每個像素點的信息都是非常重要的,於是像BN[3]這種每個批量的所有樣本都做歸一化的演算法就不太適用了,因為BN計算歸一化統計量時考慮了一個批量中所有圖片的內容,從而造成了每個樣本獨特細節的丟失。同理對於LN[4]這類需要考慮一個樣本所有通道的演算法來說可能忽略了不同通道的差異,也不太適用於圖像風格遷移這類應用。

所以這篇文章提出了Instance Normalization(IN),一種更適合對單個像素有更高要求的場景的歸一化演算法(IST,GAN等)。IN的演算法非常簡單,計算歸一化統計量時考慮單個樣本,單個通道的所有元素。IN(右)和BN(中)以及LN(左)的不同從圖1中可以非常明顯的看出。

圖1:LN(左),BN(中),IN(右)

1. IN詳解

1.1 IST中的IN

在Gatys等人的IST演算法中,他們提出的策略是通過L-BFGS演算法優化生成圖片,風格圖片以及內容圖片再VGG-19上生成的Feature Map的均方誤差。這種策略由於Feature Map的像素點數量過於多導致了優化起來非常消耗時間以及內存。IN的作者Ulyanov等人同在2016年提出了Texture network[5](圖2),

圖2:Texture Networks的網路結

圖2中的生成器網路(Generator Network)是一個由卷積操作構成的全卷積網路,在原始的Texture Network中,生成器使用的操作包括卷積,池化,上採樣以及BN。但是作者發現當訓練生成器網路網路時,使用的樣本數越少(例如16個),得到的效果越好。但是我們知道BN並不適用於樣本數非常少的環境中,因此作者提出了IN,一種不受限於批量大小的演算法專門用於Texture Network中的生成器網路。

1.2 IN vs BN

BN的詳細演算法我們已經分析過,這裡再重複一下它的計算方式:

mu_i = frac{1}{HWT}sum_{t=1}^Tsum_{l=1}^Wsum_{m=1}^H x_{tilm} qquad sigma_i^2 = frac{1}{HWT}sum_{t=1}^Tsum_{l=1}^Wsum_{m=1}^H (x_{tilm} -mu_i)^2 qquad y_{tijk} = frac{x_{tijk}-mu_{i}}{sqrt{sigma_{i}^2+ epsilon}} 	ag1

正如我們之前所分析的,IN在計算歸一化統計量時並沒有像BN那樣跨樣本、單通道,也沒有像LN那樣單樣本、跨通道。它是取的單通道,單樣本上的數據進行計算,如圖1最右側所示。所以對比BN的公式,它只需要它只需要去掉批量維的求和即可:

mu_{ti} = frac{1}{HW}sum_{l=1}^Wsum_{m=1}^H x_{tilm} qquad sigma_{ti}^2 = frac{1}{HW}sum_{l=1}^Wsum_{m=1}^H (x_{tilm} -mu_{ti})^2 qquad y_{tijk} = frac{x_{tijk}-mu_{ti}}{sqrt{sigma_{ti}^2+ epsilon}} 	ag2

對於是否使用BN中的可學習參數 etagamma ,從LN的TensorFlow中源碼中我們可以看出這兩個參數是要使用的。但是我們也可以通過將其值置為False來停用它們,這一點和其它歸一化方法在TensorFlow中的實現是相同的。

1.3 TensorFlow 中的IN

IN在TensorFlow中的實現見鏈接,其函數聲明如下:

def instance_norm(inputs,
center=True,
scale=True,
epsilon=1e-6,
activation_fn=None,
param_initializers=None,
reuse=None,
variables_collections=None,
outputs_collections=None,
trainable=True,
data_format=DATA_FORMAT_NHWC,
scope=None)

其中的centerscale便是分別對應BN中的參數 etagamma

歸一化統計量是通過nn.moments函數計算的,決定如何從inputs取值的是axes參數,對應源碼中的moments_axes參數。

# Calculate the moments (instance activations).
mean, variance = nn.moments(inputs, moments_axes, keep_dims=True)

下面我們提取源碼中的核心部分,並通過注釋的方法對齊進行解釋(假設輸入的Tensor是按NHWC排列的):

inputs_rank = inputs.shape.ndims # 取Tensor的維度數,這裡值是4
reduction_axis = inputs_rank - 1 # 取Channel維的位置,值為3
moments_axes = list(range(inputs_rank)) # 初始化moments_axes鏈表,值為[0,1,2,3]
del moments_axes[reduction_axis] # 刪除第3個值(Channel維),moments_axes變為[0,1,2]
del moments_axes[0] # 刪除第一個值(Batch維),moments_axes變為[1,2]

總結

IN本身是一個非常簡單的演算法,尤其適用於批量較小且單獨考慮每個像素點的場景中,因為其計算歸一化統計量時沒有混合批量和通道之間的數據,對於這種場景下的應用,我們可以考慮使用IN。

另外需要注意的一點是在圖像這類應用中,每個通道上的值是比較大的,因此也能夠取得比較合適的歸一化統計量。但是有兩個場景建議不要使用IN:

  1. MLP或者RNN中:因為在MLP或者RNN中,每個通道上只有一個數據,這時會自然不能使用IN;
  2. Feature Map比較小時:因為此時IN的採樣數據非常少,得到的歸一化統計量將不再具有代表性。

Reference

[1] Vedaldi V L D U A. Instance Normalization: The Missing Ingredient for Fast Stylization[J]. arXiv preprint arXiv:1607.08022, 2016.

[2] Gatys L A, Ecker A S, Bethge M. Image style transfer using convolutional neural networks[C]//Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2016: 2414-2423.

[3] Ioffe S, Szegedy C. Batch normalization: Accelerating deep network training by reducing internal covariate shift[J]. arXiv preprint arXiv:1502.03167, 2015.

[4] Ba J L, Kiros J R, Hinton G E. Layer normalization[J]. arXiv preprint arXiv:1607.06450, 2016.

[5] Ulyanov, D., Lebedev, V., Vedaldi, A., and Lempitsky, V. S. (2016). Texture networks: Feed-forward synthesis of textures and stylized images. In Proceedings of the 33nd International Conference on Machine Learning, ICML 2016, New York City, NY, USA, June 19-24, 2016, pages 1349–1357.


推薦閱讀:
相關文章