神經網絡實際上只是很多參數的巨大作用,所以你可能會認爲,這將是美好的函數式語言來寫這樣的功能,但在某些NN庫對其他語言工作過,我有一些疑問如何在這個範例中有效地實施它們。如何在Haskell中高效實現通用神經網絡?
繞過信息:如果你使每個神經元或層的相關性的圖表,你會得到這樣的事情
其中X是輸入,並˚F是輸出。雖然它在圖中看起來非常直截了當,但如果您真的將網絡視爲一項功能,那麼f必須將輸入(加上權重參數的子集)傳遞到g1和g2,它們中的每一個都具有將這些傳遞給h1,h2和h3誰最終將結果發送到上面的圖層。考慮到一組輸入加上一組權重可能是一千或更多的變量,這看起來效率很低。在其他語言中,您不必這樣做,因爲每個神經元都可以保留它的參數,並且輸入可以直接傳遞到輸入層。
國:如果你看一下圖表,既G1和G2要單獨調用H2,但由於H2具有產生兩個相同的值,它不有意義的計算兩次輸出。既然你沒有國家或副作用這成爲棘手的,如果你有一個非常龐大的網絡,然後甚至一些並行計算這會浪費大量的時間。
最後,當我說網絡是通用,我的意思是它可以有任意形狀,只要它的結構不包含循環。大多數庫我看到使用的層的疊層,所以你只需要限定層的數量和神經元的每一層中的號碼,但它的形狀是直線圖;這是對簡單的應用程序,但真的很難核心員工需要網絡具有更復雜的架構
標識像如何攻克這些問題,因爲我想實現一個庫,用於自己的需要一些建議。
注:
我不是完全陌生的語言。我用函子和單子相當數量的(主要是在我的基礎上haskells API C#FP庫),但我以前從未使用過Haskell中的實際應用。
更新
的State
單子看起來非常有前途!
你有沒有研究HNN包裝是如何做到的? – 2014-09-29 03:35:27
我會研究它。我知道他們使用hmatrices,並不渴望這種通用的東西,但也許他們也面臨這些問題。 – 2014-09-29 03:41:43
如果它像函數調用圖一樣工作,我的第一個直覺就是可以通過使用nexus類型的結構來提高效率,如本文所示http://www.cs.ox.ac.uk/ralf.hinze/出版物/ HW03.pdf。不幸的是,我不太清楚這個問題能夠給出答案。 「Hylomorphism」也可能是一個關鍵詞。編輯:其實,現在我想到了,你可能需要比技術通常提供的更多的結構信息。 – 2014-09-29 03:41:51