一個簡單的深度學習模型,帶你深度了解背後原理

2021-01-15 讀芯術

全文共4431字,預計學習時長9分鐘

深度學習是目前在實際數據科學應用中最流行的模型之一。從圖像到文本,再到語音/音樂等領域,它都是一個有效的模型。隨著使用量的上升,快速且可擴展地實現深度學習變得至關重要。Tensorflow等深度學習平臺的興起可以幫助簡化開發人員的實現方式。

在本文中,我們將學習深度學習的工作原理,並熟悉相關術語,例如反向傳播和批量大小。我們將實現一個簡單的深度學習模型 - 從理論到scratch實現 - 使用python預定義輸入和輸出,然後使用Keras和Tensorflow等深度學習平臺實現相同的模型。

我們使用Keras和Tensorflow 1.x和2.0編寫了這個簡單的深度學習模型,該模型具有三種不同級別的複雜性和易編碼性。

Scratch的深度學習實現

一個簡單的多層感知器有4個輸入神經元,隱含層有3個神經元,輸出層有1個神經元。我們有三個輸入數據樣本,用表示,三個期望輸出數據樣本,用表示。因此,每個輸入數據樣本都有4個特徵。

# Inputs and outputs of the neural net:import numpy as npX=np.array([[1.0, 0.0, 1.0, 0.0],[1.0, 0.0, 1.0, 1.0],[0.0, 1.0, 0.0, 1.0]])yt=np.array([[1.0],[1.0],[0.0]])

該神經網絡有4個輸入神經元,1個隱含層有3個神經元,輸出層有1個神經元

圖中 x(m)是X的1個樣本,h(m)是x(m) 輸入的隱含層輸出,Wi和Wh為權重。

神經網絡(NN)的目標是為給定輸入獲得權重和偏差,NN提供期望輸出。但是,我們事先並不知道什麼是適當的權重和偏差,因此我們需要更新權重和偏差,使得NN、和期望的的輸出之間的誤差最小化。這種用迭代的方式最小化誤差過程稱為神經網絡訓練。

假設隱含層和輸出層的激活函數都是sigmoid函數。因此,

神經網絡的權值大小、偏差以及輸入和輸出之間的關係

其中,激活函數是sigmoid函數,m是第m個數據樣本, yp(m) 是NN輸出。

衡量NN輸出與期望輸出之間差異的誤差函數可以用數學方式表示為:

神經網絡所定義的誤差是平方誤差

上述NN的偽代碼總結如下:

用於神經網絡訓練的偽代碼

通過偽代碼得出,我們需要計算誤差(E)相對於參數(權重和偏差)的偏導數。利用微積分中的鏈式法則,表示如下:

誤差函數對權重的導數

在此我們有兩種方式可以用來更新反向路徑中的權重和偏差(反向路徑指更新權重和偏差,從而最小化誤差):

1. 使用訓練數據的全部個樣本

2. 使用一個樣本或一簇樣本

第一種方式的批量大小是。如果第二種方式使用一個樣本來更新參數,則其批量大小是1。因此批量大小代表用於更新權重和偏差的數據樣本數量。

從上述神經網絡的實現可以得出,關於參數的誤差梯度是按符號計算的,其中具有不同的批量大小。

如上述例子所示,基於scratch創建簡單的深度學習模型,方法十分複雜。下一節將介紹如何通過深度學習框架實現可擴展且簡單的模型。

Keras、Tensorflow 1.x及2.0的深度學習實現

在上一節中,我們運用鏈式法則計算了誤差梯度參數。這不是一種簡單或可擴展的方法。同時,我們會在每次迭代時評估偏導數,因此,儘管偏導數的值很重要,但不需要梯度符號。此時Keras和Tensorflow等深度學習框架可以發揮其作用。深度學習框架使用AutoDiff方法對部分梯度進行數值計算。如果你對AutoDiff不熟悉,那麼StackExchange就是一個很好的例子。AutoDiff將複雜表達式分解為一組原始表達式,即最多由一個函數調用組成的表達式。由於已知每個單獨表達式的區分規則,因此可以以有效的方式計算最終結果。

