訓練時batch_size不同會影響訓練結果我能理解,但測試時的batch_size應該隻影響測試時間才對,為什麼不同的batch_size仍然會有同的測試結果?

例:我在一次測試集測試中選擇batch_size為32得到的accuracy是91%,選擇batch_size為64得到的accuracy是92%


前陣子剛踩坑

一般這種時候應該是程序中有比較隱晦的bug

如果是涉及到文本等序列數據已經padding後採用CNN的情況

可能是CNN進行時候計算的時候,不同的batchsize進行計算時,部分採用的是embedding中的padding數值進行計算,然後CNN自己採用了全0的補齊padding進行計算,這樣不同的batch_size的計算結果就會不同了


近期踩坑,使用 CNN 做 NLP 處理,組 batch 測試 和單句測試的結果存在偏差。以下解決方案,僅適用於只有個別句子出現預測結果波動並且幅度較小的情況。如果偏差較大的,趕緊找找肯定有大 bug。

此外,我 debug 後定位在了 CNN 的使用上,self-attention 和 RNN 類網路不會出現此類問題。


解決此類問題的第一步,是端正心態,不要心存僥倖:第一,如果出現運行偏差,一定一定是自己的代碼有 bug。第二,模型不會飄,如果輸入數據是相同的,多次預測的結果應當完全一致。

CNN 類網路,在改變 batch_size 時,到底對輸入數據施加了什麼影響呢?答案是 PADDING

NLP 的一個應用特點是,它不能像 CV 那樣對圖像做縮放來進行尺度歸一化。一個最基本的問題,就是如何在同一個 batch_size 內處理變長的序列。CNN 類網路的基本做法,就是把每個句子,都在結尾補 0,使它和最長句一致。這是預處理時候進行的 PADDING,是為了構造 batch。

在空缺位置填上 [P](即 0)

輸入 CNN 之前,還需要進行第二層的 PADDING,用來決定邊界元素如何參與卷積。tf.layers.conv1d 提供的模式中,常用的有兩種。「SAME」,輸入序列長度為 n,則輸出序列長度也為 n。以 stride = 1,kernel = 3 為例,需要補位 kernel - 1 = 2個元素,tensorflow 默認是左右均勻,各補 1 個。在下面的例子中,綠色表示預處理補位,藍色表示CNN補位。

SAME

對於 n = 3 的序列,如果是單句處理(上),則沒有預處理補位,只有CNN補位。如果是拼成最大長度為 5 的batch(下),則藍綠兩種補位都有。很明顯,卷積的輸入在這裡產生了區別。以 conv(x1,x2,x3)表示 [x1,x2,x3] 三個元素的卷積結果。在單句處理時,輸出序列 SA 包含三個元素(上);在拼 batch 時,輸出序列 SB 包含五個元素。其實,SB 就是在 SA 的後面增加兩個額外元素。

第二種補位方式是「VALID」,即能做幾次卷積就做幾次,不多補位。如下圖,沒有藍補位,只有綠補位。在單句處理時,輸出序列 SA 只包含 1 個元素(上);在拼 batch 時,輸出序列 SB 包含三個元素,仍然相當於在 SA 後追加兩個額外元素。

VALID

由上可以看出,無論 SAME 還是 VALID,batch_size 對輸出序列的影響都在序列結尾。無論額外增加的元素是 1 個還是 5 個 還是 10個,其實最後都只有 conv(x,x,[P]),conv(x,[P],[P]),conv([P],[P],[P]) 三種。只有保證這幾個元素都出現,做了 maxpool 後結果都一致。

所以,排除 batch_size 影響的關鍵,就是在序列結尾,留出足夠的額外補位。這樣一來,無論是 batch 內最長的序列,還是做了預處理補位的短序列,序列右側都至少有 kernel 個補位元素,來保證其 CNN-maxpool 後的輸出一致。

在 VALID 模式中,直接補充 kernel 個元素即可;在 SAME 模式中,右側補 kernel - ceil ( kernel - 1/2 ) 個元素。

升級提問,如果是多層 CNN 怎麼辦?答:保證最後一層的右側至少有 kernel 個和輸入序列無關的純補位元素。倒推一下,n 個元素卷積,會產生 n - (kernel - 1) 個元素。要保證下一層仍有 kernel 個元素的話,方程式是:

[公式] 也就是說,每增加一層,輸入序列就要多 kernel - 1 個元素


沒代碼沒數據說個鬼...先整個github讓大家都能夠復現再來說吧......


樓主這個問題解決了嗎


樓主,我也是這個問題,請問怎麼解決的呢


勸你檢查一下吧,這明顯是代碼的問題,可能的原因有很多:

仍然在訓練

輸入時基於batch歸一化

BN層沒關

dropout沒關

…………


Batchsize不會影響測試啊


emm,測試還用batchsize幹嘛,直接整個讀啊


推薦閱讀:
相關文章