chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線(xiàn)課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

PyTorch入門(mén)須知PyTorch教程-2.3. 線(xiàn)性代數(shù)

jf_bzMfoexS ? 來(lái)源:PyTorch入門(mén) ? 作者:PyTorch入門(mén) ? 2023-06-05 15:15 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

到目前為止,我們可以將數(shù)據(jù)集加載到張量中,并使用基本的數(shù)學(xué)運(yùn)算來(lái)操縱這些張量。要開(kāi)始構(gòu)建復(fù)雜的模型,我們還需要一些線(xiàn)性代數(shù)工具。本節(jié)簡(jiǎn)要介紹了最基本的概念,從標(biāo)量算術(shù)開(kāi)始,一直到矩陣乘法。

import torch

from mxnet import np, npx

npx.set_np()

from jax import numpy as jnp

import tensorflow as tf

2.3.1. 標(biāo)量

大多數(shù)日常數(shù)學(xué)都是一次處理一個(gè)數(shù)字。正式地,我們稱(chēng)這些值為標(biāo)量。例如,帕洛阿爾托的氣溫適中72華氏度。如果您想將溫度轉(zhuǎn)換為攝氏度,您可以計(jì)算表達(dá)式c=59(f?32), 環(huán)境f到 72. 在這個(gè)等式中,值5,9, 和 32是標(biāo)量。變量c和f代表未知標(biāo)量。

我們用普通的小寫(xiě)字母表示標(biāo)量(例如,x, y, 和z) 和所有(連續(xù))實(shí)值標(biāo)量的空間 R. 為了方便起見(jiàn),我們將跳過(guò)嚴(yán)格的空間定義。請(qǐng)記住這個(gè)表達(dá)式x∈R是一種正式的說(shuō)法 x是一個(gè)實(shí)值標(biāo)量。符號(hào)∈(發(fā)音為“in”)表示集合中的成員。例如, x,y∈{0,1}表示x和y是只能取值的變量0或者1.

標(biāo)量被實(shí)現(xiàn)為僅包含一個(gè)元素的張量。下面,我們分配兩個(gè)標(biāo)量并執(zhí)行熟悉的加法、乘法、除法和求冪運(yùn)算。

x = torch.tensor(3.0)
y = torch.tensor(2.0)

x + y, x * y, x / y, x**y

(tensor(5.), tensor(6.), tensor(1.5000), tensor(9.))

x = np.array(3.0)
y = np.array(2.0)

x + y, x * y, x / y, x ** y

(array(5.), array(6.), array(1.5), array(9.))

x = jnp.array(3.0)
y = jnp.array(2.0)

x + y, x * y, x / y, x**y

No GPU/TPU found, falling back to CPU. (Set TF_CPP_MIN_LOG_LEVEL=0 and rerun for more info.)

(Array(5., dtype=float32, weak_type=True),
 Array(6., dtype=float32, weak_type=True),
 Array(1.5, dtype=float32, weak_type=True),
 Array(9., dtype=float32, weak_type=True))

x = tf.constant(3.0)
y = tf.constant(2.0)

x + y, x * y, x / y, x**y

(,
 ,
 ,
 )

2.3.2. 載體

出于我們的目的,您可以將向量視為固定長(zhǎng)度的標(biāo)量數(shù)組。與它們的代碼對(duì)應(yīng)物一樣,我們將這些值稱(chēng)為 向量的元素(同義詞包括條目和組件). 當(dāng)向量表示現(xiàn)實(shí)世界數(shù)據(jù)集中的示例時(shí),它們的值具有一定的現(xiàn)實(shí)意義。例如,如果我們正在訓(xùn)練一個(gè)模型來(lái)預(yù)測(cè)貸款違約的風(fēng)險(xiǎn),我們可能會(huì)將每個(gè)申請(qǐng)人與一個(gè)向量相關(guān)聯(lián),該向量的分量對(duì)應(yīng)于他們的收入、工作年限或以前的違約次數(shù)等數(shù)量。如果我們正在研究心臟病發(fā)作風(fēng)險(xiǎn),每個(gè)向量可能代表一個(gè)患者,其組成部分可能對(duì)應(yīng)于他們最近的生命體征、膽固醇水平、每天的運(yùn)動(dòng)分鐘數(shù)等。我們用粗體小寫(xiě)字母表示向量,(例如,x, y, 和z).

向量實(shí)現(xiàn)為1st-階張量。通常,此類(lèi)張量可以具有任意長(zhǎng)度,受內(nèi)存限制。注意:在 Python 中,與大多數(shù)編程語(yǔ)言一樣,向量索引從0,也稱(chēng)為從零開(kāi)始的索引,而在線(xiàn)性代數(shù)中下標(biāo)開(kāi)始于1(基于一個(gè)的索引)。

x = torch.arange(3)
x

tensor([0, 1, 2])

x = np.arange(3)
x

array([0., 1., 2.])

x = jnp.arange(3)
x

Array([0, 1, 2], dtype=int32)

x = tf.range(3)
x


我們可以使用下標(biāo)來(lái)引用向量的元素。例如,x2表示的第二個(gè)元素x. 自從x2是標(biāo)量,我們不加粗。默認(rèn)情況下,我們通過(guò)垂直堆疊元素來(lái)可視化向量。

(2.3.1)x=[x1?xn],

這里x1,…,xn是向量的元素。稍后,我們將區(qū)分這種列向量和元素水平堆疊的行向量?;叵胍幌?,我們通過(guò)索引訪(fǎng)問(wèn)張量的元素。

x[2]

tensor(2)

x[2]

array(2.)

x[2]

Array(2, dtype=int32)

x[2]


