C#のに基づいて機械学習 - ディープ確率ネットワーク

 

 

 

 

我々は、すべての学習の深さを聞いたが、どのように多くの人々が信仰ネットワークの深さが何であるかを知っていますか?私たちは、この章から、この質問に答えるために始めましょう。深い信念ネットワークは、非常に高度な機械学習形態であり、急速に進化しています。機械学習の開発者として、この概念の特定の理解は非常に重要ですので、あなたがそれに遭遇したりするとき、それはあなたがそれに非常に精通しているであろうということに遭遇しました!

機械学習では、信仰ネットワークの深さは、技術的に深いニューラルネットワークです。それは深さや深さ、研究の信念に来るとき私たちは、それがネットワークを構成マルチレイヤ(隠れユニット)であることを意味し、意味の深さを指摘しなければなりません。深信念ネットワーク、一つの層内の各ニューロン間の接続ではなく、異なる層の間です。深い信念ネットワークは、入力ネットワークの確率を再確立するために、教師なし学習に訓練することができます。「特徴検出器」として、これらの層、同定または分類することができる画像、文字など。

この章では、我々は含まれています:

制限付きボルツマンマシン

C#で深い信念ネットワークの作成と訓練

 

制限付きボルツマンマシン

成層制限ボルツマンマシン(RBMの)Aとして設定されている深度信念ネットワークを構築する1つの一般的方法。これらRMBSエンコーダ、可視下層の各中間層として機能する自動。深い信念ネットワークは、ネットワークを微調整段階のフロントを提供養う、RBMの前に訓練の多層相を提供します。トレーニングの最初のステップは、可視部からの特性のいずれかを学習することです。次のステップは、以前に訓練されたプロパティから起動して、新しいユニットから見えるよう得ることです。私たちは第二の中間層で多くの機能を学ぶことができるように、その後、我々は、プロセスを繰り返します。その後、すべての隠れ層のためのプロセスを継続します。

ここでは2つの情報を提供する必要があります。

まず、自動エンコーダが何であるかを少し説明する必要があります。自動エンコーダは、学習の特徴コア。彼らは、入力(入力ベクトルは、典型的には重要な機能で圧縮され)、教師なし学習によって復元されたデータを符号化します。

第二に、我々は深い信念ネットワーク上に積層RBMのは、この問題を解決するひとつの方法であることに注意してください。リニアユニット(ReLUs)積み重ねを制限し、プラス削除や研修、その後、バックプロパゲーションプラス、再び最も先進的な技術となっていただろう。30年前、監督の方法が可能であるので、私は、繰り返します。代わりに、すべてのデータを表示し、関心のある特徴を決定するためのアルゴリズムをさせるの、時には私たち人間は、実際に私たちが望むより良い機能を見つけることができます。

私は次のように二つの最も重要な機能の信念ネットワークの深さがあると思います。

Lは、上から学習処理の底に層によって有効な層を有する重みを生成します。それはどのように決定するか、可変層でそれ以上の層に従属変数。

Lは、学習が完了した後、各層の値を容易に可変シングルボトムアップトラバーススルートラバーサルが逆リモデリングを使用して重みを生成する基礎となる観測データベクトルから開始することを推測することができますデータ。

私たちは今、RBMのと一般ボルツマンマシンに回す、と述べました。

ボルツマンマシンは、側面にバイナリとユニットとの間の差がないと、リカレントニューラルネットワークです。無向エッジ手段(又はリンク)は双方向であり、それらは任意の特定の方向を指していません。

以下は、無向グラフと無向エッジです。

ボルツマンマシンは限り十分な時間があるとして、内部表現を学習できる最も初期のニューラルネットワークの一つであり、彼らは問題を解決することができるようになります。しかし、彼らは私たちの次のトピック、RBMのに私たちをもたらした、ストレッチが得意ではありません。

RBMのは、問題をスケーリングすることはできませんボルツマンマシンを解決するために導入されています。彼らは、学習の効率を向上させることができます層、隠れユニット間の各接続が制限されているが、これらのユニットの外ではないが、隠されています。より正式に、私たちはこれを適切に説明するために、グラフ理論の数を調べる必要があります。

