吳恩達深度學習筆記(13)-多樣本梯度下降和向量化處理多批次數據

2021-01-08 百家號

m 個樣本的梯度下降(Gradient Descent on m Examples)

在之前的筆記中,已經講述了如何計算導數,以及應用梯度下降在邏輯回歸的一個訓練樣本上。現在我們想要把它應用在m個訓練樣本上。

首先,讓我們時刻記住有關於損失函數就J(w,b) 的定義。

當你的算法輸出關於樣本y 的 a(i), a(i)是訓練樣本的預測值,即:

所以我們在前面展示的是對於任意單個訓練樣本,如何計算微分當你只有一個訓練樣本。

因此dw_1,dw_2和db 添上上標i表示你求得的相應的值。

如果你面對的是我們在之前演示的那種情況,但只使用了一個訓練樣本(x^(i),y^(i)) 。

現在你知道帶有求和的全局代價函數,實際上是1到m項各個損失的平均。

所以它表明全局代價函數對w1的微分,w1的微分也同樣是各項損失對w1微分的平均。

但之前我們已經演示了如何計算這項,即之前幻燈中演示的如何對單個訓練樣本進行計算。

所以你真正需要做的是計算這些微分,如我們在之前的訓練樣本上做的。並且求平均,這會給你全局梯度值,你能夠把它直接應用到梯度下降算法中。

所以這裡有很多細節,但讓我們把這些裝進一個具體的算法。同時你需要一起應用的就是邏輯回歸和梯度下降。

我們初始化 J=0,dw_1=0,dw_2=0,db=0

代碼流程:

