深度学习:梯度裁剪

梯度裁剪是防止深度学习模型训练中梯度消失和梯度爆炸问题的策略,包括设置范围值裁剪和L2范数裁剪两种方法。当梯度值过大或过小时,可能导致模型参数更新剧烈或无法收敛,梯度裁剪通过限制梯度范围保持训练稳定性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在深度学习领域,梯度裁剪是一个常用的技巧,用于防止梯度过小或过大。下面简单介绍一下 梯度裁剪的原理与方法。

梯度裁剪简介

在深度学习模型的训练过程中,通过梯度下降算法更新网络参数。一般地,梯度下降算法分为前向传播和反向更新两个阶段。
在前向传播阶段,输入向量通过各层神经元的计算,得到输出向量,假设网络可以用一个抽象函数 f f f表示,则公式为:
y = f ( x ) \begin{equation} y = f(x) \end{equation} y=f(x)
在计算出网络的估计值后,使用类似均方误差的方法,计算出真值和估计值之间的差距,即损失函数loss:
l o s s = 1 n ∑ i = 1 n ( y i g t − y i ) 2 \begin{equation} loss = \frac{1}{n}\sum_{i=1}^{n}(y^{gt}_i-y_i)^2 \end{equation} loss=n1i=1n(yigtyi)2
在反向更新阶段,调整网络参数 θ \theta θ包括权重 W W W和偏差 b b b。为了更新网络参数,首先要计算损失函数对于参数的梯度 ∂ l o s s ∂ θ \frac{\partial loss}{\partial \theta} θloss,然后使用某种梯度更新算法,执行一步梯度下降,以减小损失函数值。如下式:
θ t + 1 = θ t − α ( ∂ l o s s ∂ θ ) \begin{equation} \theta_{t+1} = \theta_{t} - \alpha (\frac{\partial loss}{\partial \theta}) \end{equation} θt+1=θtα(θloss)
注意:从上式可以看出有时候,减小学习率和梯度裁剪是等效的。
在上述训练过程中,可能出现梯度值变得特别小或者特别大甚至溢出的情况,这就是所谓的“梯度消失”和“梯度爆炸”,这时候训练很难收敛 。梯度爆炸一般出现在由初始权重计算的损失特别大的情况,大的梯度值会导致参数更新量过大,最终梯度下降将发散,无法收敛到全局最优。此外, 随着网络层数的增加,"梯度爆炸"的问题可能会越来越明显。考虑具有三层隐藏层网络的链式法则公式,如果每一层的输出相对输入的偏导 > 1,随着网络层数的增加,梯度会越来越大,则有可能发生 “梯度爆炸”。
∂ l o s s ∂ W 1 = ∂ l o s s ∂ f 3 ∂ f 3 ∂ f 2 ∂ f 2 ∂ f 1 ∂ f 1 ∂ w 1 \begin{equation} \frac{\partial loss}{\partial W_1} = \frac{\partial loss}{\partial f_3}\frac{\partial f_3}{\partial f_2}\frac{\partial f_2}{\partial f_1}\frac{\partial f_1}{\partial w_1} \end{equation} W1loss=f3lossf2f3f1f2w1f1

当出现下列情形时,可以认为发生了梯度爆炸:两次迭代间的参数变化剧烈,或者模型参数和损失函数值变为 NaN

如果发生了 “梯度爆炸”,在网络学习过程中会直接跳过最优解,甚至可能会发散(无法收敛),所以有必要进行梯度裁剪,防止网络在学习过程中越过最优解。梯度裁剪方式:设置范围值裁剪和通过 L2 范数裁剪。

梯度裁剪方法

设置范围值裁剪