RBMのニューロンより高度な理論図形である二部グラフを形成する必要がある。細胞(可視層と中間層)の二組の各グループのノードの対の間の非対称接続を有していてもよいです。ノードのグループ間の任意の接続が存在することはできません。同じセット内の2つの隣接する頂点よう時々生物図と呼ばれる二部グラフは、グラフのセットは、2つの互いに素の集合に頂点です。

ここでは、このトピックを視覚化するのに役立ちます、良い例です。

(左側に赤である権利は黒色である)同じグループが接続されていないことに留意されたいが、二つのグループの間の接続があります。

より正式に、RBMは対称二部グラフと呼ばれています。全ての可視のノードの入力は、すべての隠されたノードに渡されるからです。私たちは、各ノードが隠れノードに関連付けられているため対称性が表示されていることを言います。

私たちは、RBMは、我々は2つの出力ノード、各動物aを持っている犬や猫の画像が表示されていることを前提としています。私たちは学習によって移動すると、私たちのRBMは、自分自身に問う:それは犬のように」知りたいと思ったで、私が見るべきである「私は猫や犬、あなたの体重に強い信号を送信しなければならないことがわかりピクセルのために?」どの画素分布「私の友人は、これは同時確率に今日のレッスンで:? X与えられ、AとXの確率の場合に与えられている間。我々の場合では、この同時確率は、重の2つの層の間の重量として表現され、それは、RBMの重要な側面です。

私たちは今、RBMSの重要な部分である再建、について話しています。我々が議論してきた例では、画素群が表示された画像(すなわちオープン)のセットを学んでいます。隠れ層のノードは、我々の場合には何が起こっているかの一般的な発生を表して(それは重量を開くことを決めた何に関係なくある)を活性化するための重要な重量が、あるとき、それは犬や猫です。これは猫、とがった耳、丸顔である場合には、小さな目は、我々が探しているものかもしれません。+ +ロングテール大きな耳、大きな鼻は、あなたのイメージは犬になることができます。これらの活性化は、RBMは、元のデータのように「考える」を表します。実際には、我々は、元のデータを再構築しています。

我々はまた、迅速ではなく一つで、RBMは、2つのバイアスを持っている、と指摘する必要があります。それは他の自動符号化アルゴリズムと異なっているので、これは非常に重要です。RBMの隠された偏差は、私たちが往路で活性化させるために必要なものを生産する役立ちますが、偏差に見えるが、私たちは復路で正しい再建を学ぶのを助けます。その主な仕事はどのようにスパース我々のデータに関係なく、いくつかのノードがトリガされることを確実にするためであるので、隠されたバイアスが重要です。後で、これは深い信仰のネットワークの夢をどのように影響するかが表示されます。

     層状

我々は、入力データにRBMの構造を理解すれば、それが最初の中間層で行わ活性化に関連付けられ、データは次の隠れ層に渡されます。最初の隠された層は、その後、新しい目に見える層となります。私たちは隠れ層で作成されたアクティベーションは、今、私たちが入力されます。彼らは、活性化の別のセットを生成するために、中間層に新しい重量で乗算されます。

このプロセスは、当社のネットワークのすべての隠された層に続けています。隠れ層が見える層になって、私たちは別の隠れ層を持って、我々は繰り返し、その後、その重量を使用します。私たちは前の層から、これまでの入力を識別できるようになるまで右それぞれの新しい世代のための調整の後の隠れ層は、重くなります。

技術的には教師なし、貪欲、成層トレーニングとして知られ、より詳細に説明するために。それぞれの層の改善は、外部からの影響のいずれかのタイプを含まないことを意味し、入力値には必要ありません。私たちは、教師なしデータを訓練するために私たちのアルゴリズムを使用することができるはずです。このさらなる手段は、前に見たことがありません。

