大規模機械学習(大規模機械学習)

序文

      ときに我々この章では、ご紹介します。この章では、このような線形回帰、ロジスティック回帰、ニューラルネットワークなどの機械学習方法の多くを紹介する私たちの前に、最後の章の内容が続いています私たちは、これらのアルゴリズムを使用する方法を、多くのデータを持っている、またはより高速なアルゴリズムの実行を改善する方法をするとき。

     最後に、それと間違って理解することがある場合、私はあなたに感謝し、あなたが私たちの教育を受けている願っています!

章XV大規模な機械学習(大規模機械学習)

学ぶためのデータの15.1大量

       フロントでは、例を持っている私たちは、{2、あまりにも、に}持っているような、我々は混乱の単語を選択したい単語、朝食のためにのために私が食べた___卵である。我々は、すべての2を埋めるためにそれを知っているが、機械学習の際に、学習は、大量のデータをもとにする必要がありますので、システム全体が比較的大規模です。実際には、多くの機械学習の問題で、我々はまた、多くのデータを持っていることを好む、良いアルゴリズムのために、私たちは多くのデータを持つようにしたい、私たちがしなければならないのアルゴリズムをたっぷり使って非常に良いではありませんデータは、最良の結果を得るためにトレーニングを続けています。図1に示されているが増加し、最終的に類似している異なる学習アルゴリズムの効果を示しただけでなく、検出されたデータである場合、そのデータはまた、良好な学習システムを証明した、良好各アルゴリズム、大きい場合我々は、データのサポートの多くを行う必要があります。

                                                                       図1のデータと異なるアルゴリズムの大きさの精度との関係

    しかし、前に、私たちは、トレーニングデータの有効性を作ることができます増やすことで、すべてのよりよい学習システムを説明していないので、私たちは私たちはあなたが大量のデータを使用する必要があるかどうかを判断するために学習曲線を使用する必要があります。データがある程度である場合、例えば、図2に示すように、高バイアスシステムは、データを増加させ、その後は大きな効果を見つけていないので、我々はデータを増やすことができず、一方、高分散のために、3う示されているように、我々はデータを増やすことによって、システムのパフォーマンスを向上させることができるようになります。

                                                                           図偏差の2高い学習曲線システム

                                                                             図3高い学習曲線の分散システム

15.2確率的勾配降下法

      我々は次の、確率的勾配降下アルゴリズムは、ロジスティック回帰分析、ニューラルネットワークとその適用のためだけではなく、線形回帰問題にも適用することに注意を払うように、進化は、勾配降下アルゴリズムに基づいてランダムドロップ勾配法である方法を説明するために、勾配線形回帰アルゴリズムを辞退します。

     まず、我々は持っている機能を予測するための線形回帰勾配降下法を見直してみましょうh_{\theta }(x)=\sum_{j=0}^{n}\theta _{j}x_{j}、費用関数がされてJ_{train}(\theta )=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})^2常に更新\theta _{j}:=\theta _{j}-\alpha \frac{1}{m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})x_{j}^{(i)}(すべてのjに対して= 0,1、... 、n)は、 更新のために\theta _{j}、私たちはそれぞれのアップデートを見つけるだろう\theta _{j}私たちは、このような人口のときに、ローカル統計などのデータの多くを持っているときに、=メートルと仮定すると、多くのデータを持っていますが、一度すべてのデータを横断する必要があるすべてのデータの合計一度行われるべきです300,000,000は、我々はすべての時間を更新し、この時間は\theta _{j}、私たちは、大量の計算を持っていますが、それは一度だけ更新され、全体的な速度が遅くなりますので、我々はまた、常に更新する必要があるので、我々は、アルゴリズムを改善する必要があります、私たちの確率的勾配降下法となっていました。従来の勾配アルゴリズムのために、我々はまた、バッチ勾配アルゴリズムの名前を持っています。

      コスト関数の勾配アルゴリズムのバルクのためにJ_{train}(\theta )=\frac{1}{2m}\sum_{i=1}^{m}(h_{\theta }(x^{(i)})-y^{(i)})^2、我々は再定義しcost(\theta ,(x^{(i)},y^{(i)}))=\frac{1}{2}(h_{\theta }(x^{(i)})-y^{(i)})^2、この時間はJ_{train}(\theta )=\frac{1}{m}\sum_{i=1}^{m}cost(\theta ,(x^{(i)},y^{(i)}))、実際には、以前のように、形式的になることです。確率的勾配アルゴリズムのために、我々は最初の仕事をする必要があり、更新が後になるように、ランダムな順序ですべてのデータを置くことである\theta _{j}アルゴリズムが許すときに我々はいるより速い収束、\theta _{j}アルゴリズムを更新しましたが、この次のとおりです。

