1.首先是初始化的時(shí)候酗宋,給權(quán)重矩陣 (以及 )的初始值不一樣。
2.如果我們固定初始值疆拘,結(jié)果仍有可能不一樣本缠,原因在于大部分算法訓(xùn)練時(shí)使用的是mini-batch SGD,也就是每次更新數(shù)據(jù)是基于一個(gè)batch里的樣本入问。這次丹锹,許多算法會(huì)在每輪遍歷時(shí)shuffle一遍數(shù)據(jù)集,那么得到的每個(gè)batch的數(shù)據(jù)也會(huì)不一樣芬失,這會(huì)導(dǎo)致學(xué)到的參數(shù)有細(xì)微不同楣黍。
3.進(jìn)一步的,如果我們固定好每個(gè)batch的樣本(或者使用批梯度下降棱烂,即每次都把全量訓(xùn)練集作為一個(gè)batch)租漂,那么訓(xùn)練出來(lái)的模型仍有可能有差異。這可能是收斂條件的判定不同颊糜,有的算法會(huì)固定epoch數(shù)哩治,有的則會(huì)使用early-stop。
以上的討論都是基于通用的神經(jīng)網(wǎng)絡(luò)模型進(jìn)行的衬鱼,即所有神經(jīng)網(wǎng)絡(luò)會(huì)具有的特性如此业筏。此外,還有一些trick也可能會(huì)導(dǎo)致同一超參訓(xùn)練出的模型準(zhǔn)確率不同鸟赫,例如:使用隨機(jī)的dropout蒜胖。需要注意的是,一個(gè)良好的抛蚤,收斂的神經(jīng)網(wǎng)絡(luò)架構(gòu)在同一套超參下訓(xùn)練出的模型台谢,即使有不一樣,但是其準(zhǔn)確率相差不應(yīng)該很大岁经。如果出現(xiàn)差距甚遠(yuǎn)的情況朋沮,請(qǐng)檢測(cè)一下是否實(shí)現(xiàn)有bug或者本身架構(gòu)有問(wèn)題,以保證算法的魯棒性缀壤。
我的算法是因?yàn)橐肓穗S機(jī)數(shù)樊拓,因此固定一個(gè)隨機(jī)種子
random_seed = 1388
random.seed(random_seed)
np.random.seed(random_seed)
torch.manual_seed(random_seed)
torch.cuda.manual_seed_all(random_seed)
#cudnn.benchmark = True
torch.backends.cudnn.deterministic = True
torch.backends.cudnn.benchmark = False