1. 程式人生 > >【DeepLearning】深度學習第一課:使用autograd來自動求導

【DeepLearning】深度學習第一課:使用autograd來自動求導

使用autograd來自動求導

在機器學習中,我們通常使用梯度下降(gradient descent)來更新模型引數從而求解。損失函式關於模型引數的梯度指向一個可以降低損失函式值的方向,我們不斷地沿著梯度的方向更新模型從而最小化損失函式。雖然梯度計算比較直觀,但對於複雜的模型,例如多達數十層的神經網路,手動計算梯度非常困難。

為此MXNet提供autograd包來自動化求導過程。雖然大部分的深度學習框架要求編譯計算圖來自動求導,mxnet.autograd可以對正常的命令式程式進行求導,它每次在後端實時建立計算圖,從而可以立即得到梯度的計算方法。

下面讓我們一步步介紹這個包。我們先匯入autograd

import mxnet.ndarray as nd
import mxnet.autograd as ag

為變數附上梯度

假設我們想對函式 f=2×x2 求關於 x 的導數。我們先建立變數x,並賦初值。

x = nd.array([[1, 2], [3, 4]])

當進行求導的時候,我們需要一個地方來存x的導數,這個可以通過NDArray的方法attach_grad()來要求系統申請對應的空間。

x.attach_grad()

下面定義f。預設條件下,MXNet不會自動記錄和構建用於求導的計算圖,我們需要使用autograd裡的record()函式來顯式的要求MXNet記錄我們需要求導的程式。

with ag.record():
    y = x * 2
    z = y * x

接下來我們可以通過z.backward()來進行求導。如果z不是一個標量,那麼z.backward()等價於nd.sum(z).backward().

z.backward()

現在我們來看求出來的導數是不是正確的。注意到y = x * 2z = x * y,所以z等價於2 * x * x。它的導數那麼就是 dzdx=4×x

print('x.grad: ', x.grad)
x.grad == 4*x

對控制流求導

命令式的程式設計的一個便利之處是幾乎可以對任意的可導程式進行求導,即使裡面包含了Python的控制流。考慮下面程式,裡面包含控制流for

if,但迴圈迭代的次數和判斷語句的執行都是取決於輸入的值。不同的輸入會導致這個程式的執行不一樣。(對於計算圖框架來說,這個對應於動態圖,就是圖的結構會根據輸入資料不同而改變)。

def f(a):
    b = a * 2
    while nd.norm(b).asscalar() < 1000:
        b = b * 2
    if nd.sum(b).asscalar() > 0:
        c = b
    else:
        c = 100 * b
    return c

我們可以跟之前一樣使用record記錄和backward求導。

a = nd.random_normal(shape=3)
a.attach_grad()
with ag.record():
    c = f(a)
c.backward()

注意到給定輸入a,其輸出 f(a)=xax 的值取決於輸入a。所以有 dfda=x,我們可以很簡單地評估自動求導的導數:

a.grad == c/a

頭梯度和鏈式法則

注意:讀者可以跳過這一小節,不會影響閱讀之後的章節

當我們在一個NDArray上呼叫backward方法時,例如y.backward(),此處y是一個關於x的函式,我們將求得y關於x的導數。數學家們會把這個求導寫成 dy(x)dx 。還有些更復雜的情況,比如z是關於y的函式,且y是關於x的函式,我們想對z關於x求導,也就是求 ddxz(y(x)) 的結果。回想一下鏈式法則,我們可以得到ddxz(y(x))=dz(y)dydy(x)dx。當y是一個更大的z函式的一部分,並且我們希望求得 dzdx 儲存在x.grad中時,我們可以傳入頭梯度(head gradient) dzdy 的值作為backward()方法的輸入引數,系統會自動應用鏈式法則進行計算。這個引數的預設值是nd.ones_like(y)。關於鏈式法則的詳細解釋,請參閱Wikipedia

with ag.record():
    y = x * 2
    z = y * x

head_gradient = nd.array([[10, 1.], [.1, .01]])
z.backward(head_gradient)
print(x.grad)

本文來自李沐Github個人使用者。

相關推薦

DeepLearning深度學習第一使用autograd自動

使用autograd來自動求導 在機器學習中,我們通常使用梯度下降(gradient descent)來更新模型引數從而求解。損失函式關於模型引數的梯度指向一個可以降低損失函式值的方向,我們不斷地沿著梯度的方向更新模型從而最小化損失函式。雖然梯度計算比較直觀,

連載深度學習筆記8利用Tensorflow搭建神經網路

      在筆記7中,和大家一起入門了  Tensorflow 的基本語法,並舉了一些實際的例子進行了說明,終於告別了使用 numpy 手動搭建的日子。所以我們將繼續往下走,看看如何利用  Tensorflow 搭建神經網路模型。       儘管對於初學者而言使用 Te

C++探索之旅第二部分第一面向對象初探,string的驚天內幕

信息技術 false cli 方法 復雜 weixin include 命令 就是 內容簡單介紹 1、第二部分第一課:面向對象初探。string的驚天內幕 2

資源深度學習 Top100近 5 年被引用次數最高論文(下載)

【新智元導讀】這裡是近5年100篇被引用次數最多的深度學習論文,覆蓋了優化/訓練方法、無監督/生成模型、卷積網路模型和影象分割/目標檢測等十大子領域。重要的論文能夠超越其應用領域讓人獲益。新智元在每個領域都選擇了一篇論文重點介紹,這將是你縱覽深度學習研究絕好的開始。【進入

