博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
sp2.1 Practical aspects of Deep Learning
阅读量:4542 次
发布时间:2019-06-08

本文共 2767 字,大约阅读时间需要 9 分钟。

训练集 dev验证集 测试集
1 很多是人为设定的 层数 单元数 学习速率 激活函数等等
idea--code--run experiment--idea--不断迭代改进参数 使这个圈加快
 
参数都是慢慢测试出来的
 
首先要建立好的训练集 交叉验证集 测试集
1 小数据一般比如一两万或者几千几百数据 三七分 七成训练 三成验证 或者6 2 2
2 大数据几十万百万 可能100万里拿一万就可以交叉验证看哪个算法好 测试集可能一万也够了
分成98% 1% 1% 甚至99.5 0.5 0.5
 
现在很多数据分布不均匀 你从网上爬到的数据图片 和用户上传的可能 比如分辨率不一样等
训练集 交叉验证集应该来自同一分布 比如一边的分辨率很高 一边的很低
可以没有测试集 验证集算出来就行了 此时测试集就成测试集
 
 
 
偏差 欠拟合 、方差过拟合:
 
 
训练时候高偏差欠拟合只好试试更大的神经网络 层数啊 单元数目啊等
然后验证集 要是发现高方差 用更多数据训练 或者正则化减少拟合 最后还不行可能要更换算法了
直到有一个低方差和偏差的神经网络
首先看是否有偏差,有的话 用更大的神经网络 跟高级的优化算法
没的话 看是否有偏差,更多的数据 正则化 更适合的神经网络
主要还是用更大的神经网络或者更多的数据
深度学习对于优化其中一项比如方差 对偏差影响不大 两者相对独立一些 这也是深度学习的优点之一
 
 
正则化:损失函数中加入刻画模型复杂度的指标,总思想就是限制权重大小 使得模型不能任意你和训练数据中的噪音
λR(w) 这里R(w)表示模型复杂程度 一般就是L1或L2的W,
λ表示模型复杂损失 在总损失中的比例
避免高方差过拟合 一个方法是更多训练数据 一个方法就是正则化 L2导数也好算
L2正则化最常用 L2不会稀疏原因是比如0.001平方接近0,模型进一步不会将这个参数再降低为0了
也有L1正则化最终W是稀疏的 很多0 用的少 而且不可导 也可以L1 L2同时使用
 
 
 
Python里lambda是保留字 所以一般写成lambd
b占比少 用不用都可以 影响不大 因为参数主要集中在W中
代价函数里面多添一个W项 这里W项一般选用平方也就是内积 就是L2正则化
 
 
 
下面这个矩阵范数就是F范数 弗罗贝尼乌斯范数
dw反向求导对于矩阵来讲F范数计算如图 梯度更新时候就是最后多加一项
这个也叫权重衰减,反向传播时候 导数变大了 相当于W每次更小了
最后一行系数小于1吧 更小了 两个方框相等吧
反向传播时候 导数也要改啊 多了一项 这里对 λ/2m*W^2对W求导
 
为什么正则化可以减少拟合:
1 因为λ大 前面w小了 当W接近0时候 相当于某些神经元不管用了 相当于简化了网络
极端情况 就变成线性了
 
2 另一角度 从激活函数来讲 w缩小了 接近0了 中间部分 则他更加呈线性了 如图
每个神经元要线性的话 隐藏层就没什么用了 相当于变简单了 所以减少了过拟合 线性的函数 线性组合还是线性的
 
 
dropout随机失活正则化:让某些神经元失活 以某种概率
 
 
假设现在有一个三层的
生成d3矩阵大小和整个神经网络一样大 <keep.prob 神经元保留的概率
覆盖上去 对应原本a3元素相乘 过滤所有等于0的单元
为了不影响z4 ,a3要除以保留的概率 不除的话z4就变小了
每次迭代 都用啊 不是在之前基础继续dropout 一般不再输入层和输出层用啊
It randomly shuts down some neurons in each iteration
他这里假设是个三层的 两个隐藏层 一个输出层
相当于建立个mask 盖上去 然后每一层这个都存到cache里
反向传播 取出来 求导时候这个单元就不用算了
dropout的反向传播 从缓存取出来 然后 那些单元就不用算了
奇怪这里还需要除以那个阀值
 
  • A common mistake when using dropout is to use it both in training and testing. You should use dropout (randomly eliminate nodes) only in training.
  • Deep learning frameworks like , ,  or  come with a dropout layer implementation. Don't stress - you will soon learn some of these frameworks.
 
 
