numpy的廣播機制到底是什麼鬼?

"

本實驗將讓你輕鬆搞定什麼是numpy的廣播?到底怎麼廣播?

numpy的廣播機制到底是什麼鬼?

簡單AI實驗室是面向學校、培訓機構的人工智能編程實驗平臺。

網址:www.easyailab.cn

概述

在機器學習編程中經常會聽到廣播機制(broadcasting),我剛接觸這個概念時一下就被搞懵圈了,什麼矩陣形狀、維度、階、後緣維度都是什麼鬼?不過別擔心,看完這個實驗,讓你輕鬆搞定什麼是numpy的廣播?到底怎麼廣播?

知識點

  • 什麼是廣播機制
  • 廣播機制的優點
  • 廣播機制的一般性規則

實驗指南

  • 點擊原文鏈接可預覽實驗內容
  • 註冊www.easyailab.cn,加入簡單AI實驗室專欄課程可在線調試實驗
  • 實驗討論答疑請加微信fancyfreeman註明申請加入實驗討論群

實驗內容

什麼是廣播機制(broadcasting)?

廣播是numpy中對兩個形狀不同的矩陣進行數學計算的處理機制。較小的矩陣被“廣播”到與較大矩陣相同的形狀尺度上,使它們對等可以進行數學計算。

先看一個簡單的例子

如果想讓一個數組中的每個元素都乘以2,應該怎麼做?下面用非廣播機制和非廣播機制分別實現:

Numpy操作通常由成對的陣列完成,矩陣的元素按照一一對應的方式進行運算(這種方式也叫element-by-element或者element-wise)。最簡單的情形是兩個數組有一樣的形狀,例如下面的例子,a和b的形狀都是(3,),仔細觀察表示形狀的列表,裡面只有1個數字3,所以這是一維數組,3表示數組在這一維度上的長度是3。

numpy的廣播機制到底是什麼鬼?

Numpy的廣播機制放寬了對矩陣形狀的限制。最簡單的情形是一個矩陣和一個標量值相乘,如下面的例子,a的形狀是(3,),b的形狀是(),姑且把標量想象為一個沒有維度的點吧,它的形狀就是一個空空如也的括號!

numpy的廣播機制到底是什麼鬼?

上面兩種方式,c的結果都是一樣的,a的形狀是(3,);b的形狀是(),表示0維;c的形狀與a相同,是1維的。

較小的矩陣b被“廣播”到與較大矩陣a相同的形狀尺度上,然後按照一一對應的方式(element-by-element,element-wise)進行計算,實際上,Numpy並不需要真的複製這些標量值,所以廣播運算在內存和計算效率上都非常高效。

廣播的一般性規則

Numpy的Universal functions 中要求輸入的數組shape是一致的,當數組的shape不相等的時候,則會使用廣播機制,調整數組使得shape一樣,滿足規則,則可以運算,否則就出錯,我將廣播的過程總結為兩個步驟:

第一步、判斷數組的形狀是否兼容:將輸入數組的形狀右對齊,左邊補1,所有的維度都滿足以下兩個條件之一,則數組形狀兼容,可以廣播:

  • 條件1:判斷兩個數組的後緣維度(trailing dimension,即從末尾開始算起的維度)的軸長度是否相等
  • 條件2:判斷兩個數組兩個數組的後緣維度其中一方的長度是否為1

第二步、如果兼容,則在各個維度上,將長度為1或者為空的部分進行復制。

這樣說還很抽象,例子不用多,下面用一個典型的例子說明就夠了:

例 一個3維數組與2維數組相加

numpy的廣播機制到底是什麼鬼?

第一步、靠右對齊形狀,左邊補1,判斷兼容性

numpy的廣播機制到底是什麼鬼?

可以看出a和b的形狀不同,但是形狀右對齊後,後緣維度中右一維度的長度都是2,因此滿足條件1;右二維度,a的長度是1,滿足條件2;右三維度,由於b的形狀左邊補1,故也滿足條件2。結果的形狀就是兩個數組各個維度上的長度取最大值組成的形狀,即(3,4,2)

第二步、形狀如果兼容,再將數組的元素進行延展(複製)。在每個維度上,將較小的尺寸延展到較大的尺寸上。在這個例子中,a和b都需要進行延展。a在軸1上廣播,b在軸0上廣播,這裡的軸是相對於結果的形狀(3,4,2)而言的。

下面是代碼驗證:

numpy的廣播機制到底是什麼鬼?

在TensorFlow當中計算張量的時候也是用廣播機制,並且和numpy的廣播機制是一樣的。

-END-

numpy的廣播機制到底是什麼鬼?


分享到:


相關文章: