ポピュラーサイエンス | TensorFlow.js から機械学習について学ぶ

ポピュラーサイエンス | TensorFlow.js から機械学習について学ぶ

フロントエンド開発者にとって、機械学習を理解するのは難しい場合があります。私は機械学習を勉強し始めてまだ間もなく、この分野では初心者です。この記事では、私自身の理解に基づいていくつかの概念を説明してみたいと思います。

ただし、既存の AI モデルを使用する場合、機械学習に関する深い知識は必要ありません。 Keras、TensorFlow、TensorFlow.js などの既存のツールを使用できます。ここでは、AI モデルを作成し、TensorFlow.js でいくつかの複雑なモデルを使用する方法について説明します。

深い知識は必要ありませんが、基本的な概念をいくつか説明させてください。

モデルとは何ですか?

あるいは、もっと良い質問は、「現実とは何か?」です。はい、これには答えるのが難しいので、理解するために質問を単純化する必要があります。

現実を簡略化して表現する 1 つの方法は、モデルを使用することです。つまり、世界地図やチャートなど、無限の数のモデルとして考えることができます。

[[243131]]

機械が関与しないモデルは私たちにとって理解しやすいです。たとえば、バルセロナの住宅の部屋数が変わると価格がどう変化するかを表すモデルを作成するとします。

まず、いくつかのデータを収集する必要があります。

部屋数価格
3 131.000ユーロ
3 125.000ユーロ
4 235,000ユーロ
4 265,000ユーロ
5 535.000ユーロ

次に、各軸が 1 つのパラメータに対応する 2D グラフを使用して、これら 2 つのデータを表示します。

そして...ドゥアン!これで、線を引いて、6部屋以上の家の価格を予測できるようになりました。

このモデルは線形回帰と呼ばれ、機械学習における最も単純なモデルの 1 つです。

もちろん、このモデルは十分ではありません。

  • サンプルが5つしかないため、結果は十分に信頼できるものではない
  • パラメーターは 2 つだけですが、実際には地理的な場所や家の築年数など、住宅価格に影響を与える要因は他にもたくさんあります。

最初の問題については、100 万のデータを追加するなど、サンプル数を増やすことで解決できます。

2 番目の質問では、軸をさらに追加できます。 2D グラフィックスでは直線を描くことができ、3D 座標では平面を描くことができます。

しかし、4D や 1000000D など、3D を超える状況にはどのように対処すればよいのでしょうか?

私たちの脳は多次元のグラフを視覚化することはできませんが、幸いなことに、数学を使用して超平面を計算することでこれを処理することができ、ニューラル ネットワークはそのための優れたツールです。

ちなみに、TensorFlow.js を使用するのに数学の専門家である必要はありません。

ニューラルネットワークとは何ですか?

ニューラル ネットワークを理解する前に、まずニューラル ネットワークとは何かを理解しましょう。

現実世界では、ニューロンは次のようになります。

神経の最も重要な部分は次のとおりです。

  • デンドライト: データが入る場所。
  • 軸索: 出力端。
  • シナプス: 神経が伝達する構造。神経軸索の末端から近くの神経の樹状突起に電気信号を伝達する役割を担っています。これらのシナプス構造は、使用されると電気信号の活動を増加または減少させるため、学習の鍵となります。

機械学習におけるニューラル ネットワークは (簡略化して) 次のようになります。

  • 入力: 入力パラメータ。
  • 重み: シナプスと同様に、重みはニューロンの活動を増減して調整し、より優れた線形回帰を実現します。
  • 線形関数: 各ニューロンは線形回帰関数のようなものです。これまでのところ、線形回帰関数には 1 つのニューロンのみが必要です。
  • 活性化関数: スカラーから別の非線形関数に変更するための活性化関数をいくつか提供できます。例: シグモイド、RELU、tanh。
  • 出力: 活性化関数が計算された後の出力結果。

活性化関数の使用は非常に便利であり、ニューラル ネットワークの本質です。活性化関数がなければ、ニューラル ネットワークは十分な知能を発揮できません。その理由は、ネットワーク内に多数のニューロンがあっても、ニューラル ネットワークの出力は常に線形回帰となるためです。非線形問題を解決するには、この独立した線形回帰を非線形回帰に変換する何らかのメカニズムが必要です。

