【梯度下降】用计算思维解析梯度下降
创作时间:
作者:
@小白创作中心
【梯度下降】用计算思维解析梯度下降
引用
CSDN
1.
https://blog.csdn.net/qq_33985931/article/details/145971452
前言
由计算思维可知,解决问题的策略可从问题拆解、模式趋势的识别、模式归纳与抽象、算法设计这几个部分着手。
分解与结构
首先,梯度下降算法的核心问题是优化目标函数,即找到使目标函数最小化的参数值。以二维图为例:
要解决的核心问题就是P点走向min点,也就是全局最优点的过程,而梯度下降就是其中寻找最优解的方法之一。
梯度下降的主要问题可以被拆解为
- 如何计算目标函数的梯度?
- 如何根据梯度更新参数?
- 如何确保算法收敛到全局或局部最优解?
模式识别
在优化问题中,梯度下降算法识别了以下模式和趋势:
- 梯度方向:目标函数的梯度方向是函数值上升最快的方向,因此负梯度方向是函数值下降最快的方向。
- 局部最优与全局最优:目标函数可能存在多个局部最优解,梯度下降通常只能找到局部最优解(除非目标函数是凸函数)。
- 学习率的影响:学习率决定了参数更新的步长,过大会导致震荡,过小会导致收敛缓慢。
- 数据规模的影响:批量梯度下降(BGD)适合小规模数据,随机梯度下降(SGD)和小批量梯度下降(MBGD)适合大规模数据。
模式归纳与抽象
通过总结我们可以得出梯度下降的最终的核心思想为:
- 迭代优化:通过多次迭代逐步逼近最优解。
- 梯度信息:利用目标函数的梯度信息指导参数更新。
- 收敛情况:尽量收敛到全局最优。
- 下降方式:选用下降的方式,
算法设计
SGD(随机梯度下降)
设计的思想为
- 每次迭代随机选择一个样本计算梯度。
- 更新参数时只使用当前样本的梯度信息。
因为参数更新的步长(前进的距离)不可控,波动较大,导致没有完全的收敛到最优解。
优点是计算速度快,适合大规模数据;缺点是梯度更新方向波动较大,收敛不稳定。
用代码了解这个思想可能是最直观的,主要思想就是随机挑一个样本计算梯度然后再下降。
import numpy as np
def sgd(X, y, learning_rate=0.01, n_iters=100):
n_samples, n_features = X.shape
theta = np.zeros(n_features)
losses = []
for i in range(n_iters):
for j in range(n_samples):
# 随机选择一个样本
idx = np.random.randint(0, n_samples)
X_i = X[idx:idx+1]
y_i = y[idx:idx+1]
# 计算梯度
gradient = X_i.T.dot(X_i.dot(theta) - y_i)
# 更新参数
theta -= learning_rate * gradient
# 计算损失
loss = np.mean((X.dot(theta) - y) ** 2)
losses.append(loss)
return theta, losses
目前也有很多改善的SGD,本文不做介绍。
BGD(批量梯度下降)
设计思想
- 每次迭代使用整个训练集计算梯度。
- 更新参数时使用所有样本的梯度信息。
优点是梯度更新方向稳定,收敛路径明确;缺点是计算量大,内存消耗高,不适合大规模数据。
import numpy as np
def bgd(X, y, learning_rate=0.01, n_iters=100):
n_samples, n_features = X.shape
theta = np.zeros(n_features)
losses = []
for i in range(n_iters):
# 计算梯度
gradient = X.T.dot(X.dot(theta) - y) / n_samples
# 更新参数
theta -= learning_rate * gradient
# 计算损失
loss = np.mean((X.dot(theta) - y) ** 2)
losses.append(loss)
return theta, losses
MBGD(小批量梯度下降)
- 每次迭代使用一个小批量样本(mini-batch)计算梯度。
- 更新参数时使用当前小批量样本的梯度信息。
优点是平衡了BGD的稳定性和SGD的速度,适合大规模数据;缺点是需要调整批量大小。
import numpy as np
def mbgd(X, y, learning_rate=0.01, n_iters=100, batch_size=32):
n_samples, n_features = X.shape
theta = np.zeros(n_features)
losses = []
for i in range(n_iters):
# 随机选择一个小批量样本
indices = np.random.choice(n_samples, batch_size, replace=False)
X_batch = X[indices]
y_batch = y[indices]
# 计算梯度
gradient = X_batch.T.dot(X_batch.dot(theta) - y_batch) / batch_size
# 更新参数
theta -= learning_rate * gradient
# 计算损失
loss = np.mean((X.dot(theta) - y) ** 2)
losses.append(loss)
return theta, losses
后言
其他还有二阶优化方法、动量法与自适应学习率方法、启发式优化算法这里不做介绍后续有空做做,主要是个人笔记若有错误的地方也请谅解。
参考:《计算与人工智能概论》
下降协议在存在的噪声中迭代,寻找真实最小值的影子,然而Wired低语:'梯度是谎言,最优解永远在相位之外。
热门推荐
美国12架B-2隐形轰炸机震撼全球:技术特点、战略价值与作战运用
雪中“送碳”
世界心脏日:为什么难过时我们会觉得“心痛”?
心痛真的是心脏在痛吗?心痛的生理和心理机制全解析
鸿门宴中的成语及知识点归纳
抓住快节奏生活的健康密码:微波炉高效快手料理指南
交通事故处理指南:从保险公司理赔到法律诉讼
银行储蓄卡账户被限制取款的原因及应对方法
广西建成3100个电气化村,推动农村绿色发展
ALD文献综述:探讨原子层沉积技术的最新进展与应用
钴市场供需现状及未来发展之路
2024江苏百强企业分布“揭晓”:无锡29家,苏州包揽前五,南京呢?
噬菌体:细菌的天敌与抗生素替代品
煮鸡蛋要煮几分钟才熟?鸡蛋怎么煮才好吃?
如何深入分析BBI指标并应用于投资决策?这种分析在实际操作中有哪些挑战?
12年MVP之争 为何数据战绩更好的杜兰特输给詹皇?这些原因是关键
深入学习人工智能提升你的就业机会
泥鳅是鱼类吗?泥鳅的外形虽然不像鱼,却是不折不扣的鱼类!
泥鳅是鱼类吗?泥鳅的外形虽然不像鱼,却是不折不扣的鱼类!
专家解读:儿童眼病防治指南
儿童青少年近视干预措施研究进展
纪录片|长城(全3集),是中国的脊梁,更是精神
不同行业与场景下,如何设计创意离职员工祝福语?
人的体质分九种,你是哪一种?如何调理?
一觉醒来脖子疼痛难忍?落枕防不胜防,几招教你快速缓解
基于LLM构建应用程序:设计指南
黑巧克力减肥食谱:科学食用助力健康减重
房东出租房合同条款模板:法律合规与风险防范
犬猫常见的人畜共患病--细菌病
宠物用品如何消毒处理 宠物用品怎么清洁卫生