表示一個(gè)向量包含n元素,我們寫(xiě) x∈Rn. 正式地,我們稱(chēng)n向量的維 數(shù)。在代碼中,這對(duì)應(yīng)于張量的長(zhǎng)度,可通過(guò) Python 的內(nèi)置len函數(shù)訪(fǎng)問(wèn)。

len(x)

3

len(x)

3

len(x)

3

len(x)

3

我們還可以通過(guò)屬性訪(fǎng)問(wèn)長(zhǎng)度shape。形狀是一個(gè)元組,指示張量沿每個(gè)軸的長(zhǎng)度。只有一個(gè)軸的張量具有只有一個(gè)元素的形狀。

x.shape

torch.Size([3])

x.shape

(3,)

x.shape

(3,)

x.shape

TensorShape([3])

通常,“維度”這個(gè)詞會(huì)被過(guò)度表示為軸的數(shù)量和沿特定軸的長(zhǎng)度。為了避免這種混淆,我們使用順序來(lái)指代軸的數(shù)量,使用維度 專(zhuān)門(mén)指代組件的數(shù)量。

2.3.3. 矩陣

就像標(biāo)量一樣0th-階張量和向量是1st-階張量,矩陣是 2nd-階張量。我們用粗體大寫(xiě)字母表示矩陣(例如,X,Y, 和 Z), 并用兩個(gè)軸的張量在代碼中表示它們。表達(dá)方式A∈Rm×n 表示一個(gè)矩陣A包含m×n 實(shí)值標(biāo)量,排列為m行和n列。什么時(shí)候m=n,我們說(shuō)矩陣是方陣。在視覺(jué)上,我們可以將任何矩陣表示為表格。為了引用單個(gè)元素,我們對(duì)行和列索引都下標(biāo),例如,aij是屬于的值A(chǔ)的ith行和jth柱子:

(2.3.2)A=[a11a12?a1na21a22?a2n????am1am2?amn].

在代碼中,我們表示一個(gè)矩陣 A∈Rm×n通過(guò)一個(gè) 2nd-具有形狀的階張量 (m,n). 我們可以轉(zhuǎn)換任何適當(dāng)大小的m×n張量變成 m×n通過(guò)將所需的形狀傳遞給矩陣reshape:

A = torch.arange(6).reshape(3, 2)
A

tensor([[0, 1],
    [2, 3],
    [4, 5]])

A = np.arange(6).reshape(3, 2)
A

array([[0., 1.],
    [2., 3.],
    [4., 5.]])

A = jnp.arange(6).reshape(3, 2)
A

Array([[0, 1],
    [2, 3],
    [4, 5]], dtype=int32)

A = tf.reshape(tf.range(6), (3, 2))
A


有時(shí),我們想翻轉(zhuǎn)坐標(biāo)軸。當(dāng)我們交換矩陣的行和列時(shí),結(jié)果稱(chēng)為轉(zhuǎn)置。形式上,我們表示一個(gè)矩陣A的轉(zhuǎn)置A?而如果B=A?, 然后bij=aji 對(duì)全部i和j. 因此,轉(zhuǎn)置一個(gè) m×n矩陣是一個(gè)n×m矩陣:

(2.3.3)A?=[a11a21…am1a12a22…am2????a1na2n…amn].

在代碼中,我們可以訪(fǎng)問(wèn)任何矩陣的轉(zhuǎn)置,如下所示:

A.T

tensor([[0, 2, 4],
    [1, 3, 5]])

A.T

array([[0., 2., 4.],
    [1., 3., 5.]])

A.T

Array([[0, 2, 4],
    [1, 3, 5]], dtype=int32)

tf.transpose(A)


對(duì)稱(chēng)矩陣是方陣的子集,它們等于它們自己的轉(zhuǎn)置:A=A?. 以下矩陣是對(duì)稱(chēng)的:

A = torch.tensor([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
A == A.T

tensor([[True, True, True],
    [True, True, True],
    [True, True, True]])

A = np.array([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
A == A.T

array([[ True, True, True],
    [ True, True, True],
    [ True, True, True]])

A = jnp.array([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
A == A.T

Array([[ True, True, True],
    [ True, True, True],
    [ True, True, True]], dtype=bool)

A = tf.constant([[1, 2, 3], [2, 0, 4], [3, 4, 5]])
A == tf.transpose(A)


矩陣對(duì)于表示數(shù)據(jù)集很有用。通常,行對(duì)應(yīng)于單個(gè)記錄,列對(duì)應(yīng)于不同的屬性。

2.3.4. 張量

雖然您可以?xún)H使用標(biāo)量、向量和矩陣在機(jī)器學(xué)習(xí)之旅中走得更遠(yuǎn),但最終您可能需要使用高階張量。張量為我們提供了一種通用的方式來(lái)描述對(duì) nth-順序數(shù)組。我們將張量類(lèi)的軟件對(duì)象稱(chēng)為 “張量”,正是因?yàn)樗鼈円部梢杂腥我鈹?shù)量的軸。雖然將張量這個(gè)詞用于數(shù)學(xué)對(duì)象及其在代碼中的實(shí)現(xiàn)可能會(huì)造成混淆,但我們的意思通常應(yīng)該從上下文中清楚。我們用特殊字體的大寫(xiě)字母表示一般張量(例如,X, Y, 和Z) 及其索引機(jī)制(例如,xijk和[X]1,2i?1,3) 從矩陣中自然得出。

當(dāng)我們開(kāi)始處理圖像時(shí),張量將變得更加重要。每個(gè)圖像作為3rd-階張量,其軸對(duì)應(yīng)于高度、寬度和通道。在每個(gè)空間位置,每種顏色(紅色、綠色和藍(lán)色)的強(qiáng)度都沿著通道堆疊。此外,一組圖像在代碼中表示為4th-階張量,其中不同的圖像沿第一軸索引。通過(guò)增加形狀分量的數(shù)量,高階張量的構(gòu)造類(lèi)似于向量和矩陣。

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]]])

