丢弃法(Dropout)

原文链接见 丢弃法(Dropout)—— 从零开始
在深度学习中,一个常用的应对过拟合(overfitting)问题的方法叫做丢弃法。

概念

在现代神经网络中,我们所指的丢弃法,通常是对输入层或者隐含层进行一下操作:
1. 随机选择一部分该层的输出作为丢弃元素
2. 把丢弃元素乘以0
3. 把非丢弃元素拉伸

本质

在集成学习里,我们可以对训练数据集有放回地采样若干次并分别训练若干个不同的分类器;测试时,把这些分类器的结果集成一下作为最终分类结果。
事实上,丢弃法在模拟集成学习。假设,下图的多层神经网络是原始网络的子集。
网络
对其使用丢弃法。而对于每一个这样的数据集,均使用丢弃法分别训练一个原神经网络子集的分类器。而每个原神经网络子集的分类器用的是同一套参数。
因此,使用丢弃法的神经网络实质上是对输入层和隐含层的参数做了正则化,同一套参数使得神经网络不同子集在训练数据上都尽可能表现良好。

定义包含丢弃层的模型

drop_prob1 = 0.2
drop_prob2 = 0.5

def net(X):
    X = X.reshape((-1, num_inputs))
    # 第一层全连接。
    h1 = nd.relu(nd.dot(X, W1) + b1)
    # 在第一层全连接后添加丢弃层。
    h1 = dropout(h1, drop_prob1)
    # 第二层全连接。
    h2 = nd.relu(nd.dot(h1, W2) + b2)
    # 在第二层全连接后添加丢弃层。
    h2 = dropout(h2, drop_prob2)
    return nd.dot(h2, W3) + b3
### 如何在RNN中实现和使用Dropout防止过拟合 #### Dropout的作用机制 Dropout是一种有效的正则化技术,主要用于减少神经网络中的过拟合现象。通过随机失活一部分神经元来降低模型复杂度并提高泛化性能[^3]。 #### RNN与Dropout的应用挑战 对于循环神经网络(RNN),由于其内部状态的递归特性,在传统上被认为不适合直接应用标准形式的Dropout,原因是这样做可能会干扰序列间的信息传递以及破坏长期依赖关系的学习过程[^1]。 然而,研究发现可以在不影响RNN核心功能的前提下合理引入Dropout: - **时间步之间的连接处加入Dropout**:即只对当前时刻输入到隐藏层的部分施加Dropout操作; - **输出端添加单独一层Dropout**:如参考资料所提到的一种做法是在获取到最后一个时间步之后再接一个独立的Dropout层用于处理即将进入全连接分类器之前的特征向量[^4]。 下面给出一段Python代码示例展示如何利用Keras库构建带有Dropout机制的简单RNN结构: ```python from tensorflow.keras.models import Sequential from tensorflow.keras.layers import SimpleRNN, Dense, Dropout model = Sequential() # 定义RNN层,并指定返回整个序列以便后续可能进一步加工 model.add(SimpleRNN(50, activation='relu', return_sequences=True)) # 对于每一个时间步都执行相同概率下的节点丢弃策略 model.add(Dropout(rate=0.2)) # 如果只需要最后一个时间步的结果,则可省略return_sequences参数,默认False model.add(Dense(units=1)) # 编译模型... ``` 此段代码展示了在一个简单的RNN架构里集成Dropout的方法之一——在整个训练过程中动态地关闭一定比例(由`rate`控制)的激活单元以达到抑制过拟合的效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值