随机梯度算法

本文介绍了随机梯度下降(Stochastic Gradient Descent, SGD)算法的基本原理及其在简化求解损失函数最小值过程中的应用。SGD通过每次迭代仅使用少量随机样本计算梯度来降低计算复杂度,适用于大规模数据集。文中还探讨了目标函数通常包含损失项和正则化项,并解释了在线梯度下降如何解决这类问题。

 随机梯度下降–Stochastic Gradient Descent | 丕子 http://www.zhizhihu.com/html/y2012/3731.html

在求损失度最小值时,我们一般用到导数为0时求相应参数,但有时会导致很高的计算复杂度。这时,就要乃至随机梯度下降算法了,是用来简化求最小值的计算的。先给W一个初始值,然后朝梯度方向下降,直到不能下降为止,此时即可得到对应的极小值,但注意得到的是局部最小值,有时要对初始值进行不断修正。

但这样,每iteration一次就得用所有数据求一次导数,代价太大,那么每一步只随机抽几个数据点来算一个梯度如何呢?当然可以!这被称之为Stochastic Gradient Descent,非常高效(随机梯度下降算法)。

记得在ML中的目标函数通常是损失+罚(\ell(h)+\lambda f(h))的形式。例如ridge regression就是平方误差+\ell_2罚,lasso是平方误差+\ell_1罚,SVM是hinge loss+\ell_2罚。最小化这个目标函数可以等价于在f(h)\le\delta的限制下最小化\ell(h)\lambda\delta是一一对应的关系。实际上f(h)\le\delta就是定义了一个凸子空间,例如使用\ell_2罚时就是一个半径为\delta的球。所以,Online Gradient Descent可以online的解这一类目标函数,只是对于不同的罚选择不同的投影子。

下面是理论分析。记投影前的\tilde h_{t+1} = h_t-\eta_t\nabla\ell_t(h_t),以及offline最优解h^*=\arg\min_{h\in\mathcal{H}}\sum_{t=1}^T\ell_t(h)。因为\mathcal{H}是凸的且h^*在其中,所以对\tilde h_{t+1}投影只会减少其与h^*的距离,既\|h_{t+1}-h^*\|\le\|\tilde h_{t+1}-h^*\|。记\nabla_t=\nabla \ell_t(h_t),注意到

\displaystyle \|\tilde h_{t+1}-h^*\|^2=\|h_t-h^*\|^2+\eta_t^2\|\nabla_t\|^2-2\eta_t\langle\nabla_t,h_t-h^*\rangle.

由于\ell_t是凸的,所以有

\displaystyle \ell_t(h_t)-\ell_t(h^*)\le \langle\nabla_t,h_t-h^*\rangle \le \frac{1}{2\eta_t}\big(\|h_t-h^*\|^2 - \|h_{t+1}-h^*\|^2\big) + \frac{\eta_t}{2}\|\nabla_t\|^2.

取固定的\eta_t=\eta,对t进行累加就有R(T)\le \frac{1}{2\eta}\|w_1-w^*\|^2+\frac{\eta}{2}\sum_{t=1}^T\|\nabla_t\|^2。记\mathcal{H}的直径为D,且对所有t\|\nabla_t\|\le L成立(既Lipschitz常数为L),再取\eta=\frac{D}{L\sqrt{T}},那么

\displaystyle R(T)\le LD\sqrt{T}.

这个bound可以通过设置变动的学习率\eta_t加强。

 

<think>好的,用户想了解随机梯度下降(SGD)和批量梯度下降(BGD)之间的区别和对比。我需要先回顾一下这两种算法的基本概念,然后从多个方面进行比较,比如计算效率、收敛速度、内存使用、应用场景等。还要结合用户提供的引用内容,确保信息准确。首先,BGD每次迭代使用整个数据集计算梯度,所以梯度方向准确,但计算量大,内存消耗高,尤其不适合大数据集。而SGD每次随机选取一个样本,计算速度快,但梯度噪声大,导致收敛路径不稳定。不过引用1提到SGD更容易跳出局部最优,这点需要强调。然后,用户提供的引用2和3中提到小批量梯度下降,虽然用户没直接问,但可能需要稍微提一下作为对比,但重点还是放在BGD和SGD上。需要分析各自的优缺点,比如BGD的稳定性但高计算成本,SGD的快速但震荡收敛。 还要注意用户的问题可能涉及实际应用中的选择,比如在处理大数据时SGD更高效,而BGD适合较小数据集。另外,引用1里提到SGD收敛速度更快,这可能是因为更新次数多,虽然每次更新方向不一定准确,但总体迭代次数多反而更快收敛。需要确保回答结构清晰,分点比较,可能用表格或列表形式更直观。同时,用户要用中文,数学公式用$...$,独立公式用$$...$$,所以要注意格式正确。最后生成相关问题,帮助用户深入理解。</think>### 随机梯度下降(SGD) vs 批量梯度下降(BGD)对比分析 #### 1. **核心定义** - **批量梯度下降(BGD)** 每次迭代使用**整个训练集**计算梯度,更新权重公式为: $$ \theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta J(\theta; \text{全量数据}) $$ 其中$\eta$是学习率,$\nabla_\theta J$是损失函数梯度[^1]。 - **随机梯度下降(SGD)** 每次迭代仅用**单个样本**计算梯度,更新公式为: $$ \theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta J(\theta; x^{(i)}, y^{(i)}) $$ 其中$(x^{(i)}, y^{(i)})$是随机选择的样本[^2]。 #### 2. **关键差异对比** | 特性 | BGD | SGD | |--------------------|-------------------------------------|-------------------------------------| | **梯度方向** | 准确(基于全量数据均值) | 有噪声(基于单个样本) | | **计算效率** | 低(大数据集时内存和计算成本高) | 高(每次仅需计算单个样本梯度) | | **收敛速度** | 慢(每次迭代需遍历全量数据) | 快(权重更新更频繁,尤其适合大数据)| | **内存需** | 高(需同时加载全量数据) | 低(仅需单样本或小批量数据) | | **误差曲面特性** | 平滑,易陷入局部最优 | 震荡,更易跳出局部最优[^1] | | **适用场景** | 小规模数据集或精确优化 | 大规模数据集或在线学习 | #### 3. **性能分析** - **收敛稳定性**:BGD的梯度方向稳定,但可能因误差曲面平滑而陷入局部最优;SGD通过噪声扰动,能探索更复杂的参数空间[^1][^2]。 - **迭代次数**:SGD的更新次数与训练样本数相同,而BGD每轮仅更新一次,因此SGD在相同时间内可能完成更多参数调整[^1]。 - **损失函数曲线**:BGD的损失曲线单调下降,而SGD的曲线波动明显(见图1对比)[^2]。 #### 4. **实际应用中的权衡** - **BGD的局限性**:当数据规模达到百万级时,单次梯度计算耗时过长,且内存可能无法容纳全量数据。 - **SGD的改进**:实际中常采用**小批量梯度下降**(Mini-batch SGD),结合两者的优点: $$ \theta_{t+1} = \theta_t - \eta \cdot \nabla_\theta J(\theta; \text{小批量数据}) $$ 例如设置批量大小(batch size)为32或64,平衡计算效率和稳定性[^3]。 #### 5. **代码示例对比** ```python # BGD示例(全量数据更新) def bgd_update(theta, X, y, eta): gradients = 2/len(X) * X.T.dot(X.dot(theta) - y) return theta - eta * gradients # SGD示例(单样本更新) def sgd_update(theta, xi, yi, eta): gradient = 2 * xi.T.dot(xi.dot(theta) - yi) return theta - eta * gradient ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值