1. 程式人生 > >記一個神奇的Bug

記一個神奇的Bug

在北京 類型轉換 pool git 在那 浮動 比較 一個 average

多年以後,當Abraham凝視著一行行新時代的代碼在屏幕上川流不息的時候,他會想起2019年4月17日那個不平凡夜晚,以及在那個夜晚他發現的那個不可思議的Bug。

雖然像無數個普普通通的夜晚一樣,我在公司加班,一樣ssh到公司在北京的服務器,但是發現resnet50的計算精度比上一版代碼低了1%。一通著急忙慌的Debug之後無濟於事,只能求助於Git來比較新舊版本異同。

由於精度降低的幅度很小,懷疑跟pool操作有關。最終發現是一個與一個未初始化的short整型數據有關。這個整型數據是pool操作的求和累加器,由於沒有初始化,又由於某種機緣巧合,它的初始值是一個在0-20左右浮動的小值,這個小值在進行7×7的求和與average pool之後起到了抵消強制類型轉換截斷誤差的作用(由於求和對象是ReLU之後的值,都是正值,故截斷誤差也都是正值)。

強制類型轉換切記+0.5/-0.5來四舍五入。

記一個神奇的Bug