np.arange(24).reshape(2, 3, 4)

array([[[ 0., 1., 2., 3.],
    [ 4., 5., 6., 7.],
    [ 8., 9., 10., 11.]],

    [[12., 13., 14., 15.],
    [16., 17., 18., 19.],
    [20., 21., 22., 23.]]])

jnp.arange(24).reshape(2, 3, 4)

Array([[[ 0, 1, 2, 3],
    [ 4, 5, 6, 7],
    [ 8, 9, 10, 11]],

    [[12, 13, 14, 15],
    [16, 17, 18, 19],
    [20, 21, 22, 23]]], dtype=int32)

tf.reshape(tf.range(24), (2, 3, 4))


2.3.5. 張量運(yùn)算的基本性質(zhì)

標(biāo)量、向量、矩陣和高階張量都有一些方便的屬性。例如,逐元素運(yùn)算產(chǎn)生與其操作數(shù)具有相同形狀的輸出。

A = torch.arange(6, dtype=torch.float32).reshape(2, 3)
B = A.clone() # Assign a copy of A to B by allocating new memory
A, A + B

(tensor([[0., 1., 2.],
     [3., 4., 5.]]),
 tensor([[ 0., 2., 4.],
     [ 6., 8., 10.]]))

A = np.arange(6).reshape(2, 3)
B = A.copy() # Assign a copy of A to B by allocating new memory
A, A + B

(array([[0., 1., 2.],
    [3., 4., 5.]]),
 array([[ 0., 2., 4.],
    [ 6., 8., 10.]]))

A = jnp.arange(6, dtype=jnp.float32).reshape(2, 3)
B = A
A, A + B

(Array([[0., 1., 2.],
    [3., 4., 5.]], dtype=float32),
 Array([[ 0., 2., 4.],
    [ 6., 8., 10.]], dtype=float32))

A = tf.reshape(tf.range(6, dtype=tf.float32), (2, 3))
B = A # No cloning of A to B by allocating new memory
A, A + B

(,
 )

兩個(gè)矩陣的元素積稱(chēng)為它們的Hadamard 積(表示為⊙). 下面,我們拼出兩個(gè)矩陣的 Hadamard 乘積的條目 A,B∈Rm×n:

(2.3.4)A⊙B=[a11b11a12b12…a1nb1na21b21a22b22…a2nb2n????am1bm1am2bm2…amnbmn].

A * B

tensor([[ 0., 1., 4.],
    [ 9., 16., 25.]])

A * B

array([[ 0., 1., 4.],
    [ 9., 16., 25.]])

A * B

Array([[ 0., 1., 4.],
    [ 9., 16., 25.]], dtype=float32)

A * B


將標(biāo)量和張量相加或相乘會(huì)產(chǎn)生與原始張量形狀相同的結(jié)果。在這里,張量的每個(gè)元素都被添加到(或乘以)標(biāo)量。

a = 2
X = torch.arange(24).reshape(2, 3, 4)
a + X, (a * X).shape

(tensor([[[ 2, 3, 4, 5],
     [ 6, 7, 8, 9],
     [10, 11, 12, 13]],

     [[14, 15, 16, 17],
     [18, 19, 20, 21],
     [22, 23, 24, 25]]]),
 torch.Size([2, 3, 4]))

a = 2
X = np.arange(24).reshape(2, 3, 4)
a + X, (a * X).shape

(array([[[ 2., 3., 4., 5.],
     [ 6., 7., 8., 9.],
     [10., 11., 12., 13.]],

    [[14., 15., 16., 17.],
     [18., 19., 20., 21.],
     [22., 23., 24., 25.]]]),
 (2, 3, 4))

a = 2
X = jnp.arange(24).reshape(2, 3, 4)
a + X, (a * X).shape

(Array([[[ 2, 3, 4, 5],
     [ 6, 7, 8, 9],
     [10, 11, 12, 13]],

    [[14, 15, 16, 17],
     [18, 19, 20, 21],
     [22, 23, 24, 25]]], dtype=int32),
 (2, 3, 4))

a = 2
X = tf.reshape(tf.range(24), (2, 3, 4))
a + X, (a * X).shape

(,
 TensorShape([2, 3, 4]))

2.3.6. 減少

通常,我們希望計(jì)算張量元素的總和。表達(dá)向量中元素的總和x長(zhǎng)度 n, 我們寫(xiě)∑i=1nxi. 它有一個(gè)簡(jiǎn)單的功能:

x = torch.arange(3, dtype=torch.float32)
x, x.sum()

(tensor([0., 1., 2.]), tensor(3.))

x = np.arange(3)
x, x.sum()

(array([0., 1., 2.]), array(3.))

x = jnp.arange(3, dtype=jnp.float32)
x, x.sum()

(Array([0., 1., 2.], dtype=float32), Array(3., dtype=float32))

x = tf.range(3, dtype=tf.float32)
x, tf.reduce_sum(x)

(,
 )

為了表達(dá)任意形狀張量元素的總和,我們簡(jiǎn)單地對(duì)其所有軸求和。例如,一個(gè)元素的總和m×n矩陣A可以寫(xiě)成 ∑i=1m∑j=1naij.

A.shape, A.sum()

(torch.Size([2, 3]), tensor(15.))

A.shape, A.sum()

((2, 3), array(15.))

A.shape, A.sum()

((2, 3), Array(15., dtype=float32))

A.shape, tf.reduce_sum(A)

(TensorShape([2, 3]), )