我們在Keras、Tensorflow 1.x和Tensorflow 2.0中實現了三個不同級別的NN模型:

1. 高級(Keras和Tensorflow 2.0):

高級Tensorflow 2.0,批量大小1

https://github.com/miladtoutounchian/Deep-Learning-/blob/master/TF_v2_HighLevel_batchsize1_train_on_batch.py

2. 中級(Tensorflow 1.x和2.0):

中級Tensorflow 1.x,批量大小1,

https://github.com/miladtoutounchian/Deep-Learning-/blob/master/TF_v1_MediumLevel_batchsize1.py

中級Tensorflow 1.x,批量大小N,

https://github.com/miladtoutounchian/Deep-Learning-/blob/master/TF_v1_MediumLevel_batchsizeN.py

中級Tensorflow 2.0,批量大小1,

https://github.com/miladtoutounchian/Deep-Learning-/blob/master/TF_v2_MediumLevel_batchsize1.py

中級Tensorflow 2.0,批量大小N

https://github.com/miladtoutounchian/Deep-Learning-/blob/master/TF_v2_MediumLevel_batchsizeN.py

3. 初級(Tensorflow 1.x):

初級Tensorflow 1.x,批量大小N

https://github.com/miladtoutounchian/Deep-Learning-/blob/master/TF_v1_LowLevel_batchsizeN.py

代碼片段:

在高級實現中,基於model.train_on_batch運用keras和Tensorflow v 2.0實現模型:

# High-Level implementation of the neural net in Tensorflow:model.compile(loss=mse,optimizer=optimizer)for _ in range(2000):for step, (x, y) in enumerate(zip(X_data, y_data)):model.train_on_batch(np.array([x]), np.array([y]))

在Tensorflow 1.x的中級實現中,定義如下:

E = tf.reduce_sum(tf.pow(ypred - Y, 2))optimizer = tf.train.GradientDescentOptimizer(0.1)grads = optimizer.compute_gradients(E, [W_h, b_h, W_o, b_o])updates = optimizer.apply_gradients(grads)

以此確保在for循環中更新需要更新的變量。在中級實現中,梯度及其更新在for循環外部進行定義,內部則為迭代更新。在Tensorflow v 2.x的中級實現中,使用如下:

# Medium-Level implementation of the neural net in Tensorflow#

In for_loop

with tf.GradientTape() as tape: x = tf.convert_to_tensor(np.array([x]), dtype=tf.float64) y = tf.convert_to_tensor(np.array([y]), dtype=tf.float64) ypred = model(x) loss = mse(y, ypred)gradients = tape.gradient(loss, model.trainable_weights)optimizer.apply_gradients(zip(gradients,model.trainable_weights))

在初級實現中,分別更新每個權重和偏差。在Tensorflow v 1.x初級實現中,定義如下:

# Low-Level implementation of the neural net in Tensorflow:E = tf.reduce_sum(tf.pow(ypred - Y, 2))dE_dW_h = tf.gradients(E, [W_h])[0]dE_db_h = tf.gradients(E, [b_h])[0]dE_dW_o = tf.gradients(E, [W_o])[0]dE_db_o = tf.gradients(E, [b_o])[0]# In for_loop:evaluated_dE_dW_h = sess.run(dE_dW_h, feed_dict={W_h: W_h_i, b_h: b_h_i, W_o: W_o_i, b_o: b_o_i, X: X_data.T, Y: y_data.T}) W_h_i = W_h_i - 0.1 * evaluated_dE_dW_h evaluated_dE_db_h = sess.run(dE_db_h, feed_dict={W_h: W_h_i, b_h: b_h_i, W_o: W_o_i, b_o: b_o_i, X: X_data.T, Y: y_data.T}) b_h_i = b_h_i - 0.1 * evaluated_dE_db_h evaluated_dE_dW_o = sess.run(dE_dW_o, feed_dict={W_h: W_h_i, b_h: b_h_i, W_o: W_o_i, b_o: b_o_i, X: X_data.T, Y: y_data.T}) W_o_i = W_o_i - 0.1 * evaluated_dE_dW_o evaluated_dE_db_o = sess.run(dE_db_o, feed_dict={W_h: W_h_i, b_h: b_h_i, W_o: W_o_i, b_o: b_o_i, X: X_data.T, Y: y_data.T}) b_o_i = b_o_i - 0.1 * evaluated_dE_db_o

