jjzjj

[ML&DL] 深度学习的实践层面

feixianxing 2024-02-14 原文

深度学习的实践层面

训练集 验证集 测试集

过程

神经网络的训练是一个需要不断迭代的过程,一般先提出idea,然后编码实现、测试,根据测试结果再次调整思路......

分组与比例

数据集通常分为3个部分:训练集、验证集和测试集

  1. 训练集用于训练模型的参数。
  2. 验证集用于选择最好的模型。
  3. 测试集用于评估训练结果。

一般讲数据集按照60%训练,20%验证和20%测试集来划分。

当数据集的大小达到一百万时,则比例可以调整为98%+1%+1%,因为验证集和测试集实际上不需要太多。

如果超过百万级别,甚至可以调整为99.5%+0.25%+0.25%.

分布

训练集、验证集和测试集应当保证分布一致

防止出现这种情况:在分辨猫图片的模型训练中,如果训练集都是猫的图片,本来训练得很好,但是测试集都是狗的图片,结果得到了很差的评估。


偏差 方差

  • 高偏差:欠拟合
  • 高方差:过拟合

如果出现高偏差问题,一般无法通过增加数据量解决问题。如果出现高方差问题,可以尝试使用正则化。


正则化

一般使用正则化来防止出现过拟合现象。

使用正则化会引入超参数\(\lambda\)

可以只正则化参数\(W\),因为偏置项\(b\)只是单个数字,正则化的意义不大。

L2正则化

正则项为:

\[\frac{\lambda}{2m}\parallel w \parallel_2^2=\frac{\lambda}{2m}\sum\limits_{j=1}^{n_x}w_j^2 \]

其中\(\parallel w\parallel_2\)\(w\)L2范数,也叫欧几里得范数。

L1正则化

使用的是L1范数,会使得模型变得稀疏(部分参数变为0)。

L2正则化是较为常用的。

正则化如何生效?

误差函数\(J\)中加入了正则项,而\(J\)的值又会影响参数的更新。

如果\(\lambda\)太大了,就会导致\(W\)几乎为0,使得模型变得简单,甚至可能欠拟合。

如果\(\lambda\)太小,对\(W\)的修正效果不大,如果原先模型就有过拟合现象,则不能很好的解决问题。

dropout正则化

随机失活,到达某一层的时候,会先遍历该层结点,以一定的概率(超参数)决定是否将其失活。

通过随机失活可以避免一些\(W\)变得太大,导致过拟合。

使用dropout正则化之前,\(a\)的原本值假设是100,使用dropout正则化之后,如果存活概率设置为80%,那么\(a\)的值可能变为80,为了保持数值,应该计算a=a/0.8

实施dropout正则化的相关知识:

  • 每层的存活率可以设置不同值,做出相应调整,但是会引入较多超参数。
  • 通常存活率不能设置太低,最好接近1,甚至大多数时候是不需要失活的,某些层直接设置为1。

其它正则化方法

  1. 数据扩增

    如果数据集是图像,可以考虑通过旋转,翻转等操作来扩增数据集。

  2. early stopping

    有时候迭代次数太多反而得到较差的结果,提前结束训练可以得到较好结果。


归一化

可以使数据分布得更”均匀“

思路和标准化正态分布是一致的:

  1. 求均值。
  2. 求方差。
  3. \(X:=\frac{X-\mu}{\sigma^2}\)

归一化可以提高训练速度。


梯度爆炸和梯度消失

这个问题通常发生在层数较多的神经网络。

梯度爆炸:如果每个权重\(W\)都大于1,那么不断地乘上\(W\),到最后输出值会变得非常大。

​ 这种情况下,可能导致\(W\)的值越来越大,最后甚至溢出为NaN.

梯度消失:如果每个权重\(W\)都小于1,那么不断地乘上\(W\),到最后输出值会变得非常小。

​ 这种情况下,可能因为梯度太小,导致梯度下降速度缓慢。


权重初始化

合理的权重初始化可以缓解梯度爆炸和梯度消失带来的痛点。

对于上图这种简单案例,有:

\[z = \sum\limits_{i=1}^nw_ix_i \]

可以考虑将权重初始化为:

\[w_i=\frac{1}{n} \]

其它激活函数

  • 如果使用的是Relu,则建议\(w_i=\frac{2}{n}\)

  • 如果使用的是\(\tanh\),则建议\(w_i=\sqrt{\frac{1}{n}}\)


梯度的数值逼近

联系导数与导数的近似值即可:

  • \(f'(x)=\lim\limits_{\epsilon\to0}\frac{f(x+\epsilon)-f(x-\epsilon)}{2\epsilon}\)

  • \(f'(x)\approx\frac{f(x+\epsilon)-f(x-\epsilon)}{2\epsilon}\)


梯度检验

  • \(W\)\(b\)都扁平化组合起来,形成一个向量\(\theta\)
  • \(dW\)\(db\)都扁平化组合起来,形成一个向量\(d\theta\)

则误差函数\(J(W,b)\)可以记为\(J(\theta)\).

对于向量\(\theta\)的每一项\(\theta_i\),我们可以计算其近似值:

\[d\theta_{approx}[i]=\frac{J(\theta_1,\theta_2,\cdots,\theta_i+\epsilon,\cdots)-J(\theta_1,\theta_2,\cdots,\theta_i-\epsilon,\cdots)}{2\epsilon} \]

这个近似值应该接近它的真实值:\(d\theta[i]\)

评估指标

\[\frac{\parallel d\theta_{approx}-d\theta\parallel_2}{ \parallel d\theta_{approx}\parallel_2 +\parallel d\theta\parallel_2 } \]

分子部分:欧几里得范数,计算两个向量”终点“之间的”距离“。

分母部分:防止分子数值相差过大,分母将这个指标变成一种”比率“。

参考数值

  • 如果指标的数量级为\(10^{-7}\),则是好的结果。
  • 如果指标的数量级为\(10^{-5}\),中规中矩,可能有问题。
  • 如果指标的数量级为\(10^{-3}\),则是坏的结果,需要调整。

注意事项

  1. 不要在训练中使用梯度检验,只用于调试。
  2. 如果算法的梯度检验失败,要检查所有项,检查每一项,并试着找出 bug。
  3. 梯度检验不能与dropout同时使用,因为每次迭代过程中,dropout会随机消除隐藏层单元的不同子集,难以计算dropout在梯度下降上的代价函数\(J\)

有关[ML&DL] 深度学习的实践层面的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  3. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  4. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  5. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  6. ruby - 检查 "command"的输出应该包含 NilClass 的意外崩溃 - 2

    为了将Cucumber用于命令行脚本,我按照提供的说明安装了arubagem。它在我的Gemfile中,我可以验证是否安装了正确的版本并且我已经包含了require'aruba/cucumber'在'features/env.rb'中为了确保它能正常工作,我写了以下场景:@announceScenario:Testingcucumber/arubaGivenablankslateThentheoutputfrom"ls-la"shouldcontain"drw"假设事情应该失败。它确实失败了,但失败的原因是错误的:@announceScenario:Testingcucumber/ar

  7. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  8. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  9. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  10. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

随机推荐