默認(rèn)情況下,調(diào)用 sum 函數(shù)會(huì)減少沿其所有軸的張量,最終生成標(biāo)量。我們的庫(kù)還允許我們指定應(yīng)減少?gòu)埩康妮S。為了對(duì)沿行(軸 0)的所有元素求和,我們指定axis=0in sum。由于輸入矩陣沿軸 0 減少以生成輸出向量,因此輸出的形狀中缺少該軸。

A.shape, A.sum(axis=0).shape

(torch.Size([2, 3]), torch.Size([3]))

A.shape, A.sum(axis=0).shape

((2, 3), (3,))

A.shape, A.sum(axis=0).shape

((2, 3), (3,))

A.shape, tf.reduce_sum(A, axis=0).shape

(TensorShape([2, 3]), TensorShape([3]))

指定axis=1將通過(guò)匯總所有列的元素來(lái)減少列維度(軸 1)。

A.shape, A.sum(axis=1).shape

(torch.Size([2, 3]), torch.Size([2]))

A.shape, A.sum(axis=1).shape

((2, 3), (2,))

A.shape, A.sum(axis=1).shape

((2, 3), (2,))

A.shape, tf.reduce_sum(A, axis=1).shape

(TensorShape([2, 3]), TensorShape([2]))

通過(guò)求和沿行和列減少矩陣等同于對(duì)矩陣的所有元素求和。

A.sum(axis=[0, 1]) == A.sum() # Same as A.sum()

tensor(True)

A.sum(axis=[0, 1]) == A.sum() # Same as A.sum()

array(True)

A.sum(axis=[0, 1]) == A.sum() # Same as A.sum()

Array(True, dtype=bool)

tf.reduce_sum(A, axis=[0, 1]), tf.reduce_sum(A) # Same as tf.reduce_sum(A)

(,
 )

一個(gè)相關(guān)的量是均值,也叫平均值。我們通過(guò)將總和除以元素總數(shù)來(lái)計(jì)算平均值。因?yàn)橛?jì)算平均值非常普遍,所以它有一個(gè)專(zhuān)用的庫(kù)函數(shù),其工作方式類(lèi)似于sum.

A.mean(), A.sum() / A.numel()

(tensor(2.5000), tensor(2.5000))

A.mean(), A.sum() / A.size

(array(2.5), array(2.5))

A.mean(), A.sum() / A.size

(Array(2.5, dtype=float32), Array(2.5, dtype=float32))

tf.reduce_mean(A), tf.reduce_sum(A) / tf.size(A).numpy()

(,
 )

同樣,計(jì)算均值的函數(shù)也可以減少沿特定軸的張量。

A.mean(axis=0), A.sum(axis=0) / A.shape[0]

(tensor([1.5000, 2.5000, 3.5000]), tensor([1.5000, 2.5000, 3.5000]))

A.mean(axis=0), A.sum(axis=0) / A.shape[0]

(array([1.5, 2.5, 3.5]), array([1.5, 2.5, 3.5]))

A.mean(axis=0), A.sum(axis=0) / A.shape[0]

(Array([1.5, 2.5, 3.5], dtype=float32), Array([1.5, 2.5, 3.5], dtype=float32))

tf.reduce_mean(A, axis=0), tf.reduce_sum(A, axis=0) / A.shape[0]

(,
 )

2.3.7. 非減額

有時(shí)在調(diào)用用于計(jì)算和或平均值的函數(shù)時(shí)保持軸數(shù)不變可能很有用。當(dāng)我們想要使用廣播機(jī)制時(shí),這很重要。

sum_A = A.sum(axis=1, keepdims=True)
sum_A, sum_A.shape

(tensor([[ 3.],
     [12.]]),
 torch.Size([2, 1]))

sum_A = A.sum(axis=1, keepdims=True)
sum_A, sum_A.shape

(array([[ 3.],
    [12.]]),
 (2, 1))

sum_A = A.sum(axis=1, keepdims=True)
sum_A, sum_A.shape

(Array([[ 3.],
    [12.]], dtype=float32),
 (2, 1))

sum_A = tf.reduce_sum(A, axis=1, keepdims=True)
sum_A, sum_A.shape

(,
 TensorShape([2, 1]))

例如,由于在sum_A對(duì)每一行求和后保留其兩個(gè)軸,我們可以通過(guò)廣播除以A創(chuàng)建sum_A一個(gè)矩陣,其中每一行總和為1.

A / sum_A

tensor([[0.0000, 0.3333, 0.6667],
    [0.2500, 0.3333, 0.4167]])

A / sum_A

array([[0.    , 0.33333334, 0.6666667 ],
    [0.25   , 0.33333334, 0.41666666]])

A / sum_A

Array([[0.    , 0.33333334, 0.6666667 ],
    [0.25   , 0.33333334, 0.41666666]], dtype=float32)

A / sum_A


如果我們想計(jì)算沿某個(gè)軸的元素的累積和A,比如axis=0(逐行),我們可以調(diào)用該cumsum 函數(shù)。按照設(shè)計(jì),此函數(shù)不會(huì)減少沿任何軸的輸入張量。

A.cumsum(axis=0)

tensor([[0., 1., 2.],
    [3., 5., 7.]])

A.cumsum(axis=0)

array([[0., 1., 2.],
    [3., 5., 7.]])

A.cumsum(axis=0)

Array([[0., 1., 2.],
    [3., 5., 7.]], dtype=float32)

tf.cumsum(A, axis=0)


2.3.8. 點(diǎn)積

到目前為止,我們只執(zhí)行了元素運(yùn)算、求和和平均。如果這就是我們所能做的全部,那么線(xiàn)性代數(shù)就不值得單獨(dú)一節(jié)了。幸運(yùn)的是,這是事情變得更有趣的地方。最基本的操作之一是點(diǎn)積。給定兩個(gè)向量x,y∈Rd, 他們的 點(diǎn)積 x?y(或者 ?x,y?) 是同一位置元素乘積的總和: x?y=∑i=1dxiyi.

