Python深度學習線性代數示例詳解
標量
標量由普通小寫字母表示(例如,x、y和z)。我們用 R \mathbb{R} R表示所有(連續)實數標量的空間。
標量由隻有一個元素的張量表示。下面代碼,我們實例化瞭兩個標量,並使用它們執行一些熟悉的算數運算,即加法、乘法、除法和指數。
import torch x = torch.tensor([3.0]) y = torch.tensor([2.0]) x + y, x * y, x / y, x ** y
tensor([5]), tensor([6]), tensor([1.5]), tensor([9])
向量
向量是標量值組成的列表,我們將這些標量值稱為向量的元素或分量。
在數學表示法中,我們通常將向量記為粗體、小寫的符號(例如, x \mathbf{x} x、 y \mathbf{y} y和 z \mathbf{z} z)
我們通過一維張量處理向量。一般來說,張量可以具有任意長度,最大長度取決於機器的內存限制。
x = torch.arange(4)
tensor([0, 1, 2, 3])
大量文獻認為列向量是向量的默認方向。在數學中,向量 x \mathbf{x} x可以寫為:
我們可以通過張量的索引來訪問任一元素。
x[3]
tensor(3)
長度、維度和形狀
在數學表示法中,如果我們想說一個向量 x \mathbf{x} x由 n n n個實值標量組成,我們可以將其表示為 x ∈ R n \mathbf{x} \in \mathbb{R}^{n} x∈Rn。向量的長度通常稱為向量的維度。
與普通的Python數組一樣,我們可以通過調用Python的內置len()函數來訪問張量的長度。
len(x)
4
當用張量表示一個向量(隻有一個軸)時,我們也可以通過.shape屬性訪問向量的長度。形狀(shape)是一個元組,列出瞭張量沿每個軸的長度(維數)。對於隻有一個軸的張量,形狀隻有一個元素。
x.shape
torch.Size([4])
註意,維度(dimension)這個詞在不同上下文時往往會有不同的含義,這經常會使人感到困惑。為瞭清楚起見,我們在此明確一下。向量或軸的維度被用來表示向量或軸的長度,即向量或軸的元素數量。然而,張量的維度用來表示張量具有的軸數。在這個意義上,張量的某個軸的維數就是這個軸的長度。
矩陣
當矩陣具有相同數量的行和列時,其形狀將變為正方形;因此,它被稱為方矩陣。
當調用函數來實例化張量時,我們可以通過指定兩個分量m和n來創建一個形狀為 m×n的矩陣。
A = torch.arange(20).reshape(5, 4)
tensor([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19]])
A.T
tensor([[0, 4, 8, 12, 16], [1, 5, 9, 13, 17], [2, 6, 10, 14, 18], [3, 7, 11, 15, 19]])
矩陣是有用的數據結構:它們允許我們組織具有不同變化模式的數據。例如,我們矩陣中的行可能對應於不同的房屋(數據樣本),而列可能對應於不同的屬性。因此,盡管單個向量的默認方向是列向量,但在表示表格數據集的矩陣中,將每個數據樣本作為矩陣中的行向量更為常見。
張量
張量為我們提供瞭描述具有任意數量軸的 n n n維數組的通用方法。
當我們開始處理圖像時,張量將變得更加重要,圖像以 n n n維數組形式出現,其中3個軸對應於高度、寬度以及一個通道(channel)軸,用於堆疊顏色通道(紅色、綠色和藍色)。現在,我們將跳過高階張量,集中在基礎知識上。
X = torch.arange(24).reshape(2, 3, 4)
tensor([[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11]], [[12, 13, 14, 15], [16, 17, 18, 19], [20, 21, 22, 23]]])
張量算法的基本性質
任何按元素的一元運算都不會改變其操作數的形狀。同樣,給定具有相同形狀的任意兩個張量,任何按元素二元運算的結果都將是相同形狀的張量。例如,將兩個相同形狀的矩陣相加會在這兩個矩陣上執行元素的加法。
A = torch.arange(20, dtype=torch.float32).reshape(5,4) B = A.clone A, A + B
tensor([[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10, 11], [12, 13, 14, 15], [16, 17, 18, 19]]), tensor([[0, 2, 4, 6], [8, 10, 12, 14], [16, 18, 20, 22], [24, 26, 28, 30], [32, 34, 36, 38]])
具體而言,兩個矩陣按元素乘法稱為哈達瑪積。
A * B
tensor([[0, 1, 4, 9], [16, 25, 36, 49], [64, 81, 100, 121], [144, 169, 196, 225], [256, 289, 324, 361]])
將張量乘以或加上一個標量不會改變張量的形狀,其中張量的每個元素都將與標量相加或相乘。
降維
我們可以對任意張量進行一個有用的操作是計算其元素的和。在代碼中,我們可以調用計算求和的函數:
x = torch.arange(4, dtype = torch.float32) x.sum()
tensor(6)
默認的情況下,調用求和函數會沿所有的軸降低張量的維度,使它變為一個標量。我們還可以指定張量沿哪一個軸來通過求和降低維度。以矩陣為例,為瞭通過求和所有行的元素來降維(軸0),我們可以在調用函數時指定axis = 0。由於輸入矩陣沿著0軸降維以生成輸出張量,因此輸入的軸0的維數在輸出形狀中丟失。
A.shape
torch.Size([5, 4])
A_sum_axis0 = A.sum(axis = 0) A_sum_axis0, A_sum_axis0.shape
tensor([40, 45, 50, 55]), torch.Size([4])
指定axis = 1將通過匯總所有列的元素降維(軸1)。因此,輸入的軸1的維數在輸出形狀中消失。
A_sum_axis1 = A.sum(axis = 1) A_sum_axis1, A_sum_axis1.shape
tensor([6, 22, 38, 54, 70]), torch.Size([5])
沿著行和列對矩陣求和,等價於對矩陣的所有元素進行求和。
A.sum(axis=[0, 1])
tensor(190)
一個與求和相關的量是平均值。在代碼中,我們可以調用函數來計算任意形狀張量的平均值。
A.mean()
同樣,計算平均值的函數也可以沿指定軸降低張量的維度。
A.mean(axis = 0)
點積
最基本的操作是點積。
給定兩個向量,點積是它們相同位置的按元素乘積的和。
y = torch.ones(4, dtype = torch.float32) x, y, torch.dot(x, y)
tensor([0, 1, 2, 3]), tensor([1, 1, 1, 1]), tensor(6)
矩陣-矩陣乘法
在下面的代碼中,我們在A和B上執行矩陣乘法。這裡的A是一個5行4列的矩陣,B是一個4行3列的矩陣。相乘後,我們得到一個5行3列的矩陣。
B = torch.ones(4, 3) torch.mm(A, B)
范數
線性代數中最有用的一些運算符是范數。非正式地說,一個向量的范數告訴我們一個向量有多大。這裡考慮的大小(size)概念不涉及維度,而是分量的大小。
在線性代數中,向量范數是將向量映射到標量的函數 f f f。向量范數要滿足一些屬性。給定任意向量 x \mathbf{x} x,第一個性質來說,如果我們按常數因子 α \alpha α縮放向量的所有元素,其范數也會按相同常數因子的絕對值縮放:
第二個性質是我們熟悉的三角不等式:
第三個性質簡單地說范數必須是非負的。
最後一個性質要求范數最小為0,當且僅當向量全由0組成。
u = torch.tensor([3, 4]) torch.norm(u)
u = torch.tensor([3, 4]) torch.abs(u).sum()
tensor(7)
torch.norm(torch.ones((4, 9)))
范數和目標:
在深度學習中,我們經常試圖解決優化問題:最大化分配給觀測數據的概率;最小化預測和真實觀測之間的距離。用向量表示物品(如單詞、產品或新聞文章),以便最小化相似項目之間的距離,最大化不同項目之間的距離。通常,目標,或許是深度學習算法最終要的組成部分(除瞭數據),被表達為范數。
以上就是Python深度學習線性代數示例詳解的詳細內容,更多關於Python線性代數的資料請關註WalkonNet其它相關文章!
推薦閱讀:
- 解決numpy和torch數據類型轉化的問題
- pytorch tensor計算三通道均值方式
- PyTorch中Tensor和tensor的區別及說明
- Python Numpy中ndarray的常見操作
- pytorch算子torch.arange在CPU GPU NPU中支持數據類型格式