大数据下的机器学习

现在机器学习算法,其实就是大量数据集下对数据集进行拟合。

当数据量很大的时候,算法的效率必然会降低,如何处理大量的数据,是现在要考虑的问题。

随机梯度下降

回顾线性回归的梯度下降。
h θ ( x ) = ∑ j = 0 n θ j x j 代 价 函 数 C o s t ( θ , ( x ( i ) , y ( i ) ) ) = 1 2 ( h θ ( x ( i ) ) − y ( i ) ) 2 J t r a i n ( θ ) = 1 2 m ∑ i − 1 m ( h θ ( x ( i ) ) − y ( i ) ) 2 = 1 m ∑ i − 1 m C o s t ( θ , ( x ( i ) , y ( i ) ) ) 迭 代 运 行 梯 度 下 降 θ j : = θ j − α ∂ J t r a i n ( θ ) ∂ θ j 对 于 每 个 j = 0 , 1 , . . . , n 对 于 θ ∈ R n : = θ j − α 1 m ∑ i = 1 m ∂ C o s t ( θ , ( x ( i ) , y ( i ) ) ) ∂ θ j : = θ j − α 1 m ∑ i = 1 m ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) 这 里 的 m 就 是 我 们 的 训 练 集 样 本 数 量 . \begin{aligned} & h_\theta(x)=\sum_{j=0}^n\theta_jx_j\\ & 代价函数Cost(\theta,(x^{(i)},y^{(i)}))=\frac{1}{2}(h_\theta(x^{(i)})-y^{(i)})^2\\ & J_{train}(\theta)=\frac{1}{2m}\sum_{i-1}^m(h_\theta(x^{(i)})-y^{(i)})^2=\frac{1}{m}\sum_{i-1}^mCost(\theta,(x^{(i)},y^{(i)}))\\ & 迭代运行梯度下降\\ & \qquad \theta_j:=\theta_j-\alpha \frac{\partial J_{train}(\theta)}{\partial\theta_j}\qquad \qquad对于每个j=0,1,...,n对于\theta\in\mathbb{R}^n\\ & \qquad\quad :=\theta_j-\alpha \frac{1}{m}\sum_{i=1}^m\frac{\partial Cost(\theta,(x^{(i)},y^{(i)}))}{\partial\theta_j}\\ & \qquad\quad :=\theta_j-\alpha\frac{1}{m}\sum_{i=1}^m(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}\\ & \qquad这里的m就是我们的训练集样本数量. \\ \end{aligned} hθ(x)=j=0nθjxjCost(θ,(x(i),y(i)))=21(hθ(x(i))y(i))2Jtrain(θ)=2m1i1m(hθ(x(i))y(i))2=m1i1mCost(θ,(x(i),y(i)))θj:=θjαθjJtrain(θ)j=0,1,...,nθRn:=θjαm1i=1mθjCost(θ,(x(i),y(i))):=θjαm1i=1m(hθ(x(i))y(i))xj(i)m.
当m非常大的时候,例如千万,上亿等。可能就需要不少的时间,而且该算法还需要多次迭代,时间消耗不容小视。

接下来,我们不每次遍历所有的训练集来求θ,而是只从训练集中拿出一个(x,y)来进行单独的求θ。

随机梯度下降:
即 :   我 们 不 区 分 ( x ( i ) , y ( i ) ) 了 , 统 一 使 用 ( x , y ) 因 为 我 们 每 次 只 用 一 个 单 独 的 样 本 进 行 训 练 , 所 以 我 们 的 梯 度 下 降 式 子 变 为 : θ j : = θ j − α ( h θ ( x ) − y ) x j \begin{aligned} 即:\ & 我们不区分(x^{(i)},y^{(i)})了,统一使用(x,y)\\ & 因为我们每次只用一个单独的样本进行训练,所以我们的梯度下降式子变为:\\ & \theta_j:=\theta_j-\alpha(h_\theta(x)-y)x_j \end{aligned} : (x(i),y(i))使(x,y)θj:=θjα(hθ(x)y)xj
此时,学习算法可能不会收敛到全局最优点,而是在最优点附近一个范围内游走,这是因为我们使用的是单独的样本。