繰り返す{

{i = 1、...、mについて

\theta _{j}:=\theta _{j}-\alpha (h_{\theta }(x^{(i)})-y^{(i)})x_{j}^{(i)}(j = 0、...、N)

       }

}

以上就是这个算法的核心,对于(h_{\theta }(x^{(i)})-y^{(i)})x_{j}^{(i)}在这里我们不是对整个J(\theta)求导,而是对cost(\theta ,(x^{(i)},y^{(i)}))求导,我们没有了求和运算,而对每一个\theta _{j}就当前的数据进行一次更新,这样对于每个数据我们就可以更新一次所有\theta,虽然在收敛时会比较曲折,而且最后结果一般情况是收敛到最小值的附近徘徊,不会像批量梯度算法那样每一次更新完都使算法更加收敛并以接近直线的方式收敛到最小值,但这样少了大量的计算量,整体速度会提高不少,所以最后的结果我们是可以接受的。

15.3 小批量梯度下降法

      在前面,我们给大家介绍了随机梯度下降算法是如何让整体速度提高的,在这一节给大家介绍一个新的梯度下降算法:小批量梯度下降法,它可以说是介于两者之间的算法,但计算的速度有时比随机梯度下降算法更快。对于批量梯度算法,我们在更新\theta _{j}时,用了m组数据,而随机梯度下降算法是用1组数据,而我们的小批量梯度算法是使用b组数据,b可以为10,一般在2~100之间。假设我们有m=1000,b=10,这个时候我们的更新算法就是:

Repeat{

for i=1,11,21,31,...,991{

\theta _{j}:=\theta _{j}-\alpha \frac{1}{10}\sum_{k=i}^{i+9}(h_{\theta }(x^{(k)})-y^{(k)})x_{j}^{(k)}(for j=0,...,n)

}

}

对于小批量梯度下降算法,我们每次计算b组数据,我们在计算那个b组求和时,我们可以通过向量化来计算,这样就更快了。

15.4 随机梯度下降法的收敛

       关于随机梯度下降法,我们对于每一步的更新\theta _{j},我们不清楚我们的算法是否收敛了,所以在更新下次的\theta _{j}之前,我们需要计算cost(\theta ,(x^{(i)},y^{(i)})),我们可以画出cost(\theta ,(x^{(i)},y^{(i)}))的图像来判断整体是否在收敛。如图4所示,由于随机梯度下降法是根据每一个数据就会更新,所以不是那么平滑,但可以看出整体是下降的,这个时候的\alpha比较小,如果我们使\alpha更小一点,会发现最后下降的结果更小,但是区别不大,所以在很多时候,如果我们发现整体是在收敛的,我们就会固定\alpha不变,因为不断改变\alpha意义不是很大,就算最后结果是一个局部最小值,我们也可以接受。

                                                                                    图4 当\alpha较小时

       当数据更多时,比如从m=1000增加到m=5000,如图5所示,我们会发现更平滑了一些,表示收敛时更快了。

                                                                                        图5 当m更大时

     但如果我们发现我们的曲线是在慢慢增长的,如图6所示,则表示我们的\alpha选大了,我们需要减小\alpha

                                                                                   图6 曲线是增长的

     关于学习速率\alpha,我们一般是选定一个较小的值,使得整体是在收敛的,就固定不变,但这样的结果是最终的算法不会收敛到一个最小的值,所以如果想收敛到一个最小的值,则我们需要不断地更新\alpha,即减小\alpha,我们有一个方法是让\alpha =\frac{const1}{iterationNumber+const2},因为迭代次数是不断增加的,所以\alpha不断在减小,但是这个式子中有两个常数,我们需要去确定,所以还是比较麻烦,通常也不会这样做,还是得看自己实际的需要吧。

