當前位置:
首頁 > 新聞 > 基礎入門:深度學習矩陣運算的概念和代碼實現

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

選自Medium

機器之心編譯

參與:蔣思源


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

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

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

什麼是線性代數?

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

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

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

# Multiply two arrays

# Linear algebra version

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

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

向量

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

向量的符號表示

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

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

幾何學中的向量

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

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

標量運算

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

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

向量間運算

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

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

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

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

向量乘法

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

點積

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

Hadamard 積

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

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

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

向量場

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

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

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

矩陣

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

矩陣的階

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

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

a = np.array([

b = np.array([

矩陣的標量運算

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

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

a = np.array(

矩陣間的運算

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

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

a = np.array([

a + b

a — b

Numpy broadcasting

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

  • 兩個矩陣的階相等

  • 矩陣的階有一個維度是 1

a = np.array([

# Same no. of rows

# Same no. of columns

# Different no. of columns

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

矩陣 Hadamard 乘積

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

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

a = np.array(

# Uses python"s multiply operator

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

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

矩陣轉置

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

1. 旋轉矩陣 90 度

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

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

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

a = np.array([

[1, 2],

[3, 4]])

a.T

矩陣乘法

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

規則

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

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([

b = np.array([

# Multiply

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

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 機器之心 的精彩文章:

如果無人駕駛是大勢所趨,還會有 24 個行業被顛覆
ICML 2017首日公布兩大獎項:斯坦福大學獲最佳論文獎
弱監督視頻物體識別新方法:TD-Graph LSTM
美國沃爾瑪正在發生驚人的事,4700 家店用機器取代了員工
金融科技與銀行的恩怨錄:要合作?這些痛點必須剔除

TAG:機器之心 |

您可能感興趣

強化學習的基本概念與代碼實現
機器學習入門:決策樹學習概述與實現
實踐入門NLP:基於深度學習的自然語言處理
入門|機器學習第一課:決策樹學習概述與實現
入門 | 機器學習第一課:決策樹學習概述與實現
深度學習中的正則化技術概述
深入淺出機器學習的基本原理與基礎概念
深度學習工程模板:簡化載入數據、構建網路、訓練模型和預測樣本的流程
簡述深度學習預訓練和正則化
使用實體嵌入的結構化數據進行深度學習
學習的理想與現實
什麼是深度強化學習:人工智慧和深度學習的下一步
機器學習第一課:決策樹學習概述與實現
入門 | 初學機器學習:直觀解讀KL散度的數學概念
論強化學習和概率推斷的等價性:一種全新概率模型
開放性體現課程改革的理念,促進學生的歷史學習和終身發展
深度學習之基礎網路演進、分類與定位的權衡
實戰深度強化學習DQN-理論和實踐
入門深度學習的誤區
學習風水最基礎知識總匯-學會了學習周易、風水就算是入門了