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

熱線電話:13121318867

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

下面我們將從以下幾個(gè)方面來介紹為什么需要手動(dòng)將梯度清零:

1. 梯度累加

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

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

2. 多次反向傳播

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

3. 內(nèi)存占用

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

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

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

總結(jié):

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

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

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

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

若不方便掃碼,搜微信號(hào):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)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".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 = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+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); }