教程| 基礎入門:深度學習矩陣運算的概念和代碼實現

2020-12-05 機器之心Pro

本文由機器之心編輯,「機器之心」專注生產人工智慧專業性內容,適合開發者和從業者閱讀參考。點擊右上角即刻關注。

本文從向量的概念與運算擴展到矩陣運算的概念與代碼實現,對機器學習或者是深度學習的入門者提供最基礎,也是最實用的教程指導,為以後的機器學習模型開發打下基礎。

在我們學習機器學習時,常常遇到需要使用矩陣提高計算效率的時候。如在使用批量梯度下降迭代求最優解時,正規方程會採用更簡潔的矩陣形式提供權重的解析解法。而如果不了解矩陣的運算法則及意義,甚至我們都很難去理解一些如矩陣因子分解法和反向傳播算法之類的基本概念。同時由於特徵和權重都以向量儲存,那如果我們不了解矩陣運算,代碼實現將變得十分艱難。

什麼是線性代數?

在深度學習中,線性代數是一個強大的數學工具箱,它提供同時計算多維數組的方法。線性代數不僅會提供如同向量和矩陣那樣的結構來儲存這些數字,還會提供矩陣的加、減、乘、除和其他運算規則。

線性代數為什麼如此實用?

線性代數將複雜問題轉變為簡單、直觀和高效的計算問題。下面的例子可以表明實現同樣的功能,線性代數的代碼表達是如何的簡潔與美觀。

# Multiply two arrays x = [1,2,3]y = [2,3,4]product = []for i in range(len(x)): product.append(x[i]*y[i])

# Linear algebra versionx = numpy.array([1,2,3])y = numpy.array([2,3,4])x * y

線性代數怎樣應用到深度學習?

神經網絡將權重儲存在矩陣當中。而線性代數特別是在 GPU 上,可以對矩陣進行簡單迅捷的計算處理。實際上,GPU 的設計就是源於向量和矩陣計算處理的基本概念。這和圖像由像素塊陣列構成,視頻遊戲使用巨量、連續展開的矩陣生成引人注目的遊戲體驗是一樣的。GPU 會並行地操作整個矩陣裡元素,而不是一個接一個地處理

向量

向量由數字或其它項組成的一維陣列。在幾何學中,向量儲存了空間中一個點潛在的改變方向。向量 [3,-2] 也就代表著原點向(3,-2)這一點運動的趨向。若向量所具有的維度超過一維,那麼就稱之為矩陣

向量的符號表示

有很多符號方式都能表示向量,下面是在本篇文章中你可能會遇到的:

幾何學中的向量

向量一般表徵著一個點的運動,一個向量同時儲存其潛在變化的方向和大小。如下圖所示,在平面空間中畫出了向量 [-2,5],因為向量只儲存了方向和大小,那麼平移並不會改變向量的值,所以所有平移的向量(方向和大小不變)都是相等的。

標量運算

標量運算即為向量和數字間的運算。向量與數的運算就是向量內每一個元素與這一個數進行相應的運算。如下圖的一個標量運算:

向量間運算

在向量間的運算中,對應位置的值可以組合而產生一個新向量。第一個向量的第 i 個值只與第二個向量的第 i 個值相匹配。這也就意味著向量之間的維度必須相等才能進行運算。下圖表明向量之間的加減法是對應元素之間的加減,代碼表明了向量之間的加減和除法。

y = np.array([1,2,3])x = np.array([2,3,4])y + x = [3, 5, 7]y - x = [-1, -1, -1]y / x = [.5, .67, .75]

在 numpy 中,如果向量是一維的,那麼他就能看作是一個標量,與其他多維向量的運算就相當於一個數

向量乘法

向量的乘法有兩種類型:一種是點積,另一種是 Hadamard 積。

點積

兩個向量的點積結果是一個標量。向量和矩陣(矩陣乘法)的點積在深度學習中是最重要的運算之一

Hadamard 積

Hadamard 積是元素之間的乘積,並得出一個向量。從下圖可以看出來 Hadamard 積就是將向量對應元素相乘積。