如初級實現所述,開發人員可以更好地控制數值運算和計算的每一步。

上述所示,在Scratch的深度學習實現中,即便只是通過使用梯度符號計算建立一個簡單的深度學習模型來更新權重和偏差並不是一種簡單或可擴展的方法。而使用用於更新權重和偏差的穩定數值梯度計算AutoDiff,深度學習框架可以加速此進程。

留言 點讚 關注

我們一起分享AI學習與發展的乾貨

編譯組:張淑霏、王書晗

相關連結:

https://towardsdatascience.com/deep-learning-from-scratch-and-using-tensorflow-in-python-34aad75f939

如需轉載,請後臺留言,遵守轉載規範

相關焦點

  • 主流的深度學習模型有哪些?
    卷積網絡(Convolutional Neural Networks)卷積網絡早已大名鼎鼎,從某種意義上也是為深度學習打下良好口碑的功臣。不僅如此,卷積網絡也是一個很好的計算機科學借鑑神經科學的例子。卷積網絡的精髓其實就是在多個空間位置上共享參數,據說我們的視覺系統也有相類似的模式。首先簡單說什麼是卷積。
  • 專家解讀阿法狗原理:是「深度學習」
    它的致命法寶就是模仿人類的「深度學習」工作原理。機器到底是怎樣像人類一樣學習的?有一天它無所不能,人類的未來又將怎樣?北京晨報記者採訪了國內專家進行解讀。  阿法狗原理是「深度學習」  AlphaGo(阿法狗)由位於英國倫敦的谷歌旗下DeepMind公司開發。它的主要工作原理是「深度學習」。
  • 手把手:教你如何用深度學習模型預測加密貨幣價格
    加密貨幣是一項顛覆性的技術,它背後的原理引人注目,我十分看好它未來的發展。實際上,我並沒有持有任何加密貨幣,但說起憑藉深度學習、機器學習以及人工智慧成功預測加密貨幣的價格,我覺得自己還算是個老司機。一開始,我認為把深度學習和加密貨幣結合在一起研究是個非常新穎獨特的想法,但是當我在準備這篇文章時,我發現了一篇類似的文章。那篇文章只談到比特幣。
  • 深度學習 vs. 概率圖模型 vs. 邏輯學
    AIMA 的封面,它是CS專業本科AI課程的規範教材然而,基於邏輯的AI遮掩了感知問題,而我很早之前就主張了解感知的原理是解開智能之謎的金鑰匙。感知是屬於那類對於人很容易而機器很難掌握的東西。(延伸閱讀:《計算機視覺當屬人工智慧》,作者2011年的博文)邏輯是純粹的,傳統的象棋機器人也是純粹算法化的,但現實世界卻是醜陋的,骯髒的,充滿了不確定性。
  • 深入了解深度學習 - 中國數字科技館
    (圖片來源:pixabay)2019年3月27日, Yoshua Bengio、Geoffrey Hinton 和 Yann LeCun三個人因在深度學習的研究工作而獲得了2018年的圖靈獎。通過複雜神經網絡進行深度學習的應用,最終將人工智慧從科幻小說領域帶到了現實世界。聲音識別可以讓你和機器人說話,圖像識別是自動駕駛汽車的關鍵,但是究竟什麼是深度學習呢?
  • 深度學習自學指南:6個月,從基礎知識到模型構建
    原作:Bargava安妮 編譯自 Medium量子位 出品 | 公眾號 QbitAI給你6個月的時間開始學習深度學習,能夠達到怎樣的程度?在這篇文章中,數據科學培訓老師Bargava就帶你半年入門深度學習。在這份攻略中,我將給大家講講零基礎入門深度學習可行性強的資料和學習方法。
  • 深度學習背後的基礎-神經網絡揭秘
    最近, 深度學習三傑獲得了計算機界最重要的圖靈獎, 它們的貢獻都集中在對深度學習的根據神經網絡的理論突破。 今天我們看到的所有和人工智慧有關的偉大成就, 從阿法狗到自動駕駛, 從海量人臉識別到對話機器人, 都可以歸功於人工神經網絡的迅速崛起。那麼對於不了解神經網絡的同學如何入門? 神經網絡的技術為什麼偉大, 又是什麼讓它們這麼多年才姍姍走來?
  • 深度| 理解深度學習中的卷積
    以下是正文:卷積現在可能是深度學習中最重要的概念。正是靠著卷積和卷積神經網絡,深度學習才超越了幾乎其他所有的機器學習手段。但卷積為什麼如此強大?它的原理是什麼?在這篇博客中我將講解卷積及相關概念,幫助你徹底地理解它。網絡上已經有不少博客講解卷積和深度學習中的卷積,但我發現它們都一上來就加入了太多不必要的數學細節,艱深晦澀,不利於理解主旨。
  • 普林,DeepMind新研究:結合深度學習符號回歸,深度模型中看見宇宙
    如何將深度模型轉換為符號方程?來自普林斯頓、DeepMind 等機構的研究人員提出了一種解決方案:結合深度學習和符號回歸實現這一目標。符號模型是自然科學的語言。與深度模型不同,符號模型是緊湊的、可解釋的,同時具備良好的泛化能力。簡單的符號表達式卻是建模世界獨一無二的強大方式。
  • 普林、DeepMind新研究:結合深度學習和符號回歸,從深度模型中看見...
    符號模型緊湊,具備可解釋性和良好的泛化能力,但很難處理高維機器學習問題;深度模型擅長在高維空間中學習,但泛化性和可解釋性卻很差。那麼有沒有什麼辦法可以取二者之所長呢?這項研究做到了。如何將深度模型轉換為符號方程?來自普林斯頓、DeepMind 等機構的研究人員提出了一種解決方案:結合深度學習和符號回歸實現這一目標。
  • 聽說你了解深度學習最常用的學習算法:Adam優化算法?
    By蔣思源2017年7月12日  深度學習常常需要大量的時間和機算資源進行訓練,這也是困擾深度學習算法開發的重大原因。雖然我們可以採用分布式並行訓練加速模型的學習,但所需的計算資源並沒有絲毫減少。而唯有需要資源更少、令模型收斂更快的最優化算法,才能從根本上加速機器的學習速度和效果,Adam算法正為此而生!
  • OpenCV+深度學習預訓練模型,簡單搞定圖像識別 | 教程
    而OpenCV最近一次版本更新,為我們帶來了更好的深度學習支持,在OpenCV中使用預訓練的深度學習模型變得非常容易。pyimagesearch網站今天發布了一份用OpenCV+深度學習預訓練模型做圖像識別的教程,量子位編譯整理如下:最近,OpenCV 3.3剛剛正式發布,對深度學習(dnn模塊)提供了更好的支持,dnn模塊目前支持Caffe、TensorFlow、Torch、PyTorch等深度學習框架。
  • 深度學習與統計力學(I) :深度學習中的基礎理論問題
    對英文原報告感興趣請在本公眾號回復關鍵詞「深度學習統計力學」。深度神經網絡最近在機器學習方面取得了顯著的成功,這就對其成功背後的理論原理提出了深刻的問題。例如,這樣的深層網絡可以計算什麼?我們如何訓練他們?信息是如何通過它們傳播的?為什麼他們泛化能力很好?我們怎麼能教他們想像呢?
  • 深度學習的可解釋性研究(一):讓模型「說人話」
    非常開心本文成為 BIGSCity 興趣組的第一篇投稿,《深度學習的可解釋性研究》系列預計包含 3-4 篇內容,用儘可能淺顯的語言帶領大家了解可解釋性的概念與方法以及關於深度學習可解釋性工作的研究成果,不定期更新內容(歡迎催更)。可解釋性是什麼?廣義上的可解釋性指在我們需要了解或解決一件事情的時候,我們可以獲得我們所需要的足夠的可以理解的信息。
  • 在深度學習中對正則化的直觀認識
    所有的圖形和模型都是用標準的科學Python堆棧製作的:numpy、matplotlib、scipy、sklearn,而神經網絡模型則是用PyTorch構建的。開發複雜函數深度學習的核心原則之一是深度神經網絡作為通用函數逼近的能力。無論你感興趣的是什麼,疾病傳播,自動駕駛汽車,天文學等,都可以通過一個自學習模型來壓縮和表達,這種想法絕對是令人驚奇的!
  • 2020年深度學習發展大盤點及對2021年深度學習的未來展望|極客雲算
    深度學習框架作為AI底層工具,對個人而言是進入深度學習世界的一把鑰匙,掌握深度學習框架並不等於理解了深度學習,要在AI開發中有所作為,關鍵還是要真正理解框架背後的技術、實踐和生態。隨著近年來的人工智慧發展,2020年深度學習依然是發展最快的領域之一,直奔未來工作。其發展是多方面的,而且是多方位的。
  • 深度網絡揭秘之深度網絡背後的數學
    注意:感謝Jung Yi Lin 的幫助,你也可以閱讀中文版的這篇文章。我在GitHub上提供了用於創建本文中使用的可視化的原始碼。了解更多的神經網絡的工作原理。我決定在今年夏天抽出點時間深入的學習一下數學。
  • 高效「煉丹」必備技能:一文實現深度學習數學原理入門,還有吳恩達...
    尤其是深度學習算法開發人員,追求模型結構優化和提高編程效率是永遠的目標。但是,如果只做代碼「搬運工」,不了解神經網絡背後的數學原理,很難對項目有深刻全面的理解,debug反而會更難、耗時更長。就以深度學習中常用的神經網絡來說,典型模型包括多層感知機(DLP)、卷積神經網絡(CNN)、循環神經網絡(RNN)等等,不同的項目,對神經網絡的調參需求也不相同。
  • 深度學習大神Yoshua Bengio經典前瞻演講,幫你打通深度學習的任督...
    Yoshua Bengio連同Geoff Hinton老先生以及 Yann LeCun教授一起造就了2006年始的深度學習復興。他的研究工作主要聚焦在高級機器學習方面,致力於用其解決人工智慧問題。目前他是僅存的幾個仍然全身心投入在學術界的深度學習教授之一(蒙特婁大學),本文是他在2009年的經典前瞻演講——「人工智慧學習深度架構」有關內容的第一部分。
  • 如何評價周志華深度森林模型,熱議會否取代深度學習 DNN
    首先,讓我們簡單回顧周志華和馮霽的論文《深度森林:探索深度神經網絡以外的方法》。了解更多請點擊閱讀新智元報導:。有了 BatchNorm 和更多更具魯棒性的優化算法,大多數時候你只需要用 Adam 用默認設置學習率 0.001 就行了,結果很好。現在很多模型使用 BatchNorm,有時候都不需要使用 Dropout,總體而言調參不再是個問題。很多步長為1、3×3 的卷積層效果很漂亮的。簡單說:如今深度 NN 不怎麼調參也用得很好。用默認設置就行了。