我々が強調してきたように、私たちが持っているより多くのデータは、より良い我々の結果!画質が良くなっているの各レイヤでは、より多くの、より正確な、私たちのことができ、より良いそれぞれの隠れ層を介して私たちの学習能力、およびウェイトの役割を向上させるためには、学習過程における右画像分類に私たちを導くことです。

復興を議論するとき、私たちは指摘しなければならない。しかし、デジタル再建(重量)で動作するように一度に一つは、RBMから我々のデータは何かを学んだことを示している、非ゼロです。ある意味で、あなたは、同じ割合のインデックスを返すために、デジタル画像処理を処理することができます。数、それが見たもの、アルゴリズムでより信頼が高いです。覚えておいてください、我々は返すようにしたいのマスタデータセットを持って、私たちは私たちの復興のための参照データセットを持っています。各画像を通して私たちのRBMは、それがプロセスイメージにあるのか分からないときは、それは決定しようとしているものです。

さんが何かを明確にする瞬間を見てみましょう。我々は貪欲なアルゴリズムを使用することを言うとき、私たちは本当に意味私たちのRBMは、最良の結果を得るために最短経路を使用することです。私たちは、正しい答えを見つけるために私たちを導くランダムに選択された画素とピクセルテストから画像を見てきました。

RBMは、右の私たちの究極の目標であるマスターデータセット(テストセット)に基づいて、各仮説をテストします。すべての画像私達はちょうどピクセルの分類を設定しようとしていることを忘れないでください。ピクセルは、データの特徴および特性を含みます。例えば、画素が境界できる光画素数を示してもよい暗いピクセルを表し異なる明るさ、などを有していてもよいです。

私たちが望むようなものが行っていない場合、我々は与えられたステップは何かを学んで何が起こるかを修正しない場合でも、?何が起こるのだろうか?この問題が発生した場合、それは私たちのアルゴリズムが間違って推測することを意味します。我々は戻って、もう一度お試しされなければなりません。これは見た目ほど悪くはないですが、またとても時間のかかるを見ていません。

もちろん、想定する間違った時間にコストが付属しますが、最終的な目標は、我々は、効率を改善し、各段階でエラーを低減することを学ばなければならないということです。すべての間違った加重接続は、我々は強化学習でやったとして、処罰されます。これらの接続は、体重を減らすだろう、もはやそれほど強くありません。次トラバース所望の精度は、エラーを低減しながら、改善され、より大きな、重量も大きく影響することができます。

私たちはデジタルでデジタル画像を分類すると仮定します。いくつかの画像は、曲線、など2,3,6,8,9などなどを持っています。そのような1,4及び7のような他の数、そうではないであろう。私たちのRBMは、エラーを削減、継続的に自分自身の学習を向上させるためにそれを使用しますので、そのような知識は、非常に重要です。我々は数2で扱っていると思う場合は、このパスの重量は、他のパスに右の値よりも重くなります。これは極端な単純化し過ぎですが、うまくいけば、それはあなたが私たちを開始しようとしているものを理解する助けには十分です。

私たちは一緒にすべてのこれらを入れた場合、理論的な枠組みは、私たちは今、深い信仰のネットワークを持っています。我々は他の章よりも深さで理論を学びながら、しかし、あなたが私たちの仕事プログラムの例を見ることができるようにそれが意味をなすために開始しますよう。あなたは、アプリケーションで使用舞台裏で何が起こったのか理解することは、より良い準備となります。

信念ネットワーク及びRBMの深さを示すために、我々は優れたオープンソースソフトウェアのSharpRBMを書かれたマティアFagerlundを使用します。オープンソースコミュニティのためのソフトウェアは、私はあなたがそれを使用する時間または数日を過ごすことになります疑いを持って、信じられないほどの貢献をしてきました。ソフトウェアは、いくつかの信じられないほどのデモが付属しています。本章では、文字の分類デモンストレーションを使用します。

