A. 人工智慧:什麼是人工神經網路
許多 人工智慧 計算機系統的核心技術是人工神經網路(ANN),而這種網路的靈感來源於人類大腦中的生物結構。
通過使用連接的「神經元」結構,這些網路可以通過「學習」並在沒有人類參與的情況下處理和評估某些數據。
這樣的實際實例之一是使用人工神經網路(ANN)識別圖像中的對象。在構建一個識別「貓「圖像的一個系統中,將在包含標記為「貓」的圖像的數據集上訓練人工神經網路,該數據集可用作任何進行分析的參考點。正如人們可能學會根據尾巴或皮毛等獨特特徵來識別狗一樣,人工神經網路(ANN)也可以通過將每個圖像分解成不同的組成部分(如顏色和形狀)進行識別。
實際上,神經網路提供了位於託管數據之上的排序和分類級別,可基於相似度來輔助數據的聚類和分組。可以使用人工神經網路(ANN)生成復雜的垃圾郵件過濾器,查找欺詐行為的演算法以及可以精確了解情緒的客戶關系工具。
人工神經網路如何工作
人工神經網路的靈感來自人腦的神經組織,使用類似於神經元的計算節點構造而成,這些節點沿著通道(如神經突觸的工作方式)進行信息交互。這意味著一個計算節點的輸出將影響另一個計算節點的處理。
神經網路標志著人工智慧發展的巨大飛躍,在此之前,人工智慧一直依賴於使用預定義的過程和定期的人工干預來產生所需的結果。人工神經網路可以使分析負載分布在多個互連層的網路中,每個互連層包含互連節點。在處理信息並對其進行場景處理之後,信息將傳遞到下一個節點,然後向下傳遞到各個層。這個想法是允許將其他場景信息接入網路,以通知每個階段的處理。
單個「隱藏」層神經網路的基本結構
就像漁網的結構一樣,神經網路的一個單層使用鏈將處理節點連接在一起。大量的連接使這些節點之間的通信得到增強,從而提高了准確性和數據處理吞吐量。
然後,人工神經網路將許多這樣的層相互疊放以分析數據,從而創建從第一層到最後一層的輸入和輸出數據流。盡管其層數將根據人工神經網路的性質及其任務而變化,但其想法是將數據從一層傳遞到另一層,並隨其添加附加的場景信息。
人腦是用3D矩陣連接起來的,而不是大量堆疊的圖層。就像人類大腦一樣,節點在接收到特定刺激時會在人工神經網路上「發射」信號,並將信號傳遞到另一個節點。但是,對於人工神經網路,輸入信號定義為實數,輸出為各種輸入的總和。
這些輸入的值取決於它們的權重,該權重用於增加或減少與正在執行的任務相對應的輸入數據的重要性。其目標是採用任意數量的二進制數值輸入並將其轉換為單個二進制數值輸出。
更復雜的神經網路提高了數據分析的復雜性
早期的神經網路模型使用淺層結構,其中只使用一個輸入和輸出層。而現代的系統由一個輸入層和一個輸出層組成,其中輸入層首先將數據輸入網路,多個「隱藏」層增加了數據分析的復雜性。
這就是「深度學習」一詞的由來——「深度」部分專門指任何使用多個「隱藏」層的神經網路。
聚會的例子
為了說明人工神經網路在實際中是如何工作的,我們將其簡化為一個實際示例。
想像一下你被邀請參加一個聚會,而你正在決定是否參加,這可能需要權衡利弊,並將各種因素納入決策過程。在此示例中,只選擇三個因素——「我的朋友會去嗎?」、「聚會地點遠嗎?」、「天氣會好嗎?」
通過將這些考慮因素轉換為二進制數值,可以使用人工神經網路對該過程進行建模。例如,我們可以為「天氣」指定一個二進制數值,即『1'代表晴天,『0'代表惡劣天氣。每個決定因素將重復相同的格式。
然而,僅僅賦值是不夠的,因為這不能幫助你做出決定。為此需要定義一個閾值,即積極因素的數量超過消極因素的數量。根據二進制數值,合適的閾值可以是「2」。換句話說,在決定參加聚會之前,需要兩個因素的閾值都是「1」,你才會決定去參加聚會。如果你的朋友要參加聚會(『1'),並且天氣很好(『1'),那麼這就表示你可以參加聚會。
如果天氣不好(『0'),並且聚會地點很遠(『0'),則達不到這一閾值,即使你的朋友參加(『1'),你也不會參加聚會。
神經加權
誠然,這是神經網路基本原理的一個非常基本的例子,但希望它有助於突出二進制值和閾值的概念。然而,決策過程要比這個例子復雜得多,而且通常情況下,一個因素比另一個因素對決策過程的影響更大。
要創建這種變化,可以使用「神經加權」——-通過乘以因素的權重來確定因素的二進制值對其他因素的重要性。
盡管示例中的每個注意事項都可能使你難以決策,但你可能會更重視其中一個或兩個因素。如果你不願意在大雨中出行去聚會,那惡劣的天氣將會超過其他兩個考慮因素。在這一示例中,可以通過賦予更高的權重來更加重視天氣因素的二進制值:
天氣= w5
朋友= w2
距離= w2
如果假設閾值現在已設置為6,則惡劣的天氣(值為0)將阻止其餘輸入達到所需的閾值,因此該節點將不會「觸發」(這意味著你將決定不參加聚會)。
雖然這是一個簡單的示例,但它提供了基於提供的權重做出決策的概述。如果要將其推斷為圖像識別系統,則是否參加聚會(輸入)的各種考慮因素將是給定圖像的折衷特徵,即顏色、大小或形狀。例如,對識別狗進行訓練的系統可以對形狀或顏色賦予更大的權重。
當神經網路處於訓練狀態時,權重和閾值將設置為隨機值。然後,當訓練數據通過網路傳遞時將不斷進行調整,直到獲得一致的輸出為止。
神經網路的好處
神經網路可以有機地學習。也就是說,神經網路的輸出結果並不受輸入數據的完全限制。人工神經網路可以概括輸入數據,使其在模式識別系統中具有價值。
他們還可以找到實現計算密集型答案的捷徑。人工神經網路可以推斷數據點之間的關系,而不是期望數據源中的記錄是明確關聯的。
它們也可以是容錯的。當神經網路擴展到多個系統時,它們可以繞過無法通信的缺失節點。除了圍繞網路中不再起作用的部分進行路由之外,人工神經網路還可以通過推理重新生成數據,並幫助確定不起作用的節點。這對於網路的自診斷和調試非常有用。
但是,深度神經網路提供的最大優勢是能夠處理和聚類非結構化數據,例如圖片、音頻文件、視頻、文本、數字等數據。在分析層次結構中,每一層節點都在前一層的輸出上進行訓練,深層神經網路能夠處理大量的這種非結構化數據,以便在人類處理分析之前找到相似之處。
神經網路的例子
神經網路應用還有許多示例,可以利用它從復雜或不精確數據中獲得見解的能力。
圖像識別人工神經網路可以解決諸如分析特定物體的照片等問題。這種演算法可以用來區分狗和貓。更重要的是,神經網路已經被用於只使用細胞形狀信息來診斷癌症。
近30年來,金融神經網路被用於匯率預測、股票表現和選擇預測。神經網路也被用來確定貸款信用評分,學習正確識別良好的或糟糕的信用風險。而電信神經網路已被電信公司用於通過實時評估網路流量來優化路由和服務質量。
B. 人工神經網路由哪幾部分構成
"人工神經網路"共有13個神經元構成,4個為輸入神經元,1個為輸 出神經元。也就是說,這個程序最多能處理一個四元關系(包含了二元, 三元)。
C. 圖神經網路是怎麼煉成的:GNN基本原理簡介
此文算是對Google Research這篇 A Gentle Introction to Graph Neural Networks 神作的閱讀筆記.
十多年來,研究人員開發了一種稱之為圖神經網路(Graph Neural Networks,GNNs)的技術,旨在將如今在深度學習的諸多任務中摧枯拉朽的神經網路,應用到圖結構之上,從而讓神經網路捕捉到更錯綜復雜的交叉特徵,以期待在一些任務上取得更佳的效果。鑒於操作圖數據結構的復雜性,盡管已經發展了十幾年,它在實際應用中卻剛剛起步,即時是google也才開始研究將其被應用到葯品研發、物理模擬、假新聞檢測、交通預測和推薦系統等領域。
盡管GNN是一個新興的研究領域,但圖結構的數據其實在我們身邊無處不在。那麼什麼是圖呢?
這個理科生應該都清楚,圖有點(Vertex)和邊(Edge)兩部分組成,一個圖就代表了各個實體節點(node)之間的關系(edge):
每個節點或者邊都可以包含它的一些屬性信息,比如如果一個節點表示一個人,那麼就可以包含這個人的姓名、性別、身高、體重之類的..我們研究需要的信息。
而這些信息,都可以用通用的向量的形式存入其中:
還有別忘了一點,邊是可以有方向的,按此我們還能分為有向圖或是無向圖。邊的方向代表了信息的傳遞方向,例如a是b的微信好友,那b也是a的微信好友,好友關系自然是沒方向的,而比如a是b的爹,那顯然b就不是a的爹,此時叫爹的關系就是有有方向的。
圖結構的構建是非常靈活的,可以根據個人的設計構建出各種不一樣的圖。而作為開發者顯然要結合實際解決的問題來構建合適的圖。
正如前面所提到的,圖無處不在。你可能已經熟悉例如知識圖譜、社交網路之類的圖數據。當時顯然,圖是一種極其強大的通用數據表示,傳統神經網路中用到的歐式空間的數據,同樣可以用圖來表示,例如可以將圖像和文本建模為圖結構數據。
比如,我們可以將一張圖片的每個像素作為圖的節點,再將相鄰的像素用邊連接起來,就構造了一個該圖像的圖。
如上圖展示了一個5*5的圖片的鄰接矩陣表示和圖表示。
我們將每個單詞作為節點,並將每個節點連接到下一個節點,就得到了一個文本的圖:
當然,在實踐中我們並不會這樣來編碼文本和圖像,因為所有的圖和文本都是非常規則的結構,表示成圖就多此一舉了。
我們再來看一些例子,這些數據的結構更加復雜,除了圖之外很難用其他方式來表達。
分子是構成物質的基石,我們可以用節點來表示它的原子和電子,用邊來表示共價鍵,這樣便將一個分子表示成了一個圖:
不同的圖可以表示出不同的分子結構:
都說社會是一個大熔爐,身處其中的人和事物之間會發生極其復雜的關系。這種關系的表示用普通的表格數據是很難表示的,而圖卻能很好的展現。
下圖是將莎士比亞歌劇《奧賽羅》中的任務關系表示成圖:
怎麼樣,如果沒看過歌劇能推測出那些是主角嗎?
下面是將一個空手道競標賽的對戰關系構建為圖:
類似的可以表示為圖的數據還有很多很多,比如論文的引用之類統統都可以表示為圖,下面是現實世界中不同規模的數據圖表示的統計數據:
可見,各種各樣規模的數據都可以輕松的用圖來表示。
在上面我們列舉了這么多的圖,那麼我們該對這些圖數據執行什麼任務呢?
圖上的預測任務一般分為三類:
下面我們通過具體的示例來說明GNN怎麼來解決上述的三個級別的預測問題。
在圖級別的任務中,我們的目標是預測整個圖的屬性。例如我們通過分子圖,來預測該分子的氣味或是者它是否是與某些疾病有關的受體。
它的輸入是完整的圖:
輸出是圖的分類:
節點級任務一般就是預測每個節點的類型。
一個經典的例子就是Zach的空手道俱樂部。該數據集市一個單一的社交網路圖,猶豫政治分歧,講師Hi先生和管理員John之間不和導致空手道俱樂部分裂,其中的學員一部分效忠於Hi先生,一部分效忠於John。每個節點代表空手道聯系著,邊代表空手道之外這些成員的互動,預測問題就是判斷這些節點是效忠於誰的。
邊級任務其實就是預測每個邊的屬性.
在目標檢測的語義分割任務中,我們也許不止要識別每個目標的類型,還需要預測各個目標之間的關系.我們可以將其描述為邊級別的分類任務:給定表示圖像中的對象的節點,我們希望預測哪些節點共享一條邊,或者該邊的值是多少。如果我們希望發現實體之間的連接,我們可以考慮圖是完全連通的,並根據它們的預測值修剪邊來得到一個稀疏圖。
用圖表示就是這樣的過程:
那麼我們要如何使用神經網路來處理上述各種類型的任務呢?
首先要考慮的是如何將圖結構數據適配到神經網路.
回想一下啊,傳統的神經網路輸入的往往是矩陣形式的數據,那麼要如何把圖作為輸入呢?
圖表示有四種類型的信息:節點(nodes),邊(edges),全局上下文(global-context),聯通性(connectivity).對於前三種信息,有一個非常簡單的方案,比如將節點排序,然後每個節點表示為一個向量,所有節點就得到了一個節點的矩陣,同理,邊和上下文也可以這么搞.
但是要標識連通性就沒有這么簡單了,也許你會想到用臨街矩陣來表示,但是這樣表示會有明顯的缺陷,因為節點數的規模往往是巨大的,對於一個數百萬節點的圖,那將耗費大量的空間,而且得到的矩陣往往也十分的稀疏,可以說空間利用率會很低.
當然,你也許會想,可以用稀疏矩陣來存儲,這樣就只需要存儲連通的情況,空間利用率將大大提升,但是我們還要考慮到一點,就是稀疏矩陣的高性能計算一直是個艱難的,尤其是在用到GPU的情況.
並且,使用鄰接矩陣還有一個問題就是各種不同的鄰接矩陣可以標識相同的連通性,而這些矩陣並不能保證在神經網路中取的相同的效果.比如,同樣的連通性,通過調換列的順序,就能得到不同的鄰接矩陣:
現在,我們成功的將圖結構成功表示成了置換不變的矩陣格式,終於可以使用圖形神經網路(GNN)來做圖形預測任務了。
GNN是對保持圖對稱性(置換不變性)的圖的所有屬性(節點、邊、全局上下文)的可優化變換。
我們將使用Gilmer等人提出的「消息傳遞神經網路」框架構建GNN,並使用Battaglia等人介紹的圖網路網路架構示意圖。GNNS採用「圖輸入,圖輸出」架構,這意味著這些模型類型接受圖作為輸入,其中包含節點,邊和全局上下文的信息,並逐步地轉換這些圖嵌入,而不會更改輸入的連接圖結構。
我們使用最開始提到的那個圖來構建一個最簡單的GNN,輸入的圖是相應節點,邊,全局信息的向量,我們針對每個向量使用一個MLP層來作變換,於是得到一個新的圖.
針對上述構建的最簡單的GNN,我們如何在上面描述的任何任務中進行預測呢?這里我們僅僅考慮二進制分類的情況,但這個框架可以很容易地擴展到多類或回歸的情況。
如果是對節點分類,我們只要在最後一層接一個線性類器就可以了:
但是上面的預測過程有點過於簡單了,完全沒有用到圖的結構信息,我們在此基礎上增加一個pooling操作,以增加它的邊緣信息:
具體操作是把待預測節點的鄰居節點以及全局的信息進行聚合再做預測,即將這些embedding向量加到一起得到一個新的向量,再輸入到最後的線性分類器.
同理,如果我們只有節點相應邊的信息的話,也可以用類似的方式pooling,然後得到節點的向量表示再輸入分類器:
反之,如果我們只有節點的信息,那麼也可以用邊所連接的兩個節點來pooling出邊的向量,然後將器輸入到分類器預測邊的類型:
顯然,不管是哪種任務,整個GNN的推理過程都是一樣的,可以表示為這樣一個端到端的過程:
不過,顯而易見的,這個簡單的GNN在分類前只是對每個向量進行了一個變換,而沒有用到圖結構的任何信息,雖然在最後做預測的時候做了一些pooling的聚合,但也始終沒有用到adjacency的信息,因此這個GNN的作用相當有限,但是它為我們提供了一個圖結構層變換和堆疊的基本思路.
針對上面最簡單GNN的不足,我們可以在其中根據連通性增加更加復雜的變換從而引入整個圖結構的信息,我們將這個過程稱之為信息傳遞.
信息傳遞包含三個步驟:
這個過程有點類似於卷積操作,每個節點匯聚了其鄰居的節點,經過多個層的變換,它將涵蓋全圖的信息.
於是我們可以將這個節點信息傳遞應用到上述的圖變換過程中:
然後,我們發現它並沒用用上邊的信息,於是可以把邊信息也加上,變成這樣:
既然把邊的信息加上了,那怎麼可以漏掉全局信息呢,於是完整的信息傳遞就可以表示成這樣:
以上,我們梳理了最簡單的GNNs是怎麼完成的,你應該已經對GNN有了一個基本的了解,就像學會了傳統神經網路中最簡單的全連接網路類似,關於GNN還有更多不同種類的更復雜的圖需要取了解和學習,但你只要掌握了以上的思想,學習起來也是十分容易的.
D. 神經網路編程入門
聽到 神經網路 這個詞,從直覺上我們會想到大腦,的確,我們可以將大腦看成一個大型的天然神經網路。然而,人工神經網路又是什麼呢?人工是一個與天然相對的詞,我們首先想到的就是人工大腦或者機器人,這就是所謂的人工。在這種情況下,受人腦的啟發,我們創建出一個和人腦相似的結構,稱之為人工智慧。
結合人腦的特點和結構,可以說人工神經網路是一種自然啟發的方法。每個神經元與許多其他神經元相接,這些神經元又會和其他大量神經元相連,形成一個高度互連的結構。神經元之間的連通性解釋了學習能力,因為每個連接都可以根據刺激和期望目標進行配置。
人工神經元
人工神經元是最基本的人工神經元素,已證明生物神經元是信號處理器,神經元中的樹突會根據接受信號的強弱和振幅。發送信號到軸突。可以這樣認為,神經元在輸入上有一個信號收集器,在輸出上有一個激活單元,它可以觸發一個新的信號,然後傳遞給其他神經元。
激活函數
激活函數是指一個神經元根據輸入信號,執行計算並產生輸出。從數學方面講,激活函數用於為神經網路模型的處理加入非線性因素,從而提供人工神經網路的非線性行為,這對模擬生物神經元的非線性特徵非常有用。激活函數通常是一個非線性函數,輸出限制在某個區間范圍內,但某些特定情況下,也可以是線性函數。
權重
盡管神經網路的結構能固定,但通過神經元之間的連接權重能夠增強或減弱接收到的神經信號,所以可以通過修改權重影響神經元的輸出。因此,神經元的激活不僅依賴輸入信號,還依賴權重。如果輸入來自其他神經元或者外部世界,權重可以看成神經網路在神經元之間建立的連接。
偏置
作為一個獨立組件,偏置主要為激活函數增加一個額外信號,這對人工神經元非常有用。
層
為抽象化處理層次,如我們大腦處理問題的方式,神經元按層組織。輸入層接受外部世界的直接刺激,輸出層觸發一些行為,對外部世界產生直接影響。輸入層和輸出層之間,有許多隱含層,某種意義上,這些隱含層對外部世界不可見。在人工神經網路中,同一層的所有神經元具有相同的輸入和激活函數。
神經網路可以有不同的布局,主要取決於神經元或層之間是如何連接的,每一個神經網路體系結構都是為特定目標而設計。神經網路可以應用於許多問題,根據問題的性質,神經網路旨在高效解決問題。
單層網路
單層網路體系中,所有神經元都處於同一層,形成單個層。
多層網路
多層網路中,神經元分成多個層,每層對應神經元的一個平行布局,每層神經元都共享相同的輸入數據。
前饋網路
神經網路中的信號流動可以是單向的,也可以是遞歸的。對於第一種結構,稱之為前饋網路,輸入信號被送入輸入層,經過處理後向前傳遞到下一層。多層感知機和徑向基函數都是前饋網路
反饋網路
當神經網路中有某種內部遞歸時,這意味著信號會反向傳遞到已經接受或已經處理過信號的神經元或層,這類網路類型為反饋網路。
E. 人工神經元網路的拓撲結構主要有哪幾種謝謝大俠~~~
神經網路的拓撲結構包括網路層數、各層神經元數量以及各神經元之間相互連接的方式。
人工神經網路的模型從其拓撲結構角度去看,可分為層次型和互連型。層次型模型是將神經網路分為輸入層(Input Layer)、隱層(Hidden Layer)和輸出層(Output Layer),各層順序連接。其中,輸入層神經元負責接收來自外界的輸入信息,並將其傳遞給隱層神經元。隱層負責神經網路內部的信息處理、信息變換。通常會根據變換的需要,將隱層設計為一層或多層。
(5)人工神經網路是如何搭建的擴展閱讀:
人工神經網路模型主要考慮網路連接的拓撲結構、神經元的特徵、學習規則等。目前,已有近40種神經網路模型,其中有反傳網路、感知器、自組織映射、Hopfield網路、波耳茲曼機、適應諧振理論等。
人工神經網路採用了與傳統人工智慧和信息處理技術完全不同的機理,克服了傳統的基於邏輯符號的人工智慧在處理直覺、非結構化信息方面的缺陷,具有自適應、自組織和實時學習的特點。
F. 如何建立神經網路模型
人工神經網路有很多種,我只會最常用的BP神經網路。不同的網路有不同的結構和不同的學習演算法。
簡單點說,人工神經網路就是一個函數。只是這個函數有別於一般的函數。它比普通的函數多了一個學習的過程。
在學習的過程中,它根據正確結果不停地校正自己的網路結構,最後達到一個滿意的精度。這時,它才開始真正的工作階段。
學習人工神經網路最好先安裝MathWords公司出的MatLab軟體。利用該軟體,你可以在一周之內就學會建立你自己的人工神經網路解題模型。
如果你想自己編程實現人工神經網路,那就需要找一本有關的書籍,專門看神經網路學習演算法的那部分內容。因為「學習演算法」是人工神經網路的核心。最常用的BP人工神經網路,使用的就是BP學習演算法。
G. 人工神經網路概念梳理與實例演示
人工神經網路概念梳理與實例演示
神經網路是一種模仿生物神經元的機器學習模型,數據從輸入層進入並流經激活閾值的多個節點。
遞歸性神經網路一種能夠對之前輸入數據進行內部存儲記憶的神經網路,所以他們能夠學習到數據流中的時間依賴結構。
如今機器學習已經被應用到很多的產品中去了,例如,siri、Google Now等智能助手,推薦引擎——亞馬遜網站用於推薦商品的推薦引擎,Google和Facebook使用的廣告排名系統。最近,深度學習的一些進步將機器學習帶入公眾視野:AlphaGo 打敗圍棋大師李世石事件以及一些圖片識別和機器翻譯等新產品的出現。
在這部分中,我們將介紹一些強大並被普遍使用的機器學習技術。這當然包括一些深度學習以及一些滿足現代業務需求傳統方法。讀完這一系列的文章之後,你就掌握了必要的知識,便可以將具體的機器學習實驗應用到你所在的領域當中。
隨著深層神經網路的精度的提高,語音和圖像識別技術的應用吸引了大眾的注意力,關於AI和深度學習的研究也變得更加普遍了。但是怎麼能夠讓它進一步擴大影響力,更受歡迎仍然是一個問題。這篇文章的主要內容是:簡述前饋神經網路和遞歸神經網路、怎樣搭建一個遞歸神經網路對時間系列數據進行異常檢測。為了讓我們的討論更加具體化,我們將演示一下怎麼用Deeplearning4j搭建神經網路。
一、什麼是神經網路?
人工神經網路演算法的最初構思是模仿生物神經元。但是這個類比很不可靠。人工神經網路的每一個特徵都是對生物神經元的一種折射:每一個節點與激活閾值、觸發的連接。
連接人工神經元系統建立起來之後,我們就能夠對這些系統進行訓練,從而讓他們學習到數據中的一些模式,學到之後就能執行回歸、分類、聚類、預測等功能。
人工神經網路可以看作是計算節點的集合。數據通過這些節點進入神經網路的輸入層,再通過神經網路的隱藏層直到關於數據的一個結論或者結果出現,這個過程才會停止。神經網路產出的結果會跟預期的結果進行比較,神經網路得出的結果與正確結果的不同點會被用來更正神經網路節點的激活閾值。隨著這個過程的不斷重復,神經網路的輸出結果就會無限靠近預期結果。
二、訓練過程
在搭建一個神經網路系統之前,你必須先了解訓練的過程以及網路輸出結果是怎麼產生的。然而我們並不想過度深入的了解這些方程式,下面是一個簡短的介紹。
網路的輸入節點收到一個數值數組(或許是叫做張量多維度數組)就代表輸入數據。例如, 圖像中的每個像素可以表示為一個標量,然後將像素傳遞給一個節點。輸入數據將會與神經網路的參數相乘,這個輸入數據被擴大還是減小取決於它的重要性,換句話說,取決於這個像素就不會影響神經網路關於整個輸入數據的結論。
起初這些參數都是隨機的,也就是說神經網路在建立初期根本就不了解數據的結構。每個節點的激活函數決定了每個輸入節點的輸出結果。所以每個節點是否能夠被激活取決於它是否接受到足夠的刺激強度,即是否輸入數據和參數的結果超出了激活閾值的界限。
在所謂的密集或完全連接層中,每個節點的輸出值都會傳遞給後續層的節點,在通過所有隱藏層後最終到達輸出層,也就是產生輸入結果的地方。在輸出層, 神經網路得到的最終結論將會跟預期結論進行比較(例如,圖片中的這些像素代表一隻貓還是狗?)。神經網路猜測的結果與正確結果的計算誤差都會被納入到一個測試集中,神經網路又會利用這些計算誤差來不斷更新參數,以此來改變圖片中不同像素的重要程度。整個過程的目的就是降低輸出結果與預期結果的誤差,正確地標注出這個圖像到底是不是一條狗。
深度學習是一個復雜的過程,由於大量的矩陣系數需要被修改所以它就涉及到矩陣代數、衍生品、概率和密集的硬體使用問題,但是用戶不需要全部了解這些復雜性。
但是,你也應該知道一些基本參數,這將幫助你理解神經網路函數。這其中包括激活函數、優化演算法和目標函數(也稱為損失、成本或誤差函數)。
激活函數決定了信號是否以及在多大程度上應該被發送到連接節點。階梯函數是最常用的激活函數, 如果其輸入小於某個閾值就是0,如果其輸入大於閾值就是1。節點都會通過階梯激活函數向連接節點發送一個0或1。優化演算法決定了神經網路怎麼樣學習,以及測試完誤差後,權重怎麼樣被更准確地調整。最常見的優化演算法是隨機梯度下降法。最後, 成本函數常用來衡量誤差,通過對比一個給定訓練樣本中得出的結果與預期結果的不同來評定神經網路的執行效果。
Keras、Deeplearning4j 等開源框架讓創建神經網路變得簡單。創建神經網路結構時,需要考慮的是怎樣將你的數據類型匹配到一個已知的被解決的問題,並且根據你的實際需求來修改現有結構。
三、神經網路的類型以及應用
神經網路已經被了解和應用了數十年了,但是最近的一些技術趨勢才使得深度神經網路變得更加高效。
GPUs使得矩陣操作速度更快;分布式計算結構讓計算能力大大增強;多個超參數的組合也讓迭代的速度提升。所有這些都讓訓練的速度大大加快,迅速找到適合的結構。
隨著更大數據集的產生,類似於ImageNet 的大型高質量的標簽數據集應運而生。機器學習演算法訓練的數據越大,那麼它的准確性就會越高。
最後,隨著我們理解能力以及神經網路演算法的不斷提升,神經網路的准確性在語音識別、機器翻譯以及一些機器感知和面向目標的一些任務等方面不斷刷新記錄。
盡管神經網路架構非常的大,但是主要用到的神經網路種類也就是下面的幾種。
3.1前饋神經網路
前饋神經網路包括一個輸入層、一個輸出層以及一個或多個的隱藏層。前饋神經網路可以做出很好的通用逼近器,並且能夠被用來創建通用模型。
這種類型的神經網路可用於分類和回歸。例如,當使用前饋網路進行分類時,輸出層神經元的個數等於類的數量。從概念上講, 激活了的輸出神經元決定了神經網路所預測的類。更准確地說, 每個輸出神經元返回一個記錄與分類相匹配的概率數,其中概率最高的分類將被選為模型的輸出分類。
前饋神經網路的優勢是簡單易用,與其他類型的神經網路相比更簡單,並且有一大堆的應用實例。
3.2卷積神經網路
卷積神經網路和前饋神經網路是非常相似的,至少是數據的傳輸方式類似。他們結構大致上是模仿了視覺皮層。卷積神經網路通過許多的過濾器。這些過濾器主要集中在一個圖像子集、補丁、圖塊的特徵識別上。每一個過濾器都在尋找不同模式的視覺數據,例如,有的可能是找水平線,有的是找對角線,有的是找垂直的。這些線條都被看作是特徵,當過濾器經過圖像時,他們就會構造出特徵圖譜來定位各類線是出現在圖像的哪些地方。圖像中的不同物體,像貓、747s、榨汁機等都會有不同的圖像特徵,這些圖像特徵就能使圖像完成分類。卷積神經網路在圖像識別和語音識別方面是非常的有效的。
卷積神經網路與前饋神經網路在圖像識別方面的異同比較。雖然這兩種網路類型都能夠進行圖像識別,但是方式卻不同。卷積神經網路是通過識別圖像的重疊部分,然後學習識別不同部分的特徵進行訓練;然而,前饋神經網路是在整張圖片上進行訓練。前饋神經網路總是在圖片的某一特殊部分或者方向進行訓練,所以當圖片的特徵出現在其他地方時就不會被識別到,然而卷積神經網路卻能夠很好的避免這一點。
卷積神經網路主要是用於圖像、視頻、語音、聲音識別以及無人駕駛的任務。盡管這篇文章主要是討論遞歸神經網路的,但是卷積神經網路在圖像識別方面也是非常有效的,所以很有必要了解。
3.3遞歸神經網路
與前饋神經網路不同的是,遞歸神經網路的隱藏層的節點里有內部記憶存儲功能,隨著輸入數據的改變而內部記憶內容不斷被更新。遞歸神經網路的結論都是基於當前的輸入和之前存儲的數據而得出的。遞歸神經網路能夠充分利用這種內部記憶存儲狀態處理任意序列的數據,例如時間序列。
遞歸神經網路經常用於手寫識別、語音識別、日誌分析、欺詐檢測和網路安全。
遞歸神經網路是處理時間維度數據集的最好方法,它可以處理以下數據:網路日誌和伺服器活動、硬體或者是醫療設備的感測器數據、金融交易、電話記錄。想要追蹤數據在不同階段的依賴和關聯關系需要你了解當前和之前的一些數據狀態。盡管我們通過前饋神經網路也可以獲取事件,隨著時間的推移移動到另外一個事件,這將使我們限制在對事件的依賴中,所以這種方式很不靈活。
追蹤在時間維度上有長期依賴的數據的更好方法是用內存來儲存重要事件,以使近期事件能夠被理解和分類。遞歸神經網路最好的一點就是在它的隱藏層裡面有「內存」可以學習到時間依賴特徵的重要性。
接下來我們將討論遞歸神經網路在字元生成器和網路異常檢測中的應用。遞歸神經網路可以檢測出不同時間段的依賴特徵的能力使得它可以進行時間序列數據的異常檢測。
遞歸神經網路的應用
網路上有很多使用RNNs生成文本的例子,遞歸神經網路經過語料庫的訓練之後,只要輸入一個字元,就可以預測下一個字元。下面讓我們通過一些實用例子發現更多RNNs的特徵。
應用一、RNNs用於字元生成
遞歸神經網路經過訓練之後可以把英文字元當做成一系列的時間依賴事件。經過訓練後它會學習到一個字元經常跟著另外一個字元(「e」經常跟在「h」後面,像在「the、he、she」中)。由於它能預測下一個字元是什麼,所以它能有效地減少文本的輸入錯誤。
Java是個很有趣的例子,因為它的結構包括很多嵌套結構,有一個開的圓括弧必然後面就會有一個閉的,花括弧也是同理。他們之間的依賴關系並不會在位置上表現的很明顯,因為多個事件之間的關系不是靠所在位置的距離確定的。但是就算是不明確告訴遞歸神經網路Java中各個事件的依賴關系,它也能自己學習了解到。
在異常檢測當中,我們要求神經網路能夠檢測出數據中相似、隱藏的或許是並不明顯的模式。就像是一個字元生成器在充分地了解數據的結構後就會生成一個數據的擬像,遞歸神經網路的異常檢測就是在其充分了解數據結構後來判斷輸入的數據是不是正常。
字元生成的例子表明遞歸神經網路有在不同時間范圍內學習到時間依賴關系的能力,它的這種能力還可以用來檢測網路活動日誌的異常。
異常檢測能夠使文本中的語法錯誤浮出水面,這是因為我們所寫的東西是由語法結構所決定的。同理,網路行為也是有結構的,它也有一個能夠被學習的可預測模式。經過在正常網路活動中訓練的遞歸神經網路可以監測到入侵行為,因為這些入侵行為的出現就像是一個句子沒有標點符號一樣異常。
應用二、一個網路異常檢測項目的示例
假設我們想要了解的網路異常檢測就是能夠得到硬體故障、應用程序失敗、以及入侵的一些信息。
模型將會向我們展示什麼呢?
隨著大量的網路活動日誌被輸入到遞歸神經網路中去,神經網路就能學習到正常的網路活動應該是什麼樣子的。當這個被訓練的網路被輸入新的數據時,它就能偶判斷出哪些是正常的活動,哪些是被期待的,哪些是異常的。
訓練一個神經網路來識別預期行為是有好處的,因為異常數據不多,或者是不能夠准確的將異常行為進行分類。我們在正常的數據里進行訓練,它就能夠在未來的某個時間點提醒我們非正常活動的出現。
說句題外話,訓練的神經網路並不一定非得識別到特定事情發生的特定時間點(例如,它不知道那個特殊的日子就是周日),但是它一定會發現一些值得我們注意的一些更明顯的時間模式和一些可能並不明顯的事件之間的聯系。
我們將概述一下怎麼用 Deeplearning4j(一個在JVM上被廣泛應用的深度學習開源資料庫)來解決這個問題。Deeplearning4j在模型開發過程中提供了很多有用的工具:DataVec是一款為ETL(提取-轉化-載入)任務准備模型訓練數據的集成工具。正如Sqoop為Hadoop載入數據,DataVec將數據進行清洗、預處理、規范化與標准化之後將數據載入到神經網路。這跟Trifacta』s Wrangler也相似,只不過它更關注二進制數據。
開始階段
第一階段包括典型的大數據任務和ETL:我們需要收集、移動、儲存、准備、規范化、矢量話日誌。時間跨度的長短是必須被規定好的。數據的轉化需要花費一些功夫,這是由於JSON日誌、文本日誌、還有一些非連續標注模式都必須被識別並且轉化為數值數組。DataVec能夠幫助進行轉化和規范化數據。在開發機器學習訓練模型時,數據需要分為訓練集和測試集。
訓練神經網路
神經網路的初始訓練需要在訓練數據集中進行。
在第一次訓練的時候,你需要調整一些超參數以使模型能夠實現在數據中學習。這個過程需要控制在合理的時間內。關於超參數我們將在之後進行討論。在模型訓練的過程中,你應該以降低錯誤為目標。
但是這可能會出現神經網路模型過度擬合的風險。有過度擬合現象出現的模型往往會在訓練集中的很高的分數,但是在遇到新的數據時就會得出錯誤結論。用機器學習的語言來說就是它不夠通用化。Deeplearning4J提供正則化的工具和「過早停止」來避免訓練過程中的過度擬合。
神經網路的訓練是最花費時間和耗費硬體的一步。在GPUs上訓練能夠有效的減少訓練時間,尤其是做圖像識別的時候。但是額外的硬體設施就帶來多餘的花銷,所以你的深度學習的框架必須能夠有效的利用硬體設施。Azure和亞馬遜等雲服務提供了基於GPU的實例,神經網路還可以在異構集群上進行訓練。
創建模型
Deeplearning4J提供ModelSerializer來保存訓練模型。訓練模型可以被保存或者是在之後的訓練中被使用或更新。
在執行異常檢測的過程中,日誌文件的格式需要與訓練模型一致,基於神經網路的輸出結果,你將會得到是否當前的活動符合正常網路行為預期的結論。
代碼示例
遞歸神經網路的結構應該是這樣子的:
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder(
.seed(123)
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).iterations(1)
.weightInit(WeightInit.XAVIER)
.updater(Updater.NESTEROVS).momentum(0.9)
.learningRate(0.005)
.gradientNormalization(GradientNormalization.ClipElementWiseAbsoluteValue)
.(0.5)
.list()
.layer(0, new GravesLSTM.Builder().activation("tanh").nIn(1).nOut(10).build())
.layer(1, new RnnOutputLayer.Builder(LossFunctions.LossFunction.MCXENT)
.activation("softmax").nIn(10).nOut(numLabelClasses).build())
.pretrain(false).backprop(true).build();
MultiLayerNetwork net = new MultiLayerNetwork(conf);
net.init();
下面解釋一下幾行重要的代碼:
.seed(123)
隨機設置一個種子值對神經網路的權值進行初始化,以此獲得一個有復驗性的結果。系數通常都是被隨機的初始化的,以使我們在調整其他超參數時仍獲得一致的結果。我們需要設定一個種子值,讓我們在調整和測試的時候能夠用這個隨機的權值。
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).iterations(1)
決定使用哪個最優演算法(在這個例子中是隨機梯度下降法)來調整權值以提高誤差分數。你可能不需要對這個進行修改。
.learningRate(0.005)
當我們使用隨機梯度下降法的時候,誤差梯度就被計算出來了。在我們試圖將誤差值減到最小的過程中,權值也隨之變化。SGD給我們一個讓誤差更小的方向,這個學習效率就決定了我們該在這個方向上邁多大的梯度。如果學習效率太高,你可能是超過了誤差最小值;如果太低,你的訓練可能將會永遠進行。這是一個你需要調整的超參數。
H. 從零開始用Python構建神經網路
從零開始用Python構建神經網路
動機:為了更加深入的理解深度學習,我們將使用 python 語言從頭搭建一個神經網路,而不是使用像 Tensorflow 那樣的封裝好的框架。我認為理解神經網路的內部工作原理,對數據科學家來說至關重要。
這篇文章的內容是我的所學,希望也能對你有所幫助。
神經網路是什麼?
介紹神經網路的文章大多數都會將它和大腦進行類比。如果你沒有深入研究過大腦與神經網路的類比,那麼將神經網路解釋為一種將給定輸入映射為期望輸出的數學關系會更容易理解。
神經網路包括以下組成部分
? 一個輸入層,x
? 任意數量的隱藏層
? 一個輸出層,?
? 每層之間有一組權值和偏置,W and b
? 為隱藏層選擇一種激活函數,σ。在教程中我們使用 Sigmoid 激活函數
下圖展示了 2 層神經網路的結構(注意:我們在計算網路層數時通常排除輸入層)
2 層神經網路的結構
用 Python 可以很容易的構建神經網路類
訓練神經網路
這個網路的輸出 ? 為:
你可能會注意到,在上面的等式中,輸出 ? 是 W 和 b 函數。
因此 W 和 b 的值影響預測的准確率. 所以根據輸入數據對 W 和 b 調優的過程就被成為訓練神經網路。
每步訓練迭代包含以下兩個部分:
? 計算預測結果 ?,這一步稱為前向傳播
? 更新 W 和 b,,這一步成為反向傳播
下面的順序圖展示了這個過程:
前向傳播
正如我們在上圖中看到的,前向傳播只是簡單的計算。對於一個基本的 2 層網路來說,它的輸出是這樣的:
我們在 NeuralNetwork 類中增加一個計算前向傳播的函數。為了簡單起見我們假設偏置 b 為0:
但是我們還需要一個方法來評估預測結果的好壞(即預測值和真實值的誤差)。這就要用到損失函數。
損失函數
常用的損失函數有很多種,根據模型的需求來選擇。在本教程中,我們使用誤差平方和作為損失函數。
誤差平方和是求每個預測值和真實值之間的誤差再求和,這個誤差是他們的差值求平方以便我們觀察誤差的絕對值。
訓練的目標是找到一組 W 和 b,使得損失函數最好小,也即預測值和真實值之間的距離最小。
反向傳播
我們已經度量出了預測的誤差(損失),現在需要找到一種方法來傳播誤差,並以此更新權值和偏置。
為了知道如何適當的調整權值和偏置,我們需要知道損失函數對權值 W 和偏置 b 的導數。
回想微積分中的概念,函數的導數就是函數的斜率。
梯度下降法
如果我們已經求出了導數,我們就可以通過增加或減少導數值來更新權值 W 和偏置 b(參考上圖)。這種方式被稱為梯度下降法。
但是我們不能直接計算損失函數對權值和偏置的導數,因為在損失函數的等式中並沒有顯式的包含他們。因此,我們需要運用鏈式求導發在來幫助計算導數。
鏈式法則用於計算損失函數對 W 和 b 的導數。注意,為了簡單起見。我們只展示了假設網路只有 1 層的偏導數。
這雖然很簡陋,但是我們依然能得到想要的結果—損失函數對權值 W 的導數(斜率),因此我們可以相應的調整權值。
現在我們將反向傳播演算法的函數添加到 Python 代碼中
為了更深入的理解微積分原理和反向傳播中的鏈式求導法則,我強烈推薦 3Blue1Brown 的如下教程:
Youtube:https://youtu.be/tIeHLnjs5U8
整合並完成一個實例
既然我們已經有了包括前向傳播和反向傳播的完整 Python 代碼,那麼就將其應用到一個例子上看看它是如何工作的吧。
神經網路可以通過學習得到函數的權重。而我們僅靠觀察是不太可能得到函數的權重的。
讓我們訓練神經網路進行 1500 次迭代,看看會發生什麼。 注意觀察下面每次迭代的損失函數,我們可以清楚地看到損失函數單調遞減到最小值。這與我們之前介紹的梯度下降法一致。
讓我們看看經過 1500 次迭代後的神經網路的最終預測結果:
經過 1500 次迭代訓練後的預測結果
我們成功了!我們應用前向和方向傳播演算法成功的訓練了神經網路並且預測結果收斂於真實值。
注意預測值和真實值之間存在細微的誤差是允許的。這樣可以防止模型過擬合並且使得神經網路對於未知數據有著更強的泛化能力。
下一步是什麼?
幸運的是我們的學習之旅還沒有結束,仍然有很多關於神經網路和深度學習的內容需要學習。例如:
? 除了 Sigmoid 以外,還可以用哪些激活函數
? 在訓練網路的時候應用學習率
? 在面對圖像分類任務的時候使用卷積神經網路
我很快會寫更多關於這個主題的內容,敬請期待!
最後的想法
我自己也從零開始寫了很多神經網路的代碼
雖然可以使用諸如 Tensorflow 和 Keras 這樣的深度學習框架方便的搭建深層網路而不需要完全理解其內部工作原理。但是我覺得對於有追求的數據科學家來說,理解內部原理是非常有益的。
這種練習對我自己來說已成成為重要的時間投入,希望也能對你有所幫助