ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

从零开始的深究手撕算法之路(二) ---- 二番战花书 再一次从零开始学习 数据处理线性代数

从零开始的深究手撕算法之路(二) ---- 二番战花书 再一次从零开始学习 数据处理线性代数 文章目录前引从零开始的深究手撕算法之路二 ---- 二番战花书 再一次从零开始学习 数据处理线性代数1、数据处理1、运行代码块2、运行结果2、线性代数1、运行代码块2、运行结果前引尽管我之前手撕过梯度求导也推导过数学公式为什么是这个样子但我到现在仍然觉得对这个东西掌握得不是那么牢固。以至于在前一篇讲到可能会出现梯度消失、梯度爆炸的情况时我脑海里没有任何画面不知道在哪个环节会出现这种情况——比如为什么会出现梯度的消失和梯度爆炸因此我认为在第二篇的时候需要先去手撕一下这里是怎么做梯度求导的公式是怎样的。尽管这个东西我之前确实求过但我觉得有必要在这里重新做一遍。我仔细思考了一下。今年年初学滑雪的时候我对深度学习刚入门这确实对我现在非常有帮助。但因为当时是在没有搞过模型、没有算法基础的情况下学习的所以学得并不是很扎实。我觉得课程真的很好所以我应该要去重新学习一遍。第二次学习时会有以下几点不同学习速度会快非常非常多。我会看到很多之前从来没有看到过的视角。很多之前不想写或者不愿意写的代码我现在愿意一点一点重新去推导。而且在过程中发现很多问题时我觉得自己是可以一点一点慢慢去Debug 的我觉得这次学习应该又会学到非常非常多。从零开始的深究手撕算法之路二 ---- 二番战花书 再一次从零开始学习 数据处理线性代数1、数据处理从最底层的开始一步一步慢慢来。我们这里反正去搞一个 notebook 就可以了可以在线对代码、做编辑。没想到第二次再做的时候这个地方就比较得心应手啊非常得心应手。我对这个东西感觉还是不错的。这个东西是一个开篇吧今晚做这种事情我有点烦躁但是我觉得后面会慢慢快起来吧。1、运行代码块xtorch.arange(12)x x.shape ytorch.zeros((1,2))y.shape Xx.reshape(3,4)X xtorch.tensor([2,1.0,0,3])ytorch.tensor([1,2,1,5])xy,x-y,x/y,x//y,x*y,x**y torch.exp(x)Xtorch.arange(12).reshape(3,-1)Ytorch.ones((3,4))torch.cat((X,Y),dim0),torch.concat((X,Y),dim0)X.sum(dim1)# 广播x1torch.arange(3).reshape((3,1))y1torch.arange(2).reshape((1,2))x1y1#而且我记得广播这里有一个问题它的维度必须是 1现在这个数字必须要是 1它才能够往外扩展。# 其实上面的广播大概是这样一个机制Y 的 1 先广播到了 3变成了 3然后 X的 1 再变成了 2。# 需要记住这个地方用的是左闭右开。Xtorch.arange(12).reshape(3,-1)X,X[1,3],X[1:3],X[-1]AX.numpy()Btorch.tensor(A)type(A),type(B)atorch.tensor([3.5])a,a.item(),float(a),int(a)2、运行结果2、线性代数下面是我大概画了一下图。 发现重新温习一下矩阵运算在矩阵运算这个地方尤其是对于行和列包括 sum 和 dim我确实都有点混淆。这样列了一下其实会清晰很多。1、运行代码块# 这个 numel 我猜应该是 num element 就是元素一共有多少个吧。。# A.to(float).mean(dim0) 实话实说对于每次这种行级别的运算和列级别的运算我都要看一会儿才能看得出来。A.sum(dim1,keepdimsTrue)# torch.dot 点击是直接比如说矩阵得相乘了之后得到一个标量。# 嗯但是我记得是一个通用的反正不是 dot。 应该是这个 matmulAtorch.tensor([1,2,3])Btorch.tensor([3,4,5])A.dot(B),A.matmul(B)# 这个我倒是没有什么很有印象了。# 看起来就是把这个向量乘进去之后按照行对标量求和。Atorch.ones((5,4))Btorch.ones(4)A.mv(B).shape2、运行结果
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进