下のスクリーンショットは、私たちの深い信念のテストアプリケーションです。あなたは今まであなたがコンピュータが眠っているときの夢何を考えたことはありますか?

 プログラムの左上隅には、層の当社指定地域を訓練することです。我々は、彼らが適切に試験前に訓練する必要があり、3つの隠れ層を持っています。私たちは、第一層の初めから、1時間を訓練することができます。より多くの訓練、より良いあなたのシステム:

訓練の後、私たちの進歩の下のオプションの一部です。私たちは、このような生成再構成誤差、誤差検出器、学習率など、すべての関連情報を、訓練すると、ここに示されています。

次はあなたがドローボックスを選択した場合、それはトレーニングプロセスを通して自分自身を更新します、私たちの特徴検出器の図です。

トレーニングレベルを開始するとき、私たちは、特徴検出器と再構成が実質的に空であることに注意します。彼らは自分自身を向上させ、絶えず私たちに訓練されます。覚えておいてください、我々はすでにトレーニングが続くとして、再構築されたデジタルはますます明確になり、私たちの特徴検出器がますます明らかになってきた本物です知って再構築されています!:

ここで訓練中のアプリケーションのスナップショットです。示されるように、これは31の第一世代である、デジタル再構築は非常にはっきりしています。

彼らはまだ不完全または不正確ですが、あなたは私たちが作ってきたどのくらいの進捗状況を確認できます。

コンピュータの夢を見て?

电脑做梦时会梦到什么?对我们来说,直觉是一个特征,它允许我们看到计算机在重构阶段在想什么。当程序试图重建我们的数字时,特征检测器本身将在整个过程中以各种形式出现。我们在dream window中显示的就是这些形式(红色圆圈表示):

我们花了很多时间查看应用程序的屏幕截图。我想是时候看看代码了。让我们先看看如何创建DeepBeliefNetwork对象本身:

DeepBeliefNetwork = new DeepBeliefNetwork(28 * 29, 500, 500, 1000);

一旦创建了这个,我们需要创建我们的网络训练器,我们根据我们正在训练的层的权重来做这件事:

DeepBeliefNetworkTrainer trainer = new DeepBeliefNetworkTrainer(DeepBeliefNetwork, DeepBeliefNetwork?.LayerWeights?[layerId], inputs);

这两个对象都在我们的主TrainNetwork循环中使用,这是应用程序中大部分活动发生的部分。这个循环将继续,直到被告知停止。

private void TrainNetwork(DeepBeliefNetworkTrainer trainer)
{
  try
  {
    Stopping = false;
    ClearBoxes();
    _unsavedChanges = true;
    int generation = 0;
    SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS | EXECUTION_STATE.ES_SYSTEM_REQUIRED);
    
while (Stopping == false)     {       Stopwatch stopwatch = Stopwatch.StartNew();       TrainingError error = trainer?.Train();       label1.Text = string.Format(       "Gen {0} ({4:0.00} s): ReconstructionError=       {1:0.00}, DetectorError={2:0.00},       LearningRate={3:0.0000}",       generation, error.ReconstructionError,       error.FeatureDetectorError,       trainer.TrainingWeights.AdjustedLearningRate,       stopwatch.ElapsedMilliseconds / 1000.0);       Application.DoEvents();       ShowReconstructed(trainer);       ShowFeatureDetectors(trainer);       Application.DoEvents();       if (Stopping)       {         break;       }
      generation
++;     }
    DocumentDeepBeliefNetwork();   }
  finally   {     SetThreadExecutionState(EXECUTION_STATE.ES_CONTINUOUS);   } }

在前面的代码中,我们突出显示了trainer.Train()方法,它是一个基于数组的学习算法,如下所示:

