线性代数

好勒,非常感谢道友的知识分享! :handshake:

运行A/A.sum(axis=1),看看会发生什么。你能分析原因吗?
如果n!=m的话报错,n==m的话,对每一列相除对应的值

2022-05-15T16:00:00Z

C.sum(axis=2)很好理解。但是要计算C.sum(axis=0)时,可以写出C[0],C[1],用C[0]+C[1]。这是个人理解。但是碰到axis=1的时候,这种方法理解起来又出现了新的问题。比入到底应该 C[0][0]+C[0][1]+C[0][2];还是应该 C[0][0]+C[0][1]+C[0][2]+ C[1][0]+C[1][1]+C[1][2]。
对于大于等于三维的张量,不同维度的相加有没有更好的理解方法??

有了新的理解。C.sum(axis=1)就是找到C的第二维的数据,如果该维度的数值是3,那么就把第二维的数据3个3个加在一起。同理其他维度也是如此。
如果有更简单的理解方法请大神们指教!

这个地方的axis=0我理解的就是让0这个维度消失,也就是让行消失,按列来进行求和

tips:
1.还是建议在学习之前把整个知识点绘图为思维导图
2.对于学习是很容易忘记的,确定要进入该行业,对于知识点在大脑清晰的脉络还是非常importance
3.This is perfect deep learn’s book ,I have interesting in dl field

axis=0 ,可以理解为按行的方向进行压缩,那么就等价于按列求和,axis=1 理解为按列的方向进行压缩。不过如果维度过多axis=2,3这种,就不太好等价为按什么进行求和了

翻了翻文档才明白shape右对齐是将两个shape摆在一起,如下:

(4,3)
  (3)

特意将3对齐,剩下的4为多出来的维度叫“头部维度”?只有3那列为“尾部维度”?尾部维度相同可以广播

Python里axis=0,是指运算沿着 ↓ 方向(向下)进行的;
axis=1,是指运算沿着 → 方向(向右)进行的。

拿sum函数举例,sum(axis=0)的结果就是把每一列求和再呈现出来,
sum(axis=1)的结果就是把每一行求和;
加上参数keepdims=True会更清晰

1,2,3:用线性代数证明。
4.答:输出是2。
5.答:是的。对应于形状中第一个轴的长度。
6.答:发生错误,因为形状不符合广播机制。广播机制是从形状尾部开始进行匹配,因此如果是A/A.sum(axis=1, keepdim=True),此时两者形状为(5, 4)和(5, 1),可以进行广播。
7.答:分别在轴0,1,2上降维,形状分别为(3, 4)、(2, 4)、(2, 3)。
8.答:均为一个标量。

一点发现:2.3.10中的范数计算函数使用的是torch.norm(),但是在2.3.13的练习第8题中使用的是torch.linalg.norm()。建议统一采用torch.linalg.norm()。理由是通过查看torch.norm()官方文档说明(运行help(torch.norm)),发现torch.norm已经过时并可能在未来PyTorch版本中被移除,官方建议采用替代采用torch.linalg.norm,具体信息如下图所示:

0代表行的维度“消失了”,故只剩下一行,也就是列和;
1代表列的维度“消失了”,故只剩下一列,也就是行和;
为什么0代表方向,1代表类方向?
因为(m,n)表示m行n列,而这个二元坐标里,第0个元素代表行,第1个元素代表列。同理,三维张量坐标同理,在三元坐标(a,m,n),此时行方向应该是1,列方向应该是2

大佬你好,想知道笔记是怎么做的,非常美观欸

长度不匹配所以无法广播,可以看之前广播机制的原则,会发现A是方阵满足,右对齐,大小一致,不是方阵由于是对axis=1求和,再右对齐(axis=0和axis=1)大小必然不同,所以会报错,如果A/A.sum(axis=[0])不管A是什么形状都可以满足广播

你可以理解成最后求和之后消失的维度,比如axis=1就是维度为1会消失,书上没问题

行列相等的话,是ok的。A.sum(axis = 1)会使得轴1坍缩,当轴0和轴1的长度不同,是没法计算的。
行列相等时,可以根据上一节讲的广播进行运算。

其实可以总结广播的条件是:
看形状,轴数相等,且每个对应轴的长度相等或=1

另外一提,pytorch在进行矩阵乘法时除了可以用torch.mm(A, B)外,还可以A @ B,后面这种写法比较少见,但是简洁。

In [24]: A
Out[24]:
tensor([[ 0.,  1.,  2.,  3.],
        [ 4.,  5.,  6.,  7.],
        [ 8.,  9., 10., 11.],
        [12., 13., 14., 15.],
        [16., 17., 18., 19.]])

In [25]: B
Out[25]:
tensor([[1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.],
        [1., 1., 1.]])

In [26]: torch.mm(A, B)
Out[26]:
tensor([[ 6.,  6.,  6.],
        [22., 22., 22.],
        [38., 38., 38.],
        [54., 54., 54.],
        [70., 70., 70.]])

In [27]: A @ B
Out[27]:
tensor([[ 6.,  6.,  6.],
        [22., 22., 22.],
        [38., 38., 38.],
        [54., 54., 54.],
        [70., 70., 70.]])

1.使用数学方法证明A = (A’)’ 即可,比较简单,不重复赘述
2.同上,使用数学方法证明 (A + B)’ = A’ + B’即可
3.同上,对于n*n方阵中的任一下标i,j元素,都可证明 Aij + Aji = Aij + Aji = Bij = Bji。其中B = A + A’
4.len(X)输出的是2
5.与4相同,一起解释。假设X为四维张量,当张量X 的shape为 m * n * q * l 时,len(X)的长度为m,对应dim=0的长度,即shape[0]的大小
6.运行 A/A.sum(axis=1) 会报错,报错原因如下:
  假设A是shape为 m * n * q 的三维张量
  则A.sum(axis=1)的 shape 为 m * q 的二维张量
  我们知道,进行/运算时,要保证shape的大小是一致的,所以上式在运行时报错。
7. shape为(2,3,4)的形状,在dim=0时的输出shape为 (3,4),在dim=1时的输出shape为(2,4),在dim=2时的输出shape为(2,3)
8.提供一个四维的张量,经计算,输出的是一个标量,为L2范数,如下例子证明:
pic3