神经网络与机器学习 笔记—LMS(最小均方算法)和学习率退火
生活随笔
收集整理的這篇文章主要介紹了
神经网络与机器学习 笔记—LMS(最小均方算法)和学习率退火
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
神經網絡與機器學習?筆記—LMS(最小均方算法)和學習率退火
LMS算法和Rosenblatt感知器算法非常想,唯獨就是去掉了神經元的壓制函數,Rosenblatt用的Sgn壓制函數,LMS不需要壓制函數,兩者一樣是只有單個神經元。
LMS算法信號流圖
?
算法小結:
然后在說下退火:
?
#pragma?once#include?"stdafx.h"#include?<string>#include?<iostream>using?namespace?std;int?gnM?=?0;??????//訓練集空間維度int?gnN?=?0;??????//突觸權值個數double?gdU0?=?0.1;??//初始學習率參數,用于退火,前期可以較大double?gdT?=?1;??//控制退火用的開始降溫的時間點double?gdN?=?0;??//當前工作時間(神經網絡學習次數)//退火//U=U0/(1+(N/T))double?GetNowU()?{gdN++;//cout<<?gdU0?/?(1.0?+?(gdN?/?gdT))<<endl;return?gdU0?/?(1.0?+?(gdN?/?gdT));}void?LMSInit(double?*dX,?const?int?&nM,?double?*dW,?const?int?&nN,?const?double?&dB,?const?double?&dU0?,const?double?&dT)?{//dX?本次訓練數據集//nM?訓練集空間維度//dW?權值矩陣//nN?突觸權值個數?LMS只有一個神經元,所以nM==nM//dB?偏置,正常這個是應該?走退火動態調整的,以后再說,現在固定得了。//dU0?初始學習率參數,用于退火,前期可以較大//dT控制退火用的開始降溫的時間點if?(nM?>?0)?{dX[0]?=?1;//把偏置永遠當成一個固定的突觸}for?(int?i?=?0;?i?<=?nN;?i++)?{if?(i?==?0)?{dW[i]?=?dB;//固定偏置}else?{dW[i]?=?0.0;}}gnM?=?nM,?gnN?=?nN,?gdU0?=?dU0,?gdT?=?dT;}double?Sgn(double?dNumber)?{return?dNumber?>?0???+1.0?:?-1.0;}//感知器收斂算法-學習void?LMSStudy(const?double?*dX,?const?double?dD,?double?*dW)?{//dX?本次訓練數據集//dD?本次訓練數據集的期望值//dW?動態參數,突觸權值double?dY?=?0;for?(int?i?=?0;?i?<=?gnM?&&?i?<=?gnN;?i++)?{dY?=?dY?+?dX[i]?*?dW[i];}//dY?=?Sgn(dY);?LMS這個地方不用了,Rosenblatt是需要的if?(dD?==?dY)?{return;//不需要進行學習調整突觸權值}for?(int?i?=?1;?i?<=?gnM?&&?i?<=?gnN;?i++)?{dW[i]?=?dW[i]?+?GetNowU()?*?(dD?-?dY)?*?dX[i];}}//感知器收斂算法-泛化double?LMSGeneralization(const?double?*dX,?const?double?*dW)?{//dX?本次需要泛化的數據集//dW?已經學習好的突觸權值//返回的是當前需要泛化的數據集的泛化結果(屬于那個域的)double?dY?=?0;for?(int?i?=?0;?i?<=?gnM?&&?i?<=?gnN;?i++)?{dY?=?dY?+?dX[i]?*?dW[i];}return?Sgn(dY);}//雙月分類模型,隨機獲取一組值/*??自己稍微改了下域1:上半個圓,假設圓心位坐標原點(0,0)(x?-?0)?*?(x?-?0)?+?(y?-?0)?*?(y?-?0)?=?10?*?10x?>=?-10?&&?x?<=?10y?>=?0?&&?y?<=?10域2:下半個圓,圓心坐標(10?,-1)(x?-?10)?*?(x?-?10)?+?(y?+?1)?*?(y?+?1)?=?10?*?10;x?>=?0?&&?x?<=?20y?>=?-11?&&?y?<=?-1*/const?double?gRegionA?=?1.0;?//雙月上const?double?gRegionB?=?-1.0;//雙月下void?Bimonthly(double?*dX,?double?*dY,?double?*dResult)?{//dX??????坐標x//dY??????坐標y//dResult?屬于哪個分類*dResult?=?rand()?%?2?==?0???gRegionA?:?gRegionB;if?(*dResult?==?gRegionA)?{*dX?=?rand()?%?20?-?10;//在區間內隨機一個X*dY?=?sqrt(10?*?10?-?(*dX)?*?(*dX));//求出Y}else?{*dX?=?rand()?%?20;*dY?=?sqrt(10?*?10?-?(*dX?-?10)?*?(*dX?-?10))?-?1;*dY?=?*dY?*?-1;}}int?main(){//system("color?0b");double?dX[2?+?1],?dD,?dW[2?+?1];?//輸入空間維度為3?平面坐標系+一個偏置double?dB?=?0;double?dU0?=?0.1;double?dT?=?128;?//128之后開始降溫LMSInit(dX,?2,?dW,?2,?dB,?dU0,?dT);//初始化?感知器double?dBimonthlyX,?dBimonthlyY,?dBimonthlyResult;int?nLearningTimes?=??1024?*?10;//進行10K次學習for?(int?nLearning?=?0;?nLearning?<=?nLearningTimes;?nLearning++)?{Bimonthly(&dBimonthlyX,?&dBimonthlyY,?&dBimonthlyResult);//隨機生成雙月數據dX[1]?=?dBimonthlyX;dX[2]?=?dBimonthlyY;dD?=?dBimonthlyResult;LMSStudy(dX,?dD,?dW);//cout?<<"Study:"?<<?nLearning?<<?"?:X=?"?<<?dBimonthlyX?<<?"Y=?"?<<?dBimonthlyY?<<?"?D="?<<?dBimonthlyResult<<?"----W1=?"?<<?dW[1]?<<?"??W2=?"?<<?dW[2]?<<?endl;}//進行LMS泛化能力測試?測試數據量1Kint?nGeneralizationTimes?=?1?*?1024;int?nGeneralizationYes?=?0,?nGeneralizationNo?=?0;double?dBlattGeneralizationSuccessRate?=?0;for?(int?nLearning?=?1;?nLearning?<=?nGeneralizationTimes;?nLearning++)?{Bimonthly(&dBimonthlyX,?&dBimonthlyY,?&dBimonthlyResult);//隨機生成雙月數據dX[1]?=?dBimonthlyX;dX[2]?=?dBimonthlyY;//cout?<<?"Generalization:?"?<<?dBimonthlyX?<<?","?<<?dBimonthlyY;if?(dBimonthlyResult?==?LMSGeneralization(dX,?dW))?{nGeneralizationYes++;//cout?<<?"?Yes"?<<?endl;}else?{nGeneralizationNo++;//cout?<<?"?No"?<<?endl;}}dBlattGeneralizationSuccessRate?=?nGeneralizationYes?*?1.0?/?(nGeneralizationNo?+?nGeneralizationYes)?*?100;cout?<<?"Study?:?"?<<?nLearningTimes?<<?"?????Generalization?:?"?<<?nGeneralizationTimes?<<?"?????SuccessRate:"?<<?dBlattGeneralizationSuccessRate?<<?"%"?<<?endl;getchar();return?0;}執行結果:
????Study?:?10240?????Generalization?:?1024?????SuccessRate:96.6797%
注意:
? ? ? ? 相對于Rosenblatt算法,LMS如果直接把sgn去掉了可能出現泛化能力急劇下降的問題,我就是,直接變成50%了(和沒學習一樣),因為此時的學習率參數恒等于0.1有點大(為什么說0.1大,因為沒有sgn了,算出的XW是比較大的,而這個時候我們訓練數據集的期望結果,還是+1和-1)。同時,退火的那個地方,去動態調整那幾個參數,會得到你意想不到的效果,挺微妙的。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的神经网络与机器学习 笔记—LMS(最小均方算法)和学习率退火的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 设计模式复习-抽象工厂模式
- 下一篇: 神经网络与机器学习 笔记—多层感知器(M