成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

基礎入門:深度學習矩陣運算的概念和代碼實現(xiàn)

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

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

深度學習矩陣運算的概念和代碼實現(xiàn)

一、什么是線性代數(shù)?

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

二、線性代數(shù)為什么如此實用?

線性代數(shù)將復雜問題轉變?yōu)楹唵巍⒅庇^和高效的計算問題。下面的例子可以表明實現(xiàn)同樣的功能,線性代數(shù)的代碼表達是如何的簡潔與美觀。

  1. # Multiply two arrays  
  2. x = [1,2,3] 
  3. y = [2,3,4] 
  4. product = [] 
  5. for i in range(len(x)): 
  6.     product.append(x[i]*y[i]) 
  7. # Linear algebra version 
  8. x = numpy.array([1,2,3]) 
  9. y = numpy.array([2,3,4]) 
  10. x * y 

三、線性代數(shù)怎樣應用到深度學習?

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

四、向量

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

1. 向量的符號表示

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

 向量的符號表示

2. 幾何學中的向量

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

3. 標量運算

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

標量運算

4. 向量間運算

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

向量間運算

 

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

在 numpy 中,如果向量是一維的,那么他就能看作是一個標量,與其他多維向量的運算就相當于一個數(shù)。

5. 向量乘法

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

6. 點積

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

7. Hadamard 積

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

Hadamard 積

 

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

8. 向量場

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

向量場

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

五、矩陣

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

1. 矩陣的階

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

矩陣的階

  1. a = np.array([ 
  2.  [1,2,3],  
  3.  [4,5,6] 
  4. ]) 
  5. a.shape == (2,3) 
  6. b = np.array([ 
  7.  [1,2,3] 
  8. ]) 
  9. b.shape == (1,3) 

2. 矩陣的標量運算

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

 矩陣的標量運算

 

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

3. 矩陣間的運算

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

 矩陣間的運算

 

  1. a = np.array([ 
  2.  [1,2], 
  3.  [3,4] 
  4. ]) 
  5. b = np.array([ 
  6.  [1,2], 
  7.  [3,4] 
  8. ]) 
  9. a + b 
  10. [[2, 4], 
  11.  [6, 8]] 
  12. a — b 
  13. [[0, 0], 
  14.  [0, 0]] 

4. Numpy broadcasting

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

  • 兩個矩陣的階相等
  • 矩陣的階有一個維度是 1
  1. a = np.array([ 
  2.  [1], 
  3.  [2] 
  4. ]) 
  5. b = np.array([ 
  6.  [3,4], 
  7.  [5,6] 
  8. ]) 
  9. c = np.array([ 
  10.  [1,2] 
  11. ]) 
  12. # Same no. of rows 
  13. # Different no. of columns 
  14. # but a has one column so this works 
  15. a * b 
  16. [[ 3, 4], 
  17.  [10, 12]] 
  18. # Same no. of columns 
  19. # Different no. of rows 
  20. # but c has one row so this works 
  21. b * c 
  22. [[ 3, 8], 
  23.  [5, 12]] 
  24. # Different no. of columns 
  25. # Different no. of rows 
  26. # but both a and c meet the  
  27. # size 1 requirement rule 
  28. a + c 
  29. [[2, 3], 
  30.  [3, 4]] 

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

5. 矩陣 Hadamard 乘積

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

 

  1. a = np.array( 
  2. [[2,3], 
  3.  [2,3]]) 
  4. b = np.array( 
  5. [[3,4], 
  6.  [5,6]]) 
  7. # Uses python's multiply operator 
  8. a * b 
  9. [[ 6, 12], 
  10.  [10, 18]] 

 

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

6. 矩陣轉置

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

  • 旋轉矩陣 90 度
  • 將每一行的元素都反向寫一遍

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

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

六、矩陣乘法

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

