05 線性代數(shù)【動手學(xué)深度學(xué)習(xí)v2】

線性代數(shù)

多維數(shù)組和線性代數(shù)的區(qū)別?
- 多維數(shù)組是一個計算機的概念,純計算機的語言
- 線性代數(shù)是從數(shù)學(xué)上的表達(dá),具有數(shù)學(xué)上的意義
標(biāo)量
- 可以理解為一個單個的值
簡單操作
- c = a + b
- c = a * b
- c = sin(a)
長度

向量
- 可以理解為一行值,既可以是行向量,也可以是列向量
簡單操作

長度


點乘

- 對應(yīng)元素相同
正交

- 兩個向量如果是垂直的話,他們的點乘的值為0
矩陣
一般用大寫字母表示矩陣,下面為了方便用小寫字母表示
簡單操作

乘法
- 矩陣乘以向量(從直觀上來講是一個扭曲的空間)?線性代數(shù) P1 - 04:43?

- 矩陣乘以矩陣

范數(shù)(矩陣的長度)





- 對稱矩陣總是能找到特征向量,但不是每個矩陣都能找到特征向量
線性代數(shù)實現(xiàn)
1、標(biāo)量由只有一個元素的張量表示
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.5000]), tensor([9.]))
2、可以將向量視為標(biāo)量值組成的列表
x = torch.arange(4)
x
輸出:
tensor([0, 1, 2, 3])
3、通過張量的索引來訪問任一元素
x[3]
輸出:
tensor(3)
4、訪問張量的長度
len(x)
輸出:
4
5、只有一個軸的張量,形狀只有一個元素
x.shape
輸出:
torch.Size([4])
6、通過指定兩個分量m和n來創(chuàng)建一個形狀為 m * n 的矩陣
a = torch.arange(20).reshape(5,4)
a
輸出:
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15],
[16, 17, 18, 19]])
7、矩陣的轉(zhuǎn)置
a.T
輸出:
tensor([[ 0, 4, 8, 12, 16],
[ 1, 5, 9, 13, 17],
[ 2, 6, 10, 14, 18],
[ 3, 7, 11, 15, 19]])
8、對稱矩陣(symmetric matrix)
對稱矩陣等于其轉(zhuǎn)置:a = aT
b = torch.tensor([[1,2,3],[2,3,1],[3,2,1]])
b
輸出:
tensor([[1, 2, 3],
[2, 3, 1],
[3, 2, 1]])
b == b.T
輸出:
tensor([[ True, True, True],
[ True, True, False],
[ True, False, True]])
- 矩陣的所有元素都是關(guān)于對角線對稱的
9、就像向量是標(biāo)量的推廣,矩陣是向量的推廣一樣,我們可以構(gòu)建具有更多軸的數(shù)據(jù)結(jié)構(gòu)
x = torch.arange(24).reshape(2,3,4)
x
輸出:
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]]])
- tensor中的行是最后一維,列是倒數(shù)第二維,以此類推
10、給定具有相同形狀的任何兩個張量,任何按元素二元計算的結(jié)果都將是相同形狀的張量
a = torch.arange(20,dtype = torch.float32).reshape(5,4)
b = a.clone()
a , a + b
- 通過分配新內(nèi)存,將 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.]]))
11、兩個矩陣的按元素乘法稱為 哈達(dá)瑪積(Hadamard product) 數(shù)學(xué)符號是?里面一個點