如图:

在这里插入图片描述

经历曲折的路径,最后在一个范围内往复。

不过确定一个范围,也是一个不错的收获。

Mini-batch梯度下降

  • 经典梯度下降,需要遍历所有训练集,时间成本太大。
  • 随机梯度下降,只需要一次计算一个样本即可,时间花费少,但是最后精度不高。

我们使用折中的方法,将经典梯度下降随机梯度下降结合起来。每次读入b个样本,即不多也不少,可以使时间变少,也可以使精度变高。


比 如 , 我 们 每 次 使 用 10 个 样 本 进 行 总 样 本 数 10000 的 梯 度 下 降 训 练 : b = 10 , m = 10000 f o r ( b = 1 , 11 , 21 , . . . , 9991 ) θ j : = θ j − α 1 b ∑ i = 1 b ( h θ ( x ( i ) ) − y ( i ) ) x j ( i ) 对 于 每 个 j = 0 , 1 , . . . , n 对 于 θ ∈ R n b : = b + 10 \begin{aligned} & 比如,我们每次使用10个样本进行总样本数10000的梯度下降训练:b=10,m=10000\\ & for(b=1,11,21,...,9991)\\ & \qquad\theta_j:=\theta_j-\alpha\frac{1}{b}\sum_{i=1}^b(h_\theta(x^{(i)})-y^{(i)})x_j^{(i)}\qquad \qquad对于每个j=0,1,...,n对于\theta\in\mathbb{R}^n\\ & \qquad b:=b+10\\ \end{aligned} 使1010000b=10,m=10000for(b=1,11,21,...,9991)θj:=θjαb1i=1b(hθ(x(i))y(i))xj(i)j=0,1,...,nθRnb:=b+10

检查收敛

按照随机或者m-b梯度下降运行后,每隔k次可以取这k次的平均值,进行检测J(θ)是否收敛。

自适应α

在进行算法执行时,合适的参数α也会帮助学习算法更快,更精确的定位到最优点。

我们一般期望是,一开始时,α较大,快速收敛到合适的范围内,然后α变小,缓慢的逼近最优点。
例 如 α = c o n s t 1 迭 代 次 数 + c o n s t 2 , α 随 迭 代 次 数 的 增 加 而 减 小 例如\alpha=\frac{const_1}{迭代次数+const_2},\alpha随迭代次数的增加而减小 α=+const2const1,α

在线学习

  • 离线学习:准备好数据,训练过程中不再增加新的数据,直到算法执行完。
  • 在线学习:算法执行的时候,随时会增加入新的训练样本,训练集在执行时是会变化的。

之前我们讨论的一直都是离线学习。

但在现在这样的网络环境中,随时随地产生的数据,让在线学习也也有了一席之地。

类似随机梯度下降,离线的随机梯度下降是从准备好的训练集中依次读入样本进行训练。

在线的可以是实时的获取样本。

在线学习可以更加快速的对样本的变化做出反应。

应用可以在 商品推荐,搜索推荐,价格歧视等方面发挥作用。

数据并行

当样本数量多的时候,可以采用并行计算的方式。

将一个大样本分成若干个小样本,在不同的计算机中并行计算,最后汇总起来做最终计算。

这样可以节省时间成本。

能够数据并行计算的算法,一般是能够用累加表达出来的,累加的算法可以先独立计算部分,最后合并计算整体。

也可以使用单机多线程来实现。

参考资料

B站吴恩达机器学习相关课程:https://www.bilibili.com/video/BV164411b7dx

Logo

CSDN联合极客时间,共同打造面向开发者的精品内容学习社区,助力成长!

更多推荐