J=0;dw1=0;dw2=0;db=0; for i = 1 to m: z(i) = wx(i)+b a(i) = sigmoid(z(i)) J += -[y(i)log(a(i))+(1-y(i))log(1-a(i)) dz(i) = a(i)-y(i) dw1 += x1(i)dz(i) dw2 += x2(i)dz(i) db += dz(i) J/= m dw1/= m dw2/= m db/= m w=w-alpha*dw b=b-alpha*db

筆記上只應用了一步梯度下降。因此你需要重複以上內容很多次,以應用多次梯度下降。看起來這些細節似乎很複雜,但目前不要擔心太多。

但這種計算中有兩個缺點,也就是說應用此方法在邏輯回歸上你需要編寫兩個for循環。

第一個for循環是一個小循環遍歷m個訓練樣本,

第二個for循環是一個遍歷所有特徵的for循環。

這個例子中我們只有2個特徵,所以n等於2並且n_x 等於2。 但如果你有更多特徵,你開始編寫你的因此dw_1,dw_2,你有相似的計算從dw_3一直下去到dw_n。所以看來你需要一個for循環遍歷所有n個特徵

當你應用深度學習算法,你會發現在代碼中顯式地使用for循環使你的算法很低效,同時在深度學習領域會有越來越大的數據集。所以能夠應用你的算法且沒有顯式的for循環會是重要的,並且會幫助你適用於更大的數據集。所以這裡有一些叫做向量化技術,它可以允許你的代碼擺脫這些顯式的for循環。

我想在先於深度學習的時代,也就是深度學習興起之前,向量化是很棒的。

可以使你有時候加速你的運算,但有時候也未必能夠。

但是在深度學習時代向量化,擺脫for循環已經變得相當重要。

因為我們越來越多地訓練非常大的數據集,因此你真的需要你的代碼變得非常高效。

所以在接下來的幾個筆記中,我們會談到向量化,以及如何應用向量化而連一個for循環都不使用。

所以學習了這些,我希望你有關於如何應用邏輯回歸,或是用於邏輯回歸的梯度下降,事情會變得更加清晰。

向量化(Vectorization)

向量化是非常基礎的去除代碼中for循環的藝術,在深度學習安全領域、深度學習實踐中,你會經常發現自己訓練大數據集,因為深度學習算法處理大數據集效果很棒,所以你的代碼運行速度非常重要,否則如果在大數據集上,你的代碼可能花費很長時間去運行,你將要等待非常長的時間去得到結果。所以在深度學習領域,運行向量化是一個關鍵的技巧,讓我們舉個慄子說明什麼是向量化。

在邏輯回歸中你需要去計算z=w^T x+b,w、x都是列向量。如果你有很多的特徵那麼就會有一個非常大的向量,所以w∈R^(n_x ) , x∈R^(n_x ),所以如果你想使用非向量化方法去計算w^T x,你需要用如下方式(python)

z=0for i in range(n_x)z+=w[i]*x[i]z+=b

這是一個非向量化的實現,你會發現這真的很慢,作為一個對比,向量化實現將會非常直接計算w^T x,代碼如下(其中使用了numpy函數,這個有點重要,需要記得哦!):

z=np.dot(w,x)+b

這是向量化計算w^T x的方法,你將會發現這個非常快

讓我們用一個小例子說明一下(以下為在Jupyter notebook上寫的Python代碼):

import numpy as np #導入numpy庫 a = np.array([1,2,3,4]) #創建一個數據a print(a)# [1 2 3 4] import time #導入時間庫 a = np.random.rand(1000000) b = np.random.rand(1000000) #通過round隨機得到兩個一百萬維度的數組 tic = time.time() #現在測量一下當前時間#向量化的版本 c = np.dot(a,b) toc = time.time() print(「Vectorized version:」 + str(1000*(toc-tic)) +ms」) #列印一下向量化的版本的時間#繼續增加非向量化的版本 c = 0 tic = time.time() for i in range(1000000): c += a[i]*b[i] toc = time.time() print(c) print(「For loop:」 + str(1000*(toc-tic)) + 「ms」)#列印for循環的版本的時間

返回值見圖。

在兩個方法中,向量化和非向量化計算了相同的值,如你所見,

向量化版本花費了1.5毫秒,非向量化版本的for循環花費了大約幾乎500毫秒,非向量化版本多花費了300倍時間。

所以在這個例子中,僅僅是向量化你的代碼,就會運行300倍快。這意味著如果向量化方法需要花費一分鐘去運行的數據,for循環將會花費5個小時去運行。

一句話總結,以上都是在說和for循環相比,向量化可以快速得到結果。

你可能聽過很多類似如下的話,「大規模的深度學習使用了GPU或者圖像處理單元實現」,但是以上做的案例都是在jupyter notebook上面實現,這裡只有CPU,CPU和GPU都有並行化的指令,他們有時候會叫做SIMD指令,這個代表了一個單獨指令多維數據,這個的基礎意義是,如果你使用了built-in函數,像np.function或者並不要求你實現循環的函數,它可以讓python的充分利用並行化計算,這是事實在GPU和CPU上面計算,GPU更加擅長SIMD計算,但是CPU事實上也不是太差,可能沒有GPU那麼擅長吧。

接下來的筆記中,你將看到向量化怎麼能夠加速你的代碼,經驗法則是,無論什麼時候,避免使用明確的for循環。

相關焦點

  • 吳恩達深度學習筆記(12)-計算圖計算梯度下降
    邏輯回歸中的梯度下降(Logistic Regression Gradient Descent)本節我們討論怎樣通過計算偏導數來實現邏輯回歸的梯度下降算法。它的關鍵點是幾個重要公式,其作用是用來實現邏輯回歸中梯度下降算法。但是在本節中,將使用計算圖對梯度下降算法進行計算。
  • 吳恩達授課,斯坦福CS230深度學習課程資源開放
    課程主要內容CS230 與吳恩達在 Coursera 上的深度學習專項課程一樣分 5 部分,即神經網絡與深度學習、提升深度神經網絡、機器學習項目的策略、卷積神經網絡及序列模型。在第一課中介紹了神經網絡和深度學習的基礎。主要在課堂內介紹了深度學習的直觀概念,並藉助兩個模塊從頭開始學習神經網絡到底是什麼。
  • 吳恩達deeplearning.ai五項課程完整筆記了解一下?
    項目地址:https://github.com/mbadry1/DeepLearning.ai-Summary上周吳恩達在推特上展示了一份由 TessFerrandez 完成的深度學習專項課程信息圖,這套信息圖優美地記錄了深度學習課程的知識與亮點。這一份信息圖的詳細介紹請查看:這是一份優美的信息圖,吳恩達點讚的 deeplearning.ai 課程總結 。
  • 吳恩達機器學習筆記 - 線性回歸、代價函數與梯度下降
    1.3 無監督學習無監督學習:算法使用的數據集不做任何人為處理,即沒有加上任何屬性。上面是監督學習,已經人為設置了屬性(紅叉,藍圈)。這是無監督學習,所有的數據沒有進行處理,表面上看起來都差不多。漁網圖像中(theta_0,theta_1)在漁網的最底部取得,使得代價函數達到最小值;h_theta(x) 圖像中預測的函數曲線對訓練數據的擬合效果達到最優;四、梯度下降算法如何在程序中求代價函數的最小值呢?可以使用經典的梯度下降算法,迭代求代價函數 J(theta_0, theta_1) 的最小值。
  • 302頁吳恩達Deeplearning.ai課程筆記,詳記基礎知識與作業代碼
    近日,來自重慶大學的 Wan Zhen 製作了一份深度學習專項課程筆記,該筆記從神經網絡與深度學習基礎、提升深度神經網絡性能和卷積神經網絡三門課程出發詳細解釋了關鍵概念與作業代碼。本文概括性地介紹了這三課的主要內容,並選擇每個課程主題比較有意思的知識點進行介紹。
  • 高效「煉丹」必備技能:一文實現深度學習數學原理入門,還有吳恩達...
    尤其是深度學習算法開發人員,追求模型結構優化和提高編程效率是永遠的目標。但是,如果只做代碼「搬運工」,不了解神經網絡背後的數學原理,很難對項目有深刻全面的理解,debug反而會更難、耗時更長。下面的深度學習數學基礎詳解,以DLP為例,你讀完後會對它的數學基礎有全面的了解,並且熟悉用數學解釋算法的基本思路。除了DLP,文末還一併為你準備了RNN、CNN數學原理,以及吳恩達老師的AI數學基礎課程。一文實現AI數學基礎入門,還在等什麼?
  • 吳恩達深度學習(20)-激活函數的導數和神經網絡的梯度下降
    3)Rectified Linear Unit (ReLU)g(z)=max(0,z)註:通常在z= 0的時候給定其導數1,0;當然z=0的情況很少4)Leaky linear unit (Leaky ReLU)與ReLU類似註:通常在z=0的時候給定其導數1,0.01;當然z=0的情況很少神經網絡的梯度下降
  • 吳恩達深度學習筆記(34)-你不知道的其他正則化方法
    通過隨意翻轉和裁剪圖片,我們可以增大數據集,額外生成假訓練數據。和全新的,獨立的貓咪圖片數據相比,這些額外的假的數據無法包含像全新數據那麼多的信息,但我們這麼做基本沒有花費,代價幾乎為零,除了一些對抗性代價。以這種方式擴增算法數據,進而正則化數據集,減少過擬合比較廉價。
  • 技術| 深度解讀最流行的優化算法:梯度下降
    與此同時,最新的深度學習程序庫都包含了各種優化梯度下降的算法(可以參見如 lasagne、caffe 及 Kera 等程序庫的說明文檔)。但它們的算法則不被公開,都作為黑箱優化器被使用,這也就是為什麼它們的優勢和劣勢往往難以被實際地解釋。 本文旨在讓你對不同的優化梯度下降法的算法有一個直觀認識,以幫助你使用這些算法。
  • 深度學習專項課程精煉圖筆記!必備收藏|原力計劃
    深度學習基礎深度學習基本概念監督學習:所有輸入數據都有確定的對應輸出數據,在各種網絡架構中,輸入數據和輸出數據的節點層都位於網絡的兩端,訓練過程就是不斷地調整它們之間的網絡連接權重。這三種架構的前向過程各不相同,NN 使用的是權重矩陣(連接)和節點值相乘並陸續傳播至下一層節點的方式;CNN 使用矩形卷積核在圖像輸入上依次進行卷積操作、滑動,得到下一層輸入的方式;RNN 記憶或遺忘先前時間步的信息以為當前計算過程提供長期記憶。右上:NN 可以處理結構化數據(表格、資料庫等)和非結構化數據(圖像、音頻等)。
  • 詳解梯度下降算法 正確訓練模型利刃!
    【IT168 資訊】梯度下降是目前最流行的優化策略,目前用於機器學習和深度學習。它在訓練模型時使用,可以與每種算法結合使用,易於理解和實施。因此,每個使用機器學習的人都應該理解它的概念。閱讀完這篇文章後,你將了解梯度下降是如何工作的,它今天使用了哪些類型,以及它們的優點和權衡。
  • 吳恩達 NIPS 2016:利用深度學習開發人工智慧應用的基本要點(含...
    ,雷鋒網(公眾號:雷鋒網)特地把吳恩達教授在NIPS 2016大會中的PPT做為中文版,由三川和亞峰聯合編譯並製作。今日,在第 30 屆神經信息處理系統大會(NIPS 2016)中,百度首席科學家吳恩達教授發表演講:《利用深度學習開發人工智慧應用的基本要點(Nuts and Bolts of Building Applications using Deep Learning)》。
  • 吳恩達NIPS2016:利用深度學習開發人工智慧應用的基本要點含唯一的...
    雷鋒網按:為了方便讀者學習和收藏,雷鋒網特地把吳恩達教授在NIPS 2016大會中的PPT做為中文版,由三川和亞峰聯合編譯並製作。今日,在第 30 屆神經信息處理系統大會(NIPS 2016)中,百度首席科學家吳恩達教授發表演講:《利用深度學習開發人工智慧應用的基本要點(Nuts and Bolts of Building Applications using Deep Learning)》。
  • 梯度下降背後的數學原理幾何?
    2、第二種變體:隨機梯度下降下面進入……隨機梯度下降!這兩種方法之間的根本區別在於,隨機梯度下降法隨機化了整個數據集並對每個單獨的訓練樣本進行權重和參數的更新,而批量梯度下降是在分析了整個訓練集之後對參數進行更新。對模型連續更新可以提供更高的準確率和更快的計算速度。
  • 把梯度下降算法變成酷炫遊戲,這有一份深度學習通俗講義
    如果代碼和公式讓你感到枯燥,那麼不妨從這段酷炫的SGD視頻入手,再讀一讀這篇文章,它會幫你更直觀地理解深度學習。梯度下降算法的可視化到底什麼是梯度?深度學習的架構和最新發展,包括CNN、RNN、造出無數假臉的GAN,都離不開梯度下降算法。梯度可以理解成山坡上某一點上升最快的方向,它的反方向就是下降最快的方向。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    20爬蟲scrapy框架及案例 21數據分析 22機器學習 23深度學習 24數據結構和算法 25python網絡爬蟲 26機器學習入門篇 27機器學習入門篇2 28機器學習提升篇 29數據挖掘篇 30深度學習必備原理與實戰 31深度學習必備原理與實戰
  • Batch、Mini-batch和隨機梯度下降的區別和Python示例
    在研究機器學習和深度學習時出現的主要問題之一是梯度下降的幾種類型。在梯度下降的三種類型(Batch梯度下降、Mini-batch梯度下降和隨機梯度下降)中,我應該使用哪一種呢?在這篇文章中,我們將了解這些概念之間的區別,並從梯度下降的代碼實現來闡明這些方法。
  • 梯度下降—Python實現
    梯度下降是數據科學的基礎,無論是深度學習還是機器學習。深入了解梯度下降原理一定會對你今後的工作有所幫助。你將真正了解這些超參數的作用以及處理使用此算法可能遇到的問題。然而,梯度下降並不局限於一種算法。另外兩種流行的梯度下降(隨機和小批量梯度下降)建立在主要算法的基礎上,你可能會看到比普通批量梯度下降更多的算法。
  • 一分鐘看完梯度下降法
    今天,我想講一下梯度下降法(Gradient Descent),基於線性回歸損失函數的梯度下降法。
  • 工程之道,深度學習的工業級模型量化實戰
    來源:新浪證券背景近年來隨著邊緣計算和物聯網的興起與發展,許多移動終端(比如手機)成為了深度學習應用的承載平臺,甚至出現了各式各樣專用的神經網絡計算晶片。由於這些設備往往對計算資源和能耗有較大限制,因此在高性能伺服器上訓練得到的神經網絡模型需要進行裁剪以縮小內存佔用、提升計算速度後,才能較好地在這些平臺上運行。