a * b
輸出:
tensor([[ 0., 1., 4., 9.],
[ 16., 25., 36., 49.],
[ 64., 81., 100., 121.],
[144., 169., 196., 225.],
[256., 289., 324., 361.]])
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]))
- 張量和一個標(biāo)量進(jìn)行運算實際上就是張量的所有元素和這個標(biāo)量進(jìn)行運算
12、計算其元素的和
x = torch.arange(4,dtype=torch.float32)
x , x.sum()
輸出:
(tensor([0., 1., 2., 3.]), tensor(6.))
13、表示任意形狀張量的元素和
a = torch.arange(20,dtype = torch.float32).reshape(5,4)
a.shape , a.sum()
輸出:
(torch.Size([5, 4]), tensor(190.))
- .sum():不管張量是什么形狀,計算出來的結(jié)果始終是一個標(biāo)量
a = torch.arange(20 * 2,dtype = torch.float32).reshape(2,5,4)
a.shape , a.sum()
輸出:
(torch.Size([2, 5, 4]), tensor(780.))
14、指定求和張量的值
a_sum_axis0 = a.sum(axis = 0)
a_sum_axis0 , a_sum_axis0.shape
輸出:
(tensor([[20., 22., 24., 26.],
[28., 30., 32., 34.],
[36., 38., 40., 42.],
[44., 46., 48., 50.],
[52., 54., 56., 58.]]),
torch.Size([5, 4]))
a_sum_axis1 = a.sum(axis = 1)
a_sum_axis1 , a_sum_axis1.shape
輸出:
(tensor([[ 40., 45., 50., 55.],
[140., 145., 150., 155.]]),
torch.Size([2, 4]))
a_sum_axis2 = a.sum(axis = 2)
a_sum_axis2 , a_sum_axis2.shape
輸出:
(tensor([[ 6., 22., 38., 54., 70.],
[ 86., 102., 118., 134., 150.]]),
torch.Size([2, 5]))
a.sum(axis = [0 , 1]).shape
輸出:
torch.Size([4])
15、一個與求和相關(guān)的量是 平均值(mean或average)
a = torch.arange(20,dtype = torch.float32).reshape(5,4)
a.mean() , a.sum() / a.numel()
- 等價于對元素求和然后除以元素的個數(shù)
輸出:
(tensor(9.5000), tensor(9.5000))
a.mean(axis = 0) , a.sum(axis = 0) / a.shape[0]
- 等價于求和然后除以維度的形狀
輸出:
(tensor([ 8., 9., 10., 11.]), tensor([ 8., 9., 10., 11.]))
16、計算綜合或均值時保持軸數(shù)不變
sum_a = a.sum(axis = 1 , keepdims = True)
sum_a
- keepdims=True:使被求和的維度大小變?yōu)?,為1的好處是可以利用廣播機制
輸出:
tensor([[ 6.],
[22.],
[38.],
[54.],
[70.]])
17、通過廣播將 a 除以sum_a
a / sum_a
輸出:
tensor([[0.0000, 0.1667, 0.3333, 0.5000],
[0.1818, 0.2273, 0.2727, 0.3182],
[0.2105, 0.2368, 0.2632, 0.2895],
[0.2222, 0.2407, 0.2593, 0.2778],
[0.2286, 0.2429, 0.2571, 0.2714]])
18、某個軸計算a元素的累積總和
a.cumsum(axis = 0)
輸出:
tensor([[ 0., 1., 2., 3.],
[ 4., 6., 8., 10.],
[12., 15., 18., 21.],
[24., 28., 32., 36.],
[40., 45., 50., 55.]])
19、點積是相同位置的按元素乘積的和
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.))
20、可以通過執(zhí)行按元素乘法,然后進(jìn)行求和來表示兩個向量的點積
torch.sum(x * y)
輸出:
tensor(6.)
21、

a.shape , x.shape , torch.mv(a,x)
- torch.mv():做矩陣向量的乘積
輸出:
(torch.Size([5, 4]), torch.Size([4]), tensor([ 14., 38., 62., 86., 110.]))
22、可以將矩陣-矩陣乘法AB看作簡單地執(zhí)行m次矩陣-向量積,并將結(jié)果拼接到一起,形成一個n * m矩陣
b = torch.ones(4,3)
torch.mm(a,b)
輸出:
tensor([[ 6., 6., 6.],
[22., 22., 22.],
[38., 38., 38.],
[54., 54., 54.],
[70., 70., 70.]])
23、L2范數(shù)是向量元素平方和的平方根

u = torch.tensor([3.0,-4.0])
torch.norm(u)
輸出:
tensor(5.)
24、L1范數(shù)表示為向量元素的絕對值之和

