深度学习原理 Lesson 10:深入理解模型Model

本文深入探讨深度学习模型的训练过程,介绍PyTorch Hooks的概念,如何利用Hooks在前向传播和反向传播中插入回调函数以追踪激活值,通过调整Activation Function和使用Normalization改进模型性能。同时,文章讲解了BatchNorm的原理、优缺点及解决小批量问题的策略。

1e1758dd9e85cca341700e36cbcf00f3.jpeg

1

   

本节简介

  1. callback

    1. 了解callbacks和event handlers的本质

    2. 了解Python中应用callbacks的方法,以及优缺点

    3. 用callback把cnn放到gpu上

  2. 其他基础原理

    1. __ dunder__ :Python中的特殊符号

    2. 如何用editor查看源代码

    3. Variance 方差, standard deviation 标准偏差, covariance 协方差, correlation 相关性

    4. Softmax

    5. 异常

  3. 重点

    1. 深入模型,看训练过程中的行为

    2. pytorch hooks,可以方便在Forward和Backward中加入callbacks

    3. 追踪Activations在每个layer上的变化

    4. 把追踪结果放在图像上,以找出问题

    5. 根据问题,修改Activation Function

    6. 介绍batchnorm,了解不适用的领域,优缺点

    7. 设计一种新的Normalization layer去解决这个问题

fdfbefa78efdc60196e100e22d88e8a2.jpeg

9d25a787116a3c3d9d24b7b9324cd8db.jpeg

提前准备的文件05a_foundations.ipynb

2

   

Callbacks

回调函数:就是把一个函数当作参数一样传进来在Fast.ai中用的最多的就是以状态(Event)命名的callback函数,这样可以更好的定义此时该做什么事

2.1

   

基础例子

显示进度的callback:show_progress

9b4b9dabfbf1ee07234c6a1ea3668f19.jpeg更精简的版本,把show_progress写成lambda函数

2e8c40e6f7cfb790d7460f922c4df1a0.png

2.2

   

callback上加额外参数 lambda & partial

如果要接收cb中的参数,并且额外再加个参数:

30bcab0ce764644632a2814b27eda848.png改成更直观的

82c489e2885612a2d0c00186ad4ca52d.jpeg

用lambda精简下

9325d81809c97fbe05e961bc2578932e.jpeg

inner这种方式有个专用的叫法:closure 闭包

但这一切都可以通过python中的partial方法来实现,这样可读性更高了!

df847a6f1f8b66db431e99c019991ba6.png

f7312b4765ffdb8ab44c9e31affd624a.png

2.3

   

Class Callback

这是没有状态的版本,只用到了内置的init和call

bb8492c24cdb2d8186c12d93059655f4.jpeg

这是有状态的版本,可以随时打出来状态节点的值

4e4697cfb87d3ffc9726c370e4de5a21.jpeg*args 位置参数,存储方式是tuple

**kwargs 关键词参数,存储方式是dictionary

17450295a73d9f15ee1cc0951372dd44.png

2.4

   

修改行为的Callback

可以提前判断callback是否存在,以及根据callback的返回结果控制是否中断运行。

5074b7a8a4320392e9d856dd306b76a9.jpeg

3

   

基础知识

3.1

   

双下划线的特殊函数

文档:

https://docs.python.org/3/reference/datamodel.html#object.__init__

69d79054b734924ea202d4a0e919b1af.png

3.2

   

查看源代码

Jeremy用的vim,感觉是骨灰级程序员的工具,我这个新手还是用可视化程度比较高的吧,于是选了atom,需要安装如下插件,然后就可以查看引用函数的源代码了。

3f5e65dda1d5e9d007e4ab058e5774c8.jpeg

fea7a4c4656885502d0c620388fba17e.gif

3.3

   

Variance 方差, standard deviation 标准偏差

因为计算比较简单,所以用方差的比较多

b0b07435c6b11f696f3f93b5f8ba11f5.jpeg

3.4

   

covariance 协方差, correlation 相关性

4b43aa8baa48d7245ca2f644ac861dac.png

04cdbb4b7ab5bd5bb80e76137d87a3d6.png

r越大,就表示线性相关性越高

ef3ece26cc1b8f3a8519b8541b1575a2.png

这里有个视频解释的很形象:https://youtu.be/85Ilb-89sjk

3.5

   

Softmax

4cd0b11cf2d0e4e91a622502f68f95c6.jpeg

虽然2张图的预测结果一样,但很可能第一张图有鱼有房子,而第二张什么都没有,所以它只适用于只有一个目标检测对象的时候。

c674f8a08cdf79e30303a19675a082cc.jpeg

这时就需要binomial 二项分配,得出来的值可以更客观的反应图片上没有什么;而之所以大家都用softmax,因为imagenet都是只检查一个类别的。

3.6

   

用Exception来终止一个一段代码

做一个Learning Rate Finder05b_early_stopping.ipynb

9d26cb35a448d93c2691f5c57e9daef8.png

d45c9c295d064692b1c7e6eee496e892.jpeg

关于Exception的文档:

https://docs.python.org/3/library/exceptions.html

自己尝试的例子

a22406a9b81d6979cf9b36e7d9af25ff.png

4

   

本节课核心,深入理解训练过程

ConvNet

  1. 深入模型,看训练过程中的行为

