授權轉載自大數(shù)據文摘 ID:BigDataDigest 看看你手機號能領到多牛的股 廣告 作者:Emil Wallnér 編譯:高寧、Happen、陳玲、Alieen 深度學習的浪潮在五年前開始興起。隨著計算能力的爆炸型增長和幾個成功的案例,深度學習引起了大肆宣傳。深度學習技術可以用來駕駛車輛,在Atari游戲中進行人機對抗,以及診斷癌癥。 開始學習神經網絡時,我花了兩周的時間進行探索,選擇合適的工具,對比不同的云服務以及檢索在線課程。但回想起來,我還是希望我可以從第一天就能創(chuàng)建神經網絡,這也是這篇文章的目的。 你不需要有任何預備知識。當然如果你對Python,命令行和Jupyter notebook有基礎的了解會對你有所幫助。 深度學習是機器學習的一個分支,它被證明是一種可以在原始數(shù)據(如一幅圖、或者一段聲音)中找到固定模型的有效方法。 如果你想對貓和狗的圖像進行分類。不需要具體的編程,它首先會找到圖片中的邊,然后從不同的邊中構建模式。接下來,它會檢測到鼻子,尾巴和爪子。通過這樣的方式,神經網絡最終可以實現(xiàn)對貓和狗進行分類。 但是,結構化的數(shù)據可以使用更好的機器學習算法。舉個例子,如果你的excel表中記錄了有序的客戶數(shù)據,你希望可以預測他們的下一張訂單,那么你可以使用傳統(tǒng)的方法,使用一個更簡單的機器學習算法。 核心邏輯 想象一個安裝了很多隨機調整齒輪的機器。這些齒輪堆疊在很多層上,而且會相互影響。最初,這個機器無法正常工作。然后隨機地調整齒輪,直到調整到可以給出正確輸出。 然后一個工程師會開始檢查所有的齒輪,然后標記出來哪些齒輪會造成誤差。他會從最后一層的齒輪開始,因為這里是所有誤差累計的結果。一旦他找到了最后一層的誤差,他就會開始查看前一層。通過這種方法他可以計算出每一個齒輪對于誤差的貢獻值。我們把這個過程稱為反向傳播。 然后這個工程師開始根據之前找到的誤差對每一個齒輪進行調整,然后重新運行整個機器。運行機器,計算誤差,調整齒輪,不斷循環(huán)這個過程直到機器給出正確輸出。 預測 – 計算誤差 – 調整預測值 (訓練周期) 神經網絡的運行方式也是如此,有輸入和輸出,然后通過調整齒輪來尋找輸入和輸出之前的關系。給定一個輸入,通過調整齒輪來預測輸出,然后將預測值和真實值進行對比。 神經網絡通過調整齒輪來追求最小誤差(預測值與實際值之前的差異),它會不斷調整齒輪,直到預測值與真實值之間的差異盡可能小。 最小化誤差的一個最佳方法是梯度下降,即通過誤差函數(shù)、或者說成本函數(shù)來進行誤差的計算。 淺層神經網絡 許多人認為人工神經網絡是我們大腦新皮質的數(shù)字化復制品。 這是一個錯誤的觀念。 我們并不知道大腦如何能夠做出這樣的聲明。這只是神經網絡發(fā)明人弗蘭克·羅森布拉特(Frank Rosenblatt)的一個靈感源泉。 淺層神經網絡 輸入-權重-加和-判斷 –> (預測值-實際值)*學習率 與神經網絡模擬器玩一兩個小時,你就可以獲得對其的直觀感受。 我們將從實現(xiàn)一個簡單的神經網絡開始,以了解TFlearn中的語法。從經典的101問題開始,也就是OR運算符。雖然神經網絡更適合于其他類型的數(shù)據,但這是了解其工作原理的一個很好的問題。 所有的深度學習程序都遵循同樣的核心邏輯: 1.首先加載庫,然后加載數(shù)據并清洗。不管是照片,音頻還是知覺數(shù)據,所有的輸入都會被轉化為數(shù)字。這些很長的數(shù)字列表就是我們神經網絡的輸入。 2.現(xiàn)在開始設計神經網絡。選擇你的神經網絡層的類型和數(shù)量 3.然后它會進入學習過程。 4.神經網絡知曉輸入和輸出,然后自行尋找二者之間的關系。 最后會用訓練好的模型中給到你一個預測值。 下面是這個神經網絡的程序: 輸出 第一行 以“#”開頭的行表示備注,一般用來解釋代碼 第二行加載TFlearn庫 通過這個語句我們可以使用谷歌Tensorflow的深度學習函數(shù) 第五行和第六行 將上述表中的數(shù)據存儲在列表中 每個數(shù)字末尾的點會將整數(shù)映射到浮點數(shù)。它存儲具有十進制值的數(shù)字,使計算更加精確。 第七行初始化神經網絡,并指定輸入數(shù)據的維度或者說尺寸 所有的OR運算都是在一對數(shù)據中進行的,所以維度是2. 空值是默認值,表示批量的大小 第八行輸出層 激活函數(shù)將過程中的結果映射到輸出層 在這個例子中,我們使用Sigmoid函數(shù)將其映射到(0,1)區(qū)間范圍內 第十一行 應用回歸 使用優(yōu)化器選擇合適的算法來最小化成本函數(shù) 學習率決定了神經網絡的調整速度,而損失變量決定了如何計算誤差。 第十二行選擇使用哪個神經網絡 一般情況下也可以用來指定存儲訓練日志的位置 第十三行訓練你的神經網絡和模型 選擇你的輸入數(shù)據(OR)以及實際的標簽(Y_truth) Epochs決定了你的神經網絡運行數(shù)據的循環(huán)次數(shù) 如果你設置 snapshot=True,那么每次循環(huán)后都會進行模型驗證 第十四到十八行使用訓練好的模型進行預測 在這個例子中,返回的是結果是1/True的概率 輸出層 第一個結果表示[0.]&[0.]組合為真的可能性為4%,以此類推?!癟raining step”顯示了你訓練了多少批。 在每一批中所有數(shù)據都將訓練一次,類似于Epoch。如果數(shù)據相對內存較大,你需要停止分段訓練。損失函數(shù)會計算每一次迭代的錯誤數(shù)量。 SGD指隨機梯度下降法及最小化代價函數(shù)方法。 Iter指當前數(shù)據索引以及輸入項的總和。 你可以在大多數(shù)TFlearn神經網絡中找到上述邏輯和語法。學習這段代碼最好的方法就是修改代碼并產生一些錯誤。 損失曲線顯示了每一次訓練的錯誤量 你可以通過Tensorboard來可視化每一次實驗,并了解每一個參數(shù)是如何影響訓練的。 這里有一些你可以運行的例子的建議。我推薦你花費幾小時練習這些例子,以更好地適應運行環(huán)境以及TFlearn中的參數(shù)。 實驗 增加訓練與迭代次數(shù) 嘗試添加或改變文檔中提到的每一個函數(shù)的參數(shù) 例如g = tflearn.fullyconnected(g, 1, activation=’sigmoid’)改成tflearn.fullyconnected(g, 1, activation=’sigmoid’, bias=False)在輸入項增加整數(shù) 改變輸入層的形狀 改變輸出層的激活函數(shù) 使用不同的梯度下降方法 改變神經網絡計算代價的方式 用X和Y來替代“AND”和“NOT”邏輯運算 例如將最后一項Y_truth從[1.]改為[0.]。為了使其有效,你需要在網絡中增加一層。 使其學得更快 想辦法使得每一步學習都超過0.1秒 新手入門 結合Python來使用Tensorflow在深度學習中是最常見的手段。 TFlearn是一個運行在Tensorflow之上的高層次框架。 另一個常見的框架是Keras。這是一個更加健壯的庫,但是我發(fā)現(xiàn)TFlearn的語法更加簡潔易懂。 它們都是運行在Tensorflow之上的高層次框架。 你可以使用你的電腦CPU來運行簡單的神經網絡。但是大多數(shù)實驗需要運行數(shù)個小時甚至幾周。這也是為什么大多數(shù)人通過現(xiàn)代GPU云服務來進行深度學習。 最簡單的GPU云服務解決方案是FloydHub(https://www./)。如果你掌握了基礎的命令行技能,部署FloydHub將不會超過5分鐘。 使用FloyHub文檔來安裝floyd-cli命令行工具。FloydHub還為遇到問題的客戶提供內部客服支持。 讓我們在FloyHub中使用TFlearn、Jupyter Notebook以及Tensorboard來運行你的第一個神經網絡吧! 安裝FloydHub并登陸,下載這份指南中所需的文件。 打開終端,輸入以下命令: 進入文件夾并初始化FloydHub: FloydHub會在你的瀏覽器打開web面板,提示你創(chuàng)建一個名為101的新項目。完成后回到終端,再次輸入初始化命令。 現(xiàn)在你可以在FloydHub上運行你的神經網絡任務了。 你可以通過“floyd run”命令進行不同的設置。在我們的案例中,我們希望: o 在FloydHub中增加一個已上傳的公共數(shù)據集 o data emilwallner/datasets/cifar-10/1:data 指定數(shù)據目錄。你可以在FloydHub上查看該數(shù)據集(以及許多其他公共數(shù)據集)。 o gpu 使用GPU云計算 o tensorboard 激活Tensorboard o mode jupyter Jupyter Notebook模式下運行任務 OK,開始運行我們的任務: 在瀏覽器中初始化Jupyter后,點擊“start-here.ipnyb”文件。 start-here.ipnyb 包含了一個簡單的神經網絡,可以了解TFlearn語法。它學習了“OR”邏輯,隨后解釋了所有組合。 點擊菜單欄的“Kernel ”下的 “Restart & Run All”。如果你能看到信息,說明它工作正常,你就可以去做其他事情了。 前往你的FloydHub項目,找到Tensorboard鏈接。 深度神經網絡 深度神經網絡指的是包含一層以上隱藏層的神經網絡。目前有非常多的關于CNN(卷積神經網絡)工作原理的詳細教程。 因此,我們將關注適用于更多神經網絡的高層次概念。 注:該圖不是一個深度神經網絡。它需要一層以上隱藏層。 你想訓練神經網絡來預測未經訓練的數(shù)據。它需要能泛化的能力。這是一種介于學習與遺忘之間的平衡。 你想它能學習如何將信號從噪聲中分離,但是同時遺忘只在訓練數(shù)據中出現(xiàn)的信號。 如果神經網絡未經充分學習,它會出現(xiàn)欠擬合現(xiàn)象。與之相反是過擬合現(xiàn)象。它指的是從訓練數(shù)據學習過多。 Regularization (正則化)是一種通過遺忘訓練中的特定信號來減少過擬合的方法。 為了進一步理解這些概念,我們在CIFAR-10數(shù)據集上開展實驗。該數(shù)據集包含了10種類別6萬張的圖片,例如汽車、卡車和鳥。目標是預測一張新的圖片屬于哪種類別。 CIFAR中的示例圖片 通常我們需要挖掘數(shù)據、清理數(shù)據以及過濾圖片。但是為了簡化過程,我們只關注神經網絡。你可以在Jupyter notebook中運行安裝的所有例子(https://github.com/emilwallner/Deep-Learning-101)。 輸入層輸出層將圖片分為10類。隱藏層混合了卷積層、 pooling以及連接層。 選擇層數(shù) 讓我們來對比下只有一層的神經網絡和有三層之間的區(qū)別。每一層包含卷積層,池層,和關聯(lián)層。 你可以通過點擊在菜單欄中的Kernel > Restart & Run All 來運行這些腳本。接著再瞥一眼Tensorboard中的訓練記錄。你會發(fā)現(xiàn)有很多層的多準確了15%。較少層的擬合度低 — 證明它學的還不夠。 你可以運行你先前下載的文件夾中相同例子,同樣包括接下來的試驗。 讓我們看一眼準確度和驗證集的準確度。深度學習中最好的實踐是將數(shù)據集一分為二,一部分用作訓練這個神經網絡,剩下的則用作驗證它。通過這種方法可以告訴我們神經網絡在預測新數(shù)據中表現(xiàn)如何,或是類推的能力。 就如你所見,訓練數(shù)據的準確度高于驗證數(shù)據集。這個神經網絡包含了背景噪聲和其他阻礙預測新圖像的細節(jié)。 為解決過擬合問題,你可以懲罰復雜方程并在神經網絡中增加噪聲。普遍解決這個的正則化技術有丟棄層和懲戒復雜方程。 丟棄層 我們可以對比一下丟棄正則化這樣理解:一些強大的神經元并不決定最終結果,而是由他們分配權力。 神經網絡被迫使去學習一些獨立的表現(xiàn)。當做最終的預測時,它則有一些不同的模型去學習。 下面是一個有丟棄層的神經網絡的例子。 在這項對比中,兩個神經網絡是一樣的除了其中一個有丟棄層,另一個沒有。 在神經網絡中的每一層中,神經元變得更依賴于彼此。某些神經元比其他的更有影響力。丟棄層隨機的丟棄部分神經元。這樣,每一個神經元需要為最終輸出提供不同的貢獻。 另一個流行的預防過擬合的方式是在每一層中運用L1 或L2 正則方程。 L1 & L2 正則方程 比方你想描述一匹馬,如果這個描述太仔細,你則會排除掉太多不同形態(tài)的馬。但是如果太籠統(tǒng)則可能包括進來很多別的動物。L1 和L2 正則化幫助我們的網絡去做這種區(qū)分。 如果我們與之前試驗類似的對比,我們會得到相似的結果。 有正則化方程的神經網絡表現(xiàn)的比沒有的要好。 正則化方程L2 懲戒方程太過復雜。它測量每一個方程對于最終輸出的貢獻量,接著懲罰系數(shù)大的方程。 批量大小 另一個重要參數(shù)是批量大小,在每一步訓練中的數(shù)據量。下面是一組大批量數(shù)據與小批量數(shù)據的對比。 就如你所見,大批量所需的周期更少但在訓練中更精確。對比之下,小批量更隨機但需要消耗更多步來補償。 大批量不需要很多學習步驟。但是,你需要更多存儲空間和時間去計算每一步。 學習率 最后一個試驗是對比大,中,小不同學習率的網絡。 學習率因其影響力被視為最重要的一個參數(shù)。它規(guī)范了如何在每一步學習過程中調節(jié)預測中的變化。如果這個學習率太高或者太低都無法收斂,就如上圖的大學習率一般。 設計神經網絡沒有特定的方式。很多是要通過試驗來決定。看看別人如何增加層數(shù)和如何調節(jié)高階參數(shù)的。 如果你有強大的計算能力,你可以設計一個程序和調節(jié)高階參數(shù)。 當你完成了運行工作,你應當為你的GPU云降低運轉速度比如通過取消FloydHub網頁儀表盤來結束工作。 后續(xù) 在TFlearn的官方示例中(https://github.com/tflearn/tflearn/tree/master/examples/images),你能感受到一些表現(xiàn)優(yōu)異的卷積神經網絡。試著運用其中一些方式去提高CIFAR-10數(shù)據庫的驗證集準確率。目前最優(yōu)的結果是96.53%(Graham,2014)。 學習Python的語法和熟悉它的命令語句是非常值得的一件事。這可以有效減少不必要的認知負荷從而全神貫注于深度學習概念上。從Codecademy的Python課開始,接著做一些命令語句練習。如果只做這一件事,你花不到三天就能掌握。 原文鏈接: https://medium./deep-learning-for-developers-tools-you-can-use-to-code-neural-networks-on-day-1-34c4435ae6b |
|
來自: bookocea > 《人工智能(已閱)》