y = np.array([1,2,3])x = np.array([2,3,4])y * x = [2, 6, 12]

向量場

向量場展示了如果我們運用一個向量函數(如向量加法或乘法等),其中任意點(x,y)會有什麼樣的運動傾向。在空間中給定一點,向量場就是我們使用的向量運算在該點的方向和大小。

該向量場很有意思,因為根據不同的出發點,其都會有不同的方向。出現這種情況是因為在該向量場中,向量背後儲存的項不是一個 5 或 2 那樣的實數,它是 2x 或 x^2 那樣的變量。對於圖表中的每一個點,我們將坐標軸變換為 2x 或 x^2,然後將起始點畫一個箭頭到新的坐標點,這樣就製成了上圖。向量場對機器學習算法(如梯度下降算法)的可視化十分重要。

矩陣

矩陣就是一個由數字或其它項組成的表格,只不過是該表格會有特定的加法、減法和乘法規則

矩陣的階

我們描述矩陣的維度由階來表達:即行數×列數(如 3×2)階矩陣。

a = np.array([

[1,2,3],[4,5,6]])a.shape == (2,3)

b = np.array([[1,2,3]])b.shape == (1,3)

矩陣的標量運算

矩陣的標量運算和向量的標量運算是一樣的。可以簡單地將標量和矩陣中的每一個元素做運算處理(如加、減、乘、除等)。

a = np.array([[1,2],[3,4]])a + 1[[2,3],[4,5]]

矩陣間的運算

為了能進行加減運算,兩個矩陣的階必須相等。然後我們可以對兩個矩陣相應的元素進行運算處理。如下圖就是兩階方陣的加法。

a = np.array([[1,2],[3,4]])b = np.array([[1,2],[3,4]])

a + b[[2, 4],[6, 8]]

a — b[[0, 0],[0, 0]]

Numpy broadcasting

在 Numpy 中,矩陣之間運算所需要的階相等可以通過一個稱之為 broadcasting 的機制變得不那麼嚴格。如果兩個矩陣相應的階(行數×列數)滿足下面兩個要求,那麼它們就是可以進行運算的:

兩個矩陣的階相等

矩陣的階有一個維度是 1

a = np.array([[1],[2]])b = np.array([[3,4],[5,6]])c = np.array([[1,2]])

# Same no. of rows# Different no. of columns# but a has one column so this worksa * b[[ 3, 4],[10, 12]]

# Same no. of columns# Different no. of rows# but c has one row so this worksb * c[[ 3, 8],[5, 12]]

# Different no. of columns# Different no. of rows# but both a and c meet the# size 1 requirement rulea + c[[2, 3],[3, 4]]

而在高維(三維或四維等)矩陣的情況下,矩陣間運算更有意思,不過在深度學習裡並不常見。

矩陣 Hadamard 乘積

Hadamard 乘積同樣是矩陣間的運算,即兩個矩陣間相同位置的元素相互乘積。

a = np.array([[2,3],[2,3]])b = np.array([[3,4],[5,6]])

# Uses python's multiply operatora * b[[ 6, 12],[10, 18]]

在 numpy 中,矩陣和向量的 Hadamard 乘積只需要兩個矩陣滿足 broadcasting 機制的要求就行。

矩陣轉置

神經網絡在處理不同大小的權重或輸入矩陣時,經常出現矩陣的階不符合矩陣乘法的要求。矩陣的轉置通過將矩陣旋轉一下以滿足矩陣乘法所需要的維度要求。下面,我們可以通過兩步完成矩陣的轉置。

1. 旋轉矩陣 90 度

2. 將每一行的元素都反向寫一遍

以下我們將矩陣 M 轉置為矩陣 T

a = np.array([ [1, 2], [3, 4]])

a.T[[1, 3],[2, 4]]

矩陣乘法

矩陣乘法是由一組乘法法則組成,他們共同作用以乘得一個新矩陣。

規則

並不是所有矩陣都能進行矩陣乘法運算的,如果兩個矩陣能相乘,那麼它需要滿足以下條件:

1. 第一個矩陣列的數量必須等於第二個矩陣行的數量