y = torch.ones(3, dtype = torch.float32)
x, y, torch.dot(x, y)

(tensor([0., 1., 2.]), tensor([1., 1., 1.]), tensor(3.))

y = np.ones(3)
x, y, np.dot(x, y)

(array([0., 1., 2.]), array([1., 1., 1.]), array(3.))

y = jnp.ones(3, dtype = jnp.float32)
x, y, jnp.dot(x, y)

(Array([0., 1., 2.], dtype=float32),
 Array([1., 1., 1.], dtype=float32),
 Array(3., dtype=float32))

y = tf.ones(3, dtype=tf.float32)
x, y, tf.tensordot(x, y, axes=1)

(,
 ,
 )

等價(jià)地,我們可以通過(guò)執(zhí)行逐元素乘法然后求和來(lái)計(jì)算兩個(gè)向量的點(diǎn)積:

torch.sum(x * y)

tensor(3.)

np.sum(x * y)

array(3.)

jnp.sum(x * y)

Array(3., dtype=float32)

tf.reduce_sum(x * y)


點(diǎn)積在廣泛的上下文中很有用。例如,給定一組值,用向量表示 x∈Rn和一組權(quán)重表示為 w∈Rn, 中值的加權(quán)和 x根據(jù)權(quán)重w可以表示為點(diǎn)積x?w. 當(dāng)權(quán)重為非負(fù)且總和為一時(shí),即 (∑i=1nwi=1),點(diǎn)積表示加權(quán)平均值。將兩個(gè)向量歸一化為單位長(zhǎng)度后,點(diǎn)積表示它們之間夾角的余弦值。在本節(jié)的后面,我們將正式介紹長(zhǎng)度的概念。

2.3.9. 矩陣向量積

既然我們知道如何計(jì)算點(diǎn)積,我們就可以開(kāi)始了解點(diǎn)積m×n矩陣 A和n維向量 x. 首先,我們根據(jù)行向量可視化我們的矩陣

(2.3.5)A=[a1?a2??am?],

每個(gè)ai?∈Rn是一個(gè)行向量,表示ith矩陣的行 A.

矩陣向量積Ax只是長(zhǎng)度的列向量m,誰(shuí)的ith元素是點(diǎn)積ai?x:

(2.3.6)Ax=[a1?a2??am?]x=[a1?xa2?x?am?x].

我們可以考慮與矩陣相乘 A∈Rm×n作為投影矢量的變換Rn到Rm. 這些轉(zhuǎn)換非常有用。例如,我們可以將旋轉(zhuǎn)表示為某些方矩陣的乘法。矩陣向量乘積還描述了在給定前一層輸出的情況下計(jì)算神經(jīng)網(wǎng)絡(luò)中每一層輸出所涉及的關(guān)鍵計(jì)算。

為了在代碼中表達(dá)矩陣向量乘積,我們使用函數(shù)mv。請(qǐng)注意,(其沿軸 1 的長(zhǎng)度)的列維度必須與(其長(zhǎng)度)A的維度相同。xPyTorch 有一個(gè)方便的運(yùn)算符@,可以執(zhí)行矩陣向量和矩陣矩陣乘積(取決于它的參數(shù))。因此我們可以寫(xiě) A@x.

A.shape, x.shape, torch.mv(A, x), A@x

(torch.Size([2, 3]), torch.Size([3]), tensor([ 5., 14.]), tensor([ 5., 14.]))

To express a matrix-vector product in code, we use the same dot function. The operation is inferred based on the type of the arguments. Note that the column dimension of A (its length along axis 1) must be the same as the dimension of x (its length).

A.shape, x.shape, np.dot(A, x)

((2, 3), (3,), array([ 5., 14.]))

A.shape, x.shape, jnp.matmul(A, x)

((2, 3), (3,), Array([ 5., 14.], dtype=float32))

To express a matrix-vector product in code, we use the matvec function. Note that the column dimension of A (its length along axis 1) must be the same as the dimension of x (its length).

A.shape, x.shape, tf.linalg.matvec(A, x)

(TensorShape([2, 3]),
 TensorShape([3]),
 )

2.3.10。矩陣-矩陣乘法

如果您掌握了點(diǎn)積和矩陣-向量積的竅門(mén),那么矩陣-矩陣乘法應(yīng)該很簡(jiǎn)單。

假設(shè)我們有兩個(gè)矩陣 A∈Rn×k和 B∈Rk×m:

(2.3.7)A=[a11a12?a1ka21a22?a2k????an1an2?ank],B=[b11b12?b1mb21b22?b2m????bk1bk2?bkm].

讓ai?∈Rk表示行向量表示ith矩陣的行 A然后讓bj∈Rk 表示來(lái)自的列向量jth矩陣的列B:

(2.3.8)A=[a1?a2??an?],B=[b1b2?bm].

形成矩陣乘積 C∈Rn×m,我們簡(jiǎn)單地計(jì)算每個(gè)元素cij作為點(diǎn)積之間 ith一排A和 jth列的B, IE, ai?bj:

(2.3.9)C=AB=[a1?a2??an?][b1b2?bm]=[a1?b1a1?b2?a1?bma2?b1a2?b2?a2?bm????an?b1an?b2?an?bm].

我們可以想到矩陣-矩陣乘法AB作為表演m矩陣向量乘積或m×n點(diǎn)積并將結(jié)果拼接在一起形成一個(gè) n×m矩陣。在以下代碼片段中,我們對(duì)A和執(zhí)行矩陣乘法B。這里,A是一個(gè)2行3列的矩陣,B是一個(gè)3行4列的矩陣。相乘后得到一個(gè)2行4列的矩陣。

