2014-05-23 46 views
1

我必須訓練一個非常大的前饋神經網絡進行模式識別。網絡有10,000個輸入神經元,200個輸出神經元,它的隱藏層有5100個神經元。函數x /(1 + abs(x))被用作激活函數。訓練一個非常大的神經網絡

訓練數據集的大小爲100,000。

問題是需要很長時間來訓練神經網絡,這使得網絡的微調非常耗時。

兩個可能的選擇來向我提高訓練表現:

  • 減少隱含層的大小介於500和1000這將大大減少所需的乘法運算的次數。但是我不確定這種降低是否會損害識別精度。獲得一個高性能的矩陣乘法庫(甚至可能引入OpenCL/CUDA),目前只實現了天真的矩陣乘法,這應該比仔細調整的要慢。

有沒有更好的選擇?我是ANN的新手,任何建議都會感激。

謝謝。

+0

'天真矩陣乘法。那很不好。很壞。非常非常糟糕。使用BLAS。也許ATLAS – bolov

+1

你想爲自己寫ANN嗎?否則應該有已經優化的ANN實現,您可以將其用於您的設計。 – MatthiasB

+0

人們已經在幾十本書或者數百本書中就這個話題寫過建議...... – PlasmaHH

回答

1

在一個句子 - 與隱藏層的大小先玩,看看有什麼大小滿足您的需求

我曾經寫過一個實現前饋反向傳播。網絡的大小可能是唯一的因素,但是在反向傳播階段還有其他因素(我需要記住,但我保證會嘗試)。你也有一些技巧作爲互相關。也可以嘗試優化差異代碼和激活函數(小x可能會引入數字問題,並且您有除法操作)

我的策略將首先檢查隱藏層 - 隱藏層中的5000個神經元與10000個輸入神經元是一個相當大的隱藏層(然而,這取決於問題)。 要計算的函數數量是主要瓶頸 - 與隱藏層大小的二次方關係。如果隱藏層中的節點數爲O(N),那麼在外層和隱藏層之間要執行的函數的數量是O(N^2)。 這是因爲輸入圖層中的每個節點都需要對隱藏圖層中的所有節點做出貢獻,並且與輸出圖層和隱藏圖層相同。

在我處理的問題 - 圖像壓縮中,輸入神經元大小的1/8或甚至1/16都滿足我的需求。我強烈建議您首先測試隱藏層大小,以查看隱藏層大小和結果質量之間的最佳折中位置。

另外 - 前饋(和反向傳播)可以以並行方式實現 - 考慮使用open-mp。 通過並行處理可以非常有效地完成每個節點中權重的累加。

+0

我同意你應該重新檢查隱藏層,特別是在考慮輸出層的大小後。我昨晚也在想OpenMP/OpenCL。我將首先嚐試OpenMP,比OpenCL更容易實現。 – user416983

+0

我接受了這個。我嘗試使用4核CPU的OpenMP,但效果不是很好,總時間僅減少了40%。這是預料之中的,因爲除了一些浮點數操作之外,我沒有太多可以放入一個循環的迭代。 OpenCL更好地解決這類問題。 – user416983

+0

@ user416983關閉課程OpenCL可能更好(特別是如果你有GPU的話),但對我來說,開始時太複雜了。 OpenMP非常簡單,你會得到有效的結果。 40%比我預期的要少(當然你永遠不會得到75%)。無論如何,你似乎可以提高40%。 – chook