本文目錄一覽:
- 1、深度學習和有效學習的區別
- 2、機器學習——條件決策樹
- 3、機器學習如何對財富和所在行業關係進行建模預測
- 4、CNN、RNN、DNN的一般解釋
- 5、一文搞懂DNN反向傳播!
- 6、機器學習的基本框架體系是什麼?並分模塊進行闡述。
深度學習和有效學習的區別
深度學習和有效學習的區別分別是:
1、深度學習是:Deep Learning,是一種機器學習的技術,由於深度學習在現代機器學習中的比重和價值非常巨大,因此常常將深度學習單獨拿出來說。
最初的深度學習網路是利用神經網路來解決特徵層分布的一種學習過程。通常我們了解的DNN(深度神經網路),CNN(卷積神經網路),RNN(循環神經網路),LSTM(長短期記憶網路)都是隸屬於深度學習的範疇。
也是現代機器學習最常用的一些手段。通過這些手段,深度學習在視覺識別,語音識別,自然語言處理(NLP)等領域取得了使用傳統機器學習演算法所無法取得的成就。
2、有效學習是:所謂有效學習就是智能系統從環境到行為映射的學習,以使獎勵信號(強化信號)函數值最大,由於外部給出的信息很少。
有效學習系統必須依靠自身的經歷進行自我學習。通過這種學習獲取知識,改進行動方案以適應環境。有效學習最關鍵的三個因素是狀態,行為和環境獎勵。
機器學習是:Maching Learning,是實現人工智慧的一種手段,也是目前被認為比較有效的實現人工智慧的手段。
目前在業界使用機器學習比較突出的領域很多,例如計算機視覺、自然語言處理、推薦系統、文本分類等,大家生活中經常用到的比如高速公路上的ETC的車牌識別,蘋果手機的Siri,看今日頭條時給你推薦的新聞,再比如大家用天貓買東西看評論的時候的評價描述。
機器學習——條件決策樹
使用威斯康星州乳腺癌數據,劃分訓練集和測試集,比較經典決策樹和條件決策樹的效果。
演算法如下:
(1) 對輸出變數與每個預測變數間的關係計算p值。
(2) 選取p值最小的變數。
(3) 在因變數與被選中的變數間嘗試所有可能的二元分割(通過排列檢驗),並選取最顯著的分割。
(4) 將數據集分成兩群,並對每個子群重複上述步驟。
(5) 重複直至所有分割都不顯著或已到達最小節點為止。
條件推斷樹可由party包中的ctree()函數獲得:
library(party)
fit.ctree – ctree(class~., data=df.train)
plot(fit.ctree, main=”Conditional Inference Tree”)
ctree.pred – predict(fit.ctree, df.validate, type=”response”)
ctree.perf – table(df.validate$class, ctree.pred,dnn=c(“Actual”, “Predicted”))
ctree.perf
註:
值得注意的是,對於條件推斷樹來說,剪枝不是必需的,其生成過程相對更自動化一些。另外,party包也提供了許多圖像參數。
下圖展示了一棵條件推斷樹,每個節點中的陰影區域代表這個節點對應的惡性腫瘤比例。
predict()函數 用來對驗證集中的觀測點分類。結果給出了實際類別與預測類別的交叉表。整體來看,條件決策樹中驗證集中的準確率是95.2381%,經典決策樹的準確率是96%。
儘管在這個例子中,傳統決策樹和條件推斷樹的準確度比較相似,但有時它們可能會很不一樣。
· rpart包的處理方式:
首先對所有自變數和所有分割點進行評估,最佳的選擇是使分割後組內的數據更為”一致”(pure)。這裡的”一致”是指組內數據的因變數取值變異較小。
rpart包對這種”一致”性的默認度量是Gini值(“吉尼係數”也可以用來衡量樣本數據集的純度。
吉尼係數越小,則表示該節點可以有效的把同一類聚集在一起。反之,分割後的類別越雜亂,則吉尼係數會越大。
在決策樹生成時,當用到吉尼係數這個方法時,通常會計算每一個特徵的吉尼係數,接著比較各個特徵下的吉尼係數,係數越小的特徵越適合先作為內部節點。)。
確定停止劃分的參數有很多(參見rpart.control),確定這些參數是非常重要而微妙的,因為劃分越細,模型越複雜,越容易出現過度擬合的情況,而劃分過粗,又會出現擬合不足。
處理這個問題通常是使用”剪枝”(prune)方法。即先建立一個劃分較細較為複雜的樹模型,再根據交叉檢驗(Cross-Validation)的方法來估計不同”剪枝”條件下,各模型的誤差,選擇誤差最小的樹模型。
· party包的處理方式:
它的背景理論是”條件推斷決策樹”(conditional inference trees):它根據統計檢驗來確定自變數和分割點的選擇。
即先假設所有自變數與因變數均獨立。再對它們進行卡方獨立檢驗,檢驗P值小於閥值的自變數加入模型,相關性最強的自變數作為第一次分割的自變數。自變數選擇好後,用置換檢驗來選擇分割點。
用party包建立的決策樹不需要剪枝,因為閥值就決定了模型的複雜程度。所以如何決定閥值參數是非常重要的(參見ctree_control)。較為流行的做法是取不同的參數值進行交叉檢驗,選擇誤差最小的模型參數。
機器學習如何對財富和所在行業關係進行建模預測
方法1
可能存在問題,樣本太少,有可能過擬合。先看下效果在說吧。
首先建立了一個4層的dnn網路(詳見test_dnn.py)
預測結果分析
對測試集進行測試
衡量標準為為均方根
計算方法:sqrt((預測值-原始值)**2/樣本數)
Rms=1.84
下圖為預測誤差分布圖
結果分析:效果不理想,預測值與真實值差距較大,有一個值偏離非常大
原因分析:
模型結構不夠理想
超參數的設置
樣本太少,有200w的參數但是樣本只有4000+,過擬合問題嚴重(在20次迭代後,就發生過擬合了)
方法2
使用lightgbm
直接使用lightgbm庫(能用,但是對調參還需要學習)
詳見test_lightgbm.py
預測結果分析
對測試集進行測試
衡量標準為均方根
Rms=1.35
結果分析:效果依舊不理想,但是比dnn較好,而且沒有偏移非常大的值
原因分析:
依舊存在過擬合
模型參數設置
方法3
使用xgboost
方法同上
預測結果
Rms=1.38
結果分析:效果依舊不理想
原因分析:
2000次迭代次數不夠,模型還未收斂
模型參數設置
方法4
使用catboost
方法同上
預測結果
Rms=1.47
結果分析:效果依舊不理想
方法5
使用集成學習的思想,將上面的方法混合使用
將3個學習器的結果根據權重求和,得到最後結果
Rms=1.36