测试阶段不用dropout 用之前成型的模型就行了
 
理解Dropout
可能让一个节点显得不那么重要了 不依赖某一特征值 因为都有可能被删除
每一层的保留值还可以设得不同 有的不担心过拟合那一层设为1可以全保留
有参数多的可能过拟合 可以设得保留值小一点
对输入层也可以用 一般不用 就是相当于减少特征值嘛
视觉方面用的比较多 因为像素点多
缺点是代价函数没有明确定义 因为每次都是随机删除点 好像不好算下降 可以关掉这个正则设为1 然后看下j是否一直下降
 
 
其他方法正则化:从数据本身
扩增数据:比如对数据进行改变 把图颠倒一下 裁剪一下 或者怎么
对于数字识别可能稍微变形等
 
提前停止梯度下降: 不仅可以看训练集误差 也可以看验证集误差
缺点是 同时处理了两件事 一是 想最小化 代价函数 二是不过拟合 这样其实比较困难
原本这俩问题是分开的 用不同的方式
 
加速训练的方法:
归一化输入:
1 零均值化 每个都减平均值
2然后归一化方差 图例x1方差比较大 同时用这里的两者值也用到测试集上进行归一化
为什么要归一化输入值呢:不归一的话这样的话代价函数的图像会是狭长的 归一化更对称 梯度下降时候可能次数会少很多 可以使用更大的步长 帮助算法算的更快
 
 
梯度消失 梯度爆炸:导数可能特别大或者特别小
若是非常深的话 激活函数以指数级递减或增加 看权重大于1还是小于1
对于导数或者梯度函数都是 每次可能步长非常小 花费时间巨大
举个极端情况就是w123...都大于1或者小于1 爆炸性增长或减少
 
解决上面问题:
不能全都初始化为0 要不都一样了
 
不能初始化过大 他后面*10
 
 
He 初始化方法
 
 
初始化参数:为了不让z过大或过小 特征值n越多 w要越小 设为1/n
对于普通的1/n relu就是最下面一行的 tanh用右边两个都可以
 
梯度数值的逼近:用左右两边的算更准确
 
梯度检测:利用上面的来检验反向传播里导数写的对不对
把所有层的Wb合一起转为一个向量
 
 
 

 

转载于:https://www.cnblogs.com/hellodantong/p/9965206.html

你可能感兴趣的文章
Dubbo源码学习--服务是如何引用的
查看>>
【转】C#安装字体到系统
查看>>
Android视频播放之VideoView
查看>>
非对称加密
查看>>
位运算巧用
查看>>
display:flex布局
查看>>
利用反射跟自定义注解拼接实体对象的查询SQL
查看>>
JQuery Ajax Options
查看>>
整体二分专题
查看>>
Python执行Linux系统命令的4种方法
查看>>
09 mongoDB基础(进阶)
查看>>
Xenomai PC开发环境
查看>>
spring-c3p0-01
查看>>
浏览器
查看>>
E20170624-ts
查看>>
linux shell实现随机数多种方法(date,random,uuid)
查看>>
页面上有tab,如何点击加载更多?
查看>>
bash&nbsp;shell笔记1&nbsp;脚本基础知识
查看>>
html dl dt dd标签元素语法结构与使用
查看>>
OC单元测试框架-----Google开源单元测试框架Google Test(gtest)
查看>>