99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁大數(shù)據(jù)時代PyTorch中在反向傳播前為什么要手動將梯度清零?
PyTorch中在反向傳播前為什么要手動將梯度清零?
2023-03-22
收藏
在使用PyTorch進(jìn)行深度學(xué)習(xí)模型訓(xùn)練時,我們通常需要手動將梯度清零。這是因?yàn)?a href='/map/pytorch/' style='color:#000;font-size:inherit;'>PyTorch中的自動求導(dǎo)機(jī)制(Autograd)會自動計算每個張量的梯度,并將其累加到張量的.grad屬性中。如果不手動將梯度清零,那么每次反向傳播時,梯度會被累加到之前的梯度上,導(dǎo)致最終的梯度與期望值不一致。

下面我們將從以下幾個方面來介紹為什么需要手動將梯度清零:

1. 梯度累加

在訓(xùn)練深度學(xué)習(xí)模型時,通常采用批量隨機(jī)梯度下降法(SGD)或者Adam等優(yōu)化算法對模型參數(shù)進(jìn)行更新。在每個batch內(nèi),我們會將多個樣本通過模型進(jìn)行前向傳播得到預(yù)測結(jié)果,計算出損失函數(shù)值,然后通過反向傳播計算出每個參數(shù)的梯度并更新參數(shù)。當(dāng)多個batch的數(shù)據(jù)經(jīng)過前向傳播和反向傳播之后,每個參數(shù)的梯度會被累加起來。這種梯度累加的方式對于訓(xùn)練大型模型非常有用,可以有效地提升模型的性能。

但是,在每個batch之間,如果不手動將之前的梯度清零,那么累加下來的梯度會影響到當(dāng)前batch的參數(shù)更新,導(dǎo)致模型收斂速度變慢,甚至出現(xiàn)震蕩等問題。

2. 多次反向傳播

在某些模型中,我們需要進(jìn)行多次反向傳播,比如說GAN(生成式對抗網(wǎng)絡(luò))。在這種情況下,如果不手動將梯度清零,那么每次反向傳播時,梯度會被累加到之前的梯度上,導(dǎo)致更新的參數(shù)偏差較大,使得訓(xùn)練效果不佳。

3. 內(nèi)存占用

由于PyTorch默認(rèn)情況下會將梯度保存在.grad屬性中,如果不手動清零,那么這些梯度會一直占用內(nèi)存,使得程序的內(nèi)存占用增加。當(dāng)訓(xùn)練大型模型時,這種內(nèi)存泄漏問題會嚴(yán)重影響程序的運(yùn)行效率。

因此,我們需要手動將梯度清零,以確保每次反向傳播時都是基于當(dāng)前batch的梯度計算,而不是基于之前batch的梯度計算。

手動清零梯度的方法很簡單,只需調(diào)用optimizer.zero_grad()即可。這個函數(shù)會將模型所有參數(shù)的.grad屬性設(shè)置為0。

總結(jié):

PyTorch中,手動清零梯度是一個常見的操作。它能夠避免梯度累加、多次反向傳播和內(nèi)存占用等問題帶來的負(fù)面影響,從而保證模型的訓(xùn)練效果和程序的運(yùn)行效率。

推薦學(xué)習(xí)書籍
《CDA一級教材》適合CDA一級考生備考,也適合業(yè)務(wù)及數(shù)據(jù)分析崗位的從業(yè)者提升自我。完整電子版已上線CDA網(wǎng)校,累計已有10萬+在讀~

免費(fèi)加入閱讀:https://edu.cda.cn/goods/show/3151?targetId=5147&preview=0

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗(yàn)證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }