精华内容
下载资源
问答
  • tensorflow训练过程中loss越来越大

    千次阅读 2020-08-13 15:58:09
    在学习Tensorflow的时候,发现训练时loss竟然越来越大,多次检查之后发现代码并无问题。最终发现原因是学习率太大,调小之后loss减小,特此记录。

    在学习Tensorflow的时候,发现训练时loss竟然越来越大,多次检查之后发现代码并无问题。最终发现原因是学习率太大,调小之后loss减小,特此记录。

    展开全文
  • ![图片说明](https://img-ask.csdn.net/upload/201809/30/1538270368_592051.jpg)
  • 简单记录刚刚在使用 librec 时发现的一个小点,发现越训练,loss值越??? 训练的数据集是 filmtrust ,训练的效果如下图所示,loss值一直在上升,肯定是有问题的! 说明: 上图的 loss 是每一次迭代的 loss ...

    简单记录下困扰了我半个多月的问题:在跑 Librec 的 SBPR 算法代码的时候,发现 Loss 一直随着迭代次数在逐渐增加,这不是不正常吗???

    一、我的疑问

    最早的时候,只是拿 Librec 去跑一个数据集的实验结果,但是一不下心瞄了一眼输出的迭代结果,竟然发现 loss 一直在逐渐增大,跑了其他几个方法,都没有发现这样的情况,按理来说,越训练 loss 应该越小才对,所以到底哪里有问题???
    在这里插入图片描述
    说明

    • 上图的 loss 是每一次迭代的 loss 总值
    • delta_loss 是上一次迭代的 loss 值 - 本次迭代 loss 值

    二、我的尝试解决办法

    然后我开始尝试不断的解决问题,劝说自己:

    • 首先排查是不是不小心把对方的代码改了,这里没有。
    • 然后想想是不是迭代次数不够,慢慢的后面会逐渐收敛,所以把迭代次数设置的超级大,但 loss 还是一直在持续上升,并且不是上升一点点的那种。
    • 查询很多资料后,发现 loss 上升绝对是不正常的,所以我开始看原论文,发现原论文是用梯度上升求最大值,看了眼公式,既然是求最大值,那 loss 上升应该是对的,我这样想。

    我以为这是我的最终答案,遂不管它。但是过了几天想想还是不对劲,loss 代表的是误差,误差一直在增大,怎么样都说不过去啊,只有 loss 缓慢更新才代表收敛啊,这样才叫训练好了啊,然后我就开始查梯度上升的资料,发现这方面的资料很少。咨询同门师弟也说,loss 一直上升是不正常的!!!

    • 后来查到如果 loss 上升的话,可以调整下学习率,每次迭代的时候都相应的更新学习率,loss 就会收敛。而在 librec 中确实有一个 bolddriver 的设置问题,设置为 true 的话,可以控制每次迭代的时候相应的更新学习率的大小,比如 loss 在增加,学习率在下一轮变小,loss 在减小,学习率在下一轮变大。这样设置后, 虽然前面的迭代次数 loss 都在上升,但是后面逐渐收敛。

    我以为上面就是我的最终答案,只要改一个默认的参数设置 bolddriver就可以解决 。遂又开始不管它。(但SBPR的梯度上升的疑问一直留在我的心中,这是个啥?)

    三、插句题外话,BPR公式错了?

    后面因为种种原因,我重新看了遍 BPR 的公式以及重新推导了一遍 BPR 的公式,发现 BPR 也是要查找最大值,但是为啥最后用的是梯度下降,梯度下降不是用来找最小值的吗???为啥 SBPR 用的是梯度上升???然后我去翻了很多 BPR 的其他变体,大家普遍用的是梯度下降。

    我开始纳闷了。真的纳闷了!!!看来我真的没有看懂过 BPR 这个算法,枉我之前还更新过【论文阅读+实现】BPR: Bayesian Personalized Ranking from Implicit Feedback,简直打脸,我连它为啥用梯度下降找最大值都不知道。

    找了很多资料,开始手把手的重新推导公式,下面是 BPR 论文中的优化公式(目标函数),说是要最大化这个公式,这个公式到这里的推导都是正确的。
    在这里插入图片描述
    但后面就开始说用梯度下降求解了,这?????(这里开始不断的怀疑自己几百次)
    在这里插入图片描述
    我这里就不卖关子了,直接说出我最后的结论,结论就是要找最大值没有错,整个公式加个负号不就是找最小值了吗!!!不就可以使用梯度下降了吗!!!(这里原论文感觉也没有说明白,然后就直接推导公式了,其实这个推导是有错误的)
    在这里插入图片描述
    证据就是这一步这样推下来是没有那个负号的!(我推了很多次,不要怀疑…不过,也可以怀疑…)
    所以这个目标公式其实应该改成下面这样,再来进行梯度下降求最小值(整体取负,想想ln函数在(0,1)区间得到的值都是负数就明白了)。
    在这里插入图片描述
    我其实一开始不太肯定自己的这种猜想,但是为了劝服自己,我又去看了其他论文,比如下面这篇发表在CIKM2018上的MBPR上的目标函数。我才敢觉得我这样的猜想有些正确…
    在这里插入图片描述
    那么自然而然这个公式最后求导的结果为
    在这里插入图片描述
    参数更新公式为
    在这里插入图片描述
    其实到这里我还是不太敢详细论文中公式推错了,而且很多人都推错了…(或许是我错了…)但是我仔仔细细的研究了下 librec 中的 BPR代码,发现我这样的公式和那里的实现是吻合的。

    四、言归正传,SBPR 用梯度上升有问题吗?

    为啥中间插个 BPR 呢?其实是因为在不断的解决问题中,一直不断的产生新的疑问,新的自我怀疑,上面这个怀疑公式推导错误我也是想了很久,验证了很久。(验证方法无非是看其他引文的公式推导,发现我没有错),看其他开源代码的实现方法(有的和我一致,有的不一致…)

    但上面就是我现阶段对于 BPR 的结论了,可能过个几个月,我又会觉得我自己错了。学术交流嘛,反正我就是想把这个思考的过程记录在这里。

    言归正传,上面讲到 BPR 的目标函数已经变为了这个,所以用梯度下降求最小值,没有任何问题。在这里插入图片描述
    而SBPR的目标函数如下,这个公式没有问题,求最大值没有问题,用梯度上升求最大值更没有问题了。至此不纠结为啥SBPR用梯度上升,而其他方法都用梯度下降了,确实这样说一点问题都没有!在这里插入图片描述

    五、我又开始尝试解决这个问题了

    既然如此,因为使用梯度上升,所以 loss 一直上升,而且最后 loss 会收敛好像确实没有毛病(我也不知道是不是这样)。我又以为这是我最终的答案

    但出人意料的点来了。在 Librec 中是使用梯度下降的方法来优化 SBPR 算法的。所以 loss 会一直上升是真的有问题!!!

    再来回顾下,SBPR的 loss 公式:
    在这里插入图片描述
    下面是计算 loss 的代码,没有错误。
    在这里插入图片描述
    在这里插入图片描述
    我们知道,对于一个用户来说,如果没有 social item 的话,那该用户的参数更新就会降为BPR算法了在这里插入图片描述
    由此,此时的 loss 公式为
    在这里插入图片描述
    下面是 librec 这部分的代码
    在这里插入图片描述
    终于找到错误了!!!就是上面画×的地方,这里的代码应该是

    double posNegDiffValue = posPredictRating - negPredictRating;
    double lossValue = - Math.log(Maths.logistic(posNegDiffValue));
    loss += lossValue;
    

    要哭了…原来是 librec 库里的代码写错了,完全可能是复现作者的笔误,直接将posNegDiffValue 作为 loss 相加…下面的结果是修改完这段代码之后的运行结果,loss 在逐渐降低并且收敛。(没有设置 bolddriver)
    在这里插入图片描述
    至此,我的问题终于解决了。值得一提的是,因为代码部分这里的 loss 写错了,参数更新以及其他的地方都没有写错,所以在同样的迭代次数下,实验结果是一样的。所以除了没有显示出正确的 loss 值外,其他都对!

    六、小结

    看完上面我的种种陷入自我怀疑又不断求证的"精分现场"是不是脑子里会有点???
    在这里插入图片描述
    我也觉得很无语,小小的问题被我解决来解决去,竟然发现了自己的这么多漏洞,自己有这么多理解错的地方,比如 梯度上升求最小值???loss 不收敛结果正确吗???BPR的公式推错了???梯度下降求最大值???简直是越求证,越无知!!!不过还好没有放弃妥协…

    以上是我的"精分现场",如有同样疑问,欢迎评论交流。如有错误,欢迎指正。

    展开全文
  • 训练loss问题

    2020-12-27 17:25:04
    <div><p>请问loss越来越大是怎么回事</p><p>该提问来源于开源项目:A-bone1/Attention-ocr-Chinese-Version</p></div>
  • 1、http://blog.csdn.net/kuaitoukid/article/details/421209612、http://blog.csdn.net/huangynn/article/details/52947894梯度爆炸原因...loss随着每轮迭代越来越大,最终超过了浮点型表示的范围,就变成了NaN...
    1、
    

    http://blog.csdn.net/kuaitoukid/article/details/42120961

    2、

    http://blog.csdn.net/huangynn/article/details/52947894



    梯度爆炸

    原因:梯度变得非常大,使得学习过程难以继续

    现象:观察log,注意每一轮迭代后的loss。loss随着每轮迭代越来越大,最终超过了浮点型表示的范围,就变成了NaN。

    措施:
    1. 减小solver.prototxt中的base_lr,至少减小一个数量级。如果有多个loss layer,需要找出哪个损失层导致了梯度爆炸,并在train_val.prototxt中减小该层的loss_weight,而非是减小通用的base_lr。
    2. 设置clip gradient,用于限制过大的diff

    不当的损失函数

    原因:有时候损失层中loss的计算可能导致NaN的出现。比如,给InfogainLoss层(信息熵损失)输入没有归一化的值,使用带有bug的自定义损失层等等。

    现象:观测训练产生的log时一开始并不能看到异常,loss也在逐步的降低,但突然之间NaN就出现了。

    措施:看看你是否能重现这个错误,在loss layer中加入一些输出以进行调试。

    示例:有一次我使用的loss归一化了batch中label错误的次数。如果某个label从未在batch中出现过,loss就会变成NaN。在这种情况下,可以用足够大的batch来尽量避免这个错误。

    不当的输入

    原因:输入中就含有NaN。

    现象:每当学习的过程中碰到这个错误的输入,就会变成NaN。观察log的时候也许不能察觉任何异常,loss逐步的降低,但突然间就变成NaN了。

    措施:重整你的数据集,确保训练集和验证集里面没有损坏的图片。调试中你可以使用一个简单的网络来读取输入层,有一个缺省的loss,并过一遍所有输入,如果其中有错误的输入,这个缺省的层也会产生NaN。

    案例:有一次公司需要训练一个模型,把标注好的图片放在了七牛上,拉下来的时候发生了dns劫持,有一张图片被换成了淘宝的购物二维码,且这个二维码格式与原图的格式不符合,因此成为了一张“损坏”图片。每次训练遇到这个图片的时候就会产生NaN。良好的习惯是,你有一个检测性的网络,每次训练目标网络之前把所有的样本在这个检测性的网络里面过一遍,去掉非法值。

    池化层中步长比核的尺寸大

    如下例所示,当池化层中stride > kernel的时候会在y中产生NaN

        layer {
          name: "faulty_pooling"
          type: "Pooling"
          bottom: "x"
          top: "y"
          pooling_param {
          pool: AVE
          stride: 5
          kernel: 3
          }
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    致谢

    http://stackoverflow.com/questions/33962226/common-causes-of-NaNs-during-training


    展开全文
  • loss = loss_fn(X, U, p, q) optim.zero_grad() loss.backward() optim.step() print('*'*10) print('epoch {}'.format(epoch+1)) #误差 print('loss is {:.4f}'.format(loss)) ``` ``` X和U为...
  • 使用caffe训练时Loss变为nan的原因

    万次阅读 2016-10-27 17:29:27
    loss随着每轮迭代越来越大,最终超过了浮点型表示的范围,就变成了nan。措施:减小solver.prototxt中的base_lr,至少减小一个数量级。如果有多个loss layer,需要找出哪个损失层导致了梯度爆炸,并在train_val....

    梯度爆炸

    原因:梯度变得非常大,使得学习过程难以继续

    现象:观察log,注意每一轮迭代后的loss。loss随着每轮迭代越来越大,最终超过了浮点型表示的范围,就变成了NaN。

    措施:
    1. 减小solver.prototxt中的base_lr,至少减小一个数量级。如果有多个loss layer,需要找出哪个损失层导致了梯度爆炸,并在train_val.prototxt中减小该层的loss_weight,而非是减小通用的base_lr。
    2. 设置clip gradient,用于限制过大的diff

    不当的损失函数

    原因:有时候损失层中loss的计算可能导致NaN的出现。比如,给InfogainLoss层(信息熵损失)输入没有归一化的值,使用带有bug的自定义损失层等等。

    现象:观测训练产生的log时一开始并不能看到异常,loss也在逐步的降低,但突然之间NaN就出现了。

    措施:看看你是否能重现这个错误,在loss layer中加入一些输出以进行调试。

    示例:有一次我使用的loss归一化了batch中label错误的次数。如果某个label从未在batch中出现过,loss就会变成NaN。在这种情况下,可以用足够大的batch来尽量避免这个错误。

    不当的输入

    原因:输入中就含有NaN。

    现象:每当学习的过程中碰到这个错误的输入,就会变成NaN。观察log的时候也许不能察觉任何异常,loss逐步的降低,但突然间就变成NaN了。

    措施:重整你的数据集,确保训练集和验证集里面没有损坏的图片。调试中你可以使用一个简单的网络来读取输入层,有一个缺省的loss,并过一遍所有输入,如果其中有错误的输入,这个缺省的层也会产生NaN。

    案例:有一次公司需要训练一个模型,把标注好的图片放在了七牛上,拉下来的时候发生了dns劫持,有一张图片被换成了淘宝的购物二维码,且这个二维码格式与原图的格式不符合,因此成为了一张“损坏”图片。每次训练遇到这个图片的时候就会产生NaN。良好的习惯是,你有一个检测性的网络,每次训练目标网络之前把所有的样本在这个检测性的网络里面过一遍,去掉非法值。

    池化层中步长比核的尺寸大

    如下例所示,当池化层中stride > kernel的时候会在y中产生NaN

        layer {
          name: "faulty_pooling"
          type: "Pooling"
          bottom: "x"
          top: "y"
          pooling_param {
          pool: AVE
          stride: 5
          kernel: 3
          }
        }
    

    致谢

    http://stackoverflow.com/questions/33962226/common-causes-of-NaNs-during-training

    展开全文
  • 使用caffe训练时Loss变为nan的原因From [原创|使用caffe...loss随着每轮迭代越来越大,最终超过了浮点型表示的范围,就变成了NaN。 措施: 减小solver.prototxt中的base_lr,至少减小一个数量级。如果有多个loss layer
  • 目录梯度爆炸原因:梯度变得非常大,使得...loss随着每轮迭代越来越大,最终超过了浮点型表示的范围,就变成了NaN。 措施:&nbsp;1. 减小solver.prototxt中的base_lr,至少减小一个数量级。如果有多个loss la...
  • 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、基本理论 1.采用soft - gamma...
  • 验证集loss振荡很厉害怎么回事?

    千次阅读 2020-06-16 19:56:07
    原因:batch_size可能太小。...2)跑完一次epoch(全数据集)所需迭代次数减少,对于相同的数据量的处理速度进一步加快,但是达到相同精度所需要的epoch数量也越来越多。由于这两种因素的矛盾, batch_Size 增大
  • 2020-08-28

    2020-08-28 16:58:04
    用matlab软件实现DDPG算法时,自己的代码步骤严格按照算法步骤,为什么自己的代码运行时会出现Loss越来越大情况。请大家指教。
  • 写demo的时候,遇到一个问题,排查了很久也找不到原因。 若生成训练数据的时候,用这种方式...则在求loss的时候,loss越来越大,至至NAN,排查半天发现,这里linspace参数必须(0,1),也就是x必须0-1之间,才能正常...
  • 往往因为显存的不足,会导致我们的BatchSize无法设置的较高,当我使用BatchSize=4的情况下,开始Loss会稳定下降,但当一定step之后,会在某个Batch时出现Loss突然变大的情况,在这个Batch之后,Loss会变得越来越大。...
  • 文章目录目前存在的问题 ReID1、表征学习: 类内... 距离最远的正样本距离越来越小, 距离最近的正样本距离越来越大论文: Alexander Hermans, Lucas Beyer, Bastian Leibe. In defense of the triplet loss for per
  • 深度学习交流QQ群:116270156 一、caffe训练时Loss变为nan的原因 本节转载于公众号平台:极市平台 1、梯度爆炸 ...现象:观察log,注意每一轮迭代后的lossloss随着每轮迭代越来越大,最终...
  • 激活函数简单理解

    2017-06-27 11:23:35
    梯度是从输出端根据loss求导反向传播的,根据求导的链式法则,靠近输入层的梯度是靠近输出层梯度累积的乘积,因此,连乘有可能会导致连乘的梯度越来越小或者越来越大,越来越小就叫梯度弥散,越来越大
  • 最近在使用perceptual_loss过程中,出现了模型随着训练占用的内存越来越大的问题,千万不要在遍历数据的过程中使用tf的相关操作,必要的操作放到模型中,如果在模型外执行,会不断增加新的节点,导致网络占用的内存...
  • 梯度爆炸

    2017-10-23 21:42:53
    loss随着每轮迭代越来越大,最终超过了浮点型表示的范围,就变成了NaN。 措施: 1. 减小solver.prototxt中的base_lr,至少减小一个数量级。如果有多个loss layer,需要找出哪个损失层导致了梯度爆炸,并在train_...
  • WGAN学习笔记

    2018-12-24 22:34:00
    GAN回顾 Martin 称这个loss为original cost function(参见[1] 2.2.1章节),而实际操作中采用的...当固定G时,训练D直到收敛,可以发现D的loss越来越小,趋于0,这表明JSD(Pr || Pg)被较化了,并且趋...
  • 梯度爆炸由于初始化权值过大,前面层会比后面层变化的更快,就会导致权值越来越大,梯度爆炸的现象就发生了。 模型无法从训练数据中获得更新(如低损失)。 模型不稳定,导致更新过程中的损失出现显著变化。 训练...
  • tensorflow中如何查看梯度

    千次阅读 2018-09-23 21:01:31
    (2)求导之后的数(的绝对值)越来越大(特别大,发散),这就是梯度爆炸 所以说呢,当loss不正常时,可以看看梯度是否处于爆炸,或者是消失了,梯度爆炸的话,网络中的W也会很大,人工控制一下(初始化的时候弄小...
  • 最好结果 所做工作 主要对chatbot.py的network options和training options部分的参数进行了修改。...感觉对结果影响较的是learningRate和dropout,随着loss越来越小,learningRate也要跟着减小,dropou...

空空如也

空空如也

1 2 3
收藏数 59
精华内容 23
关键字:

loss越来越大