Hooks

  1. pytorch hooks,可以方便在Forward和Backward中加入callbacks

  2. 追踪Activations在每个layer上的变化

  3. 把追踪结果放在图像上,以找出问题

  4. 根据问题,修改Activation Function

BatchNorm

  1. 介绍batchnorm,了解不适用的领域,优缺点

  2. 设计一种新的Normalization layer去解决这个问题

4.1

   

ConvNet

之前用的是linear+ReLu+Linear,把数据从784→50→10现在用卷积神经网络来训练

06_cuda_cnn_hooks_init.ipynb

f3a969b1d51fc3dac2bc21cf8b632a2f.png

2ea7d37cd6c64e1c51acd5ed9e931c5b.png

e660c650d7a086f920f8bf0c69f588f7.jpeg

b04af5de19ca4e9e01d89e2b5524bc6a.jpeg

CUDA

上面的训练太慢,用callback放到GPU上,CUDA是NVIDIA的一项并行处理数据的技术

22eeefe71005b3cc44da2bdd505ba0c2.png

6820f6108b1365719e8942540d3e5da4.jpeg

快了3倍的速度

重构

只是把重复的代码更抽象一点了,但易读性反而变差所以其他的就不看了,就把这个transform的callback拿出来看看吧

368a5f7f21b120656c7cb8d649d9b052.png

4.2

   

Hooks

这里通过hook可以更方便的统计出指标,发现问题后

  1. 用Normalization初始化数据;

  2. 用Relu的配置,让Activation分布更有意义

原始版本

f37aaf2ef0565a598d7e6c75cefd7eb5.jpeg

73d007c8df3598c54b96271d638f13cd.jpeg

可以看到这里有明显的大起大落,而且标准差的值一开始并不是接近于1

0a9ac1d76820670e2d76a7aee6b05347.png

对每个层进行Normalization后,std更接近1了

c57537dd8f2a1888b0babf9127b92c7b.jpeg

d91fc21bfc46bdcf8c136ee2a99932f6.jpeg

Pytorch Hook Function

只要在每个层上都注册一个hook就可以,每次Forward后算出了output,就会触发hook

8150e624888df863363aec01f3f28e4c.png

Pytorch Hook Class重构

要及时删除hooks

6ca24c4135e9b64e1c318d9dbe4fbee8.jpeg

把Hooks Class增加类似于Array的属性

这里不展开,都是比较基础的东西,可自行查看视频或文档

更多指标:histogram 直方图/柱状图

如下显示的是前4个layers,每个batch的Activations的值分布

ec9d8fdc70294690da0a7113b07499f0.jpeg期中黄色部分就是分布最多,说明大部分值都接近于0,用下图展示出来80-90%的都是接近于0

6b3e1d8d4fa9506a6d2a66ca2d00ed4c.png

通用的Relu

为了解决上面遇到的问题

53b6e8f340229da22878d60baff8026f.png

0d2f81316bd4cbcb7b25b82afc6dad63.png

对Relu的改造后,分布更均匀了,而且接近0的Activations占比只有20%

8cd95db04f080865eb194605654cb5b3.jpeg

4.3

   

Batchnorm

  1. 介绍batchnorm,了解不适用的领域,优缺点

  2. 设计一种新的Normalization layer去解决这个问题

从零搭建

07_batchnorm.ipynb

aee2ca33b56f0ba2e6a53eb3a8e87a9b.jpeg

如下解释了x.mean的运作方式

b0b6b4d22376f1fc8310a108eaee3893.png

于是乎这一轮对batchnorm的处理,就把feature的因素给消除了,下一轮处理的数据就可以更突显其他因素。

线性插值,为了计算均值消耗更小的性能,类似于Momentum

2217b8a4799239ba65edcc3f08935496.jpeg

调用Pytorch BatchNorm的方式

39e22a771dfa6006bfea9e0f774b45e2.png

More norms

普通的BatchNorm不适用于边训练边运行的项目,以及RNN和小batch

LayerNorm和BatchNorm的唯一区别就是,求的均值是每个image的,而不是每个channel的

672da2c8a4426cb37d44ed753599fb18.jpeg

InstanceNorm求的均值是每个image的每个channel

95de1f09e96aed256859d1c886735cde.jpeg

所以二者都不适合当前的模型训练,LayerNorm更适合RNN,InstanceNorm更适合Style Transfer

28d0ca93a9970182a239554b6714bcaa.jpeg

Fix small batch size problem

解决批次太小,训练时间会很长,而且准确率会特别低,所以需要通过epsilon来解决,但需要很慎重的调节eps

e4a49ea0e54329d96c04f4131a057b2b.jpeg

所以做了Running BatchNorm来解决BatchNorm批次太小的问题

  1. 用更高效率的算法来计算variance

  2. 求count

  3. Debiasing这个技术可以用最小的epoch实现最高的准确率,1epoch 98%的准确率,还没发布,是个好东西

87dcb49903c94836c90689c3fa71b511.jpeg

相关阅读

产品经理也能动手实践的AI:

 (一)|(二)|(三)|(四)|(五)|(六)|(七)|(八)

人人都能搞懂的AI :

(一)|(二)|(三)|(四)

f89e08afb8792775fa0513208e34dd7a.png

如果你喜欢思考,又喜欢学点新东西,别忘记关注+置顶公众号哦!

我是Hawk,8年产品经理,目前专注AI机器学习。

f54de7507fc4926383480446d247b41c.jpeg

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值