2. m×n 階矩陣左乘 n×k 階矩陣的結果是 m×k 階矩陣。新得出來矩陣就等於第一個矩陣的行數×第二矩陣的列數。

步驟

矩陣乘法的步驟和向量點積的過程是相似的,它們都是由對應位置的元素進行乘積並相加而得出。第一個矩陣每一行的維度和第二個矩陣每一列的維度相等,所以第一個矩陣第 i 行元素與第二個矩陣第 j 列對應元素的乘積和就等於新矩陣的第 i 行第 j 列的元素值。在下圖中,A 矩陣左乘 B 矩陣得到 C 矩陣。A 矩陣行向量與 B 矩陣列向量點積就等於 C 矩陣的元素,具體可以通過下圖 C 矩陣內部元素的構成來了解。

A 矩陣行向量 a1 與 B 矩陣列向量 b1 的點積,即下圖所示:

下面是另一個矩陣的乘積:

矩陣乘法是不可交換的(即AB ≠ BA)。因為不可能預期在改變向量的部分後還能得到相同的結果,而且第一個矩陣的列數必須要和第二個矩陣的行數相同,也可以看出為什麼矩陣相乘的順序會影響其結果。雖然矩陣乘法是人為的規則,但它確實大大簡化了計算的表達,可以將巨大的計算量很簡潔地表達出來,這一點對機器學習算法的開發和使用有重要的作用

最後你可以用以下案例檢測一下是否你已經掌握了矩陣運算的基本原理:

下面矩陣乘法的階是多少?

下面矩陣乘法的階是多少?

下面矩陣的乘法是多少?

下面矩陣的乘法是多少?

下面矩陣的乘法是多少?

使用 Numpy 進行矩陣乘法運算

在 Numpy 中,np.dot(a,b) 函數可以進行向量和矩陣點積。並且該函數還有許多有意思的特徵,所以我建議你在使用該函數前先看看該函數的用法:https://docs.scipy.org/doc/numpy/reference/generated/numpy.dot.html

a = np.array([[1, 2]])a.shape == (1,2)

b = np.array([[3, 4],[5, 6]])b.shape == (2,2)

# Multiplymm = np.dot(a,b)mm == [13, 16]mm.shape == (1,2)

深度學習通常會有巨大的計算量。從最開始的特徵輸入,我們會使用一個個高維向量將特徵輸入到神經網絡中,而每一層的權重作為列向量組成一個權重矩陣。每一層的正向傳播都需要使用矩陣乘法進行計算,而反向傳播更需要理解矩陣運算才能對其運行原理有一個較為深入的理解。本文是矩陣運算的基礎性文章,其不僅對概念的理解很是重要,同時在新手開始學著搭建機器學習系統時更為有用,因為矩陣運算的代碼在實際操作中是我們看懂一段代碼或寫出一段代碼的基礎。並且採用矩陣運算代碼實現也遠比採用循環語句或條件語句代碼實現的算法要簡潔易讀得多。