結果分析:
使用4種方法對預測目標進行建模,其中dnn由於數據太少,很早就發生了過擬合
Xgboost,lightgbm,catboost效果比dnn要好很多,但是對價值預測依然存在偏差。但是結合kaggle的論壇帖子,由於數據特點在不使用leak的情況下 這已經是不錯的預測。由於調參修改的時間需求較大就不進行了,這裡只是一個驗證,驗證結果為Xgboost,lightgbm,catboost在數據量較少的場景,效果是非常好的。
CNN、RNN、DNN的一般解釋
CNN(卷積神經網路)、RNN(循環神經網路)、DNN(深度神經網路)的內部網路結構有什麼區別?
轉自知乎 科言君 的回答
神經網路技術起源於上世紀五、六十年代,當時叫 感知機 (perceptron),擁有輸入層、輸出層和一個隱含層。輸入的特徵向量通過隱含層變換達到輸出層,在輸出層得到分類結果。早期感知機的推動者是Rosenblatt。 (扯一個不相關的:由於計算技術的落後,當時感知器傳輸函數是用線拉動變阻器改變電阻的方法機械實現的,腦補一下科學家們扯著密密麻麻的導線的樣子…)
但是,Rosenblatt的單層感知機有一個嚴重得不能再嚴重的問題,即它對稍複雜一些的函數都無能為力(比如最為典型的「異或」操作)。連異或都不能擬合,你還能指望這貨有什麼實際用途么o(╯□╰)o
隨著數學的發展,這個缺點直到上世紀八十年代才被Rumelhart、Williams、Hinton、LeCun等人(反正就是一票大牛)發明的 多層感知機 (multilayerperceptron)克服。多層感知機,顧名思義,就是有多個隱含層的感知機(廢話……)。好好,我們看一下多層感知機的結構:
圖1 上下層神經元全部相連的神經網路——多層感知機
多層感知機可以擺脫早期離散傳輸函數的束縛,使用sigmoid或tanh等連續函數模擬神經元對激勵的響應,在訓練演算法上則使用Werbos發明的反向傳播BP演算法。對,這貨就是我們現在所說的 神經網路 NN ——神經網路聽起來不知道比感知機高端到哪裡去了!這再次告訴我們起一個好聽的名字對於研(zhuang)究(bi)很重要!
多層感知機解決了之前無法模擬異或邏輯的缺陷,同時更多的層數也讓網路更能夠刻畫現實世界中的複雜情形。相信年輕如Hinton當時一定是春風得意。
多層感知機給我們帶來的啟示是, 神經網路的層數直接決定了它對現實的刻畫能力 ——利用每層更少的神經元擬合更加複雜的函數[1]。
(Bengio如是說:functions that can be compactly
represented by a depth k architecture might require an exponential number of
computational elements to be represented by a depth k − 1 architecture.)
即便大牛們早就預料到神經網路需要變得更深,但是有一個夢魘總是縈繞左右。隨著神經網路層數的加深, 優化函數越來越容易陷入局部最優解 ,並且這個「陷阱」越來越偏離真正的全局最優。利用有限數據訓練的深層網路,性能還不如較淺層網路。同時,另一個不可忽略的問題是隨著網路層數增加, 「梯度消失」現象更加嚴重 。具體來說,我們常常使用sigmoid作為神經元的輸入輸出函數。對於幅度為1的信號,在BP反向傳播梯度時,每傳遞一層,梯度衰減為原來的0.25。層數一多,梯度指數衰減後低層基本上接受不到有效的訓練信號。
2006年,Hinton利用預訓練方法緩解了局部最優解問題,將隱含層推動到了7層[2],神經網路真正意義上有了「深度」,由此揭開了深度學習的熱潮。這裡的「深度」並沒有固定的定義——在語音識別中4層網路就能夠被認為是「較深的」,而在圖像識別中20層以上的網路屢見不鮮。為了克服梯度消失,ReLU、maxout等傳輸函數代替了sigmoid,形成了如今DNN的基本形式。單從結構上來說, 全連接的 DNN 和圖 1 的多層感知機是沒有任何區別的 。
值得一提的是,今年出現的高速公路網路(highway network)和深度殘差學習(deep residual learning)進一步避免了梯度消失,網路層數達到了前所未有的一百多層(深度殘差學習:152層)[3,4]!具體結構題主可自行搜索了解。如果你之前在懷疑是不是有很多方法打上了「深度學習」的噱頭,這個結果真是深得讓人心服口服。
圖2 縮減版的深度殘差學習網路,僅有34 層,終極版有152 層,自行感受一下
如圖1所示,我們看到 全連接 DNN 的結構里下層神經元和所有上層神經元都能夠形成連接 ,帶來的潛在問題是 參數數量的膨脹 。假設輸入的是一幅像素為1K*1K的圖像,隱含層有1M個節點,光這一層就有10^12個權重需要訓練,這不僅容易過擬合,而且極容易陷入局部最優。另外,圖像中有固有的局部模式(比如輪廓、邊界,人的眼睛、鼻子、嘴等)可以利用,顯然應該將圖像處理中的概念和神經網路技術相結合。此時我們可以祭出題主所說的卷積神經網路CNN。對於CNN來說,並不是所有上下層神經元都能直接相連,而是 通過「卷積核」作為中介。同一個卷積核在所有圖像內是共享的,圖像通過卷積操作後仍然保留原先的位置關係。 兩層之間的卷積傳輸的示意圖如下:
圖3 卷積神經網路隱含層(摘自Theano 教程)
通過一個例子簡單說明卷積神經網路的結構。假設圖3中m-1=1是輸入層,我們需要識別一幅彩色圖像,這幅圖像具有四個通道ARGB(透明度和紅綠藍,對應了四幅相同大小的圖像),假設卷積核大小為100*100,共使用100個卷積核w1到w100(從直覺來看,每個卷積核應該學習到不同的結構特徵)。用w1在ARGB圖像上進行卷積操作,可以得到隱含層的第一幅圖像;這幅隱含層圖像左上角第一個像素是四幅輸入圖像左上角100*100區域內像素的加權求和,以此類推。同理,算上其他卷積核,隱含層對應100幅「圖像」。每幅圖像對是對原始圖像中不同特徵的響應。按照這樣的結構繼續傳遞下去。CNN中還有max-pooling等操作進一步提高魯棒性。
圖4 一個典型的卷積神經網路結構,注意到最後一層實際上是一個全連接層(摘自Theano 教程)
在這個例子里,我們注意到 輸入層到隱含層的參數瞬間降低到了 100*100*100=10^6 個 !這使得我們能夠用已有的訓練數據得到良好的模型。題主所說的適用於圖像識別,正是由於 CNN 模型限制參數了個數並挖掘了局部結構的這個特點 。順著同樣的思路,利用語音語譜結構中的局部信息,CNN照樣能應用在語音識別中。
全連接的DNN還存在著另一個問題——無法對時間序列上的變化進行建模。然而, 樣本出現的時間順序對於自然語言處理、語音識別、手寫體識別等應用非常重要 。對了適應這種需求,就出現了題主所說的另一種神經網路結構——循環神經網路RNN。
在普通的全連接網路或CNN中,每層神經元的信號只能向上一層傳播,樣本的處理在各個時刻獨立,因此又被成為前向神經網路(Feed-forward Neural Networks)。而在 RNN 中,神經元的輸出可以在下一個時間戳直接作用到自身 ,即第i層神經元在m時刻的輸入,除了(i-1)層神經元在該時刻的輸出外,還包括其自身在(m-1)時刻的輸出!表示成圖就是這樣的:
圖5 RNN 網路結構
我們可以看到在隱含層節點之間增加了互連。為了分析方便,我們常將RNN在時間上進行展開,得到如圖6所示的結構:
圖6 RNN 在時間上進行展開
Cool, ( t+1 )時刻網路的最終結果O(t+1) 是該時刻輸入和所有歷史共同作用的結果 !這就達到了對時間序列建模的目的。
不知題主是否發現,RNN可以看成一個在時間上傳遞的神經網路,它的深度是時間的長度!正如我們上面所說, 「梯度消失」現象又要出現了,只不過這次發生在時間軸上 。對於t時刻來說,它產生的梯度在時間軸上向歷史傳播幾層之後就消失了,根本就無法影響太遙遠的過去。因此,之前說「所有歷史」共同作用只是理想的情況,在實際中,這種影響也就只能維持若干個時間戳。
為了解決時間上的梯度消失,機器學習領域發展出了 長短時記憶單元 LSTM ,通過門的開關實現時間上記憶功能,並防止梯度消失 ,一個LSTM單元長這個樣子:
圖7 LSTM 的模樣
除了題主疑惑的三種網路,和我之前提到的深度殘差學習、LSTM外,深度學習還有許多其他的結構。舉個例子,RNN既然能繼承歷史信息,是不是也能吸收點未來的信息呢?因為在序列信號分析中,如果我能預知未來,對識別一定也是有所幫助的。因此就有了 雙向 RNN 、雙向 LSTM ,同時利用歷史和未來的信息。
圖8 雙向RNN
事實上, 不論是那種網路,他們在實際應用中常常都混合著使用,比如 CNN 和RNN 在上層輸出之前往往會接上全連接層,很難說某個網路到底屬於哪個類別。 不難想像隨著深度學習熱度的延續,更靈活的組合方式、更多的網路結構將被發展出來。儘管看起來千變萬化,但研究者們的出發點肯定都是為了解決特定的問題。題主如果想進行這方面的研究,不妨仔細分析一下這些結構各自的特點以及它們達成目標的手段。入門的話可以參考:
Ng寫的Ufldl: UFLDL教程 – Ufldl
也可以看Theano內自帶的教程,例子非常具體: Deep Learning Tutorials
歡迎大家繼續推薦補充。
當然啦,如果題主只是想湊個熱鬧時髦一把,或者大概了解一下方便以後把妹使,這樣看看也就罷了吧。
參考文獻:
[1]
Bengio Y. Learning Deep
Architectures for AI[J]. Foundations Trends® in Machine Learning, 2009,
2(1):1-127.
[2]
Hinton G E, Salakhutdinov R R.
Reducing the Dimensionality of Data with Neural Networks[J]. Science, 2006,
313(5786):504-507.
[3]
He K, Zhang X, Ren S, Sun J. Deep
Residual Learning for Image Recognition. arXiv:1512.03385, 2015.
[4]
Srivastava R K, Greff K,
Schmidhuber J. Highway networks. arXiv:1505.00387, 2015.
一文搞懂DNN反向傳播!
本文主要整理自下面的幾篇博客:
1、深度神經網路(DNN)反向傳播演算法(BP):
2、機器學習中的矩陣、向量求導。
1、推導BPNN前需要了解的矩陣求導知識
1.1 矩陣/向量值函數對實數的導數
1.2 實值函數對矩陣/向量的導數
1.3 向量值函數對向量的求導(雅可比矩陣)
1.4 變數多次出現的求導法則
規則:若在函數表達式中,某個變數出現了多次,可以單獨計算函數對自變數的每一次出現的導數,再把結果加起來。
1.5 向量求導的鏈式法則
1.6 一一對應關係下的矩陣求導
1.7 幾個重要的結論
掌握了上面的一些基本知識之後,我們就可以順利推導出神經網路的反向傳播演算法。
2、反向傳播的推導
具體的推導過程可以參考文章開頭給出的博客,下圖是我手動推導的過程:
讚賞支持
鏈接:
來源:
機器學習的基本框架體系是什麼?並分模塊進行闡述。
Boehm:運用現代科學技術知識來設計並構造計算機程序及為開發、運行和維護這些程序所必需的相關文件資料。
IEEE在軟體工程術語彙編中的定義:軟體工程是:1.將系統化的、嚴格約束的、可量化的方法應用於軟體的開發、運行和維護,即將工程化應用於軟體;2.在1中所述方法的研究
Fritz Bauer在NATO會議上給出的定義:建立並使用完善的工程化原則,以較經濟的手段獲得能在實際機器上有效運行的可靠軟體的一系列方法。
目前比較認可的一種定義認為:軟體工程是研究和應用如何以系統性的、規範化的、可定量的過程化方法去開發和維護軟體,以及如何把經過時間考驗而證明正確的管理技術和當前能夠得到的最好的技術方法結合起來。
《計算機科學技術百科全書》中的定義:軟體工程是應用計算機科學、數學及管理科學等原理,開發軟體的工程。軟體工程借鑒傳統工程的原則、方法,以提高質量、降低成本。其中,計算機科學、數學用於構建模型與演算法,工程科學用於制定規範、設計范型(paradigm)、評估成本及確定權衡,管理科學用於計劃、資源、質量、成本等管理。
軟體工程學的內容
軟體工程學的主要內容是軟體開發技術和軟體工程管理.
軟體開發技術包含軟體工程方法學、軟體工具和軟體開發環境;軟體工程管理學包含軟體工程經濟學和軟體管理學。
軟體工程基本原理
著名軟體工程專家B.Boehm綜合有關專家和學者的意見並總結了多年來開發軟體的經驗,於1983年在一篇論文中提出了軟體工程的七條基本原理。
(1)用分階段的生存周期計划進行嚴格的管理。
(2)堅持進行階段評審。
(3)實行嚴格的產品控制。
(4)採用現代程序設計技術。
(5)軟體工程結果應能清楚地審查。
(6)開發小組的人員應該少而精。
(7)承認不斷改進軟體工程實踐的必要性。
B.Boehm指出,遵循前六條基本原理,能夠實現軟體的工程化生產;按照第七條原理,不僅要積極主動地採納新的軟體技術,而且要注意不斷總結經驗。
軟體工程(SoftWare Engineering)的框架可概括為:目標、過程和原則。
(1)軟體工程目標:生產具有正確性、可用性以及開銷合宜的產品。正確性指軟體產品達到預期功能的程度。可用性指軟體基本結構、實現及文檔為用戶可用的程度。開銷合宜是指軟體開發、運行的整個開銷滿足用戶要求的程度。這些目標的實現不論在理論上還是在實踐中均存在很多待解決的問題,它們形成了對過程、過程模型及工程方法選取的約束。
(2)軟體工程過程:生產一個最終能滿足需求且達到工程目標的軟體產品所需要的步驟。軟體工程過程主要包括開發過程、運作過程、維護過程。它們覆蓋了需求、設計、實現、確認以及維護等活動。需求活動包括問題分析和需求分析。問題分析獲取需求定義,又稱軟體需求規約。需求分析生成功能規約。設計活動一般包括概要設計和詳細設計。概要設計建立整個軟體系統結構,包括子系統、模塊以及相關層次的說明、每一模塊的介面定義。詳細設計產生程序員可用的模塊說明,包括每一模塊中數據結構說明及加工描述。實現活動把設計結果轉換為可執行的程序代碼。確認活動貫穿於整個開發過程,實現完成後的確認,保證最終產品滿足用戶的要求。維護活動包括使用過程中的擴充、修改與完善。伴隨以上過程,還有管理過程、支持過程、培訓過程等。
(3)軟體工程的原則是指圍繞工程設計、工程支持以及工程管理在軟體開發過程中必須遵循的原則。
軟體工程必須遵循什麼原則
圍繞工程設計、工程支持以及工程管理已提出了以下四條基本原則:
(1)選取適宜的開發模型
該原則與系統設計有關。在系統設計中,軟體需求、硬體需求以及其它因素間是相互制約和影響的,經常需要權衡。因此,必需認識需求定義的易變性,採用適當的開發模型,保證軟體產品滿足用戶的要求。
(2)採用合適的設計方法
在軟體設計中,通常需要考慮軟體的模塊化、抽象與信息隱蔽、局部化、一致性以及適應性等特徵。合適的設計方法有助於這些特徵的實現,以達到軟體工程的目標。
(3)提供高質量的工程支撐
工欲善其事,必先利其器。在軟體工程中,軟體工具與環境對軟體過程的支持頗為重要。軟體工程項目的質量與開銷直接取決於對軟體工程所提供的支撐質量和效用。
(4)重視軟體工程的管理
軟體工程的管理直接影響可用資源的有效利用,生產滿足目標的軟體產品以及提高軟體組織的生產能力等問題。因此,僅當軟體過程予以有效管理時,才能實現有效的軟體工程。
軟體工程是指導計算機軟體開發和維護的工程學科。
採用工程的概念、原理、 技術和方法來開發與維護軟體,把經過時間考驗而證明正確的管理技術和當前能夠 得到的最好的技術方法結合起來,這就是軟體工程。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/242082.html