设置范围值裁剪方法简单,将参数的梯度限定在一个范围内,如果超出这个范围,则进行裁剪(大于阈值为上限阈值 max ⁡ \max max;小于阈值为下限阈值 min ⁡ \min min),但是阈值通常较难确定一个合适的。
y = { x , i f min ⁡ ≤ x ≤ max ⁡ , max ⁡ , i f x ≥ max ⁡ , min ⁡ , x ≤ min ⁡ . \begin{equation} y=\left\{ \begin{aligned} & x , & if \min \leq x \leq \max , \\ & \max , & if x\geq \max , \\ & \min , & x\leq \min . \end{aligned} \right. \end{equation} y= x,max,min,ifminxmax,ifxmax,xmin.

通过 L2 范数裁剪

通过 L2 范数裁剪是用阈值限制梯度向量的 L2 范数,从而对梯度进行裁剪。

y = { x , i f   n o r m ( x ) ≤ c l i p _ n o r m , c l i p _ n o r m × x n o r m ( x ) , i f   n o r m ( x ) > c l i p _ n o r m . \begin{equation} y=\left\{ \begin{aligned} & x , & if \ norm(x) \leq clip\_norm , \\ & \frac{clip\_norm \times x}{norm(x)} , & if \ norm(x) > clip\_norm . \end{aligned} \right. \end{equation} y= x,norm(x)clip_norm×x,if norm(x)clip_norm,if norm(x)>clip_norm.

### 解决方案概述 在 Python 数据处理中,`TypeError: Cannot convert list of strings to numeric` 是一种常见错误,通常发生在尝试将字符串列表转换为数值类型时。这种问题的根本原因是部分或全部字符串无法被解释成合法的数值形式[^1]。 以下是针对该问题的具体分析与解决方案: --- ### 错误原因剖析 当使用像 `numpy.array.astype(float)` 或者 `pandas.to_numeric()` 进行数据类型转换时,如果目标对象(如列表或 Pandas Series)中含有非数值型字符串(例如 `'abc'`、空格 `' '` 或其他特殊字符),则会触发 `TypeError` 或类似的异常。这是由于这些方法默认期望所有元素都能无歧义地转换为目标数值类型[^2]。 --- ### 推荐解决策略 #### 方法一:使用 Pandas 的 `to_numeric` 函数 Pandas 提供了强大的工具来应对这类情况。可以调用 `pd.to_numeric(series, errors='coerce')` 将无法转换的部分设为 NaN 值,从而避免程序中断运行。 ```python import pandas as pd data = ['61190.55', '15282', '59527.35', '', 'not_a_number'] numeric_data = pd.to_numeric(data, errors='coerce') print(numeric_data) ``` 上述代码片段展示了如何优雅地处理含有非法数值的数据集合[^1]。 #### 方法二:手动过滤非法值 另一种方式是遍历原数据集并对每个元素单独检验其合法性后再决定是否加入最终的结果集中。这种方法虽然效率较低但对于小型项目来说仍然适用。 ```python def safe_float_conversion(value): try: return float(value.strip()) if isinstance(value, str) else value except ValueError: return None cleaned_list = [safe_float_conversion(item) for item in data] filtered_cleaned_list = [item for item in cleaned_list if item is not None] print(filtered_cleaned_list) ``` #### 方法三:借助 NumPy 实现效矢量化操作 NumPy 支持效的数组级运算,适合大规模科学计算场合。然而需要注意的是,在直接运用 `.astype()` 类型转换之前最好先行确认内部各成员均满足基本条件。 ```python import numpy as np array_of_strings = np.array(['61190.55', '15282', 'invalid_entry'], dtype=object) # 初步筛选掉明显不符合标准的情况 valid_entries_mask = np.vectorize(lambda x: x.replace('.', '').isdigit() or x.isdigit())(array_of_strings) converted_array = array_of_strings[valid_entries_mask].astype(np.float64) print(converted_array) ``` --- ### 总结注意事项 无论采取哪种技术路线都需牢记以下几点事项: - 明确了解源数据特性以便选取最适合的技术路径; - 对潜在的风险点保持警惕并设计合理的防御机制防止意外发生; - 定期复查清洗后的成果确保质量达标[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AI Player

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值