堆疊泛化演算法
Ⅰ 人工智慧學什麼
作為一名計算機專業的教育工作者,我來回答一下這個問題。
首先,人工智慧專業屬於計算機大類專業之一,雖然是新興專業,但是由於當前人工智慧領域的發展前景比較廣闊,同時一系列人工智慧技術也進入到了落地應用的階段,所以當前人工智慧專業也是熱點專業之一。
人工智慧專業有三個特點,其一是多學科交叉,涉及到計算機、數學、控制學、經濟學、神經學、語言學等諸多學科,因此整體的知識量還是比較大的,其二是學習難度較大,人工智慧本身的知識體系尚處在完善當中,很多領域還有待突破,其三是實踐場景要求高。
基於這三個特點,要想在本科階段有較好的學習效果,要有針對性的解決方案。針對於多學科交叉的情況,在大一期間一定要多做加法,尤其要重視編程語言的學習,基於編程語言來打開計算機技術大門,進而學習機器學習,而機器學習則被稱為是打開人工智慧技術大門的鑰匙。
其三是要重視為自己營造一個較好的交流和實踐場景,這對於學習效果有較大的影響,建議在大一、大二期間積極參加人工智慧相關的課題組。在選擇課題組的時候,要考慮到自己的興趣愛好、課題周期、實踐資源等因素,從這個角度來看,學校的科研資源對於人工智慧專業的同學有較大的影響。
如果有互聯網、大數據、人工智慧等方面的問題,或者是考研方面的問題,都可以私信我!
很榮幸曾經參加過一次江蘇省人工智慧論壇,論壇上認真聆聽了行業大佬周志華教授的報告,受益匪淺,首先呢,如果你是在校大學生,想要以後從事人工智慧專業相關工作,我這里給你分享下 南京大學人工智慧學院院長周志華教授 曾經在論壇上分享的南京大學人工智慧專業本科生教育培養大綱的相關課程。
首先是基礎數學部分:
數學分析、高等數學、高等代數、概率論與數理統計、最優化方法、數理邏輯。
其次是學科基礎課程:
人工智慧導引、數據結構與演算法分析、程序設計基礎、人工智慧程序設計、機器學習導論、知識表示與處理、模式識別與計算機視覺、自然語言處理、數字系統設計基礎、操作系統。
專業方向課程:
泛函分析、數字信號處理、高級機器學習、計算方法、控制理論方法、機器人學導論、多智能體系統、分布式與並行計算。
專業選修課課程:
數學建模、矩陣計算、隨機過程、組合數學。博弈論及其應用、時間序列分析、編譯原理、隨機演算法、資料庫概論。
這是南京大學人工智慧學院本科生四年的課程安排,看起來課程非常多,但這是一個培養體系,現在國內只有南京大學針對人工智慧專業開設了如此系統的培養方案,專業涉及人工智慧的各個領域方向。學生可以根據自己的興趣愛好,選擇想要學習的領域方向。
如果你已經畢業,想要轉行從事人工智慧行業,那麼下面這套課程可能比較適合你:
1.莫煩python教程(網路可搜): 莫煩python有很多專欄,可以學習到python基礎、以及人工智慧相關的軟體框架教程,包括相關人工智慧相關的一些實戰小項目。
2.吳恩達機器學習(網易雲課堂): 人工智慧機器學習理論部分,非常適合零基礎的小白學習
3.吳恩達卷積神經網路(網易雲課堂): 人工智慧深度學習理論部分,非常適合零基礎的小白學習
4.李飛飛CS231n(網易雲課堂): 人工智慧深度學習和機器學習理論,適合有一定基礎的學習者。
5.吳恩達cs229(blibli): 人工智慧深度學習和機器學習理論,適合有一定基礎的學習者。
這些基礎課程學會了,可能就算是跨入了半個門檻,當然面試的時候還欠缺實戰經驗,於是你可以去kaggle或者天池參加一些比賽,有了這些比賽經驗,簡歷上也算是多了一塊實戰經驗,增加了你的面試成功率。最後,不要參加什麼培訓機構區培訓,既花錢又學不到什麼東西,最後畢業還會給你簡歷造假,得不償失,我給你推薦的這些課程絕對比市面上99.99%的培訓機構課程靠譜!
接下來文章會側重在以下幾方面
1、零基礎如何進行人工智慧的自學(以找工作為目的),包括路徑規劃,怎麼學等等。
2、我的個人感悟,關於轉行、工作、創業、希望能給大家一些啟發。
3、好的學習資源分享
先說一下個人背景,一本,經濟學畢業,上學時從未學過編程。我這里指的零基礎指的是,沒有編程基礎、沒有數學基礎(數學需要一些基本的,如果沒有,後續也會幫助大家的)。
剛畢業第一年時,迷茫,不知道做什麼。
第一階段:邊工作邊自學爬蟲,失敗
畢業一年後,覺得編程可能是自己想要的,所以開始自學編程。
最開始學的是爬蟲,python語言。每天學6個小時,一周五到六天。學了4個月後,去面了五六家企業,沒有成功。原因是爬蟲的知識夠,可是計算機的基礎太薄弱。什麼演算法、計算機網路這些,統統沒學。因為我當時是完全自學,沒有人帶,導致我也不知道要學這些。第一階段,失敗,說實話,有點氣餒,那可是每天沒日沒夜的學習啊,最後卻換來一場空。可是生活還得繼續,怨天尤人有什麼用。
第二階段:邊工作邊自學人工智慧,成功
面試失敗後,考慮了要把編程基礎學一下再去面試,還是學點別的。我的決定是學人工智慧,當時對這個比較感興趣。好了,又是學了半年多,每天學6個小時,一周6天。從機器學習學到深度學習再學回機器學習。面試,成功地去公司從事機器學習深度學習方面的基礎工作。不過實力肯定沒有那些編程出身,數學、統計出身的人強,所以很多時候也是邊學邊做,打打雜。
其實我說的很簡單很輕松的樣子,但其中的艱辛只有自己是最清楚。所以我很希望通過我未來經驗學習的分享,幫助大家少走一些彎路。
第三階段:自己干
現在,已從公司辭職,自己開發網站,做社群,開網店。就是覺得,其實編程也只是我的一個工具,這個人就是比較喜歡自己做點事情,編程挺累的,哈哈哈。如果大家有什麼合作的好點子,也歡迎隨時來找我哦。
十問十答:
1、零基礎轉行學編程可以嗎?可以,要做好吃苦的准備。學習是個漫長的過程,你上班的話,能否保證一定時間的學習呢,這個是你要問自己的。我也是邊工作邊學習,不同的是,我工作很清閑,所以我基本可以在上班時間學習。如果你還在上學,恭喜你這是你最好的機會了。
2、該自學還是去培訓班?我覺得自學就夠了,培訓班真是又貴又水。這是我進過培訓班的朋友告訴我的。其實你工作之後會發現,很多東西都是要自學的。如果你連自學都沒辦法自學的話,你又怎麼能工作。而且,自學的效率會更高,當然前提是路徑不能錯。
3、轉行編程,就業率怎麼樣?說實話,如果你不是編程出身的,要轉行編程其實是比較難的,畢竟人家4年的正統學習不是白學的。但這不意味著就沒辦法。找准目標,規劃好路徑,學習最必要的知識,這樣就有機會。但是,請做好學完仍找不到工作的心理准備。
4、最理想的自學環境是怎麼樣的?清晰的學習路徑+自學+交流討論的環境+有人指導
5、人工智慧零基礎可以學嗎?可以,但是比一般轉行編程的要難,因為要自學的東西更多,要求的門檻也會更高。這個後續會著重講到。
6、學人工智慧需要數學嗎?不要因為數學而望而切步,數學是需要的,但沒有要求的高不可攀,通過必要的學習,是可以達到入門水準的。
7、以前沒接觸過編程,怎麼辦?可以學習python,這真的是一門對零基礎的人來說很友好的語言了,其他的我不懂。
8、一般轉行編程的周期要多久?按我跟我周邊朋友的經驗來看。一周5-6天,一天6小時學習時間,4-7個月,這應該是比較正常的。
9、我是怎麼堅持下來的?期間有很多次想要放棄,有的時候是真的看不懂,也沒人教,純自學,安裝個工具有什麼時候就要安裝半天,不多說,都是淚啊。你的慾望有多強烈,就能有多堅持。
10、現在學編程還來得及嗎?永遠都來得及,學編程不一定是為了好工作,它更是一個全新的世界,你會發現很多對自己有幫助的東西。就算以後你不做這個,我相信這個學習的過程也會有所收獲。
這是我之後會寫的文章的大概目錄,大家可以參考一下。
以下系列是暫定的,一篇文章可能會寫成好幾篇。這個系列不僅僅以學習為目的,目的是為了達到機器學習的工作入門標准。並不簡單,但努力就有可能。網上的教程我看了很多,路徑大部分都沒有錯。只是我覺得第一,太貴,明明網上有很多免費的更好的資源。第二,練習的量遠遠不夠達到能去找工作的標准。
目錄:
零基礎自學人工智慧系列(1):機器學習的最佳學習路徑規劃(親身經驗)
零基礎自學人工智慧系列(2):機器學習的知識准備(數學與python,附學習資源)
零基礎自學人工智慧系列(3):機器學習的知識准備(數學篇詳解)
零基礎自學人工智慧系列(4):機器學習的知識准備(python篇詳解)
零基礎自學人工智慧系列(5):機器學習的理論學習規劃(附資源)
零基礎自學人工智慧系列(6):深度學習的理論學習規劃(附資源)
零基礎自學人工智慧系列(7):機器學習的實戰操作(附資源和代碼)
零基礎自學人工智慧系列(8):深度學習的實戰操作(附資源和代碼)
零基礎自學人工智慧系列(9):找工作篇,需加強的部分(類似數據結構與演算法)
最後,我希望我能給大家樹立一些信心。不管你現在處於什麼水平,只要肯努力,什麼都有可能的。
首先我們需要一定的數學基礎,如:高數、線性代數、概率論、統計學等等。很多人可能要問,我學習人工智慧為什麼要有數學基礎呢?二者看似毫不相干,實則不然。線性代數能讓我們了解如何將研究對象形象化,概率論能讓我們懂得如何描述統計規律,此外還有許多其他數學科目,這些數學基礎能讓我們在學習人工智慧的時候事半功倍。
1、學習並掌握一些數學知識
高等數學是基礎中的基礎,一切理工科都需要這個打底,數據挖掘、人工智慧、模式識別此類跟數據打交道的又尤其需要多元微積分運算基礎
線性代數很重要,一般來說線性模型是你最先要考慮的模型,加上很可能要處理多維數據,你需要用線性代數來簡潔清晰的描述問題,為分析求解奠定基礎
概率論、數理統計、隨機過程更是少不了,涉及數據的問題,不確定性幾乎是不可避免的,引入隨機變數順理成章,相關理論、方法、模型非常豐富。很多機器學習的演算法都是建立在概率論和統計學的基礎上的,比如貝葉斯分類器、高斯隱馬爾可夫鏈。
再就是優化理論與演算法,除非你的問題是像二元一次方程求根那樣有現成的公式,否則你將不得不面對各種看起來無解但是要解的問題,優化將是你的GPS為你指路
有以上這些知識打底,就可以開拔了,針對具體應用再補充相關的知識與理論,比如說一些我覺得有幫助的是數值計算、圖論、拓撲,更理論一點的還有實/復分析、測度論,偏工程類一點的還有信號處理、數據結構。
2、掌握經典機器學習理論和演算法
如果有時間可以為自己建立一個機器學習的知識圖譜,並爭取掌握每一個經典的機器學習理論和演算法,我簡單地總結如下:
1) 回歸演算法:常見的回歸演算法包括最小二乘法(OrdinaryLeast Square),邏輯回歸(Logistic Regression),逐步式回歸(Stepwise Regression),多元自適應回歸樣條(MultivariateAdaptive Regression Splines)以及本地散點平滑估計(Locally Estimated Scatterplot Smoothing);
2) 基於實例的演算法:常見的演算法包括 k-Nearest Neighbor(KNN), 學習矢量量化(Learning Vector Quantization, LVQ),以及自組織映射演算法(Self-Organizing Map , SOM);
3) 基於正則化方法:常見的演算法包括:Ridge Regression, Least Absolute Shrinkage and Selection Operator(LASSO),以及彈性網路(Elastic Net);
4) 決策樹學習:常見的演算法包括:分類及回歸樹(ClassificationAnd Regression Tree, CART), ID3 (Iterative Dichotomiser 3), C4.5, Chi-squared Automatic Interaction Detection(CHAID), Decision Stump, 隨機森林(Random Forest), 多元自適應回歸樣條(MARS)以及梯度推進機(Gradient Boosting Machine, GBM);
5) 基於貝葉斯方法:常見演算法包括:樸素貝葉斯演算法,平均單依賴估計(AveragedOne-Dependence Estimators, AODE),以及Bayesian Belief Network(BBN);
6) 基於核的演算法:常見的演算法包括支持向量機(SupportVector Machine, SVM), 徑向基函數(Radial Basis Function ,RBF), 以及線性判別分析(Linear Discriminate Analysis ,LDA)等;
7) 聚類演算法:常見的聚類演算法包括 k-Means演算法以及期望最大化演算法(Expectation Maximization, EM);
8) 基於關聯規則學習:常見演算法包括 Apriori演算法和Eclat演算法等;
9) 人工神經網路:重要的人工神經網路演算法包括:感知器神經網路(PerceptronNeural Network), 反向傳遞(Back Propagation), Hopfield網路,自組織映射(Self-OrganizingMap, SOM)。學習矢量量化(Learning Vector Quantization, LVQ);
10) 深度學習:常見的深度學習演算法包括:受限波爾茲曼機(RestrictedBoltzmann Machine, RBN), Deep Belief Networks(DBN),卷積網路(Convolutional Network), 堆棧式自動編碼器(Stacked Auto-encoders);
11) 降低維度的演算法:常見的演算法包括主成份分析(PrincipleComponent Analysis, PCA),偏最小二乘回歸(Partial Least Square Regression,PLS), Sammon映射,多維尺度(Multi-Dimensional Scaling, MDS), 投影追蹤(ProjectionPursuit)等;
12) 集成演算法:常見的演算法包括:Boosting, Bootstrapped Aggregation(Bagging),AdaBoost,堆疊泛化(Stacked Generalization, Blending),梯度推進機(GradientBoosting Machine, GBM),隨機森林(Random Forest)。
3、掌握一種編程工具,比如Python
一方面Python是腳本語言,簡便,拿個記事本就能寫,寫完拿控制台就能跑;另外,Python非常高效,效率比java、r、matlab高。matlab雖然包也多,但是效率是這四個裡面最低的。
4、了解行業最新動態和研究成果,比如各大牛的經典論文、博客、讀書筆記、微博微信等媒體資訊。
5、買一個GPU,找一個開源框架,自己多動手訓練深度神經網路,多動手寫寫代碼,多做一些與人工智慧相關的項目。
6、選擇自己感興趣或者工作相關的一個領域深入下去
人工智慧有很多方向,比如NLP、語音識別、計算機視覺等等,生命有限,必須得選一個方向深入的專研下去,這樣才能成為人工智慧領域的大牛,有所成就。
再回答第二個問題,人工智慧到底是不是一項技術?
根據網路給的定義,人工智慧(Artificial Intelligence),英文縮寫為AI。它是研究、開發用於模擬、延伸和擴展人的還能的理論、方法、技術及應用系統的一門新的技術科學。
網路關於人工智慧的定義詳解中說道:人工智慧是計算機的一個分支,二十世紀七十年代以來被稱為世界三大尖端技術之一(空間技術、能源技術、人工智慧)。也被認為是二十一世紀三大尖端技術(基因工程、納米科學、人工智慧)之一。這是因為近三十年來它獲得了迅速的發展,在很多學科領域都獲得了廣泛應用,並取得了豐碩的成果,人工智慧已逐步成為一個獨立的分支,無論在理論和實踐上都已自成一個系統。
綜上,從定義上講,人工智慧是一項技術。
希望能幫到你。
人工智慧需要學習的主要內容包括:數學基礎課學科基礎課,包括程序設計基礎、數據結構、人工智慧導論、計算機原理、 數字電路 、系統控制等;專業選修課,比如 神經網路 、深度學習以及認知科學、神經科學、計算金融、計算生物學、計算語言學等交叉課程。
一、人工智慧專業學什麼
1.認知與神經科學課程群
具體課程:認知心理學、神經科學基礎、人類的記憶與學習、語言與思維、計算神經工程
2.人工智慧倫理課程群
具體課程:《人工智慧、 社會 與人文》、《人工智慧哲學基礎與倫理》
3.科學和工程課程群
新一代人工智慧的發展需要腦科學、神經科學、認知心理學、信息科學等相關學科的實驗科學家和理論科學家的共同努力,尋找人工智慧的突破點,同時必須要以嚴謹的態度進行科學研究,讓人工智慧學科走在正確、 健康 的發展道路上。
4.先進機器人學課程群
具體課程:《先進機器人控制》、《認知機器人》、,《機器人規劃與學習》、《仿生機器人》
5.人工智慧平台與工具課程群
具體課程:《群體智能與自主系統》《無人駕駛技術與系統實現》《 游戲 設計與開發》《計算機圖形學》《虛擬現實與增強現實》。
6.人工智慧核心課程群
具體課程:《人工智慧的現代方法I》《問題表達與求解》、《人工智慧的現代方法II》《機器學習、自然語言處理、計算機視覺等》。
二、人工智慧專業培養目標及要求
以培養掌握人工智慧理論與工程技術的專門人才為目標,學習機器學習的理論和方法、深度學習框架、工具與實踐平台、自然語言處理技術、語音處理與識別技術、視覺智能處理技術、國際人工智慧專業領域最前沿的理論方法,培養人工智慧專業技能和素養,構建解決科研和實際工程問題的專業思維、專業方法和專業嗅覺。
探索 實踐適合中國高等人工智慧人才培養的教學內容和教學方法,培養中國人工智慧產業的應用型人才。
三、人工智慧專業簡介
人工智慧專業是中國高校人計劃設立的專業,旨在培養中國人工智慧產業的應用型人才,推動人工智慧一級學科建設。2018年4月,教育部在研究制定《高等學校引領人工智慧創新行動計劃》,並研究設立人工智慧專業,進一步完善中國高校人工智慧學科體系。2019年3月,教育部印發了《教育部關於公布2018年度普通高等學校本科專業備案和審批結果的通知》,根據通知,全國共有35所高校獲首批「人工智慧」新專業建設資格。
2020年3月3日,教育部公布2019年度普通高等學校本科專業備案和審批結果,「人工智慧」專業成為熱門。
人工智慧是一個綜合學科,其本身涉及很多方面,比如神經網路、機器識別、機器視覺、機器人等,因此,我們想要學好整個人工智慧是很不容易的。
首先我們需要一定的數學基礎,如:高數、線性代數、概率論、統計學等等。很多人可能要問,我學習人工智慧為什麼要有數學基礎呢?二者看似毫不相干,實則不然。線性代數能讓我們了解如何將研究對象形象化,概率論能讓我們懂得如何描述統計規律,此外還有許多其他數學科目,這些數學基礎能讓我們在學習人工智慧的時候事半功倍。
然後我們需要的就是對演算法的累積,比如人工神經網路、遺傳演算法等。人工智慧的本身還是通過演算法對生活中的事物進行計算模擬,最後做出相應操作的一種智能化工具,演算法在其中扮演的角色非常重要,可以說是不可或缺的一部分。
最後需要掌握和學習的就是編程語言,畢竟演算法的實現還是需要編程的,推薦學習的有Java以及Python。如果以後想往大數據方向發展,就學習Java,而Python可以說是學習人工智慧所必須要掌握的一門編程語言。當然,只掌握一門編程語言是不夠的,因為大多數機器人的模擬都是採用的混合編程模式,即採用多種編程軟體及語言組合使用,在人工智慧方面一般使用的較多的有匯編和C++,此外還有MATLAB、VC++等,總之一句話,編程是必不可少的一項技能,需要我們花費大量時間和精力去掌握。
人工智慧現在發展得越來越快速,這得益於計算機科學的飛速發展。可以預料到,在未來,我們的生活中將隨處可見人工智慧的產品,而這些產品能為我們的生活帶來很大的便利,而人工智慧行業的未來發展前景也是十分光明的。所以,選擇人工智慧行業不會錯,但正如文章開頭所說,想入行,需要我們下足功夫,全面掌握這個行業所需要的技能才行。
,首先呢,如果你是在校大學生,想要以後從事人工智慧專業相關工作,我這里給你分享下 南京大學人工智慧學院院長周志華教授 曾經在論壇上分享的南京大學人工智慧專業本科生教育培養大綱的相關課程。
首先是基礎數學部分:
人工智慧亦稱智械、機器智能,指由人製造出來的機器所表現出來的智能。通常人工智慧是指通過普通計算機程序來呈現人類智能的技術。通過醫學、神經科學、機器人學及統計學等的進步,有些預測則認為人類的無數職業也逐漸被人工智慧取代。
Ⅱ 堆棧有哪兩種基本操作,它的含義是什麼
機科學與技術領域上廣泛被使用的術語。它用來反映一個數據的內部構成,即一個數據由那些成分數據構成,以什麼方式構成,呈什麼結構。數據結構有邏輯上的數據結構和物理上的數據結構之分。邏輯上的數據結構反映成分數據之間的邏輯關系,而物理上的數據結構反映成分數據在計算機內部的存儲安排。數據結構是數據存在的形式。 數據結構是信息的一種組織方式,其目的是為了提高演算法的效率,它通常與一組演算法的集合相對應,通過這組演算法集合可以對數據結構中的數據進行某種操作。
?
數據結構主要研究什麼?
?
數據結構作為一門學科主要研究數據的各種邏輯結構和存儲結構,以及對數據的各種操作。因此,主要有三個方面的內容:數據的邏輯結構;數據的物理存儲結構;對數據的操作(或演算法)。通常,演算法的
?
設計取決於數據的邏輯結構,演算法的實現取決於數據的物理存儲結構。
?
什麼是數據結構?什麼是邏輯結構和物理結構?
?
數據是指由有限的符號(比如,"0"和"1",具有其自己的結構、操作、和相應的語義)組成的元素的集合。結構是元素之間的關系的集合。通常來說,一個數據結構DS 可以表示為一個二元組:
?
DS=(D,S), //i.e., data-structure=(data-part,logic-structure-part) 這里D是數據元素的集合(或者是「結點」,可能還含有「數據項」或「數據域」),S是定義在D(或其他集合)上的關系的集合,S = ,稱之為元素的邏輯結構。 邏輯結構有四種基本類型:集合結構、線性結構、樹狀結構和網路結構。表和樹是最常用的兩種高效數據結構,許多高效的演算法可以用這兩種數據結構來設計實現。表是線性結構的(全序關系),樹(偏序或層次關系)和圖(局部有序(weak/local orders))是非線性結構。
?
數據結構的物理結構是指邏輯結構的存儲鏡像(image)。數據結構 DS 的物理結構 P對應於從 DS 的數據元素到存儲區M(維護著邏輯結構S)的一個映射:
?
(PD,S) -- > M 存儲器模型:一個存儲器 M 是一系列固定大小的存儲單元,每個單元 U 有一個唯一的地址 A(U),該地址被連續地編碼。每個單元 U 有一個唯一的後繼單元 U'=succ(U)。 P 的四種基本映射模型:順序(sequential)、鏈接(linked)、索引(indexed)和散列(hashing)映射。
?
因此,我們至少可以得到4×4種可能的物理數據結構:
?
sequential (sets)
linked lists
indexed trees
hash graphs
?
(並不是所有的可能組合都合理)
?
??? 數據結構DS上的操作:所有的定義在DS上的操作在改變數據元素(節點)或節點的域時必須保持DS的邏輯和物理結構。
?
DS上的基本操作:任何其他對DS的高級操作都可以用這些基本操作來實現。最好將DS和他的所有基本操作看作一個整體——稱之為模塊。我們可以進一步將該模塊抽象為數據類型(其中DS的存儲結構被表示為私有成員,基本操作被表示為公共方法),稱之為ADT。作為ADT,堆棧和隊列都是一種特殊的表,他們擁有表的操作的子集。 對於DATs的高級操作可以被設計為(不封裝的)演算法,利用基本操作對DS進行處理。
?
好的和壞的DS:如果一個DS可以通過某種「線性規則」被轉化為線性的DS(例如線性表),則稱它為好的DS。好的DS通常對應於好的(高效的)演算法。這是由計算機的計算能力決定的,因為計算機本質上只能存取邏輯連續的內存單元,因此如何沒有線性化的結構邏輯上是不可計算的。比如對一個圖進行操作,要訪問圖的所有結點,則必須按照某種順序來依次訪問所有節點(要形成一個偏序),必須通過某種方式將圖固有的非線性結構轉化為線性結構才能對圖進行操作。
?
樹是好的DS——它有非常簡單而高效的線性化規則,因此可以利用樹設計出許多非常高效的演算法。樹的實現和使用都很簡單,但可以解決大量特殊的復雜問題,因此樹是實際編程中最重要和最有用的一種數據結構。樹的結構本質上有遞歸的性質——每一個葉節點可以被一棵子樹所替代,反之亦然。實際上,每一種遞歸的結構都可以被轉化為(或等價於)樹形結構。
?
從機器語言到高級語言的抽象
?
我們知道,演算法被定義為一個運算序列。這個運算序列中的所有運算定義在一類特定的數據模型上,並以解決一類特定問題為目標。這個運算序列應該具備下列四個特徵。 有限性,即序列的項數有限,且每一運算項都可在有限的時間內完成;確定性,即序列的每一項運算都有明確的定義,無二義性;可以沒有輸入運算項,但一定要有輸出運算項;可行性,即對於任意給定的合法的輸入都能得到相應的正確的輸出。這些特徵可以用來判別一個確定的運算序列是否稱得上是一個演算法。 但是,我們現在的問題不是要判別一個確定的運算序列是否稱得上是一個演算法,而是要對一個己經稱得上是演算法的運算序列,回顧我們曾經如何用程序設計語言去表達它。
?
演算法的程序表達,歸根到底是演算法要素的程序表達,因為一旦演算法的每一項要素都用程序清楚地表達,整個演算法的程序表達也就不成問題。
?
作為運算序列的演算法,有三個要素。 作為運算序列中各種運算的運算對象和運算結果的數據;運算序列中的各種運算;運算序列中的控制轉移。這三種要素依序分別簡稱為數據、運算和控制。 由於演算法層出不窮,變化萬千,其中的運算所作用的對象數據和所得到的結果數據名目繁多,不勝枚舉。最簡單最基本的有布爾值數據、字元數據、整數和實數數據等;稍復雜的有向量、矩陣、記錄等數據;更復雜的有集合、樹和圖,還有聲音、圖形、圖像等數據。 同樣由於演算法層出不窮,變化萬千,其中運算的種類五花八門、多姿多彩。最基本最初等的有賦值運算、算術運算、邏輯運算和關系運算等;稍復雜的有算術表達式和邏輯表達式等;更復雜的有函數值計算、向量運算、矩陣運算、集合運算,以及表、棧、隊列、樹和圖上的運算等:此外,還可能有以上列舉的運算的復合和嵌套。 關於控制轉移,相對單純。在串列計算中,它只有順序、分支、循環、遞歸和無條件轉移等幾種。
?
我們來回顧一下,自從計算機問世以來,演算法的上述三要素的程序表達,經歷過一個怎樣的過程。
?
最早的程序設計語言是機器語言,即具體的計算機上的一個指令集。當時,要在計算機上運行的所有演算法都必須直接用機器語言來表達,計算機才能接受。演算法的運算序列包括運算對象和運算結果都必須轉換為指令序列。其中的每一條指令都以編碼(指令碼和地址碼)的形式出現。與演算法語言表達的演算法,相差十萬八千里。對於沒受過程序設計專門訓練的人來說,一份程序恰似一份"天書",讓人看了不知所雲,可讀性
?
極差。
?
用機器語言表達演算法的運算、數據和控制十分繁雜瑣碎,因為機器語言所提供的指令太初等、原始。機器語言只接受算術運算、按位邏輯運算和數的大小比較運算等。對於稍復雜的運算,都必須一一分解,直到到達最初等的運算才能用相應的指令替代之。機器語言能直接表達的數據只有最原始的位、位元組、和字三種。演算法中即使是最簡單的數據如布爾值、字元、整數、和實數,也必須一一地映射到位、位元組和字
中,還得一一分配它們的存儲單元。對於演算法中有結構的數據的表達則要麻煩得多。機器語言所提供的控制轉移指令也只有無條件轉移、條件轉移、進入子程序和從子程序返回等最基本的幾種。用它們來構造循環、形成分支、調用函數和過程得事先做許多的准備,還得靠許多的技巧。 直接用機器語言表達演算法有許多缺點。
?
大量繁雜瑣碎的細節牽制著程序員,使他們不可能有更多的時間和精力去從事創造性的勞動,執行對他們來說更為重要的任務。如確保程序的正確性、高效性。程序員既要駕馭程序設計的全局又要深入每一個局部直到實現的細節,即使智力超群的程序員也常常會顧此失彼,屢出差錯,因而所編出的程序可靠性差,且開發周期長。 由於用機器語言進行程序設計的思維和表達方式與人們的習慣大相徑庭,只有經過
較長時間職業訓練的程序員才能勝任,使得程序設計曲高和寡。因為它的書面形式全是"密"碼,所以可讀性差,不便於交流與合作。因為它嚴重地依賴於具體的計算機,所以可移植性差,重用性差。這些弊端造成當時的計算機應用未能迅速得到推廣。
?
克服上述缺點的出路在於程序設計語言的抽象,讓它盡可能地接近於演算法語言。 為此,人們首先注意到的是可讀性和可移植性,因為它們相對地容易通過抽象而得到改善。於是,很快就出現匯編語言。這種語言對機器語言的抽象,首先表現在將機器語言的每一條指令符號化:指令碼代之以記憶符號,地址碼代之以符號地址,使得其含義顯現在符號上而不再隱藏在編碼中,可讓人望"文"生義。其次表現在這種語言擺脫了具體計算機的限制,可在不同指令集的計算機上運行,只要該計算機配上匯編語言的一個匯編程序。這無疑是機器語言朝演算法語言靠攏邁出的一步。但是,它離演算法語言還太遠,以致程序員還不能從分解演算法的數據、運算和控制到匯編才能直接表達的指令等繁雜瑣碎的事務中解脫出來。 到了50年代中期,出現程序設計的高級語言如Fortran,Algol60,以及後來的PL/l, Pascal等,演算法的程序表達才產生一次大的飛躍。
?
誠然,演算法最終要表達為具體計算機上的機器語言才能在該計算機上運行,得到所需要的結果。但匯編語言的實踐啟發人們,表達成機器語言不必一步到位,可以分兩步走或者可以築橋過河。即先表達成一種中介語言,然後轉成機器語言。匯編語言作為一種中介語言,並沒有獲得很大成功,原因是它離演算法語
?
言還太遠。這便指引人們去設計一種盡量接近演算法語言的規范語言,即所謂的高級語言,讓程序員可以用它方便地表達演算法,然後藉助於規范的高級語言到規范的機器語言的"翻譯",最終將演算法表達為機器語言。而且,由於高級語言和機器語言都具有規范性,這里的"翻譯"完全可以機械化地由計算機來完成,就像匯編語言被翻譯成機器語言一樣,只要計算機配上一個編譯程序。 上述兩步,前一步由程序員去完成,後一步可以由編譯程序去完成。在規定清楚它們各自該做什麼之後,這兩步是完全獨立的。它們各自該如何做互不相干。前一步要做的只是用高級語言正確地表達給定的演算法,產生一個高級語言程序;後一步要做的只是將第一步得到的高級語言程序翻譯成機器語言程序。至於程序員如何用高級語言表達演算法和編譯程序如何將高級語言表達的演算法翻譯成機器語言表達的演算法,顯然毫不相干。
?
處理從演算法語言最終表達成機器語言這一復雜過程的上述思想方法就是一種抽象。匯編語言和高級語言的出現都是這種抽象的範例。 與匯編語言相比,高級語言的巨大成功在於它在數據、運算和控制三方
?
面的表達中引入許多接近演算法語言的概念和工具,大大地提高抽象地表達演算法的能力。 在運算方面,高級語言如Pascal,除允許原封不動地運用演算法語言的四則運算、邏輯運算、關系運算、算術表達式、邏輯表達式外,還引入強有力的函數與過程的工具,並讓用戶自定義。這一工具的重要性不僅在於它精簡了重復的程序文本段,而且在於它反映出程序的兩級抽象。
?
在函數與過程調用級,人們只關心它能做什麼,不必關心它如何做。只是到函數與過程的定義時,人們才給出如何做的細節。用過高級語言的讀者都知道,一旦函數與過程的名稱、參數和功能被規定清楚,那麼,在程序中調用它們便與在程序的頭部說明它們完全分開。你可以修改甚至更換函數體與過程體,而不影響它們的被調用。如果把函數與過程名看成是運算名,把參數看成是運算的對象或運算的結果,那麼
?
,函數與過程的調用和初等運算的引用沒有兩樣。利用函數和過程以及它們的復合或嵌套可以很自然地表達演算法語言中任何復雜的運算。
?
在數據方面,高級語言如Pascal引人了數據類型的概念,即把所有的數據加以分類。每一個數據(包括表達式)或每一個數據變數都屬於其中確定的一類。稱這一類數據為一個數據類型。 因此,數據類型是數據或數據變數類屬的說明,它指示該數據或數據變數可能取的值的全體。對於無結構的數據,高級語言如Pascal,除提供標準的基本數據類型--布爾型、字元型、整型和實型外,還提供用戶可自定義的枚舉類、子界類型和指針類型。這些類型(除指針外),其使用方式都順應人們在演算法語言中使用的習慣。對於有結構的數據,高級語言如Pascal,提供了數組、記錄、有限制的集合和文件等四種標準的結構數據類型。其中,數組是科學計算中的向量、矩陣的抽象;記錄是商業和管理中的記錄的抽象;有限制的集合是數學中足夠小的集合的勢集的抽象;文件是諸如磁碟等外存儲數據的抽象。
?
人們可以利用所提供的基本數據類型(包括標準的和自定義的),按數組、記錄、有限制的集合和文件的構造規則構造有結構的數據。 此外,還允許用戶利用標準的結構數據類型,通過復合或嵌套構造更復雜更高層的結構數據。這使得高級語言中的數據類型呈明顯的分層。 高級語言中數據類型的分層是沒有窮盡的,因而用它們可以表達演算法語言中任何復雜層次的數據。 在控制方面,高級語言如Pascal,提供了表達演算法控制轉移的六種方式。
?
(1)預設的順序控制";"。
?
(2)條件(分支)控制:"if表達式(為真)then S1 else S2;" 。
?
(3)選擇(情況)控制:
?
"Case 表達式 of
?
值1: S1
值2: S2
...
值n: Sn
end"
?
(4)循環控制:
?
"while 表達式(為真) do S;" 或
"repeat S until 表達式(為真);" 或
"for變數名:=初值 to/downto 終值do S;"
?
(5)函數和過程的調用,包括遞歸函數和遞歸過程的調用。
?
(6)無條件轉移goto。
這六種表達方式不僅覆蓋了演算法語言中所有控製表達的要求,而且不再像機器語言或匯編語言那樣原始、那樣繁瑣、那樣隱晦,而是如上面所看到的,與自然語言的表達相差無幾。 程序設計語言從機器語言到高級語言的抽象,帶來的主要好處是: 高級語言接近演算法語言,易學、易掌握,一般工程技術人員只要幾周時間的培訓就可以勝任程序員的工作;高級語言為程序員提供了結構化程序設計的環境和工具,使得設計出來的程序可讀性好,可維護性強,可靠性高;高級語言遠離機器語言,與具體的計算機硬體關系不大,因而所寫出來的程序可移植性好,重用率高; 由於把繁雜瑣碎的事務交給了編譯程序去做,所以自動化程度高,開發周期短,且程、序員得到解脫,可以集中時間和精力去從事對於他們來說更為重要的創造性勞動,以提高、程序的質量。
?
數據結構、數據類型和抽象數據類型
?
數據結構、數據類型和抽象數據類型,這三個術語在字面上既不同又相近,反映出它們在含義上既有區別又有聯系。
?
數據結構是在整個計算機科學與技術領域上廣泛被使用的術語。它用來反映一個數據的內部構成,即一個數據由哪些成分數據構成,以什麼方式構成,呈什麼結構。數據結構有邏輯上的數據結構和物理上的數據結構之分。邏輯上的數據結構反映成分數據之間的邏輯關系,物理上的數據結構反映成分數據在計算機內的存儲安排。數據結構是數據存在的形式。
?
數據是按照數據結構分類的,具有相同數據結構的數據屬同一類。同一類數據的全體稱為一個數據類型。在程序設計高級語言中,數據類型用來說明一個數據在數據分類中的歸屬。它是數據的一種屬性。這個屬性限定了該數據的變化范圍。為了解題的需要,根據數據結構的種類,高級語言定義了一系列的數據類型。不同的高級語言所定義的數據類型不盡相同。Pascal語言所定義的數據類型的種類。
?
其中,簡單數據類型對應於簡單的數據結構;構造數據類型對應於復雜的數據結構;在復雜的數據結構里,允許成分數據本身具有復雜的數據結構,因而,構造數據類型允許復合嵌套;指針類型對應於數據結構中成分數據之間的關系,表面上屬簡單數據類型,實際上都指向復雜的成分數據即構造數據類型中的數據,因此這里沒有把它劃入簡單數據類型,也沒有劃入構造數據類型,而單獨劃出一類。
?
數據結構反映數據內部的構成方式,它常常用一個結構圖來描述:數據中的每一項成分數據被看作一個結點,並用方框或圓圈表示,成分數據之間的關系用相應的結點之間帶箭號的連線表示。如果成分數據本身又有它自身的結構,則結構出現嵌套。這里嵌套還允許是遞歸的嵌套。
?
由於指針數據的引入,使構造各種復雜的數據結構成為可能。按數據結構中的成分數據之間的關系,數據結構有線性與非線性之分。在非線性數據結構中又有層次與網狀之分。 由於數據類型是按照數據結構劃分的,因此,一類數據結構對應著一種數據類型。數據類型按照該類型中的數據所呈現的結構也有線性與非線性之分,層次與網狀之分。一個數據變數,在高級語言中的類型說明必須是讀變數所具有的數據結構所對應的數據類型。最常用的數據結構是數組結構和記錄結構。數組結構的特點是:
?
成分數據的個數固定,它們之間的邏輯關系由成分數據的序號(或叫數組的下標)來體現。這些成分數據按照序號的先後順序一個挨一個地排列起來。每一個成分數據具有相同的結構(可以是簡單結構,也可以是復雜結構),因而屬於同一個數據類型(相應地是簡單數據類型或構造數據類型)。這種同一的數據類型稱為基類型。所有的成分數據被依序安排在一片連續的存儲單元中。 概括起來,數組結構是一個線性的、均勻的、其成分數據可隨機訪問的結構。
?
由於這、種結構有這些良好的特性,所以最常被人們所採用。在高級語言中,與數組結構相對應的、數據類型是數組類型,即數組結構的數據變數必須說明為array [i] of T0 ,其中i是數組、結構的下標類型,而T0是數組結構的基類型。 記錄結構是另一種常用的數據結構。它的特點是:與數組結構一樣,成分數據的個數固定。但成分數據之間沒有自然序,它們處於平等地位。每一個成分數據被稱為一個域並賦予域名。不同的域有不同的域名。不同的域允許有不同的結構,因而允許屬於不同的數據類型。與數組結構一樣,它們可以隨機訪問,但訪問的途徑靠的是域名。在高級語言中記錄結構對應的數據類型是記錄類型。記錄結構的數據的變數必須說明為記錄類型。
?
抽象數據類型的含義在上一段已作了專門敘述。它可理解為數據類型的進一步抽象。即把數據類型和數據類型上的運算捆在一起,進行封裝。引入抽象數據類型的目的是把數據類型的表示和數據類型上運算的實現與這些數據類型和運算在程序中的引用隔開,使它們相互獨立。對於抽象數據類型的描述,除了必須描述它的數據結構外,還必須描述定義在它上面的運算(過程或函數)。抽象數據類型上定義的過程和函
數以該抽象數據類型的數據所應具有的數據結構為基礎。
?
泛型設計和數據結構與演算法
?
下面我想再說說關於泛型程序設計模型對於數據結構和演算法方面的最新推動,泛型思想已經把數據結
?
構和演算法方面的基本思想抽象到了一個前所未有的高度,現在有多種程序設計語言支持泛型設計,比如
ADA,C++,而且據說在JAVA的下一版本和C#中也將對泛型設計進行全面的支持。
?
先說說泛型設計的基本思想:泛型編程(generic programming,以下直接以GP稱呼)是一種全新的程序設計思想,和OO,OB,PO這些為人所熟知的程序設計想法不同的是GP抽象度更高,基於GP設計的組件之間偶合度底,沒有繼承關系,所以其組件間的互交性和擴展性都非常高。我們都知道,任何演算法都是作用在一種特定的數據結構上的,最簡單的例子就是快速排序演算法最根本的實現條件就是所排序的對象是存
貯在數組裡面,因為快速排序就是因為要用到數組的隨機存儲特性,即可以在單位時間內交換遠距離的對象,而不只是相臨的兩個對象,而如果用聯表去存儲對象,由於在聯表中取得對象的時間是線性的既O[n],這樣將使快速排序失去其快速的特點。也就是說,我們在設計一種演算法的時候,我們總是先要考慮其應用的數據結構,比如數組查找,聯表查找,樹查找,圖查找其核心都是查找,但因為作用的數據結構不同
?
將有多種不同的表現形式。數據結構和演算法之間這樣密切的關系一直是我們以前的認識。泛型設計的根本思想就是想把演算法和其作用的數據結構分離,也就是說,我們設計演算法的時候並不去考慮我們設計的演算法將作用於何種數據結構之上。泛型設計的理想狀態是一個查找演算法將可以作用於數組,聯表,樹,圖等各種數據結構之上,變成一個通用的,泛型的演算法。這樣的理想是不是很誘惑人?
?
泛型編程帶來的是前所未有的彈性以及不會損失效率的抽象性,GP和OO不同,它不要求你通過額外的間接層來調用函數:它讓你撰寫完全一般化並可重復使用的演算法,其效率與針對特定數據結構而設計的演算法旗鼓相當。我們大家都知道數據結構在C++中可以用用戶定義類型來表示,而C++中的模板技術就是以類型作為參數,那麼我可以想像利用模板技術可以實現我們開始的GP思想,即一個模板函數可以對於各種傳遞進來的類型起作用,而這些類型就可以是我們定義的各種數據結構。
?
泛型演算法抽離於特定類型和特定數據結構之外,使得其適應與盡可能的一般化類型,演算法本身只是為了實現演算法其需要表達的邏輯本質而不去被為各種數據結構的實現細節所干擾。這意味著一個泛型演算法實際具有兩部分。1,用來描敘演算法本質邏輯的實際指令;2,正確指定其參數類型必須滿足的性質的一組需求條件。到此,相信有不少人已經開始糊塗了,呵呵,不要緊。畢竟GP是一種抽象度非常高的程序設計思想,裡面的核心就是抽象條件成為成為程序設計過程中的核心,從而取代了類型這在OO裡面的核心地位,正是因為類型不在是我們考慮的重點,類型成為了抽象條件的外衣,所以我們稱這樣的程序思想為泛型思想------把類型泛化。
Ⅲ 網路架構搜索
作為計算智能方法的代表,起源於上個世紀四十年代的人工神經網路經歷了五六十年代的繁榮,七十年代的低潮,八十年代的再次復甦,到近十年的廣泛關注,如今已經成為理論日趨完善,應用逐步發展的前沿方向。Hinton 等人2006 年在《Science》上發表的文章引發了深度神經網路研究的熱潮。面對大數據的諸多挑戰,以深度信念網路、卷積神經網路和遞歸神經網路為代表的深度神經網路模型在很多應用領域展示出明顯的優勢和潛力,特別是隨著數據量和數據維數的增加,深度學習的優勢愈加突出。例如,Google 藉助深度學習開發的AlphaGo 能從海量的對弈中學習正確的決策,微軟語音識別採用深度學習使識別錯誤率顯著降低,網路基於深度學習開發的機器人「小度」在跨年齡人臉識別上超越了人類。
經過多年的研究和發展,基於人工神經網路的識別方法也逐漸取代傳統的模式識別方法。神經網路已成為當前比較先進的技術,用來解決許多具有挑戰性的識別任務如文字識別、語音識別、指紋識別、遙感圖像識別、人臉識別、手寫體字元的識別等。其中主流的神經網路模型有卷積網路和遞歸神經網路,卷積神經網路由 Yann LeCun 在 1998 年提出,自從 AlexNe 在 2012 年的 ImageNet 比賽中使用了這一架構拔得頭籌,卷積神經網路迅速流行起來並廣泛應用到視覺任務。如今,最先進的卷積神經網路演算法在進行圖像識別時,甚至可以超過人類肉眼識別的准確率。遞歸神經網路網路提出於 1990 年,被視為循環神經網路的推廣,遞歸神經網路可以引入門控機制以學習長距離依賴,適用於包含結構關系的機器學習任務,在序列識別方面有重要應用。
深度神經網路和深度學習演算法因為在科研工作與工程任務中都取得了顯著的效果從而大受歡迎。它取代了傳統的手動提取特徵方法,夠端到端地自動提取和學習特徵。而其中取得顯著成功的深度神經網路通常是由於它們成功的架構設計,研究的工作重心從提取特徵轉移到了尋找最優架構上。通常來說,模型的容量越大網路的性能就越好,能夠擬合任意函數。因此為了提升網路性能,網路結構被設計的越來越復雜。例如,VGG-16 約有1.4億浮點數參數,整個網路佔用超過500兆存儲空間,需要153億次浮點操作來處理一個$224\times224$大小的圖像。雖然更深的網路層次和復雜的拓撲結構能夠更有效地學習特徵,但是網路規模的增大意味著人工設計網路時需要花費更多時間來反復試驗,即使是專家也需要大量的資源和時間來創建性能良好的模型。
神經網路架構搜索(NAS)是一種自動化學習網路結構的新方法,用於減少繁重的網路設計成本。目前為止,NAS方法設計的網路在識別任務上的表現已經超過了人工設計的架構。NAS可以視作自動機器學習(AutoML)的子領域,與超參數優化和元學習有明顯的重疊。不同的NAS方法的區別主要在於三個維度:搜索空間、搜索策略和性能評估,我們對此分別進行了調研。
搜索空間:搜索空間定義了網路的所有可選結構和操作,通常指數級大,甚至無界。在設計搜索空間時結合先驗知識,即參考現有的針對當前任務的先進結構設計知識,能夠有效減小搜索空間並簡化搜索。但這也會引入偏好,從而限制網路學習到超越當前人類知識的結構。
搜索策略:定義搜索空間後,搜索策略引導尋找高性能的模型架構,其中的難點是保證探索和利用的平衡。一方面,希望快速找到性能良好的架構,另一方面,需要避免過早收斂到次優的架構。
性能評估:NSA的目的是找到一個在未知數據上具有良好泛化性能的架構,一旦模型生成,就需要對其性能進行評估。直觀的方法是在訓練集上訓練收斂,並在驗證集上得到其性能,但是這種方法會耗費巨大的算力,從而限制了可探索的網路結構。一些先進的方法關注於減小性能評估時的計算代價,但會引入誤差。因此,平衡評價的效率和效果是一個需要研究的問題。
從計算的角度來看,神經網路代表了一個通過一系列操作將輸入變數 x 轉換為輸出變數 y 的函數。基於計算圖語言,神經網路可以表示為一個有向無環圖(DAG),其中每個節點表示一個張量 z ,通過邊連接其父節點 I(k),每條邊表示從候選操作集O中選擇的一個操作 o 。節點 k 的計算公式為:
其中候選操作集合$O$主要包括卷積、池化、激活函數、跳躍連接、拼接、加法等基本操作。此外,為了進一步提高模型的性能,一些先進的人工設計模塊也可以作為候選操作,如深度可分離卷積、膨脹卷積、組卷積。基於操作的類型可以選擇不同的超參數,例如輸入節點選取、卷積核數量、尺寸、步長等。不同的搜索空間設計,選擇和組合操作的方法也不同所以參數化的形式也不一樣。一般來說,一個好的搜索空間應該能夠排除人類的偏見,並且足夠靈活,能夠覆蓋更廣泛的模型架構。
全局搜索空間搜索一個完整的網路結構,具有很高的自由度。最簡單的例子是鏈式搜索空間,見圖1左。固定的數量的節點按順序堆疊,只有前一個節點的輸出提供給後一個節點作為輸入,每個節點代表一個層,並具有指定的操作。右圖引入更復雜的跳躍鏈接和多支路結構,此時當前節點可以結合前面所有節點的輸出作為輸入,使得搜索的自由度顯著增大。許多網路都是多分支網路的特例,比如
1)鏈式網路: ;
2)殘差網路: ;
3)DenseNets:
雖然整體結構搜索很容易實現,但它也有一些缺點。首先,搜索空間的大小與網路深度是指數級關系,尋找泛化性能好的深度網路計算成本高。此外,生成的架構缺乏可遷移性和靈活性,在小型數據集上生成的模型可能不適合較大的數據集。有研究提出,初始架構的選擇在搜索全局結構時十分重要。在適當的初始條件下,可以獲得與單元搜索空間性能相當的架構,但是初始架構選擇的指導原則仍然不明確。
基於單元的搜索空間受啟發於人工設計知識,許多有效的網路結構都會重復使用固定結構,例如在RNNs中重復LSTM塊或堆疊殘差模塊。因此可以只搜索這樣的重復單元(cells),整個神經結構的搜索問題被簡化為在單元搜索空間中搜索最優的單元結構,從而極大的減小搜索空間。大多數研究對比了基於全局搜索空間和單元搜索空間的實驗結果,證明在基於單元的搜索空間中可以獲得良好的性能。單元搜索空間的另一個優勢是能方便地在數據集和任務之間進行泛化,因為通過增減卷積核和單元的數量,架構的復雜性幾乎可以任意改變。
NASNet是最早提出的單元搜索空間之一,也是當前最熱門的選擇,之後的大部分改進只是在此基礎上對操作選擇和單元組合策略進行了少量修改。如圖2所示,它由兩種單元組成,分別為保持輸入特徵維度的標准單元(normal cell),和減小空間維度的簡化單元(rection cell)。每個單元由b個塊組成,每個塊由它的兩個輸入和相應的操作定義。可選的輸入包括前兩個單元的輸出和單元中先前定義的塊的輸出,所以它支持跨單元的跳躍連接。未使用的塊被連接起來並作為單元格的輸出,最終通過預定義好的規則級聯這些單元。
不同於上面將單元結構按照人工定義的宏結構進行連接,層次結構是將前一步驟生成的單元結構作為下一步單元結構的基本組成部件,通過迭代的思想得到最終的網路結構。Hier提出的層次搜索空間,通過合並低層單元生成高級單元實現單元級別和網路級別的同時優化。此方法具體分為3層。第一層包含一系列的基礎操作;第二層通過有向無環圖連接第一層的基礎操作,構建不同的單元,圖結構用鄰接矩陣編碼;第三層是網路級的編碼,決定如何連接第二層的單元,組合成一個完整的網路。基於單元的搜索空間可以看作是這種層次搜索空間的一個特殊情況。
強化學習方法(RL)能夠有效建模一個順序決策的過程,其中代理與環境相互作用,代理學會改善其行為從而使目標回報最大化。(圖3)給出了一個基於強化的NAS演算法的概述。代理通常是一個遞歸神經網路(RNN),它在每一步t執行一個動作 來從搜索空間采樣一個新的樣本,同時接收狀態 的觀察值和環境中的獎勵 ,以更新代理的采樣策略。這種方法非常適合於神經結構搜索,代理的行為是生成神經結構,行為空間是搜索空間,環境是指對代理生成的網路進行訓練和評估,獎勵是訓練後的網路結構對未知數據的預測性能,在最後一個行為之後獲得。
4.2進化演算法
進化演算法(EA)是一種成熟的全局優化方法,具有較高的魯棒性和廣泛的適用性。許多研究使用進化演算法來優化神經網路結構。進化演算法演化了一組模型,即一組網路;在每個世代中,至少從這組模型中選擇一個模型,作為親本在突變後作為生成子代。在對子代進行訓練之後,評估它們的適應度並將它們添加到種群中。
典型的進化演算法包括選擇、交叉、變異和更新等步驟。選擇時一般使用聯賽選擇演算法對父類進行采樣,其中適應性最好的一個作為親本。Lemonade對適應度使用核密度估計,使網路被選擇的概率與密度成反比。交叉方式因編碼方案的不同而不同。突變針對的是親本的部分操作,例如添加或移除層,改變層的超參數,添加跳躍連接,以及改變訓練超參數。對於產生的後代,大多數方法隨機初始化子網路權重,而Lemonade把父網路學習到的權重通過使用網路態射傳遞給其子網路。Real等人讓後代繼承其父母的所有不受突變影響的參數,雖然這種繼承不是嚴格意義上的功能保留,它可以加速學習。生成新的網路的同時需要從種群中移除一些個體。Real等人從群體中移除最差的個體,AmoebaNet移除最老的個體。也有一些方法定期丟棄所有個體,或者完全不移除個體。EENA通過一個變數調節最壞模型和最老模型的刪除概率。
基於代理模型的優化方法(SMBO)用一個代理模型來近似目標函數。即不需要訓練采樣到的網路結構,只需要訓練一個代理模型,使用代理模型預測網路的性能。通常在實踐中只需要得到架構的性能排序,而不一定要計算出具體的損失值,因此代理模型只需要預測相對得分並選出有前途的候選架構。然後只對預測性能好的架構進行評估,用它們的驗證精度更新代理模型,這樣只需要完全訓練少量候選架構,大大減少搜索時間。代理模型通常訓練為最小化平方誤差:
貝葉斯優化(BO)是用於超參數優化的最流行的方法之一。最經典的是基於高斯過程的BO,生成的神經結構的驗證結果可以建模為高斯過程,然而,基於高斯的BO方法在觀察次數上的推理時間尺度是立方的,並且不擅長處理變長神經網路。有些工作使用基於樹或者隨機森林的方法來在非常高維的空間中高效的搜索,並且在很多問題上取得了優異的效果。Negrinho利用其搜索空間的樹形結構,並使用蒙特卡洛樹搜索。雖然沒有完整的比較,但初步的證據表明這些方法可以超越進化演算法。
上面的搜索策略搜是從一個離散的搜索空間提取神經結構樣本。DARTS提出搜索空間的連續鬆弛,在連續可微的搜索空間上搜索神經架構如圖4所示,並使用如下softmax函數來鬆弛離散空間:
鬆弛後,架構搜索的任務轉化為網路架構與神經權值的聯合優化。這兩類參數分別在訓練集和驗證集上交替優化,表示為一個雙層優化問題。
為了對搜索過程進行引導,必須對產生的神經網路性能進行評估。一種直觀的方法是訓練網路至收斂,然後評估其性能。但是,這種方法需要大量的時間和計算資源。因此提出了幾種加速模型評估的方法。
為了減少計算負擔,可以用實際性能的低質近似來估測性能。實現方法包括: 縮短訓練時間、選擇數據集的子集、在低解析度的圖像上訓練、每層使用更少的通道數、堆疊更少的單元結構。在低質條件下搜索到的最優網路或單元,構建出最終結構在數據集上重新訓練,得到目標網路。雖然這些低精度的近似能夠減少訓練花費,但性能被低估的同時不可避免地引入了誤差。最近的研究表明,當這種低質評價與完全評價之間的差異較大時,網路性能的相對排名可能變化很大,並強調這種誤差會逐漸增加。
早停技術最初用於防止過擬合。一些研究通過在訓練初期預測網路性能,在驗證集上預計表現不佳的模型被強制停止訓練,以此來加速模型評估。一種在早期估計網路性能的方法是學習曲線外推法。Domhan 等提出訓練初期對學習曲線進行插值,並終止那些預測性能不好的網路結構的訓練。Swersky等在評估學習曲線的好壞時,把網路架構的超參數作為參考因素。另一種方法根據梯度的局部統計信息實現早期停止,它不再依賴驗證集,允許優化器充分利用所有的訓練數據。
代理模型可以被訓練用預測網路性能。PNAS提出訓練一個代理網路(LSTM)來預測網路結構的性能,他不考慮學習曲線而是基於結構的特點來預測性能,並在訓練時推斷更大的網路結構。SemiNAS是一種半監督NAS方法,利用大量的未標記架構進一步提高搜索效率。不需要在對模型進行訓練,只使用代理模型來預測模型精度。預測網路性能的主要難點是:為加快搜索過程,需要在對較大的搜索空間進行較少的評估的基礎上進行良好的預測。當優化空間過大且難以量化,且對每個結構的評估成本極高時,基於代理的方法就不適用。
代理模型還可以用來預測網路權重。超網路(Hypernetworks)是一種神經網路,被訓練來為各種架構生成網路權值。超網路在搜索過程中節省了候選體系結構的訓練時間,因為它們的權值是通過超網路的預測得到的。Zhang等人提出了一種計算圖表示,並使用圖超網路(GHN)比常規超網路(SMASH)更快更准確地預測所有可能架構的權值。
權重繼承是讓新網路結構繼承之前訓練完成的其他網路結構的權值。其中一種方法是網路態射,一般的網路設計方法是首先設計出一個網路結構,然後訓練它並在驗證集上查看它的性能表現,如果表現較差,則重新設計一個網路。可以很明顯地發現這種設計方法會做很多無用功,因此耗費大量時間。而基於網路態射結構方法能夠在原有的網路結構基礎上做修改,修改後的網路可以重用之前訓練好的權重。其特殊的變換方式能夠保證新的網路結構還原成原網路,因此子網路的表現至少不會差於原網路,並且能在較短的訓練時間內繼續成長為一個更健壯的網路。具體地,網路射態能夠處理任意非線性激活函數,可以添加跳躍連接,並且支持添加層或通道得到更深或更寬的等效模型。經典的網路態射只能使網路變大,這可能導致網路過於復雜,之後提出的近似網路態射通過知識蒸餾允許網路結構減小。進化演算法經常使用基於網路態射的變異,或者直接讓孩子繼承親本的權重,再執行一般變異操作,這樣產生的網路具有一個更好的初始值,而不用重頭開始訓練。
Ⅳ 深度學習之卷積神經網路經典模型
LeNet-5模型 在CNN的應用中,文字識別系統所用的LeNet-5模型是非常經典的模型。LeNet-5模型是1998年,Yann LeCun教授提出的,它是第一個成功大規模應用在手寫數字識別問題的卷積神經網路,在MNIST數據集中的正確率可以高達99.2%。
下面詳細介紹一下LeNet-5模型工作的原理。
LeNet-5模型一共有7層,每層包含眾多參數,也就是卷積神經網路中的參數。雖然層數只有7層,這在如今龐大的神經網路中可是說是非常少的了,但是包含了卷積層,池化層,全連接層,可謂麻雀雖小五臟俱全了。為了方便,我們把卷積層稱為C層,下采樣層叫做下采樣層。
首先,輸入層輸入原始圖像,原始圖像被處理成32×32個像素點的值。然後,後面的隱層計在卷積和子抽樣之間交替進行。C1層是卷積層,包含了六個特徵圖。每個映射也就是28x28個神經元。卷積核可以是5x5的十字形,這28×28個神經元共享卷積核權值參數,通過卷積運算,原始信號特徵增強,同時也降低了雜訊,當卷積核不同時,提取到圖像中的特徵不同;C2層是一個池化層,池化層的功能在上文已經介紹過了,它將局部像素值平均化來實現子抽樣。
池化層包含了六個特徵映射,每個映射的像素值為14x14,這樣的池化層非常重要,可以在一定程度上保證網路的特徵被提取,同時運算量也大大降低,減少了網路結構過擬合的風險。因為卷積層與池化層是交替出現的,所以隱藏層的第三層又是一個卷積層,第二個卷積層由16個特徵映射構成,每個特徵映射用於加權和計算的卷積核為10x10的。第四個隱藏層,也就是第二個池化層同樣包含16個特徵映射,每個特徵映射中所用的卷積核是5x5的。第五個隱藏層是用5x5的卷積核進行運算,包含了120個神經元,也是這個網路中卷積運算的最後一層。
之後的第六層便是全連接層,包含了84個特徵圖。全連接層中對輸入進行點積之後加入偏置,然後經過一個激活函數傳輸給輸出層的神經元。最後一層,也就是第七層,為了得到輸出向量,設置了十個神經元來進行分類,相當於輸出一個包含十個元素的一維數組,向量中的十個元素即0到9。
AlexNet模型
AlexNet簡介
2012年Imagenet圖像識別大賽中,Alext提出的alexnet網路模型一鳴驚人,引爆了神經網路的應用熱潮,並且贏得了2012屆圖像識別大賽的冠軍,這也使得卷積神經網路真正意義上成為圖像處理上的核心演算法。上文介紹的LeNet-5出現在上個世紀,雖然是經典,但是迫於種種復雜的現實場景限制,只能在一些領域應用。不過,隨著SVM等手工設計的特徵的飛速發展,LeNet-5並沒有形成很大的應用狀況。隨著ReLU與dropout的提出,以及GPU帶來算力突破和互聯網時代大數據的爆發,卷積神經網路帶來歷史的突破,AlexNet的提出讓深度學習走上人工智慧的最前端。
圖像預處理
AlexNet的訓練數據採用ImageNet的子集中的ILSVRC2010數據集,包含了1000類,共1.2百萬的訓練圖像,50000張驗證集,150000張測試集。在進行網路訓練之前我們要對數據集圖片進行預處理。首先我們要將不同解析度的圖片全部變成256x256規格的圖像,變換方法是將圖片的短邊縮放到 256像素值,然後截取長邊的中間位置的256個像素值,得到256x256大小的圖像。除了對圖片大小進行預處理,還需要對圖片減均值,一般圖像均是由RGB三原色構成,均值按RGB三分量分別求得,由此可以更加突出圖片的特徵,更方便後面的計算。
此外,對了保證訓練的效果,我們仍需對訓練數據進行更為嚴苛的處理。在256x256大小的圖像中,截取227x227大小的圖像,在此之後對圖片取鏡像,這樣就使得原始數據增加了(256-224)x(256-224)x2= 2048倍。最後對RGB空間做PCA,然後對主成分做(0,0.1)的高斯擾動,結果使錯誤率下降1%。對測試數據而言,抽取以圖像4個角落的大小為224224的圖像,中心的224224大小的圖像以及它們的鏡像翻轉圖像,這樣便可以獲得10張圖像,我們便可以利用softmax進行預測,對所有預測取平均作為最終的分類結果。
ReLU激活函數
之前我們提到常用的非線性的激活函數是sigmoid,它能夠把輸入的連續實值全部確定在0和1之間。但是這帶來一個問題,當一個負數的絕對值很大時,那麼輸出就是0;如果是絕對值非常大的正數,輸出就是1。這就會出現飽和的現象,飽和現象中神經元的梯度會變得特別小,這樣必然會使得網路的學習更加困難。此外,sigmoid的output的值並不是0為均值,因為這會導致上一層輸出的非0均值信號會直接輸入到後一層的神經元上。所以AlexNet模型提出了ReLU函數,公式:f(x)=max(0,x)f(x)=max(0,x)。
用ReLU代替了Sigmoid,發現使用 ReLU 得到的SGD的收斂速度會比 sigmoid快很多,這成了AlexNet模型的優勢之一。
Dropout
AlexNet模型提出了一個有效的模型組合方式,相比於單模型,只需要多花費一倍的時間,這種方式就做Dropout。在整個神經網路中,隨機選取一半的神經元將它們的輸出變成0。這種方式使得網路關閉了部分神經元,減少了過擬合現象。同時訓練的迭代次數也得以增加。當時一個GTX580 GPU只有3GB內存,這使得大規模的運算成為不可能。但是,隨著硬體水平的發展,當時的GPU已經可以實現並行計算了,並行計算之後兩塊GPU可以互相通信傳輸數據,這樣的方式充分利用了GPU資源,所以模型設計利用兩個GPU並行運算,大大提高了運算效率。
模型分析
AlexNet模型共有8層結構,其中前5層為卷積層,其中前兩個卷積層和第五個卷積層有池化層,其他卷積層沒有。後面3層為全連接層,神經元約有六十五萬個,所需要訓練的參數約六千萬個。
圖片預處理過後,進過第一個卷積層C1之後,原始的圖像也就變成了55x55的像素大小,此時一共有96個通道。模型分為上下兩塊是為了方便GPU運算,48作為通道數目更加適合GPU的並行運算。上圖的模型里把48層直接變成了一個面,這使得模型看上去更像一個立方體,大小為55x55x48。在後面的第二個卷積層C2中,卷積核的尺寸為5x5x48,由此再次進行卷積運算。在C1,C2卷積層的卷積運算之後,都會有一個池化層,使得提取特徵之後的特徵圖像素值大大減小,方便了運算,也使得特徵更加明顯。而第三層的卷積層C3又是更加特殊了。第三層卷積層做了通道的合並,將之前兩個通道的數據再次合並起來,這是一種串接操作。第三層後,由於串接,通道數變成256。全卷積的卷積核尺寸也就變成了13×13×25613×13×256。一個有4096個這樣尺寸的卷積核分別對輸入圖像做4096次的全卷積操作,最後的結果就是一個列向量,一共有4096個數。這也就是最後的輸出,但是AlexNet最終是要分1000個類,所以通過第八層,也就是全連接的第三層,由此得到1000個類輸出。
Alexnet網路中各個層發揮了不同的作用,ReLU,多個CPU是為了提高訓練速度,重疊pool池化是為了提高精度,且不容易產生過擬合,局部歸一化響應是為了提高精度,而數據增益與dropout是為了減少過擬合。
VGG net
在ILSVRC-2014中,牛津大學的視覺幾何組提出的VGGNet模型在定位任務第一名和分類任務第一名[[i]]。如今在計算機視覺領域,卷積神經網路的良好效果深得廣大開發者的喜歡,並且上文提到的AlexNet模型擁有更好的效果,所以廣大從業者學習者試圖將其改進以獲得更好地效果。而後來很多人經過驗證認為,AlexNet模型中所謂的局部歸一化響應浪費了計算資源,但是對性能卻沒有很大的提升。VGG的實質是AlexNet結構的增強版,它側重強調卷積神經網路設計中的深度。將卷積層的深度提升到了19層,並且在當年的ImageNet大賽中的定位問題中獲得了第一名的好成績。整個網路向人們證明了我們是可以用很小的卷積核取得很好地效果,前提是我們要把網路的層數加深,這也論證了我們要想提高整個神經網路的模型效果,一個較為有效的方法便是將它的深度加深,雖然計算量會大大提高,但是整個復雜度也上升了,更能解決復雜的問題。雖然VGG網路已經誕生好幾年了,但是很多其他網路上效果並不是很好地情況下,VGG有時候還能夠發揮它的優勢,讓人有意想不到的收獲。
與AlexNet網路非常類似,VGG共有五個卷積層,並且每個卷積層之後都有一個池化層。當時在ImageNet大賽中,作者分別嘗試了六種網路結構。這六種結構大致相同,只是層數不同,少則11層,多達19層。網路結構的輸入是大小為224*224的RGB圖像,最終將分類結果輸出。當然,在輸入網路時,圖片要進行預處理。
VGG網路相比AlexNet網路,在網路的深度以及寬度上做了一定的拓展,具體的卷積運算還是與AlexNet網路類似。我們主要說明一下VGG網路所做的改進。第一點,由於很多研究者發現歸一化層的效果並不是很好,而且佔用了大量的計算資源,所以在VGG網路中作者取消了歸一化層;第二點,VGG網路用了更小的3x3的卷積核,而兩個連續的3x3的卷積核相當於5x5的感受野,由此類推,三個3x3的連續的卷積核也就相當於7x7的感受野。這樣的變化使得參數量更小,節省了計算資源,將資源留給後面的更深層次的網路。第三點是VGG網路中的池化層特徵池化核改為了2x2,而在AlexNet網路中池化核為3x3。這三點改進無疑是使得整個參數運算量下降,這樣我們在有限的計算平台上能夠獲得更多的資源留給更深層的網路。由於層數較多,卷積核比較小,這樣使得整個網路的特徵提取效果很好。其實由於VGG的層數較多,所以計算量還是相當大的,卷積層比較多成了它最顯著的特點。另外,VGG網路的拓展性能比較突出,結構比較簡潔,所以它的遷移性能比較好,遷移到其他數據集的時候泛化性能好。到現在為止,VGG網路還經常被用來提出特徵。所以當現在很多較新的模型效果不好時,使用VGG可能會解決這些問題。
GoogleNet
谷歌於2014年Imagenet挑戰賽(ILSVRC14)憑借GoogleNet再次斬獲第一名。這個通過增加了神經網路的深度和寬度獲得了更好地效果,在此過程中保證了計算資源的不變。這個網路論證了加大深度,寬度以及訓練數據的增加是現有深度學習獲得更好效果的主要方式。但是增加尺寸可能會帶來過擬合的問題,因為深度與寬度的加深必然會帶來過量的參數。此外,增加網路尺寸也帶來了對計算資源侵佔過多的缺點。為了保證計算資源充分利用的前提下去提高整個模型的性能,作者使用了Inception模型,這個模型在下圖中有展示,可以看出這個有點像金字塔的模型在寬度上使用並聯的不同大小的卷積核,增加了卷積核的輸出寬度。因為使用了較大尺度的卷積核增加了參數。使用了1*1的卷積核就是為了使得參數的數量最少。
Inception模塊
上圖表格為網路分析圖,第一行為卷積層,輸入為224×224×3 ,卷積核為7x7,步長為2,padding為3,輸出的維度為112×112×64,這裡面的7x7卷積使用了 7×1 然後 1×7 的方式,這樣便有(7+7)×64×3=2,688個參數。第二行為池化層,卷積核為3×33×3,滑動步長為2,padding為 1 ,輸出維度:56×56×64,計算方式:1/2×(112+2×1?3+1)=56。第三行,第四行與第一行,第二行類似。第 5 行 Inception mole中分為4條支線,輸入均為上層產生的 28×28×192 結果:第 1 部分,1×1 卷積層,輸出大小為28×28×64;第 2 部分,先1×1卷積層,輸出大小為28×28×96,作為輸入進行3×3卷積層,輸出大小為28×28×128;第 3部分,先1×1卷積層,輸出大小為28×28×32,作為輸入進行3×3卷積層,輸出大小為28×28×32;而第3 部分3×3的池化層,輸出大小為輸出大小為28×28×32。第5行的Inception mole會對上面是個結果的輸出結果並聯,由此增加網路寬度。
ResNet
2015年ImageNet大賽中,MSRA何凱明團隊的ResialNetworks力壓群雄,在ImageNet的諸多領域的比賽中上均獲得了第一名的好成績,而且這篇關於ResNet的論文Deep Resial Learning for Image Recognition也獲得了CVPR2016的最佳論文,實至而名歸。
上文介紹了的VGG以及GoogleNet都是增加了卷積神經網路的深度來獲得更好效果,也讓人們明白了網路的深度與廣度決定了訓練的效果。但是,與此同時,寬度與深度加深的同時,效果實際會慢慢變差。也就是說模型的層次加深,錯誤率提高了。模型的深度加深,以一定的錯誤率來換取學習能力的增強。但是深層的神經網路模型犧牲了大量的計算資源,學習能力提高的同時不應當產生比淺層神經網路更高的錯誤率。這個現象的產生主要是因為隨著神經網路的層數增加,梯度消失的現象就越來越明顯。所以為了解決這個問題,作者提出了一個深度殘差網路的結構Resial:
上圖就是殘差網路的基本結構,可以看出其實是增加了一個恆等映射,將原本的變換函數H(x)轉換成了F(x)+x。示意圖中可以很明顯看出來整個網路的變化,這樣網路不再是簡單的堆疊結構,這樣的話便很好地解決了由於網路層數增加而帶來的梯度原來越不明顯的問題。所以這時候網路可以做得很深,到目前為止,網路的層數都可以上千層,而能夠保證很好地效果。並且,這樣的簡單疊加並沒有給網路增加額外的參數跟計算量,同時也提高了網路訓練的效果與效率。
在比賽中,為了證明自己觀點是正確的,作者控制變數地設計幾個實驗。首先作者構建了兩個plain網路,這兩個網路分別為18層跟34層,隨後作者又設計了兩個殘差網路,層數也是分別為18層和34層。然後對這四個模型進行控制變數的實驗觀察數據量的變化。下圖便是實驗結果。實驗中,在plain網路上觀測到明顯的退化現象。實驗結果也表明,在殘差網路上,34層的效果明顯要好於18層的效果,足以證明殘差網路隨著層數增加性能也是增加的。不僅如此,殘差網路的在更深層的結構上收斂性能也有明顯的提升,整個實驗大為成功。
除此之外,作者還做了關於shortcut方式的實驗,如果殘差網路模塊的輸入輸出維度不一致,我們如果要使維度統一,必須要對維數較少的進行増維。而增維的最好效果是用0來填充。不過實驗數據顯示三者差距很小,所以線性投影並不是特別需要。使用0來填充維度同時也保證了模型的復雜度控制在比較低的情況下。
隨著實驗的深入,作者又提出了更深的殘差模塊。這種模型減少了各個層的參數量,將資源留給更深層數的模型,在保證復雜度很低的情況下,模型也沒有出現梯度消失很明顯的情況,因此目前模型最高可達1202層,錯誤率仍然控製得很低。但是層數如此之多也帶來了過擬合的現象,不過諸多研究者仍在改進之中,畢竟此時的ResNet已經相對於其他模型在性能上遙遙領先了。
殘差網路的精髓便是shortcut。從一個角度來看,也可以解讀為多種路徑組合的一個網路。如下圖:
ResNet可以做到很深,但是從上圖中可以體會到,當網路很深,也就是層數很多時,數據傳輸的路徑其實相對比較固定。我們似乎也可以將其理解為一個多人投票系統,大多數梯度都分布在論文中所謂的effective path上。
DenseNet
在Resnet模型之後,有人試圖對ResNet模型進行改進,由此便誕生了ResNeXt模型。
這是對上面介紹的ResNet模型結合了GoogleNet中的inception模塊思想,相比於Resnet來說更加有效。隨後,誕生了DenseNet模型,它直接將所有的模塊連接起來,整個模型更加簡單粗暴。稠密相連成了它的主要特點。
我們將DenseNet與ResNet相比較:
從上圖中可以看出,相比於ResNet,DenseNet參數量明顯減少很多,效果也更加優越,只是DenseNet需要消耗更多的內存。
總結
上面介紹了卷積神經網路發展史上比較著名的一些模型,這些模型非常經典,也各有優勢。在算力不斷增強的現在,各種新的網路訓練的效率以及效果也在逐漸提高。從收斂速度上看,VGG>Inception>DenseNet>ResNet,從泛化能力來看,Inception>DenseNet=ResNet>VGG,從運算量看來,Inception<DenseNet< ResNet<VGG,從內存開銷來看,Inception<ResNet< DenseNet<VGG。在本次研究中,我們對各個模型均進行了分析,但從效果來看,ResNet效果是最好的,優於Inception,優於VGG,所以我們第四章實驗中主要採用谷歌的Inception模型,也就是GoogleNet。
Ⅳ 數據泛化是什麼
06-08-21] 來源: 作者: [字體:大 中 小]
黃建國
(合肥幼兒師范 現代教育技術中心 安徽 合肥 230011 )
摘要 為了更有效的進行在線分類挖掘,提出了一種泛化演算法。該演算法結合了數據立方體技術和面向屬性歸納方法中的泛化策略,有效降低了聚合運算的運算量,提高了運算效率,將資料庫中的原始數據泛化成用譽裂戶感興趣的概念層次上的、聚合的、具有統計意義的元數據,為在線分類提供了良好的數據環境。
關鍵詞 數據挖掘 數據泛化 數據立方體
1 引言
數據准備是KDD過程中一個很重要的過程,良好的數據准備過程能夠為數據挖掘提供清潔、可靠、穩定的數據環境,以保證挖掘演算法的有效實施。在線分類理想的數據環境應具備以下幾個特點: (1)數據應包含豐富的屬性信息,應具備可靠性和穩定性;
(2)數據的屬性應具有對於分類任務的相關性。大多數的分類任務只與資料庫中部分屬性有關,多餘的、無關的屬性介入分類,常會減慢甚至錯誤引導分類過程,應此必須去掉無關屬性。
(3)數據應具有高層數據信息,以發現清晰的、高層的、具有統計意義的分類規則。在本文的研究中,為了使數據環境達到上慶拍閉述要求,在數據准備階段採用了數據泛化的策略,這個策略用概念層次作為背景,結合了OLAP技術與Jiawei Han等人的面向屬性歸納的方法,明顯提高了工作效率。
2 面向屬性歸納中的基本泛化策略和演算法
隨著KDD研究的逐步深入, Jiawei Han等人提出了一種基於歸納的知識發現方法——面向屬性的歸納方法[1][2][3],這方法的特點是能夠根據概念層次將低概念層的數據泛化到相應的高層次的概念層,以發現多層的或高層的規則。面向屬性歸納方法是一種有效的、完整的知識發現演算法,該演算法將機器學習中示例學習方法與資料庫的操作技術相結合[1]。演算法的一個關鍵就是攀升屬性所對應的概念層次樹以泛化原始數據集的數據到用戶感興趣的概念層上,減少數據集的大小,從而降低知識發現過程的計算復雜度。面向屬性歸納方法的進行,必須有兩個前提:
(1)必須由用戶提出明確的知識發現任務。在Jiawei Han等人的研究中,採用了一種類似SQL語句的知識發現語句DMQL[4]用來讓用戶定義發現任務,下面便是一個分類任務的語句描述:
要說明的是在本文的研究中採用了一個可視化的向導來引導用戶定義發現任務,但為了文章描述方便,在本文的描述中,借用了DMQL來描述發現任務
(2)與發現任務相關的屬性應有概念層次,如上文所述,數值型的概念層次可以自動提取,給定的概念層次可以用戶的興趣和發現任務的不同而進行動態調整。
在具備以上兩個前提時,面向屬性歸納採用了以下一些泛化策略。
●賀遲 泛化策略
策略1 在最小分解單位上泛化
一般而言,泛化都是在數據集的單個屬性上進行的。因為單個屬性常常是數據集中的最小分解單位。在最小分解單位上進行泛化,更能確定泛化過程中的細微變化,從而達到適度泛化的目的,避免過度泛化。
策略2 屬性去除
如果一個屬性在相關數據集中有大量不同的值,但是在其對應的概念層次樹上,沒有比該屬性更高的概念層,則該屬性將被從發現任務中去除。因為這樣的屬性是不可能被泛化到更高的概念層的,這是符合示例學習理論的。
策略3 概念樹攀升
如果一個屬性在概念層次樹上有更高層次的概念,那麼在泛化後的數據集中將所有記錄的該屬性值以高層次的屬性值替代。
策略4 增加屬性CNT
作為策略3的執行結果,必然會有許多不同的紀錄由於屬性值完全相同而合並成一條紀錄。為了反應這一變化,引入屬性CNT來紀錄最初的表中不同紀錄被概括成泛化表中相同紀錄的個數。屬性CNT在泛化的過程中保存了最初的計數,該值在知識發現的過程中起到了重要作用。
策略5 設立閾值
利用策略2中的CNT可以定義規則的正確率P,P=(符合規則的CNT值)/(符合規則左邊屬性條件的CNT值)。這樣可以定義一閾值L用於取捨規則,若P>L則規則有效,否則丟棄該規則。另外,對一個屬性A而言,為了將數據集概括到一定層次,必須沿著A的概念層次向上爬行幾次。為了控制這個過程,有必要設置一歸納閾值,若A的取值個數達到這一閾值,則無需進一步概括,否則必須進行進一步的概括。除此之外,我們還可以對泛化表設置一個歸納閾值,如果泛化表的記錄樹大於該歸納閾值,則進行進一步的泛化直到滿足這個歸納閾值為止。以上策略可以總結成演算法如下:
演算法1 (基本泛化演算法)
輸入條件:1.一個關系數據集,2 一個學習任務,3 一套相關屬性的概念層次,4 每個屬性歸納閾值t[i](i=1 to n,於屬性相對應)、一個泛化表歸納閾值t2。
輸出:一個用戶期望的泛化後的數據集。
步驟:本演算法可以分為兩大步:
Step1. 根據用戶提交的學習任務,從原始的關系數據集中收集與任務相關的屬性與數據。生成初始泛化集GR;
Step2. 運行基本的泛化演算法產生泛化數據集。
注意,step2可以細化成如下演算法:
begin
for GR中的每一個屬性Ai do
begin
while Ai的不同值的數目>t[i] do
begin
if Ai在概念層次中有高層次的概念 THEN
將Ai的所有值以高層次的概念值取代
else
在GR中移去Ai;
合並同樣的記錄;
end;
end;
while GR中的記錄數>t2 do
begin
選擇泛化屬性進一步泛化;
合並相同的記錄。
end;
end.
3 基於數據立方體的泛化演算法
上述泛化演算法是針對關系表的,其生成的結果也是關系數據表。對泛化後關系數據表進行分類規則挖掘時仍要進行大量的聚合運算,如計數、求和等。有沒有辦法降低聚合運算的運算量呢?有,那就是數據立方體。我們知道數據立方體的方格內存放的就是一些聚合值,而且對數據立方體進行聚合運算,其效率遠高於對關系資料庫進行聚合運算。基於此,本文提出了一種基於數據立方體的演算法。
● 基於數據立方體的泛化演算法
本演算法共分為四步:第一步,初始化。首先,根據用戶提出的發現任務,收集相關數據。(這里需說明的一點是此處用戶提出的發現任務的相關屬性實際上是一個維的概念,它可能對應於資料庫中一個或幾個有層次關系的實際屬性。在下面的例子中我們將看到這一點。)然後確定每維的概念層次(自動提取數值型概念層次或動態調整已有概念層次)。第二步,構造基本立方體(Basecube)。這一步中首先根據資料庫的數據分布特性(對於離散屬性確定不同值的個數,連續值則確定數值間的最小間隔)確定每維的最初泛化層次,然後進行聚合計算來構造基本立方體。第三步,按照基本泛化策略對每維進行泛化造作,以確定每維理想的泛化層次。第四步,在新的泛化層次上對Basecube進行再計算,以構造最終的泛化立方體Primecube。這一步中將大量使用數據立方體的操作。該演算法的形式描述如下:
演算法2 基於數據立方體的泛化演算法
輸入:
1 一個待挖掘的關系數據集;
2 一個學習任務;
3 一個概念層次集合Gen(Ai),Ai是任意維;
4 Ti,任意維Ai的泛化閾值。
輸出:一個最終泛化的數據立方體。
方法:
⑴ 始化:
① 根據用戶的學習任務,確定每一維對應的屬性,並從初始關系數據集中收集相關的數據。
② for 每一維Ai do
begin
if Ai是數值型 and Ai沒有概念層次 then 自動生成概念層次(演算法2.1)
else 動態調整概念層次以適應當前學習任務;
end;
⑵ 造Basecube:
① 對於每一維的屬性計算其在資料庫中對應的不同值的個數,如果是數值型則計算數值間的最小間隔,根據不同值的個數或最小間隔確定每一維的最初泛化層次。
② 按最初泛化層次確定每維的維成員,並進行COUNT,SUM等聚合運算。用文[26]中演算法構造基本立方體。
⑶ 確定每維的泛化層次。
① 根據每一維的泛化閾值,進行基本泛化(演算法2.5)找到最終理想的層次Li。
② 找出每一維Ai的映射<v,v』>,其中v是維成員值,v』是v在泛化層上對應的概念值。
⑷ 構造Primecube。
① 將Basecube的維成員v替換成v』;
② 對Basecube進行數據立方體操作,構造Primecube。
本演算法中,第一步的時間復雜度主要依賴於特定資料庫的操作和提取或調整概念層次的演算法的效率。第二步的主要操作在於立方體的構造上,復雜度為 。第三步和第四步都只對基本立方體進行一次掃描,加上計算量,復雜度也為 。所以本演算法中二到四步總的時間復雜度應為 。
下面以一個例子來進一步描述該演算法。
例1:從網上下了一個資料庫CITYDATA,該資料庫記錄了美國地區城市的情況。其中有三個表,如下:
表1 CityLocation 記錄城市所在地
表2 LaborIncome 記錄城市人員的收入
表3 記錄犯罪率與教育程度
我們有一個初始概念層次US_LOCATION:
…
現在我們要對資料庫進行如下任務的發現:
CLASSIFY CITYDATA
ACCORDING TO UNEMPLOYMENT_RATE
IN RELEVANCE TO US_LOCATION,FAMILY_INCOME,POVERTY_PCT,
CRIME_RATE,BACHELOR_PCT
FROM LABORINCOME,CRIMEEDUCATION
注意到該發現任務中的維US_LOCATION對應著幾個有層次關系的資料庫屬性:area-name→county→state→region→big region→country,這些屬性在概念層次Us location中都對應著相應的層次。每一維的閾值為5。
根據演算法,我們首先作初始化,對family income,poverty pct,crime_rate,bachelor_pct由於它們是數值型的屬性,所以概念層次可以自動提取出來,下面便是自動提取出來的概念層次:
運行演算法二、三、四步,得到六維的基本立方體和泛化立方體,為方便起見本文給出其中三維的立方體圖。
最後的泛化結果放在了表4。注意到cityid的屬性已被移去。
表4 最後的泛化結果
4 結束語
數據泛化在線分類研究中佔有重要地位,它是在線分類規則挖掘演算法的基礎。在線分類任務的一個重要特徵就是數據量龐大,且數據中含有一定量的異常信息,這樣的數據是不適合直接分類的。通過數據泛化,可以將數據整理、清潔,為分類提供較好的數據環境。另外數據泛化採用了概念層次技術,可以發現高層的分類規則,從而使分類結果更易理解。
本文結合基本的面向屬性歸納技術,提出了一種數據立方體的數據泛化演算法,給在線分類提供了較好的數據預處理技術。
參考文獻
[1] Han J, Fu Y. Exploration of the power of attribute-oriented inction in data mining. In: Fayyad U M et al eds. Advances in Knowledge Discover and Data Mining. Cambridge: AAAI/MIT Press, 1996. 399~421
[2] J. Han, Y. Cai, and N. Cercone. Knowledge discovery in databases: An attribute_Oriented approach. In Proc. 18th Int. Conf. Very Large Data Bases, pages 547--559, Vancouver, Canada, August 1992.
[3] Cheung D W, Fu A W C, Han J. Knowledge discovery in databases: a rule based attribute oriented approach. In: Zbigniew R ed. Methodologies for Intelligent systems: 8th International Symposium. Berlin: Springer-Verlag, 1994. 164~173
[4] Han, J., Chiang, J., Chee, S., Chen, J., Chen, Q., Cheng, S., Gong, W., Kamber, M., Liu, G., Koperski, K., Lu, Y., Stefanovic, N., Winstone, L., Xia, B., Zaiane, O. R., Zhang, S. & Zhu, H. (1997), DBMiner: A system for data mining in relational databases and data warehouses, in `Proc. CASCON'97: Meeting of Minds', Toronto, Canada, pp. 249--260.
作者簡介:
黃建國(1974年10月-- ) ,男,安徽省合肥市人,合肥幼兒師范學校講師,中國科技大學計算機應用工程碩士。
Ⅵ C4.5演算法
C4.5是一系列用在機器學習和數據挖掘的分類問題中的演算法。它的目標是監督學習:給定一個數據集,其中的每一個元組都能用一組屬性值來描述,每一個元組屬於一個互斥的類別中的某一類。C4.5的目標是通過學習,找到一個從屬性值到類別的映射關系,並且這個映射能用於對新的類別未知的實體進行分類。
C4.5由J.Ross Quinlan在ID3的基礎上提出的。ID3演算法用來構造決策樹。決策樹是一種類似流程圖的樹結構,其中每個內部節點(非樹葉節點)表示在一個屬性上的測試,每個分枝代表一個測試輸出,而每個樹葉節點存放一個類標號。一旦建立好了決策樹,對於一個未給定類標號的元組,跟蹤一條有根節點到葉節點的路徑,該葉節點就存放著該元組的預測。決策樹的優勢在於不需要任何領域知識或參數設置,適合於探測性的知識發現。
決策樹呈樹形結構,在分類問題中,表示基於特徵對實例進行分類的過程。學習時,利用訓練數據,根據損失函數最小化的原則建立決策樹模型;預測時,對新的數據,利用決策模型進行分類。
決策樹是一種通過對特徵屬性的分類對樣本進行分類的樹形結構,包括有向邊以及三類節點:
上圖給出了(二叉)決策樹的示例。決策樹具有以下特點:
決策樹學習的本質是從訓練集中歸納出一組分類規則。但隨著分裂屬性次序的不同,所得到的決策樹也會不同。如何得到一棵決策樹既對訓練數據有較好的擬合,又對未知數據有很好的預測呢?
首先,我們要解決兩個問題:
一般的,一顆決策樹包含一個根節點、若干個內部結點和若干個葉結點;葉結點則對應於一個屬性冊書;每個葉結點包含的樣本集合根據屬性測試的結果被劃分到子結點中;根結點包含樣本全集,從根結點到每個葉結點的路徑對飲過了一個判定測試序列。決策樹學習的目的是為了產生一顆泛化能力強的決策樹,其基本流程遵循簡單且只管的「分而治之」(divide-and-conquer)策略,如下圖所示:
顯然,決策樹的生成是一個遞歸的過程。在決策樹基本演算法中,有三種情形會導致遞歸返回:
在第二種情形下,我們把當前結點標記為葉結點,並且將其類別設定為該結點所含樣本最多的類別;在第三種情形下,同樣把當前結點標記為葉結點,但將其類別設定為其父結點所含樣本最多類別。注意這兩種情形的處理實質不同:情形二是在利用當前結點的後驗分布,而情形三則是把父結點的樣本分布當做當前結點的先驗分布。
決策樹學習的關鍵在於如何選擇最優劃分屬性。一般而言,隨著劃分過程的不斷進行,我們希望決策樹的分支結點所包含的樣本盡可能屬於同一類別,即結點的「純度」越來越高。
「信息熵」(information entropy)是度量樣本集合純度最常用的一種指標。假定當前樣本集合 中第k類樣本所佔比例為 ,則 的信息熵定義為
的值越小,則 的純度越高。
假定離散屬性 有 個可能的取值 ,若使用 來對樣本集合 進行劃分,則會產生 個分支結點,其中第v個分支結點包含了 中所有在屬性 上取值為 的樣本,記為 ,我們根據上述公式計算出 的信息熵,再考慮到不同的分支結點所包含的樣本數不同,給分支結點賦予權重 ,即樣本越多的分支結點影響越大,於是可以計算出用屬性 對樣本集合 進行劃分所獲得的"信息增益"(information gain)
一般而言,信息增益越大,則意味著使用屬性a來進行劃分所獲得的「純度提升越大」。因此,我們可用信息增益來進行決策樹的劃分屬性選擇。
實際上,信息增益准則對可取值數目較多的屬性有所偏好(如何以序號作為劃分屬性,每一個事物作為一個單獨存在的類別的時候,信息增益往往會很高,但是這樣進行劃分並沒有什麼意義),為了減少這種偏好可能帶來的不利影響,著名的C4.5演算法並不是直接使用信息增益,而是使用增益率(gain ratio)來選擇最優的劃分屬性。增益率的定義為:
值得注意的是: 增益率准則對可取值數目較少的屬性有所偏好,因此C4.5演算法並不是直接選擇增益率最大的候選劃分屬性,而是使用了一個啟發式: 先從候選劃分屬性中找出信息增益高於平均水平的屬性,再從中選擇增益率最高的
CART決策樹使用「基尼指數」來選擇劃分屬性。數據集 的純度可用基尼值來度量:
直觀來說, 反映了從數據集 中隨機抽取兩個樣本,其類別標記不一致的概率,因此 值越小,則數據集 的純度就越高。屬性 的基尼指數定義為:
於是,我們在候選屬性集合 中,選擇那個使得劃分後基尼指數最小的屬性作為最優劃分屬性,即
銀行希望能夠通過一個人的信息(包括職業、年齡、收入、學歷)去判斷他是否有貸款的意向,從而更有針對性地完成工作。下表是銀行現在能夠掌握的信息,我們的目標是通過對下面的數據進行分析建立一個預測用戶貸款一下的模型。
上表中有4個客戶的屬性,如何綜合利用這些屬性去判斷用戶的貸款意向?決策樹的做法是每次選擇一個屬性進行判斷,如果不能得出結論,繼續選擇其他屬性進行判斷,直到能夠「肯定地」判斷出用戶的類型或者是上述屬性都已經使用完畢。比如說我們要判斷一個客戶的貸款意向,我們可以先根據客戶的職業進行判斷,如果不能得出結論,再根據年齡作判斷,這樣以此類推,直到可以得出結論為止。決策樹用樹結構實現上述的判斷流程,如圖所示:
以熵作為節點復雜度的統計量,分別求出下面例子的信息增益,圖3.1表示節點選擇屬性1進行分裂的結果,圖3.2表示節點選擇屬性2進行分裂的結果,通過計算兩個屬性分裂後的信息增益,選擇最優的分裂屬性。
屬性一
屬性二
由於 ,所以屬性1是比屬性2更優的分裂屬性,故而選擇屬性1作為分裂屬性。
由於 ,故而選擇屬性2作為分裂屬性。
剪枝(pruning)是決策樹學習演算法對付「過擬合」的主要手段。在決策樹學習中,為了盡可能正確分類訓練樣本,結點劃分過程將不斷重復,有事會造成決策樹分支過多,這是就可能因為訓練樣本學得太好了,以致把訓練集自身的一些特點黨組喲所有數據都具有的一般性質而導致過擬合。因此,可通過主動去掉一些分支來降低過擬合的風險。
其中{1,2,3,6,7,10,14,15,16,17}為測試集,{4,5,8,9,11,12,13}為訓練集。
預剪枝是要對劃分前後泛化性能進行評估。對比決策樹某節點生成前與生成後的泛化性能。
2.計算訓練集的信息增益,得知臍部的信息增益最大,因此按照臍部進行劃分。又因為在訓練集中,凹陷特徵好瓜的佔比多,因此凹陷劃分為好瓜,稍凹特徵好過佔比多,因此將其標記為好瓜,因此按照臍部劃分的子樹結果如下:
劃分後,對比結果如下:
由圖可知,預剪枝使得很多分支沒有展開,這不僅降低了過擬合的風險,還顯著減少了決策樹的訓練時間開銷和測試時間。但是,有些分支雖當前不能提升泛化性。甚至可能導致泛化性暫時降低,但在其基礎上進行後續劃分卻有可能導致顯著提高,因此預剪枝的這種貪心本質,給決策樹帶來了欠擬合的風險。
後剪枝表示先從訓練集中生成一顆完整決策樹。
對比標記節點的劃分類與各數據的真實分類,計算準確率,如下表所示:
生成的決策樹,在驗證集上的准確度為3/7*100%=42.9%.
對比預剪枝與後剪枝生成的決策樹,可以看出,後剪枝通常比預剪枝保留更多的分支,其欠擬合風險很小,因此後剪枝的泛化性能往往由於預剪枝決策樹。但後剪枝過程是從底往上裁剪,因此其訓練時間開銷比前剪枝要大。
Ⅶ 在計算機科學中,有哪些非常巧妙的演算法
分支界定演算法(Branch and Bound)——在多種最優化問題中尋找特定最優化解決方案的演算法,特別是針對離散、組合的最優化。Buchberger演算法——一種數學演算法,可將其視為針對單變數最大公約數求解的歐幾里得演算法和線性系統中高斯消元法的泛化。
動態規劃演算法(Dynamic Programming)——展示互相覆蓋的子問題和最優子架構演算法
歐幾里得演算法(Euclidean algorithm)——計算兩個整數的最大公約數。最古老的演算法之一,出現在公元前300前歐幾里得的《幾何原本》。
期望-最大演算法(Expectation-maximization algorithm,又名EM-Training)——在統計計算中,期望-最大演算法在概率模型中尋找可能性最大的參數估算值,其中模型依賴於未發現的潛在變數。EM在兩個步驟中交替計算,第一步是計算期望,利用對隱藏變數的現有估計值,計算其最大可能估計值;第二步是最大化,最大化在第一步上求得的最大可能值來計算參數的值