B = torch.ones(3, 4)
torch.mm(A, B), A@B

(tensor([[ 3., 3., 3., 3.],
     [12., 12., 12., 12.]]),
 tensor([[ 3., 3., 3., 3.],
     [12., 12., 12., 12.]]))

B = np.ones(shape=(3, 4))
np.dot(A, B)

array([[ 3., 3., 3., 3.],
    [12., 12., 12., 12.]])

B = jnp.ones((3, 4))
jnp.matmul(A, B)

Array([[ 3., 3., 3., 3.],
    [12., 12., 12., 12.]], dtype=float32)

B = tf.ones((3, 4), tf.float32)
tf.matmul(A, B)


術(shù)語(yǔ)矩陣-矩陣乘法通常簡(jiǎn)化為矩陣乘法,不應(yīng)與 Hadamard 乘積混淆。

2.3.11。規(guī)范

線(xiàn)性代數(shù)中一些最有用的運(yùn)算符是范數(shù)。通俗地說(shuō),向量的范數(shù)告訴我們它有多大。例如,?2范數(shù)測(cè)量向量的(歐幾里德)長(zhǎng)度。在這里,我們使用了一個(gè)大小概念,它涉及向量分量的大?。ǘ皇瞧渚S度)。

范數(shù)是函數(shù)‖?‖將向量映射到標(biāo)量并滿(mǎn)足以下三個(gè)屬性:

給定任何向量x,如果我們用標(biāo)量縮放向量(的所有元素)α∈R, 它的范數(shù)相應(yīng)地縮放:

(2.3.10)‖αx‖=|α|‖x‖.

對(duì)于任何向量x和y:范數(shù)滿(mǎn)足三角不等式:

(2.3.11)‖x+y‖≤‖x‖+‖y‖.

向量的范數(shù)是非負(fù)的,只有當(dāng)向量為零時(shí)它才會(huì)消失:

(2.3.12)‖x‖>0for allx≠0.

許多函數(shù)都是有效的范數(shù),不同的范數(shù)編碼不同的大小概念。我們小學(xué)幾何學(xué)計(jì)算直角三角形的斜邊時(shí)都學(xué)過(guò)的歐幾里德范數(shù),就是對(duì)向量元素的平方和開(kāi)平方根。正式地,這被稱(chēng)為?2 規(guī)范并表示為

(2.3.13)‖x‖2=∑i=1nxi2.

該方法norm計(jì)算?2規(guī)范。

u = torch.tensor([3.0, -4.0])
torch.norm(u)

tensor(5.)

u = np.array([3, -4])
np.linalg.norm(u)

array(5.)

u = jnp.array([3.0, -4.0])
jnp.linalg.norm(u)

Array(5., dtype=float32)

u = tf.constant([3.0, -4.0])
tf.norm(u)


這?1范數(shù)也很流行,相關(guān)的度量標(biāo)準(zhǔn)稱(chēng)為曼哈頓距離。根據(jù)定義,?1norm 對(duì)向量元素的絕對(duì)值求和:

(2.3.14)‖x‖1=∑i=1n|xi|.

相比于?2norm,它對(duì)異常值不太敏感。計(jì)算?1范數(shù),我們用求和運(yùn)算合成絕對(duì)值。

torch.abs(u).sum()

tensor(7.)

np.abs(u).sum()

array(7.)

jnp.linalg.norm(u, ord=1) # same as jnp.abs(u).sum()

Array(7., dtype=float32)

tf.reduce_sum(tf.abs(u))


這倆?2和?1規(guī)范是更一般的特殊情況?p 規(guī)范:

(2.3.15)‖x‖p=(∑i=1n|xi|p)1/p.

在矩陣的情況下,事情要復(fù)雜得多。畢竟,矩陣既可以看作是單個(gè)條目的集合,也 可以看作是對(duì)向量進(jìn)行運(yùn)算并將它們轉(zhuǎn)換為其他向量的對(duì)象。例如,我們可以問(wèn)矩陣向量乘積多長(zhǎng)時(shí)間Xv可能是相對(duì)于 v. 這種思路導(dǎo)致了一種稱(chēng)為 譜范數(shù)的范數(shù)?,F(xiàn)在,我們介??紹Frobenius 范數(shù),它更容易計(jì)算并定義為矩陣元素平方和的平方根:

(2.3.16)‖X‖F(xiàn)=∑i=1m∑j=1nxij2.

Frobenius 范數(shù)的行為就好像它是一個(gè)?2矩陣形向量的范數(shù)。調(diào)用以下函數(shù)將計(jì)算矩陣的 Frobenius 范數(shù)。

torch.norm(torch.ones((4, 9)))

tensor(6.)

np.linalg.norm(np.ones((4, 9)))

array(6.)

jnp.linalg.norm(jnp.ones((4, 9)))

Array(6., dtype=float32)

tf.norm(tf.ones((4, 9)))


雖然我們不想過(guò)于超前,但我們已經(jīng)對(duì)這些概念為何有用有了一些直覺(jué)。在深度學(xué)習(xí)中,我們經(jīng)常試圖解決優(yōu)化問(wèn)題:最大化分配 給觀察數(shù)據(jù)的概率;最大化與推薦模型相關(guān)的收入;最小化預(yù)測(cè)和地面實(shí)況觀察之間的距離;最小化同一個(gè)人的照片表示之間的距離,同時(shí)最大化 不同人的照片表示之間的距離。這些構(gòu)成深度學(xué)習(xí)算法目標(biāo)的距離通常表示為規(guī)范。

2.3.12。討論