相關焦點

  • 從系統和代碼實現角度解析TensorFlow的內部實現原理|深度
    雷鋒網按:本文作者姚健,畢業於中科院計算所網絡數據實驗室,曾就職於360天眼實驗室,主要從事深度學習和增強學習相關研究工作。目前就職於騰訊MIG事業部,從事神經機器翻譯工作。摘要2015年11月9日,Google發布深度學習框架TensorFlow並宣布開源,並迅速得到廣泛關注,在圖形分類、音頻處理、推薦系統和自然語言處理等場景下都被大面積推廣。TensorFlow系統更新快速,官方文檔教程齊全,上手快速且簡單易用,支持Python和C++接口。
  • 深度學習入門教程:手把手帶你用Numpy實現卷積神經網絡(一)
    本教程由深度學習中文社區(Studydl.com)持續發布與更新, 教程中完整代碼已上傳至github上, 可關注我百家號後發送消息"CNN代碼", 獲得地址.前言Numpy是一個非常好用的python科學計算的庫,CNN是現在視覺領域深度學習的基礎之一。
  • 線性代數入門——矩陣的轉置運算及對稱矩陣的概念
    系列簡介:這個系列文章講解線性代數的基礎內容,注重學習方法的培養。
  • 資源|用Python和NumPy學習《深度學習》中的線性代數基礎
    本文系巴黎高等師範學院在讀博士 Hadrien Jean 的一篇基礎學習博客,其目的是幫助初學者/高級初學者基於深度學習和機器學習來掌握線性代數的概念。掌握這些技能可以提高你理解和應用各種數據科學算法的能力。
  • 深度學習基礎:張量運算
    字幕組雙語原文:深度學習基礎:張量運算英語原文:Tensor Operations — Basic Building Blocks of Deep Learning翻譯:雷鋒字幕組(大表哥、Shangru)2012-至今:深度學習爆炸時代在2012年的Imagenet運動之後,深度學習取得了突飛猛進的發展。
  • 一文弄清深度學習、TensorFlow和張量之間的關係
    我們今天所用的許多深度學習系統都是基於張量代數的,比如谷歌的TensorFlow,但是張量代數與深度學習的關係到底如何?那麼,其核心是,線性代數是由相當簡單和非常有規律可循的操作組成的,包括對一維和二維數字數組(在本文中通常稱之為向量和矩陣)的重複乘法和加法運算,並且它是極其普遍的,許多問題都可以通過線性方法求解或近似。這些範圍涵蓋的領域非常廣闊,從計算機遊戲中圖像的渲染到核武器的設計,以及這些極端之間的其他大範圍的應用都是可以利用線性代數來進行運算的。
  • 如何實現高速卷積?深度學習庫使用了這些「黑魔法」
    而當我自己做了一個簡單的卷積層實現,發現這一個層的運行時間竟然超過2秒時,我非常震驚。大家都知道,現代深度學習庫對大部分運算具備高度優化的生產級實現。但是這些庫使用了哪些人類不具備的「黑魔法」呢?它們如何將性能提升100倍?當它們「優化」或加速神經網絡運算時,它們在做什麼?當談及高性能/高效DNN時,我常常問(或被問及)這些問題。
  • matlab矩陣及其運算(五)
    如果公眾號文章對您有幫助,別忘了點擊分享和「在看」哦!若您對公眾號有什麼意見或建議,請在公眾號中回復或在任意文章底部留言!二狗在MATLAB矩陣及其運算(三)篇章中,給大家留下關於自編行列式運算的小程序,本期二狗在此給大家解答一下自編行列式程序思路及代碼,再給大家講一下廣逆矩陣的概念,為深入學習廣逆矩陣做準備。
  • MIT Taco項目:自動生成張量計算的優化代碼,深度學習加速效果提高...
    相比起現有的非優化軟體包,該系統可實現100倍的加速,其性能與特定稀疏數據操作的精細手工優化代碼相當,但程式設計師的工作要少得多。該系統的名字叫Taco,即「張量代數編譯器」的縮寫。在計算機科學上,類似亞馬遜的表格這樣的數據結構被稱為「矩陣」,張量只是一個矩陣的更高維的模擬。
  • 還不會使用PyTorch框架進行深度學習的小夥伴,看過來
    選自heartbeat.fritz.ai作者:Derrick Mwiti機器之心編譯參與:Geek AI、王淑婷這是一篇關於使用 PyTorch 框架進行深度學習的教程,讀完以後你可以輕鬆地將該框架應用於深度學習模型。
  • 機器學習第一步,從向量和矩陣開始!
    這時候,就需要我們回歸基本概念——從向量、矩陣開始,讀懂機器學習語言。不同在何處?這樣一來,向量便能搭載著數據的邏輯關係及權重,從而讓數據集被輸入編碼器,形成數組,隨之進入神經網絡模型運算。而這個龐大的數組,通常以矩陣的方式出現。所謂矩陣(Matrix),當然不是《黑客帝國》裡的那個邪惡智能體Matrix了,不過它的確有這方面的潛質。
  • 想入門機器學習?機器之心為你準備了一份中文資源合集
    機器之心也介紹過許多數學基礎與概念:基礎入門:深度學習矩陣運算的概念和代碼實現想了解概率圖模型?你要先理解圖論的基本定義與形式深度神經網絡中的數學,對你來說會不會太難?Reddit 熱門話題:如何閱讀並理解論文中的數學內容?
  • Keras vs PyTorch:誰是第一深度學習框架?
    MXNet、Chainer 和 CNTK 目前應用不那麼廣泛。  三、Keras vs PyTorch:易用性和靈活性  Keras 和 PyTorch 的運行抽象層次不同。  Keras 是一個更高級別的框架,將常用的深度學習層和運算封裝進乾淨、樂高大小的構造塊,使數據科學家不用再考慮深度學習的複雜度。
  • Python學習第116課——numpy.dot和矩陣相乘的數學運算
    對於二維以上的數組的點乘,就會用到矩陣相乘。對於矩陣相乘,我們直接推導最一般最基本的情況,就是ndarray(我們可以把它理解為n維的數組)和mdarray(我們可以把它理解為m維的數組)這兩個數組進行相乘。所以我們必須要接觸matrix(矩陣)的一些概念,我們可以把matrix看做是一種非常有用的數據儲存的結構。
  • 一文讀懂深度學習中的矩陣微積分,fast.ai創始人&ANTLR之父出品
    魚羊 編譯整理量子位 報導 | 公眾號 QbitAI想要真正了解深度神經網絡是如何訓練的,免不了從矩陣微積分說起。這位ANTLR之父和fast.ai創始人Jeremy Howard一起推出了一篇免費教程,旨在幫你快速入門深度學習中的矩陣微積分。簡明,易懂。
  • 從FM推演各深度CTR預估模型(附代碼)
    此處附上FM的TensorFlow代碼實現,完整數據和代碼請參考網盤。此處附上FNN的代碼實現,完整數據和代碼請參考網盤。此處DeepFM的代碼實現,完整數據和代碼請參考網盤。網盤連結:https://pan.baidu.com/s/1eDwOxweRDPurI2fF51EALQ9.NFM:通過逐元素乘法延遲FM的實現過程我們再回到考慮領域信息的FM,它仍有改進的空間。
  • Adreno GPU 矩陣乘法——第1講:OpenCL優化
    由於近來依賴於卷積的深度學習引起廣泛關注,矩陣乘法(MM)運算也在GPU上變得流行起來。我們也收到開發人員的反饋,希望利用配備Adreno™GPU的Qualcomm®Snapdragon™處理器加速深度學習(DL)應用。
  • 深度學習框架太抽象?其實不外乎這五大核心組件
    張量(Tensor)張量是所有深度學習框架中最核心的組件,因為後續的所有運算和優化算法都是基於張量進行的。幾何代數中定義的張量是基於向量和矩陣的推廣,通俗一點理解的話,我們可以將標量視為零階張量,矢量視為一階張量,那麼矩陣就是二階張量。舉例來說,我們可以將任意一張RGB彩色圖片表示成一個三階張量(三個維度分別是圖片的高度、寬度和色彩數據)。
  • 用於深度強化學習的結構化控制網絡(ICML 論文講解)
    介紹 在本教程中,我想介紹一下我們在ICML上發表的工作中提出的結構化控制網絡的簡單實現,並在最後展示了案例研究的介紹。 我鼓勵您在完成本教程之前先閱讀本文。這兩個流可以被視為獨立的子策略,其輸出被融合為強化學習的策略網絡。 此體系結構概述的目的是證明這兩個模塊可以使用策略實現,這些策略在策略網絡上強制執行特定於任務的先驗條件,以更好地提高採樣效率和最終性能。
  • 教程| 從特徵分解到協方差矩陣:詳細剖析和實現PCA算法
    機器之心編譯參與:蔣思源本文先簡要明了地介紹了特徵向量和其與矩陣的關係,然後再以其為基礎解釋協方差矩陣和主成分分析法的基本概念,最後我們結合協方差矩陣和主成分分析法實現數據降維。本文不僅僅是從理論上闡述各種重要概念,同時最後還一步步使用 Python 實現數據降維。首先本文的特徵向量是數學概念上的特徵向量,並不是指由輸入特徵值所組成的向量。