一個(gè)深度學(xué)習(xí)的框架侮邀,在訓(xùn)練過程中發(fā)現(xiàn)坏怪,前向的運(yùn)算部分沒問題,但是求導(dǎo)回傳后绊茧,就出現(xiàn)整個(gè)網(wǎng)絡(luò)失效的問題(整個(gè)網(wǎng)絡(luò)權(quán)重全部更新為0)铝宵,檢查了很久以后,找到一個(gè)容易被忽視的問題华畏。
就現(xiàn)在很多模型中所用到的loss公式中大多數(shù)都是基本初等函數(shù)鹏秋,這些基本初等函數(shù)中,存在一些定義域?yàn)镽亡笑,但是其導(dǎo)數(shù)定義域不是R的拼岳,或者是函數(shù)定義域與其導(dǎo)數(shù)定義域不相同的。例如况芒,我在應(yīng)用中用到的求平方根的函數(shù)惜纸,該函數(shù)定義域?yàn)榉秦?fù)實(shí)數(shù)叶撒,但是該函數(shù)導(dǎo)數(shù)的定義域?yàn)檎龑?shí)數(shù),這樣導(dǎo)致了耐版,一旦出現(xiàn)變量為0祠够,那么其導(dǎo)數(shù)就為不可求的狀態(tài),進(jìn)而導(dǎo)致了回傳更新參數(shù)出錯(cuò)粪牲。
修改解決辦法很簡(jiǎn)單古瓤,比如在求平方根函數(shù)的調(diào)用中加入很小的數(shù),保證其可導(dǎo)腺阳,例如:
tf.sqrt(x+1e-20)
但是這樣的解決只是一個(gè)trick的解決辦法落君,與此同時(shí),你需要關(guān)注的是亭引,你代碼計(jì)算出來(lái)的x绎速,是否應(yīng)該本身的值域就是x>0,那么這里出現(xiàn)0值,一定是前面計(jì)算存在問題焙蚓;第二就是如果x的值域本身就包含0纹冤,那么有多大的概率會(huì)導(dǎo)致計(jì)算取0。這些都是通過上述折中的辦法解決問題時(shí)购公,應(yīng)該非常謹(jǐn)慎注意的問題萌京。
與此同時(shí),需要探討的是TensorFlow框架實(shí)現(xiàn)的問題宏浩,為什么在導(dǎo)數(shù)出現(xiàn)錯(cuò)誤的情況下知残,還允許訓(xùn)練繼續(xù),更新錯(cuò)誤的權(quán)重比庄,而不是拋出異常求妹,這是值得探討的問題。