2026.04.02随记
1、DL1、反向传播backward propagation是计算网络参数梯度的方法用链式法则从输出层到输入层遍历算出每个参数该怎么改。反向传播中每一个记录的梯度都是该函数的导数。梯度下降不等于反向传播反向传播是算梯度梯度下降是用梯度更新参数、2、梯度公式3、梯度消失、爆炸原因及其解决办法梯度损失函数L对某个变量的偏导数梯度消失和梯度爆炸定义梯度消失参数更新过小每次更新几乎不会移动导致模型无法学习。梯度爆炸参数更新过大破坏了模型的稳定收敛。梯度消失与梯度爆炸其实是一种情况。两种情况下梯度消失经常出现一是在深层网络中二是采用了不合适的激活函数比如sigmoid。梯度爆炸一般出现在深层网络和权值初始化值太大的情况下。下面分别从这两个角度分析梯度消失和爆炸的原因比较简单的深层网络如下前向传播第一步线性组合第二步激活函数第二层输出层损失函数反向传播其中a1对z1求导就是对激活函数求导如果此部分大于1那么层数增多的时候最终的求出的梯度更新将以指数形式增加即发生梯度爆炸。如果此部分小于1那么随着层数增多求出的梯度更新信息将会以指数形式衰减即发生了梯度消失。下图为sigmoid导数图其梯度是不可能超过0.25的这样经过链式求导之后很容易发生梯度消失。同理tanh作为损失函数它的导数图如下可以看出tanh比sigmoid要好一些但是它的导数仍然是小于1的。权值初始化值太大做反向传播的时候总会有一些线性层而这些线性层的局部导数就等于权重本身如果权值初始化太大可能会造成梯度爆炸梯度消失、爆炸的解决方案采用ReLU函数、LeakyRelu函数、ELU函数等作为激活函数ReLU思想也很简单如果激活函数的导数为1那么就不存在梯度消失爆炸的问题了每层的网络都可以得到相同的更新速度relu就这样应运而生。下图是ReLU函数图和导数图ReLU的主要贡献在于解决了梯度消失、爆炸的问题计算方便计算速度快加速了网络的训练同时也存在一些缺点由于负数部分恒为0会导致一些神经元无法激活输出不是以0为中心的梯度 δ × 输入、δ 是“已经从后面所有层传回来的梯度信息最后再乘上“当前参数对输出的导数输入”得到参数的梯度。如果 ReLU 输出全是正数那么x0于是梯度符号完全取决于δ假设一个batch中所有样本的δ0那么所有权重的梯度都 0所有权重一起往同一个方向更新后果梯度更新“方向单一”你之前提到的 zig-zag 问题优化过程会变成不是“朝最优点直线走”而是“来回震荡 偏移”2、PyTorch1、N维数组就是有N个维度的数据结构0维标量、1维向量、2维矩阵、3维RGB图像数组也被称为张量tensor张量是多维数据的统一表示一中数据结构里面包含了多种 方法tNumPy 中的 ndarray 仅支持CPU 计算而 PyTorch 中的 Tensor 能够放到 GPU 上计算并且支持自动微分2、创建数组需要形状、数据类型int、float、元素值3、访问元素4、张量数据操作torch.__version__ # 查看torch版本 x torch.arange(12) # 标量 x.shape # torch.Size([]) x torch.arange(12) # 初始化一个0-11的张量这是一维的 x.shape # 张量的形状 torch.Size([12]) x.numel() # 张量中元素的总数 number of elements x x.reshape(3,4) # 一维张量改为3行4列的二维张量 y torch.zeros((2,3,4)) # 创建全0张量 #tensor([[[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]], [[0., 0., 0., 0.], [0., 0., 0., 0.], [0., 0., 0., 0.]]]) y torch.tensor([[2,1,4,3],[1,2,3,4],[4,3,2,1]]) # 二维tensor创建特定值张量 z torch.tensor([[[2,1,4,3],[1,2,3,4],[4,3,2,1]]]) # 三维tensor x torch.arange(12,dtypetorch.float32).reshape((3,4)) y torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]]) m torch.cat((x,y),dim0) # 按行合并起来 n torch.cat((x,y),dim1) # 按列合并起来 # 即使形状不同也可以张量广播运算 a torch.arange(3).reshape((3,1)) b torch.arange(2).reshape((1,2)) print(ab) tensor([[0, 1], [1, 2], [2, 3]]) # 张量内存变化 x torch.arange(12,dtypetorch.float32).reshape((3,4)) y torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]]) before id(y) y x y # 为了保证安全y会开辟新的内存空间以免新y和旧y所占内存空间不同 print(id(y) before) x torch.arange(12,dtypetorch.float32).reshape((3,4)) y torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]]) z torch.zeros_like(y) # z 的数据类型、尺寸和y一样里面的元素全为0 print(id(z):,id(z)) z[:] x y # 原地操作id不会变 print(id(z):,id(z)) x torch.arange(12,dtypetorch.float32).reshape((3,4)) y torch.tensor([[2.0,1,4,3],[1,2,3,4],[4,3,2,1]]) before id(x) x y # 原地操作id不会变 print(id(x) before) x torch.arange(12,dtypetorch.float32).reshape((3,4)) A x.numpy() # tensor转ndaaray B torch.tensor(A) # ndaaray转tensor a torch.tensor([3.5]) print(a) # tensor([3.5000]) print(a.item()) # 3.5 .item()是把只包含一个元素的张量转化为python普通数值 print(float(a)) # 3.5 print(int(a)) # 3 sum_A A.sum(axis1,keepdimsTrue) #keepdimsTrue不丢掉维度否则三维矩阵按一个维度求和就会变为二维矩阵二维矩阵若按一个维度求和就会变为一维向量 torch.dot(x,y) # 向量点积 torch.mv(A,x) # 矩阵和向量的乘积 torch.mm(A,B) # 矩阵相乘y x y 是创建新的张量x y 是原地操作id不会变
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2493812.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!