torch.abs(u).sum()
輸出:
tensor(7.)
25、矩陣的 弗羅貝尼烏斯范數(shù)(Frobenius norm) 實矩陣元素的平方和的平方根

torch.norm(torch.ones((4,9)))
輸出:
tensor(6.)
- 等價于將矩陣?yán)梢粋€向量,然后做一個向量的范數(shù)
- 計算簡單,是最常用的范數(shù)
按待定軸求和
總的來說axis等于幾就去掉那一維(keepdim不為True時),當(dāng)keepdim為True時,將axis指定的那一維的shape置為1
import torch
a = torch.ones(2,5,4)
a.shape
輸出:
torch.Size([2, 5, 4])
a.sum().shape
輸出:
torch.Size([])
- shape為空,表示它是一個標(biāo)量
a.sum(axis = 1).shape
輸出:
torch.Size([2, 4])
a.sum(axis = 1)
輸出:
tensor([[5., 5., 5., 5.],
[5., 5., 5., 5.]])
a.sum(axis = 0).shape
輸出:
torch.Size([5, 4])
a.sum(axis = [0,2]).shape
輸出:
torch.Size([5])
a.sum(axis = 1,keepdim=True).shape
輸出:
torch.Size([2, 1, 4])
- 維度的個數(shù)沒有發(fā)生變化只是第2個元素(下標(biāo)為1)變換成了1
Q&A
1、這么轉(zhuǎn)化有什么負(fù)面影響?比如數(shù)值變得稀疏
稀疏矩陣不會有太多影響
2、問什么深度學(xué)習(xí)要用張量來表示?
整個機器學(xué)習(xí)都是用張量或者是用數(shù)值的矩陣來表示的,深度學(xué)習(xí)是由機器學(xué)習(xí)發(fā)展過來的,機器學(xué)習(xí)實際上是統(tǒng)計的計算機版本
3、求copy與clone的區(qū)別(是關(guān)于內(nèi)存的嗎)?
copy有可能是不copy內(nèi)存的(深度copy與淺copy)
clone一定會復(fù)制內(nèi)存
4、對哪一維求和就是消除那一維可以這么理解嗎?
可以這么理解,將某一維縮減成一個值
5、torch不區(qū)分行向量和列向量嗎?
- 如果是一維向量的話一定是一個行向量
- 列向量是一個矩陣
- 可以用一個二維的矩陣來區(qū)分一個列向量和一個行向量
6、sum(axis=[0,1])怎么求?
- 相當(dāng)于每次求和是對于一個矩陣來說的
7、請問torch中L1,L2正則項要怎么加入?
之后會講
8、稀疏的時候可以把它當(dāng)成單詞做詞向量解決嗎?
之后會講,稀疏的話可以當(dāng)成詞向量來進(jìn)行查表,但不見得每次都能這樣做,絕大部分可以這么做
9、張量的概念機器學(xué)習(xí)里和數(shù)學(xué)有哪些主要的區(qū)別?
- 機器學(xué)習(xí)的張量其實不是張量,就是一個多維數(shù)組,跟數(shù)學(xué)的張量是不一樣的
- 深度學(xué)習(xí)大部分的運算都是矩陣的運算,不會用到數(shù)學(xué)中張量的概念
10、這門課是不是只講基于pytorch的神經(jīng)網(wǎng)絡(luò)算法?學(xué)習(xí)其他算法可以先聽這門課嗎?
- 工具和學(xué)習(xí)應(yīng)該是分開的
- 主要是學(xué)會,然后拓展至其他框架
11、病理圖片的SVS格式和醫(yī)生勾畫的區(qū)域XML格式的文件如何進(jìn)行預(yù)處理?
12、稀疏化之后有什么好的解決辦法?
被跳過了。。。
13、老師后面講算法的時候可以著重講一下算法提出的過程的直覺和數(shù)學(xué)嗎,想多了解算法背后的why?
----end----?
05 線性代數(shù)【動手學(xué)深度學(xué)習(xí)v2】的評論 (共 條)
