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

熱線電話:13121318867

登錄
首頁精彩閱讀神經網絡入門之bp算法,梯度下降
神經網絡入門之bp算法,梯度下降
2018-08-01
收藏

神經網絡入門之bp算法,梯度下降

本人作為一個想進行NLP研究的新手,看了很多網絡上很好的神經網絡的入門代碼和數(shù)學原理。但是個人數(shù)學比較爛,很多東西想了很久才想明白,又害怕忘掉。為此寫下這篇大白話入門篇作為自己學習的一個記錄,也想為跟我同樣想入門的同學們一個參考。希望有問題多多交流。
備注:很多內容都是本人自己想當然的結果,有錯誤的話,望大神們多多指教。
廢話都說完了本文將從一個最簡單一個BP網絡開始講起。
bp網絡的bp(back propagation)中文就是反向傳播的意思,為什么反向傳播呢。是為了將配合梯度下降法進行迭代求出好的結果。這個會稍后講解。

上圖來自百度圖片(懶得畫了)
x為輸入,w為權重,這個f(x)被稱為激活函數(shù)(activation function)。如sigmoid,tanh等。他們的特點有一個就是可以容易的求出他們的導數(shù)(很關鍵)。激活函數(shù)的意義可以看這篇神經網絡激勵函數(shù)的作用是什么?有沒有形象的解釋?
可以看到輸出的o = f(w1x1+w2x2+w3x3+w4x4) = f(∑WiXi)。
第一次運算的結果很明顯就是上邊的o。但是此時問題出來了,運算出來的o和實際的結果肯定式有誤差的,該如何利用這個誤差優(yōu)化這個運算呢?也就是得到好的w呢?

梯度下降法

此時就出現(xiàn)了反向傳播這個過程。而配合反向傳播的就是梯度下降法了。
現(xiàn)在很多同學可能會很暈,當時我第一次看的時候也很暈。
為了容易理解梯度下降法,建議去看Ng的斯坦福網課第二節(jié),非常清楚。比我寫的清楚多了。
梯度下降法是求(局部)最好的w。
設誤差函數(shù)為:


y為實際結果,o為預測結果。
設激活函數(shù)f(x)為sigmoid函數(shù),此時就可以很方便的求出其導數(shù)了(其他激活函數(shù)也是一樣)


所以我們要求的就是J最小的時候wi的值。a是變化的速率。下式就可以比作從山頂走到山底的過程,而a表示行走的步長或者是速率。


此時可以發(fā)現(xiàn)每一項都是可以求出的,則經過多次運算,可以求出好的Wi
一般我們把前兩項作為


此時我們可以發(fā)現(xiàn)

BP的原因

上邊介紹完了梯度下降,現(xiàn)在再說反向傳播理由。其實很簡單了。它用的就是鏈式法則。我們第一步是前向傳播,進行一系列運算得到了預測結果o。為了使用梯度下降法,我們需要得到,上邊需要的delta,也就是說 J 這個誤差函數(shù)。因為實際結果我們知道,而激活函數(shù)的導數(shù)我們也知道怎么運算。所以我們得到預測結果o時,delta就可以求出來。而delta屬于輸出層的運算,再乘以輸入層的Xi就能得到?

Wi,進一步更新Wi。
很明顯可以看出整個一輪的運算是:
前向傳播:
輸入層—-w—》輸出層(sigmoid)—-》預測結果
后向傳播:
誤差—》輸出層(sigmoid)求導—-》輸入層—–》更新Wi

換句話說,BP算法就是提供了給梯度下降法所需要的所有值。
由鏈式法則可知,如果網絡層數(shù)為3層以上時也可以得到每層的delta。
python代碼來說:
layer_n_delta = layer_n+1_delta.dot((W_n_n+1).T)
(W_n_n+1) += (Xn).T.dot(layer_n+1_delta)

上邊有很多符號有點問題,但是我覺得閱讀應該沒有什么障礙。因為第一次用這個marddown編輯器,很多東西不好弄。


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

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

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

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(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調,回調的第一個參數(shù)驗證碼對象,之后可以使用它調用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產品形式,包括: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); }