satyrs

yuqing

  • home
  • leetcode
  • bilibili
  • categories
articles links about me
总字数 168.3k

satyrs

yuqing

  • home
  • leetcode
  • bilibili
  • categories

dl技巧

2021-10-06
字数:1.5k字 | 预计阅读时长:5分钟

加速

  • minibatch

batch将一个batch里的example组成matrix进行运算。
GPU使同时运算。GPU+minibatch

提升performance

bn

1、bn是因为,1 线性变换加上激活的非线性变换,导致中间层的输入远离初始分布,后面的网络由于每次输入分布变化,导致网络的学习比较慢。2 由于一些激活函数求导随着层数增加,乘积越来越小,导致梯度接近0,模型近似饱和。又有情况是,w的梯度越来越大,w值也越来越大。此时可以改变激活函数为非饱和激活函数如Relu,也可以通过让激活函数的输入分布保持在一个稳定状态,尽可能避免它们陷入梯度饱和区,这也就是Normalization的思路。

即,一个是分布变化,一个是梯度问题。

2、解决:
1 白化,通过使得输入特征的均值为0,方差为1或者相同,来保证分布的稳定并去除特征相关性,从而加速收敛
2 bn : 白化的缺点是计算量并且改变了特征的分布导致信息丢失,所以引入了bn– 简化、进化版的白化。

3、bn
bn原理、效果测试
bn ln wn

4、 test上bn
无偏估计、每个层的bn进行指数

5、 优点
1分布稳定,避免梯度消失,加速收敛 2对网络参数不敏感 3引入随机噪声,正则化效果

尽管每一个batch中的数据都是从总体样本中抽样得到,但不同mini-batch的均值与方差会有所不同,这就为网络的学习过程中增加了随机噪音,与Dropout通过关闭神经元给网络训练带来噪音类似,在一定程度上对模型起到了正则化的效果。原作者通过也证明了网络加入BN后,可以丢弃Dropout,模型也同样具有很好的泛化效果。

trick

lr:
learning rate ,推荐了解 cosine learning rate

weight:
weight decay。

loss:
当你的模型还不错的时候,可以试着做数据增广和改损失函数锦上添花了。

全连接:
1、能用全卷积的任务,少用全连接层,参数量小。
2、highway net:可以考虑将全连接层(MLP)替换成Highway Network,我尝试对结果有一点提升,建议作为最后提升模型的手段,原理很简单,就是给输出加了一个gate来控制信息的流动

参数初始化:
1、uniform均匀分布初始化:w = np.random.uniform(low=-scale, high=scale, size=[n_in,n_out])
Xavier初始法,适用于普通激活函数(tanh,sigmoid):scale = np.sqrt(3/n)
He初始化,适用于ReLU:scale = np.sqrt(6/n)
2、normal高斯分布初始化:w = np.random.randn(n_in,n_out) * stdev # stdev为高斯分布的标准差,均值设为0
Xavier初始法,适用于普通激活函数 (tanh,sigmoid):stdev = np.sqrt(n)He初始化,适用于ReLU:stdev = np.sqrt(2/n)
3、svd初始化:对RNN有比较好的效果。
4、LSTM 的forget gate的bias,用1.0或者更大的值做初始化

batch_size:
embdding size,一般从128上下开始调整. batch size,一般从128左右开始调整.batch size合适最重要,并不是越大越好.

数据预处理:
bn、pca白化

激活函数:
sigmoid函数在-4到4的区间里,才有较大的梯度。之外的区间,梯度接近0。输入0均值,sigmoid函数的输出不是0均值的。
把输出限制成0-1之外,尽量不要用sigmoid,可以用tanh或者relu之类

ensemble:
cv
不同模型线性融合

优化器:
用ada系列先跑,最后快收敛的时候,更换成sgd继续训练.同样也会有提升.据说adadelta一般在分类问题上效果比较好,adam在生成问题上效果比较好。
sgd的话,可以选择从1.0或者0.1的学习率开始,隔一段时间,在验证集上检查一下,如果cost没有下降,就对学习率减半. 我看过很多论文都这么搞

dropout:
dropout对小数据防止过拟合有很好的效果,值一般设为0.5
小数据上dropout+sgd在我的大部分实验中,效果提升都非常明显
因此可能的话,建议一定要尝试一下。 dropout的位置比较有讲究, 对于RNN,建议放到输入->RNN与RNN->输出的位置

梯度:
要做梯度归一化,即算出来的梯度除以minibatch size
clip c(梯度裁剪): 限制最大梯度,其实是value = sqrt(w1^2+w2^2….),如果value超过了阈值,就算一个衰减系系数,让value的值等于阈值: 5,10,15
RNN 不加 gradient clipping,导致训练一段时间以后 loss 突然变成 Nan。

正则:
一轮加正则,一轮不加正则,反复进行。

数据集:
判断测试集靠不靠谱,包括采样/数据分布的线上一致性、时效性、标注正确率、评测方差/置信度
除了标准和采样问题外,数据问题上还可以组合大量预处理策略和训练策略

性能关注

运行速度,准确率,召回率,auc,显存利用率,显存占用,cpu利用率,内存占用,并发路数

业务场景和模型是否合适

陌生社交和graphsage的相似top推荐思路的逻辑不恰

dropout

当一个复杂的前馈神经网络被训练在小的数据集时,容易造成过拟合。为了防止过拟合,可以通过阻止特征检测器的共同作用来提高神经网络的性能。

1、取平均,相当于训练了很多个模型然后投票
2、正则化
3、避免共适应、共线性

本文作者: yuqing wang
本文链接: https://satyrswang.github.io/2021/10/06/dl技巧/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
赏

thanks for tips

支付宝
微信
  • 算法
  • dl

扫一扫,分享到微信

微信分享二维码
历史中国宪制
图算法
© 2023 yuqing wang
Hexo Theme Yilia by Litten
  • articles
  • links
  • about me

tag:

  • 随笔
  • 算法
  • ml
  • 编程语言
  • python
  • dl
  • 金融经济
  • tensorflow源码
  • 工程
  • spring
  • c++
  • 论文
  • gpu
  • cuda
  • 训诫
  • dubbo
  • es
  • 流处理
  • 大数据
  • java
  • 并发
  • 英文积累
  • linux
  • mac
  • cheetsheet
  • 数据库
  • 索引
  • redis
  • 金融
  • 读后感
  • 分布式
  • 推荐系统
  • 方法论
  • 股市理论
  • 模型框架
  • 计算机
  • leetcode
  • 英文写作
  • 货银
  • 货币政策
  • 商业银行
  • 零散知识点
  • 破站
  • ky

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • github
  • jianshu
  • cnblogs
  • bilibili
  • youtube
  • uva
关心算法、cs、网络、投资, 闲听历史、看史评 wechat satyrsh