大家好~我开设了“深度学习基础班”的线上课程,带领同学从0开始学习全连接和卷积神经网络,进行数学推导,并且实现可以运行的Demo程序

线上课程资料:
本节课录像回放

加QQ群,获得ppt等资料,与群主交流讨论:106047770

本系列文章为线上课程的复盘,每上完一节课就会同步发布对应的文章

本文为第五节课:“用全连接层识别手写数字(中)”的复盘文章

本课程系列文章可进入索引查看:
深度学习基础课系列文章索引

主问题:如何使训练收敛?

  • 如何找到未收敛的原因?
    答:通过打印(log)来调试,打印一些重要的值
  • 打印哪些值?
    答:前向传播的输入输出;
    后向传播的输入输出;
    更新后的权重矩阵。

任务:找到未收敛的原因并修复

  • 请通过打印的方法调试,找到异常的数据?
    答:使用Log.res模块的log和printForDebug函数来打印,找到了下面的异常数据:
    1.前向传播的输出中,隐藏层和输出层的输出向量的值都几乎为1。
    进一步发现:它们的加权和都比较大,其中隐藏层的加权和基本上都是50几,输出层的加权和基本上都是10几。
    2.后向传播的输出中,隐藏层和输出层的梯度都很小
  • 原因是什么?如何修复?

答: 对于第1个异常数据,原因是隐藏层的输入向量的个数(784)和输出层的输入向量的个数(30)都很多,导致加权和过大,从而导致sigmoid激活函数的返回接近1

对于第2个异常数据,原因是:sigmoid激活函数的返回接近1->激活函数的导数接近0->梯度很小

另外因为损失函数变化了,所以在后向传播中计算输出层的误差项时, \(\frac{𝑑𝐸}{𝑑𝑦_𝑘}\)应该要修改。不过目前暂时不修改,因为跟修改前差别不大,所以影响不大。另外以后会再次修改损失函数,所以到时候再改

修复方案:
根据输入向量的个数来减小加权和,解决“sigmoid激活函数返回接近1”的问题;并且提高学习率,来减轻梯度过小的问题

  • 请实现修复
    答:待修复的代码为:ImplementTrain_answer,修复后的代码为:ImplementTrain_fix
  • 请每个同学都运行修复后的代码,看下是否收敛?
    答:现在正确率在50轮时能提高到60%左右,增加更多轮数则会提高到100%,所以收敛了

任务:重构调试代码

  • 请增加异常检查的代码,自动化检查异常数据?
    答:待修改的代码为:ImplementTrain_fix。增加了代码:DebugUtils,修改后的代码为ImplementTrain_fix_check
    现在会检查减小加权和后,加权后是否<=7;以及检查隐藏层和输出层的梯度 乘以 学习率后 是否出现消失或者爆炸的情况(梯度消失或梯度爆炸)
  • 请每个同学都运行代码,看下是否通过了自动化检查?
    答:通过了检查
  • 请每个同学都调整下学习率,看下结果?
    答:我们检查梯度乘以学习率后的值,具体是通过自动化检查中梯度消失的值的个数(打印的次数)来判断该值变化的趋势:学习率为0.1时,该值呈逐渐减小的趋势,所以导致正确率一直维持不变(10%)左右;学习率为10.0时,该值呈现逐渐增大的趋势,所以导致正确率逐渐加快地增加(直到100%)

结学

  • 未收敛的原因的原因是什么?
  • 如何修复?
  • 如何自动化地检查?

原文地址:http://www.cnblogs.com/chaogex/p/16905389.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性