これらの活性化関数のおかげで、これらの線形関数を非線形関数に変換できます。

モデルのトレーニング

上記の 2D 線形回帰の例では、グラフ上に線を描くだけで、新しいデータの予測を開始できました。しかし、「ディープラーニング」の概念は、ニューラルネットワークにこの線を描くことを教えることです。

単純な線を描くには、ニューロンが 1 つある非常に単純なニューラル ネットワークだけが必要ですが、他のモデルでは、2 セットのデータを分類するなど、はるかに複雑な処理を実行します。この場合、「トレーニング」では次の画像の描き方を学習します。

これは 2D のみなので、それほど複雑ではありません。

各モデルは世界であり、これらすべてのモデルのトレーニングの概念は似ています。まずランダムな線を描き、それを反復アルゴリズムで改善し、各サイクルでエラーを修正します。この最適化アルゴリズムは、勾配降下法とも呼ばれます。同様の概念を持つ、SGD や ADAM などのより複雑なアルゴリズムもあります。

勾配降下法を理解するには、各アルゴリズム (線形回帰、ロジスティック回帰など) がこれらのエラーを測定するための異なるコスト関数を持っていることを知っておく必要があります。

コスト関数は常にある点に収束し、凸または非凸になることがあります。最終的な収束点は 0% の誤差で見つかり、この点に到達することが私たちの目標です。

しかし、勾配降下アルゴリズムを使用する場合、ランダムなポイントから開始しますが、それがどこにあるかはわかりません。自分が山の上にいて、完全に目が見えず、一歩一歩山を下りて頂上まで行かなければならないと想像してください。地形が複雑な場合(非凸関数など)、降下プロセスはより複雑になります。

勾配降下法アルゴリズムが何であるかについては詳しく説明しません。覚えておかなければならないのは、これは AI モデルをトレーニングして予測のエラーを最小限に抑えるために使用される最適化アルゴリズムであるということです。このアルゴリズムでは、行列乗算を計算するために時間と GPU が必要です。通常、最初の実行ラウンドで収束点に到達するのは難しいため、学習率などのハイパーパラメータを調整したり、正規化を追加したりする必要があります。

勾配降下法を繰り返した後、収束点に非常に近い点に到達し、エラー率は 0% に近くなりました。この時点で、モデルは正常に作成され、予測を開始できます。

TensorFlow.jsを使用してモデルをトレーニングする

TensorFlow.js は、ニューラル ネットワークを簡単に作成する方法を提供します。

まず、LinearModel クラスを作成し、trainModel メソッドを追加します。

このタイプのモデルでは、モデル トポロジが分岐やスキップのない単純なスタックである場合など、1 つのレイヤーの出力が次のレイヤーの入力となるシーケンシャル モデルを使用します。

trainModel メソッド内でレイヤーを定義します (線形回帰問題には 1 つだけ使用すれば十分です)。

  1. *をtfとしてインポート  '@tensorflow/tfjs' ;   
  2.  
  3. /**  
  4. * 線形モデルクラス 
  5. */  
  6. デフォルトクラスLinearModelをエクスポートします{  
  7. /**  
  8. * 列車模型 
  9. */  
  10. 非同期trainModel(xs, ys){  
  11. 定数レイヤー = tf.layers.dense({  
  12. 単位: 1, //出力次元 空間   
  13. inputShape: [1], //パラメータは1つだけ 
  14. });  
  15. const lossAndOptimizer = {  
  16. 損失: 'meanSquaredError'  
  17. オプティマイザー: 'sgd' , // 確率的勾配降下法 
  18. };
  19.  
  20. this.linearModel = tf.sequential();  
  21. this.linearModel.add (layers); //レイヤー追加する 
  22. this.linearModel.compile(損失とオプティマイザ);   
  23.  
  24. // モデルのトレーニングを開始します。  
  25. this.linearModel.fit() を待機します。  
  26. tf.tensor1d(xs)、  
  27. tf.tensor1d(ys)、  
  28. );  
  29. }   
  30.  
  31. ...もっと 
  32. }