在本節(jié)中,我們回顧了理解大量現(xiàn)代深度學(xué)習(xí)所需的所有線(xiàn)性代數(shù)。線(xiàn)性代數(shù)還有很多內(nèi)容,其中大部分對(duì)機(jī)器學(xué)習(xí)很有用。例如,矩陣可以分解為因子,這些分解可以揭示現(xiàn)實(shí)世界數(shù)據(jù)集中的低維結(jié)構(gòu)。機(jī)器學(xué)習(xí)的整個(gè)子領(lǐng)域都專(zhuān)注于使用矩陣分解及其對(duì)高階張量的推廣來(lái)發(fā)現(xiàn)數(shù)據(jù)集中的結(jié)構(gòu)并解決預(yù)測(cè)問(wèn)題。但這本書(shū)側(cè)重于深度學(xué)習(xí)。我們相信,一旦您親手將機(jī)器學(xué)習(xí)應(yīng)用于真實(shí)數(shù)據(jù)集,您將更愿意學(xué)習(xí)更多數(shù)學(xué)。因此,雖然我們保留稍后介紹更多數(shù)學(xué)的權(quán)利,但我們?cè)诖私Y(jié)束本節(jié)。

如果你渴望學(xué)習(xí)更多的線(xiàn)性代數(shù),有很多優(yōu)秀的書(shū)籍和在線(xiàn)資源。如需更高級(jí)的速成課程,請(qǐng)考慮查看 Kolter ( 2008 )、Petersen等人。(2008 年),斯特朗(1993 年)。

回顧一下:

標(biāo)量、向量、矩陣和張量是線(xiàn)性代數(shù)中使用的基本數(shù)學(xué)對(duì)象,分別具有零、一、二和任意數(shù)量的軸。

可以分別通過(guò)索引或sum和 等操作沿指定軸對(duì)張量進(jìn)行切片或縮減。mean

Elementwise 產(chǎn)品稱(chēng)為 Hadamard 產(chǎn)品。相比之下,點(diǎn)積、矩陣-向量積和矩陣-矩陣積不是按元素運(yùn)算,并且通常返回與操作數(shù)具有不同形狀的對(duì)象。

與 Hadamard 積相比,矩陣-矩陣積的計(jì)算時(shí)間要長(zhǎng)得多(三次而不是二次時(shí)間)。

范數(shù)捕捉了向量大小的各種概念,并且通常應(yīng)用于兩個(gè)向量的差異以測(cè)量它們的距離。

常見(jiàn)的向量范數(shù)包括?1和?2 范數(shù),常見(jiàn)的矩陣范數(shù)包括譜范數(shù)和Frobenius 范數(shù)。

2.3.13. 練習(xí)

證明矩陣轉(zhuǎn)置的轉(zhuǎn)置就是矩陣本身:(A?)?=A.

給定兩個(gè)矩陣A和B, 表明總和和轉(zhuǎn)置交換: A?+B?=(A+B)?.

給定任何方陣A, 是 A+A?總是對(duì)稱(chēng)的?你能僅用前兩個(gè)練習(xí)的結(jié)果來(lái)證明這個(gè)結(jié)果嗎?

我們?cè)诒竟?jié)中定義了形狀為 (2, 3, 4) 的張量X。的輸出是什么len(X)?在不執(zhí)行任何代碼的情況下寫(xiě)下您的答案,然后使用代碼檢查您的答案。

對(duì)于任意形狀的張量X,總是len(X)對(duì)應(yīng)于某個(gè)軸的長(zhǎng)度X?那個(gè)軸是什么?

跑看看會(huì)發(fā)生什么。能分析一下原因嗎?A / A.sum(axis=1)

在曼哈頓市中心的兩點(diǎn)之間旅行時(shí),根據(jù)坐標(biāo),即大道和街道,您需要經(jīng)過(guò)的距離是多少?可以對(duì)角線(xiàn)旅行嗎?

考慮一個(gè)形狀為 (2, 3, 4) 的張量。沿軸 0、1 和 2 的求和輸出的形狀是什么?

將具有 3 個(gè)或更多軸的張量輸入函數(shù)linalg.norm并觀察其輸出。對(duì)于任意形狀的張量,此函數(shù)計(jì)算什么?

定義三個(gè)大矩陣,比如說(shuō) A∈R210×216, B∈R216×25和 C∈R25×214,例如用高斯隨機(jī)變量初始化。你想計(jì)算產(chǎn)品ABC. 內(nèi)存占用和速度是否有任何差異,具體取決于您是否計(jì)算(AB)C或者 A(BC). 為什么?

定義三個(gè)大矩陣,比如說(shuō) A∈R210×216, B∈R216×25和 C∈R25×216. 根據(jù)您是否計(jì)算,速度是否有任何差異 AB或者AC??為什么?如果初始化會(huì)發(fā)生什么變化 C=B?沒(méi)有克隆內(nèi)存?為什么?

