Mini-Batch

minibatch是咋来的呢?

这个在训练神经网络的时候仿佛已经司空见惯了,我们会根据前人的工作,惯性使然的把训练集分成一个batch,然后一轮就是个epoch,but why??

(全)梯度下降:

我们看我们之前所做的梯度下降是使用了所有的输入,也就是样本数是全部。
在这里插入图片描述
在这里插入图片描述

理论上好像我们用全部样本参与计算,得到的就应该是全部数据都符合的梯度,训练起来就像上图那样顺滑,但实际用起来完全不知这回事,特别大的batch经常难以收敛,这就完全不符合我们的常理认知。

据说这是因为损失函数不平整造成的,越大的batch 反而会收敛到局部最优解就跳不出来了。

随机梯度下降

那么当随机选一个1个样本参与计算的时候就是随机梯度下降。

在这里插入图片描述

Q:随机梯度下降,怎么随机的呢?
A:其实就是在求梯度的时候,不再用所有的m个样本数据来计算,而是随机的选择一条数据来计算梯度!

Q:随机梯度下降的好处是什么?缺点是什么?
A:在求梯度的时候快,迭代次数有可能更多,最终可能落不到全局最优解上

Q:Mini-Batch GD是什么?(这个效果最好)
A:就是在求梯度的时候做了一个折中,不用所有的数据,而是随机选择一部分数据来求梯度!

Q:为什么要不断的调整步长?
A:就是为了让越接近最优解的时候,调整的幅度越小,避免来回震荡!

Q:如果我们不人为的调小步长,会不会随着迭代的次数增多,调整的幅度自动减小?
A:调整的幅度取决于谁?却决于学习率和梯度,梯度事实上越接近最优解,梯度的绝对值越小

代码

import numpy as np

__author__ = 'yasaka'

X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
X_b = np.c_[np.ones((100, 1)), X]
print(X_b)

learning_rate = 0.1
n_iterations = 10000
m = 100

# 1,初始化theta,w0...wn
theta = np.random.randn(2, 1)
count = 0

# 4,不会设置阈值,之间设置超参数,迭代次数,迭代次数到了,我们就认为收敛了
for iteration in range(n_iterations):
    count += 1
    # 2,接着求梯度gradient
    gradients = 1/m * X_b.T.dot(X_b.dot(theta)-y)
    # 3,应用公式调整theta值,theta_t + 1 = theta_t - grad * learning_rate
    theta = theta - learning_rate * gradients

print(count)
print(theta)


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值