15.5 在线学习问题

      在前面给大家介绍了随机梯度算法和小批量梯度算法,在这里给大家介绍下在线学习算法,也是他们的一些变种,这个算法在每次处理数据时也是每次处理一组数据,在我们的实际中也用到很多。比如你在网上有一个网店是卖手机的,店里有100种手机,当有顾客需要买手机时在搜索栏进行搜索自己想要手机的特征,我们相应地进行推荐,使顾客尽可能地会去点击每个商品,即尽可能的都是他想要的商品,我们用y=1表示用户对此商品进行了点击,用y=0表示用户没有对此商品进行点击,用p(y=1|x;\theta )来表示此商品可能被点击的概率,我们就是要对此进行学习,这样才能推荐相应点击率高的商品给顾客。这就是一个在线学习的例子,我们对每个用户进行学习,这里的用户数据就像一条流水线一样,是源源不断的,所以我们每次都是对当前用户进行学习更新,然后就扔掉当前的数据,进行下一个数据的学习。

     还有一些例子,比如推荐文章的例子,也是根据你的点击率来进行学习,然后推荐相应的文章给你,还有网上买书例子等等,都是在线学习问题。

15.6 映射约减和数据的并行

      在前面介绍的随机梯度下降法,小批量梯度下降法还有他们的一些变种算法都是只能在一台计算机上运行,但当有很多的数据时,我们不希望只在一台计算机上运行,而希望有几台计算机共同合作完成。这就是Map-reduce(映射约减)算法,对于这个算法和随机梯度下降算法哪个更好,并没有一个明确的答案,各有各的好,只能根据实际要求和条件来进行选择。

      假设我们现在有400组数据,即m=400,对于批量梯度下降法的每次更新\theta _{j}:=\theta _{j}-\alpha \frac{1}{400}\sum_{i=1}^{400}(h_{\theta }(x^{(i)})-y^{(i)})x_{j}^{(i)},前面我们也说了这样的计算量很大,但是如果我们现在有4台计算机,我们可以把数据分成4份,即

Machine 1:Use (x^{(1)},y^{(1)}),(x^{(2)},y^{(2)}),...,(x^{(100)},y^{(100)})

temp_{j}^{(1)}=\sum_{i=1}^{100}(h_{\theta }(x^{(i)})-y^{(i)})x_{j}^{(i)}

Machine 2:Use (x^{(101)},y^{(101)}),(x^{(102)},y^{(102)}),...,(x^{(200)},y^{(200)})

temp_{j}^{(2)}=\sum_{i=101}^{200}(h_{\theta }(x^{(i)})-y^{(i)})x_{j}^{(i)}

Machine 3:Use (x^{(201)},y^{(201)}),(x^{(202)},y^{(202)}),...,(x^{(300)},y^{(300)})

temp_{j}^{(3)}=\sum_{i=201}^{300}(h_{\theta }(x^{(i)})-y^{(i)})x_{j}^{(i)}

Machine 4:Use (x^{(301)},y^{(301)}),(x^{(302)},y^{(302)}),...,(x^{(400)},y^{(400)})

temp_{j}^{(4)}=\sum_{i=301}^{400}(h_{\theta }(x^{(i)})-y^{(i)})x_{j}^{(i)}

最后再进行整合:\theta _{j}:=\theta _{j}-\alpha \frac{1}{400}(temp_{j}^{(1)}+temp_{j}^{(2)}+temp_{j}^{(3)}+temp_{j}^{(4)})(for j=0,...,n)

以上即是整个算法实现的过程,我们就会感觉多组数据一起并行运算,如图7所示,是映射约减过程的示意图,对于逻辑回归,这个也是同样适用的,按道理讲,这样做,我们整体的速度会提高四倍,但是由于整合时一些延缓,我们最终提高的速度会小于四倍的速度。

                                                                                           图7 Map-reduce

     如果我们没有多台计算机,是不是就不能进行映射约减了?不是的,现在计算机一般都是多核的,如图8所示,我们就可以把分好的数据放在每个内核上进行计算,最后再整合。

                                                                                     图8 多核计算机

 

 

おすすめ

転載: blog.csdn.net/qq_36417014/article/details/84675253