文章作者:Tyan
博客:noahsnail.com | CSDN | 简书
注:本文为李沐大神的《动手学深度学习》的课程笔记!
丢弃法的概念
在现代神经网络中,我们所指的丢弃法,通常是对输入层或者隐含层做以下操作:
- 随机选择一部分该层的输出作为丢弃元素;
- 把丢弃元素乘以0;
- 把非丢弃元素拉伸。
丢弃法的实现
1 | import mxnet as mx |
1 | # 测试dropout |
[[ 0. 1. 2. 3.]
[ 4. 5. 6. 7.]
[ 8. 9. 10. 11.]
[ 12. 13. 14. 15.]
[ 16. 17. 18. 19.]]
<NDArray 5x4 @cpu(0)>
1 | dropout(A, 1.0) |
[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]]
<NDArray 5x4 @cpu(0)>
1 | dropout(A, 0.5) |
[[ 0. 2. 4. 0.]
[ 8. 0. 12. 0.]
[ 16. 18. 0. 0.]
[ 0. 0. 0. 30.]
[ 0. 34. 36. 0.]]
<NDArray 5x4 @cpu(0)>
丢弃法的本质
一般来说,在集成学习里,我们可以对训练数据集有放回地采样若干次并分别训练若干个不同的分类器;测试时,把这些分类器的结果集成一下作为最终分类结果。事实上,丢弃法在模拟集成学习。丢弃法实质上是对每一个这样的数据集分别训练一个原神经网络子集的分类器。与一般的集成学习不同,这里每个原神经网络子集的分类器用的是同一套参数。因此丢弃法只是在模拟集成学习。使用丢弃法的神经网络实质上是对输入层和隐含层的参数做了正则化:学到的参数使得原神经网络不同子集在训练数据上都尽可能表现良好。
数据获取
1 | # 批数据大小 |
含两个隐藏层的多层感知机
1 | # 模型输入大小 |
定义包含丢弃层的模型
1 | # 第一个隐藏层的丢弃概率 |
训练
1 | # 定义交叉熵损失 |
Epoch 0. Loss: 1.221062, Train acc 0.528746, Test acc 0.754006
Epoch 1. Loss: 0.598503, Train acc 0.774890, Test acc 0.813101
Epoch 2. Loss: 0.499490, Train acc 0.818493, Test acc 0.840244
Epoch 3. Loss: 0.457343, Train acc 0.832699, Test acc 0.835036
Epoch 4. Loss: 0.426575, Train acc 0.846070, Test acc 0.849159