深度學習基礎概念理解

器) 好處 網站 water weight tar 直觀 str view 原文鏈接 神經網絡基礎 1)神經元(Neuron)——就像形成我們大腦基本元素的神經元一樣,神經元形成神經網絡的基本結構。想象一下,當我們得到新信息時我們該怎麽做。當我們獲取信息時,我們一般會處

深度學習第一 線性迴歸

最近在學習李沐的Mxnet/Gluon深度學習的線性迴歸部分,線性迴歸是很基本的一種監督學習,分類問題。 以前學習完一遍吳恩達的《machine learning》,並把《機器學習實戰》裡面的主要程式碼都實現一遍,現在有點忘記了,正好開始深度學習,開始線性迴歸查缺補漏,MXnet框架其實比較小眾

Hadoop學習--第二篇史上最詳細的Hadoop環境搭建

GitChat 作者:鳴宇淳 原文: 史上最詳細的Hadoop環境搭建 前言 Hadoop在大資料技術體系中的地位至關重要,Hadoop是大資料技術的基礎,對Hadoop基礎知識的掌握的紮實程度,會決定在大資料技術道路上走多遠。 這是一篇入門文章,Hadoop的學

golang語言學習第一如何定義變數,筆記及回顧

第一課主要講go語言如何定義變數 需要注意的是:go語言定義了變數一定要使用,不使用會提示出錯。這個機制比較好。 第一:完整變數定義法: var a int =3    注意:go語言跟其他語言定義變數不太一樣,型別放後面,符合人們思維的習慣。 第二種:var省略型別法: var a

django3Django學習筆記3Model,Template,View 基本概念

轉載:http://www.cnblogs.com/weichsel/archive/2012/10/16/2725554.html,侵權必刪 總體結構         Django是MTV結構,即:Model, Template, View &nb

深度學習第一windows+Anaconda下安裝tensorflow深度學習框架

一共四步,一會就成功! 第一步,首先需要安裝Anaconda。 它是一個庫管理工具,能夠管理不同環境,不同環境下可以安裝不同python版本以及其他庫。安裝Anaconda這一步非常的簡單去Anaconda官方網站(https://www.continuum.

轉載深度學習框架對比

 深度學習研究的熱潮持續高漲,各種開源深度學習框架也層出不窮,其中包括TensorFlow、Caffe、Keras、CNTK、Torch7、MXNet、Leaf、Theano、DeepLearning4、Lasagne、Neon,等等。然而TensorFlo

深度學習第一入門

近幾年深度學習的概念非常火,我們很幸運趕上並見證了這一波大潮的興起。記得2012年之前提及深度學習,大部分人並不熟悉,而之後一段時間裡,也有些人仍舊持懷疑的態度,覺得這一波浪潮或許與之前sparse coding類似,或許能持續火個兩三年,但終究要被某個新技術新

2Caffe學習系列(11)影象資料轉換成db(leveldb/lmdb)檔案

在深度學習的實際應用中,我們經常用到的原始資料是圖片檔案,如jpg,jpeg,png,tif等格式的,而且有可能圖片的大小還不一致。而在caffe中經常使用的資料型別是lmdb或leveldb,因此就產生了這樣的一個問題:如何從原始圖片檔案轉換成caffe中能夠執行的db(l

Tensorflow深度學習實戰06——Tensorflow實現ResNet

前言   ResNet(Residual Neural Network)由前微軟研究院的 Kaiming He 等4名華人提出(有興趣的可以點選這裡,檢視論文原文),通過使用 Residual Blocks 成功訓練152層深的神經網路,在 ILSVR

網易雲深度學習第一第一週程式設計作業

1.1Python Basics with Numpy (optional assignment) Welcome to your first assignment. This exercise gives you a brief introduction t

吳恩達深度學習第一第四周(深層神經網路)

打卡(1) 4.1 深層神經網路 * 符號約定:輸入層X=a[0],預測值ŷ =a[L]X=a[0],預測值y^=a[L] 打卡(2) 4.2 深層網路中前向傳播 單個樣本:

網易雲深度學習第一第三週程式設計作業

具有一個隱藏層的平面資料分類 第三週的程式設計任務: 構建一個含有一層隱藏層的神經網路,你將會發現這和使用邏輯迴歸有很大的不同。 首先先匯入在這個任務中你需要的所有的包。 -numpy是Python中與科學計算相關的基礎包 -sklearn提供簡單高效

吳恩達深度學習第一第三週課後作業

Planar data classification with one hidden layer Welcome to your week 3 programming assignment. It’s time to build your first

專欄 - 深度學習進行目標定位和識別

深度學習進行目標定位和識別 在這個專欄中,我們以RCNN作為首先第一篇,然後講解spp net,Fast RCNN,以及Faster RCNN,還有YOLO等等網路結構,按它的提出順序(因為後面提出的網路往往是針對前面網路的問題而

心得深度學習入門——訓練並測試自己資料集

經過幾天的努力,成功訓練自己的資料集,並進行了單張圖片的測試。 訓練過程中val準確率約為0.91。看起來效果還比較理想,是否已經過擬合還沒有進行確定。 在訓練過程中,最討厭的就是處理檔案路徑和檔案存放位置。 一、ImageNet分類部分: caffe模型下有一個ex