このクラスの使用方法:

  1. 定数モデル = 新しい LinearModel();  
  2. // xsys ->数値配列(x 軸y 軸)  
  3. model.trainModel(xs, ys) を待機します。

トレーニング後、予測を開始できます。

TensorFlow.js を使用した予測

予測の部分は通常簡単です。モデルのトレーニングにはいくつかのハイパーパラメータを定義する必要がありますが、予測を行うのは簡単です。このメソッドを LinearRegressor クラスに追加します。

  1. *をtfとしてインポート  '@tensorflow/tfjs' ;  
  2. デフォルトクラスLinearModelをエクスポートします{  
  3. ...トレーニングコード 
  4. 予測(値){  
  5. Array.fromを返します(  
  6. this.linearModel  
  7. .predict(tf.tensor2d([値], [1, 1]))  
  8. .dataSync()  
  9.  
  10. }  
  11. }

さて、コードで予測メソッドを使ってみましょう

  1. const prediction = model.predict(500); //数値 500予測する 
  2. console.log(予測) // => 420.423

このコードはオンラインで実行できます:

https://stackblitz.com/edit/linearmodel-tensorflowjs-react

TensorFlow.jsでトレーニング済みモデルを使用する

モデルの作成方法、トレーニング データの正規化、すべてのハイパーパラメータの正しい選択などを学習することが最も難しい部分です。初心者で、いくつかのモデルを試してみたい場合は、事前トレーニング済みのモデルを使用できます。

TensorFlow.js で使用できるモデルは多数あり、TensorFlow または Keras を使用してモデルを作成し、それを TensorFlow.js にインポートすることができます。

たとえば、posenet モデル (リアルタイムの人間のポーズ シミュレーション) を使用して、次のような楽しいことができます。

コードは https://github.com/aralroca/posenet-d3 から入手できます。

使い方はとても簡単です:

  1. *posenetとしてインポート  '@tensorflow-models/posenet' ;  
  2. // 定数 
  3. 定数imageScaleFactor = 0.5;  
  4. 定数出力ストライド = 16;  
  5. 定数 flipHorizo​​ntal = true ;  
  6. 定数重み = 0.5;   
  7.  
  8. //モデルをロードする 
  9. const net = posenet.load (weight) を待機します。   
  10.  
  11. // 予測を行う 
  12. const poses = await ネット 
  13. .estimateSinglePose(  
  14. 画像要素、  
  15. 画像スケール係数、  
  16. 水平反転、  
  17. 出力ストライド 
  18. );

poses 変数は次の JSON ファイルにあります。

  1. {  
  2. 「スコア」 : 0.32371445304906、  
  3. 「キーポイント」 : [  
  4. {  
  5. "位置" : {  
  6. "y" : 76.291801452637,  
  7. "x" : 253.36747741699  
  8. },  
  9. 「部分」 「鼻」  
  10. 「スコア」 : 0.99539834260941  
  11. },  
  12. {  
  13. "位置" : {  
  14. "y" : 71.10383605957,  
  15. "x" : 253.54365539551  
  16. },  
  17. 「部分」 : 「左目」  
  18. 「スコア」 : 0.98781454563141  
  19. },  
  20. // ...そして 対象: rightEye、leftEar、rightEar、leftShoulder、rightShoulder  
  21. // 左肘、右肘、左手首、右手首、左ヒップ、右ヒップ、  
  22. // 左膝、右膝、左足首、右足首 
  23. ]  
  24. }

このモデルだけで、どれだけ面白いことができるか想像してみてください。

[[243138]]

上記のサンプルコードは次の場所にあります: https://github.com/aralroca/fishFollow-posenet-tfjs

Kerasからのモデルのインポート

TensorFlow.js には外部からモデルをインポートできます。次の例では、数字認識に Keras モデルを使用します (ファイル形式は h5)。これを実現するには、tfjs_converter を使用する必要があります。

  1. pip で tensorflowjs をインストールします

次に、変換ツールを使用します。

  1. tensorflowjs_converter --input_format keras keras/cnn.h5 src/assets  

これで、モデルを JS コードにインポートできます。

  1. //モデルをロード 
  2. const model = tf.loadModel( './assets/model.json' ) を待機します。   
  3.  
  4. //イメージを準備する 
  5. img = tf.fromPixels(imageData, 1); とします。  
  6. 画像のサイズを縮小します。  
  7. img = tf.cast (img、 'float32' );   
  8.  
  9. // 予測する 
  10. const出力= model.predict(img);

わずか数行のコードで、Keras の数字認識モデルを使用できます。もちろん、キャンバスを追加して数字を描画し、その画像をキャプチャして数字を認識するなど、さらに興味深いロジックを追加することもできます。

コード: https://github.com/aralroca/MNIST_React_TensorFlowJS

なぜブラウザで AI を実行するのでしょうか?

ハードウェアが良好でない場合、ブラウザ上でモデルをトレーニングすることは非常に非効率的になる可能性があります。 TensorFlow.js は WebGL インターフェースを使用してトレーニングを高速化しますが、それでも TensorFlow Python バージョンよりも 1.5​​ ~ 2 倍遅くなります。

しかし、TensorFlow.js が登場する前は、API のやり取りなしにブラウザで機械学習モデルを使用することは基本的に不可能でした。これで、アプリケーションでモデルをオフラインでトレーニングして使用できるようになりました。また、サーバーとやり取りする必要がないため、予測が速くなります。

もう 1 つの利点は、これらの計算をブラウザで実行すると、サーバーのオーバーヘッドが削減され、コストが節約されることです。

結論は

  • モデルとは、予測を行うために使用できる現実の一部を簡略化した表現です。
  • モデルを作成する良い方法は、ニューラル ネットワークを使用することです。
  • ニューラル ネットワークを作成するシンプルで簡単な方法は TensorFlow.js です。

<<:  電子商取引用に作成されたナレッジグラフは、ユーザーのニーズをどのように感知するのでしょうか?

>>:  AI スタートアップの品質を測定するにはどうすればよいでしょうか?

推薦する

2019 年のトップ 5 ディープラーニング コース

現在、ディープラーニングはデータサイエンスの分野で最も人気のあるスキルとなっています。ディープラーニ...

機械学習の背後にある数学的な柱を理解するには、この 5 冊の本が役立ちます。

この記事は、公開アカウント「Reading the Core」(ID: AI_Discovery)か...

AGVロボットマルチエージェント経路探索の4つの主要な研究方向

マルチエージェント経路探索 (MAPF) は、人工知能、ロボット工学、理論計算機科学、実践的オペレー...

ディープQ学習ネットワーク: 仮想ゲームから現実世界のアプリケーションへのギャップを埋める

翻訳者 |李睿レビュー | Chonglou人工知能と機械学習は、ヘルスケア、金融、エネルギー、輸送...

ノーコード プラットフォーム トップ 8: 2020 年に見逃せない機械学習プラットフォーム

この記事は、公開アカウント「Reading the Core」(ID: AI_Discovery)か...

RPAとAIを組み合わせることで、自動化の新しい世界が開かれます

たとえば、ボットに請求書を分析してもらい、それを社内の適切な連絡先に送信させたいとします。十分簡単そ...

...

...

...

顔認識システムの技術的プロセスの分析

顔認識は、顔の特徴に基づいて人物を識別する生体認証技術です。カメラまたはビデオカメラを使用して、顔を...

多くの場所でAI顔認識の使用が制限されており、監視は技術開発のペースに追いついています

最近、南京、江蘇省、天津などではAI顔認識技術の使用を禁止し始めている。 11月末、南京市のある男性...

...

Canalys:2027年までにPCの60%がAI機能に対応し、出荷台数は1億7500万台を超える見込み

9月26日、市場調査会社Canalysが発表した最新レポートによると、現在のAIの波の中で、企業や消...

海雲捷迅2018ビッグデータ博覧会ツアー——2018ビッグデータ博覧会人工知能世界大会決勝戦が終了

5月25日、2018年中国国際ビッグデータ博覧会人工知能世界大会決勝戦が予定通り貴陽で開催され、世界...

ジェンセン・フアン:わずか2年で、Nvidiaと業界全体が完全に変わるだろう

黄仁訓は未来について次のように予言した。コンピューティング技術は10年ごとに100万倍に進歩します。...