添加微信:kkcoder,备注:CV群,拉你入群,一起讨论。
hello,我是kk~
不知道京东给大家的感觉怎么样?
这几天看到以为同学面试京东,给她的感觉非常不错,如果加入面试官的团队,一定会超开心。
有人说京东很多时候给人的感觉是,没有信任可言。不少同学拿到offer,却在后面告知,要单方面撕毁offer。
其实,这种情况每家公司都会发生,其实还是要看部门老板,部门leader的秉性吧。
大多数情况下,我们会遇到比较不错的同事。在后面的项目上,技术提升上,都会给予很多的帮助。
正常情况下,一名应届生在2年之内,基本就能达到一个不错的水平。
这个是面试的一个记录,问题都不太难,属于应届的水平。
趁这个机会,咱们今天也来聊一个问题,对于SGD,如何选择合适的mini-batch大小?
这个很重要,很多场景都会遇到。下面咱们好好聊聊~
一般来说,选择合适的mini-batch大小对于随机梯度下降(SGD)等优化算法的性能至关重要。
不同的问题和数据集可能需要不同的mini-batch大小。在选择合适的mini-batch大小时,需要平衡计算效率和模型收敛性能。
核心原理
1. Mini-Batch梯度下降的原理:
SGD通过每次使用一小批次(mini-batch)的样本来估计梯度,然后更新模型参数。这相比使用整个数据集的批量梯度下降更具计算效率。
Mini-batch的引入可以减少梯度估计的方差,有助于更快地收敛。
2. 选择合适的Mini-Batch大小:
小Batch(比如1):
优点:更频繁的更新参数,有助于快速收敛。
缺点:噪声较大,更新过于频繁可能导致不稳定的收敛。
大Batch(接近整个数据集):
优点:估计的梯度更准确,收敛相对稳定。
缺点:计算代价高,可能会导致陷入局部极小值。
中等大小的Batch:
综合了小Batch和大Batch的优点,通常是一个经验值。
3. 核心公式:
Mini-Batch SGD更新参数的核心公式为:
其中,
是模型参数,
是学习率,
和
是mini-batch的输入和标签,
是对应于这个mini-batch的梯度。
核心代码案例
import numpy as npimport matplotlib.pyplot as pltdef mini_batch_sgd(X, Y, theta, learning_rate=0.01, epochs=100, batch_size=32): m = len(Y) losses = [] for epoch in range(epochs): # 打乱数据 permutation = np.random.permutation(m) X_shuffled = X[permutation] Y_shuffled = Y[permutation] for i in range(0, m, batch_size): X_mini_batch = X_shuffled[i:i+batch_size] Y_mini_batch = Y_shuffled[i:i+batch_size] # 计算梯度 gradient = compute_gradient(X_mini_batch, Y_mini_batch, theta) # 更新参数 theta = theta - learning_rate * gradient # 计算整个数据集的损失 loss = compute_loss(X, Y, theta) losses.append(loss) return theta, lossesdef compute_gradient(X, Y, theta): # 使用mini-batch计算梯度 # 具体问题和损失函数决定了这里的实现 # 为了简化,假设一个简单的线性回归问题 gradient = np.dot(X.T, (np.dot(X, theta) - Y)) / len(Y) return gradientdef compute_loss(X, Y, theta): # 使用整个数据集计算损失 # 具体问题和损失函数决定了这里的实现 # 为了简化,假设一个简单的线性回归问题 loss = np.mean((np.dot(X, theta) - Y)**2) return loss# 生成简单线性回归问题的合成数据np.random.seed(42)X = 2 * np.random.rand(100, 1)Y = 4 + 3 * X + np.random.randn(100, 1)# 初始化参数theta_initial = np.random.randn(2, 1)# 执行Mini-Batch SGDtheta_final, losses = mini_batch_sgd(np.c_[np.ones((100, 1)), X], Y, theta_initial)# 绘制损失曲线plt.plot(losses)plt.xlabel('Epochs')plt.ylabel('Loss')plt.title('Mini-Batch SGD Loss Curve')plt.show()
选择合适的mini-batch大小需要根据具体问题和数据集进行调整。小batch有助于更频繁的参数更新,大batch有助于更准确的梯度估计。中等大小的batch通常是一种折中的选择。通过调整学习率、batch大小等超参数,可以在实际问题中找到最佳的组合。
在真实场景中,通常需要进行超参数调优,通过尝试不同的组合来找到最优的训练配置。推荐阅读
原创合集,持续更新!
超强机器学习合集!!
大厂程序员提倡“防御性编程”!!
相当猛!拼多多今年的薪资。。。
目前,一个薪资非常不错的方向!最后
最近我们花了几个月整理的一个内容,可meeting的idea,内容超级豪华~~~~~~
绝对绝对不可错过的一个内容~
好了,今天的内容先这样,继续想看解决什么问题,评论区留言~
都到这里了,记得点赞哦~