public TrainingError Train()
{
  TrainingError trainingError = null;
  if (_weights != null)
  {
    ClearDetectorErrors(_weights.LowerLayerSize,
    _weights.UpperLayerSize);
    float reconstructionError = 0;
    ParallelFor(MultiThreaded, 0, _testCount,
      testCase =>
      {
        float errorPart =
        TrainOnSingleCase(_rawTestCases,_weights?.Weights, _detectorError,testCase,
           _weights.LowerLayerSize,_weights.UpperLayerSize, _testCount);         
lock (_locks?[testCase % _weights.LowerLayerSize])         {           reconstructionError += errorPart;         }       }
    );     
float epsilon =     _weights.GetAdjustedAndScaledTrainingRate(_testCount);     UpdateWeights(_weights.Weights,_weights.LowerLayerSize, _weights.UpperLayerSize,_detectorError, epsilon);     trainingError = new TrainingError(_detectorError.Sum(val =>Math.Abs(val)), reconstructionError);     _weights?.RegisterLastTrainingError(trainingError);     return trainingError;   }
  return trainingError; }

此代码使用并行处理(突出显示的部分)并行地训练单个案例。这个函数负责处理输入层和隐藏层的更改,正如我们在本章开头所讨论的。它使用TrainOnSingleCase函数,如下图所示:

private float TrainOnSingleCase(float[] rawTestCases, float[] weights, float[] detectorErrors, int testCase,
int lowerCount, int upperCount, int testCaseCount)
{
  float[] model = new float[upperCount];
  float[] reconstructed = new float[lowerCount];
  float[] reconstructedModel = new float[upperCount];
  int rawTestCaseOffset = testCase * lowerCount;
  ActivateLowerToUpperBinary(rawTestCases, lowerCount,
  rawTestCaseOffset, model, upperCount, weights); // Model
  ActivateUpperToLower(reconstructed, lowerCount, model,upperCount, weights); // Reconstruction
  ActivateLowerToUpper(reconstructed, lowerCount, 0,
  reconstructedModel, upperCount, weights); //
  Reconstruction model
  return AccumulateErrors(rawTestCases, lowerCount,rawTestCaseOffset, model, upperCount, reconstructed,
    reconstructedModel, detectorErrors); // Accumulate
  detector errors
}

最后,我们在处理过程中积累错误,这就是我们的模型应该相信的和它实际做的之间的区别。

显然,错误率越低越好,对于我们的图像重建最准确。AccumulateErrors函数如下所示:

private float AccumulateErrors(float[] rawTestCases, int lowerCount, int rawTestCaseOffset, float[] model,
int upperCount, float[] reconstructed, float[] reconstructedModel, float[] detectorErrors)
{
  float reconstructedError = 0;
  float[] errorRow = new float[upperCount];
  for (int lower = 0; lower < lowerCount; lower++)
  {
    int errorOffset = upperCount * lower;
    for (int upper = 0; upper < upperCount; upper++)
    {
      errorRow[upper] = rawTestCases[rawTestCaseOffset +
      lower] * model[upper] +
      // 模型应该相信什么
      -reconstructed[lower] *
        reconstructedModel[upper];
        // 模型真正相信什么
    }
    lock (_locks[lower])
    {
      for (int upper = 0; upper < upperCount; upper++)
      {
        detectorErrors[errorOffset + upper] -= errorRow[upper];
      }
    }
    reconstructedError += Math.Abs(rawTestCases[rawTestCaseOffset + lower] - reconstructed[lower]);
  }
  return reconstructedError;
}

总结

在本章中,我们学习了RBMs、一些图论,以及如何在c#中创建和训练一个深入的信念网络。我建议你对代码进行试验,将网络层训练到不同的阈值,并观察计算机在重构时是如何做梦的。记住,你训练得越多越好,所以花时间在每一层上,以确保它有足够的数据来进行准确的重建工作。

警告:如果启用特性检测器和重构输入的绘图功能,性能将会极速下降。

如果你正在尝试训练你的图层,你可能希望先在没有可视化的情况下训练它们,以减少所需的时间。相信我,如果你把每一个关卡都训练成高迭代,那么可视化会让你感觉像一个永恒的过程!在你前进的过程中,随时保存你的网络。

在下一章中,我们将学习微基准测试,并使用有史以来最强大的开源微基准测试工具包之一!

おすすめ

転載: www.cnblogs.com/wangzhenyao1994/p/11183385.html