1. 規(guī)則

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

  • ***個矩陣列的數(shù)量必須等于第二個矩陣行的數(shù)量
  • m×n 階矩陣左乘 n×k 階矩陣的結果是 m×k 階矩陣。新得出來矩陣就等于***個矩陣的行數(shù)×第二矩陣的列數(shù)。

2. 步驟

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

矩陣乘法

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

矩陣乘法

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

矩陣乘法

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

***你可以用以下案例檢測一下是否你已經(jīng)掌握了矩陣運算的基本原理:

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

矩陣乘法的階

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

矩陣乘法的階

下面矩陣的乘法是多少?

矩陣乘法的階

下面矩陣的乘法是多少?

矩陣乘法的階

下面矩陣的乘法是多少?

矩陣乘法的階

七、使用 Numpy 進行矩陣乘法運算

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

  1. a = np.array([ 
  2.  [1, 2] 
  3.  ]) 
  4. a.shape == (1,2) 
  5. b = np.array([ 
  6.  [3, 4], 
  7.  [5, 6] 
  8.  ]) 
  9. b.shape == (2,2) 
  10. # Multiply 
  11. mm = np.dot(a,b) 
  12. mm == [13, 16] 
  13. mm.shape == (1,2) 

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

原文:

https://medium.com/towards-data-science/linear-algebra-cheat-sheet-for-deep-learning-cd67aba4526c

【本文是51CTO專欄機構“機器之心”的原創(chuàng)譯文,微信公眾號“機器之心( id: almosthuman2014)”】

 

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2017-03-21 11:02:59

基礎深度學習備忘錄

2018-09-29 10:05:54

深度學習神經(jīng)網(wǎng)絡神經(jīng)元

2017-05-02 14:45:11

深度學習機器學習人工神經(jīng)網(wǎng)絡

2021-02-26 10:02:13

人工智能深度學習機器學習

2017-04-11 12:05:07

機器學習python矩陣運算

2017-09-18 10:48:06

深度學習零基礎入門

2023-05-17 10:16:04

ORM工具包SQLAlchemy

2016-09-18 21:14:54

JavascriptPromiseWeb

2023-03-19 17:24:43

2017-03-27 16:35:23

2021-02-07 10:36:34

機器學習人工智能圖表

2024-03-19 08:54:20

Rust語言內存管理應用程序開發(fā)

2024-11-11 08:00:00

PyTorch深度學習

2023-04-03 10:04:36

Java變量類型

2025-01-02 15:40:23

2016-12-27 14:06:36

Python代碼基礎

2021-04-13 10:25:33

人工智能深度學習

2016-11-01 15:32:43

深度學習

2009-08-13 10:52:03

C#基礎概念

2009-08-13 11:10:32

C#基礎概念
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日本黄色片免费在线观看 | 色伊人网 | 大香在线伊779 | 97精品久久 | 国产精品久久午夜夜伦鲁鲁 | 天天拍天天插 | 亚洲444kkkk在线观看最新 | www精品美女久久久tv | 亚洲高清一区二区三区 | 国产免费av在线 | 久久人人网 | 免费看a | 国产精品免费一区二区三区 | 亚洲精品黄色 | 国产乱码一二三区精品 | 久久精品中文 | 国产黄色av网站 | 麻豆av免费观看 | 91精品国产一区二区三区 | 国产亚洲一区二区三区 | 国产欧美精品一区二区色综合 | 日韩视频精品 | 久久久91精品国产一区二区精品 | 毛片a区 | 久久精品国产精品青草 | 亚洲国产中文字幕 | 成人精品免费视频 | www.成人久久 | 天天射天天干 | 精品久久久久久国产 | 国产一区二区在线视频 | 欧美精品一区二区三区在线播放 | 一区视频 | xx性欧美肥妇精品久久久久久 | 午夜不卡福利视频 | 久色视频在线观看 | 中文在线一区 | 欧美最猛性xxxxx亚洲精品 | 久久99国产精品久久99果冻传媒 | 日韩欧美久久精品 | 毛片入口 |