定義三個(gè)矩陣,比如說(shuō) A,B,C∈R100×200. 通過(guò)堆疊構(gòu)成具有3個(gè)軸的張量 [A,B,C]. 什么是維度?切出第三軸第二坐標(biāo)恢復(fù)B. 檢查你的答案是否正確。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7292

    瀏覽量

    93362
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4738

    瀏覽量

    96702
  • 線(xiàn)性代數(shù)
    +關(guān)注

    關(guān)注

    5

    文章

    50

    瀏覽量

    11300
  • 深度學(xué)習(xí)
    +關(guān)注

    關(guān)注

    73

    文章

    5586

    瀏覽量

    123618
  • pytorch
    +關(guān)注

    關(guān)注

    2

    文章

    812

    瀏覽量

    14414
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    線(xiàn)性代數(shù)超強(qiáng)總結(jié)

    線(xiàn)性代數(shù)超強(qiáng)總結(jié)
    發(fā)表于 05-26 07:26

    Pytorch入門(mén)之的基本操作

    Pytorch入門(mén)之基本操作
    發(fā)表于 05-22 17:15

    PyTorch如何入門(mén)

    PyTorch 入門(mén)實(shí)戰(zhàn)(一)——Tensor
    發(fā)表于 06-01 09:58

    線(xiàn)性代數(shù)實(shí)踐及MATLAB入門(mén)》(第二版)程序集

    線(xiàn)性代數(shù)實(shí)踐及MATLAB入門(mén)》(第二版)程序集:本程序集同時(shí)適用于《線(xiàn)性代數(shù)實(shí)踐及MATLAB入門(mén)》第一版和第二版。第二版中新增的程序只有ag906,ag907,ag908三個(gè)程序名
    發(fā)表于 10-24 08:47 ?0次下載

    線(xiàn)性代數(shù)實(shí)踐及MATLAB入門(mén)》第二版《線(xiàn)性代數(shù)實(shí)踐》課件

    線(xiàn)性代數(shù)實(shí)踐及MATLAB入門(mén)》第二版《線(xiàn)性代數(shù)實(shí)踐》課件:第六章 用行階梯法解方程組第7章  矩陣運(yùn)算法解方程第十章  后續(xù)課矩陣建模舉例第二篇  線(xiàn)性代數(shù)
    發(fā)表于 10-24 08:49 ?0次下載

    對(duì)線(xiàn)性代數(shù)課程大綱的建議

    對(duì)線(xiàn)性代數(shù)課程大綱的建議 致基礎(chǔ)數(shù)學(xué)分教指委一.問(wèn)題的提出:現(xiàn)在的“線(xiàn)性代數(shù)”大綱不能滿(mǎn)足后續(xù)課的要求。為后續(xù)課程打好基礎(chǔ),應(yīng)該成為任何
    發(fā)表于 05-26 16:59 ?5次下載

    Matlab線(xiàn)性代數(shù)實(shí)驗(yàn)

    Matlab線(xiàn)性代數(shù)實(shí)驗(yàn)8.1 實(shí)驗(yàn)(Ⅰ):用Matlab學(xué)線(xiàn)性代數(shù)8.1.1實(shí)驗(yàn)與觀察:向量組的線(xiàn)性關(guān)系和解線(xiàn)性方程組1.  用線(xiàn)性
    發(fā)表于 10-17 00:36 ?2164次閱讀

    工程線(xiàn)性代數(shù)matlab版

    MATLAB,工程線(xiàn)性代數(shù)matlab版。
    發(fā)表于 12-21 14:41 ?0次下載

    機(jī)器學(xué)習(xí)線(xiàn)性代數(shù)基礎(chǔ)

    機(jī)器學(xué)習(xí)所需要的一些線(xiàn)性代數(shù)知識(shí)
    發(fā)表于 09-04 10:08 ?0次下載

    Pytorch入門(mén)教程與范例

    的深度學(xué)習(xí)框架。 對(duì)于系統(tǒng)學(xué)習(xí) pytorch,官方提供了非常好的入門(mén)教程?,同時(shí)還提供了面向深度學(xué)習(xí)的示例,同時(shí)熱心網(wǎng)友分享了更簡(jiǎn)潔的示例。 1. overview 不同于 theano
    發(fā)表于 11-15 17:50 ?5711次閱讀
    <b class='flag-5'>Pytorch</b><b class='flag-5'>入門(mén)</b>教程與范例

    線(xiàn)性代數(shù)是什么?存在的意義是什么?

    在大學(xué)數(shù)學(xué)學(xué)科中,線(xiàn)性代數(shù)是最為抽象的一門(mén)課,從初等數(shù)學(xué)到線(xiàn)性代數(shù)的思維跨度比微積分和概率統(tǒng)計(jì)要大得多。
    的頭像 發(fā)表于 08-19 10:24 ?29.9w次閱讀
    <b class='flag-5'>線(xiàn)性代數(shù)</b>是什么?存在的意義是什么?

    基于PyTorch的深度學(xué)習(xí)入門(mén)教程之PyTorch簡(jiǎn)單知識(shí)

    本文參考PyTorch官網(wǎng)的教程,分為五個(gè)基本模塊來(lái)介紹PyTorch。為了避免文章過(guò)長(zhǎng),這五個(gè)模塊分別在五篇博文中介紹。 Part1:PyTorch簡(jiǎn)單知識(shí) Part2:PyTorch
    的頭像 發(fā)表于 02-16 15:20 ?2695次閱讀

    PyTorch教程2.3線(xiàn)性代數(shù)

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程2.3線(xiàn)性代數(shù).pdf》資料免費(fèi)下載
    發(fā)表于 06-05 11:32 ?2次下載
    <b class='flag-5'>PyTorch</b>教程<b class='flag-5'>2.3</b>之<b class='flag-5'>線(xiàn)性代數(shù)</b>

    PyTorch教程22.1之幾何和線(xiàn)性代數(shù)運(yùn)算

    電子發(fā)燒友網(wǎng)站提供《PyTorch教程22.1之幾何和線(xiàn)性代數(shù)運(yùn)算.pdf》資料免費(fèi)下載
    發(fā)表于 06-06 09:26 ?0次下載
    <b class='flag-5'>PyTorch</b>教程22.1之幾何和<b class='flag-5'>線(xiàn)性代數(shù)</b>運(yùn)算

    PyTorch教程-2.3. 線(xiàn)性代數(shù)

    2.3. 線(xiàn)性代數(shù)? Colab [火炬]在 Colab 中打開(kāi)筆記本 Colab [mxnet] Open the notebook in Colab Colab [jax
    的頭像 發(fā)表于 06-05 15:37 ?788次閱讀