フロントエンド人工知能: 機械学習による関数方程式の導出 - プラチナ III

フロントエンド人工知能: 機械学習による関数方程式の導出 - プラチナ III

[[259734]]

tensorflow.jsとは

Tensorflow.js は、ブラウザーと Node.js で実行できる機械学習および機械学習トレーニングの JavaScript ライブラリです。ご存知のとおり、ブラウザーで JavaScript を使用して計算を実行すると非常に時間がかかります。Tensorflow.js は GPU を使用して WebGL に基づく高性能機械学習モジュールの計算を高速化し、フロントエンド開発者がブラウザーで機械学習を実行し、ニューラル ネットワークをトレーニングできるようにします。この記事で説明するプロジェクト コードは、いくつかのルールに従ってデータをシミュレートし、機械学習とトレーニングを通じて、このデータに基づいてこのデータを生成する数式関数を逆推論するというものです。

基本概念

次に、5 分かけて TensorFlow の基本概念について説明します。この部分では主にいくつかの概念を紹介します。著者は、誰もがすぐに理解できるようにするために、いくつかの概念を簡単に説明するためにいくつかの例え話を使用します。ただし、エネルギーとスペースが限られているため、読者は概念の具体的かつ詳細な定義については公式ドキュメントを参照する必要があります。

テンソル

テンソルは実際には配列であり、1 次元または多次元になります。テンソルは、tensorflow.js のデータ ユニットです。

  1. テンソルtf代入します  
  2. テンソルを印刷します。

ブラウザは次のように出力します:

Tensorflow は、セマンティック テンソル作成関数も提供します: tf.scalar (0 次元テンソルを作成)、tf.tensor1d (1 次元テンソルを作成)、tf.tensor2d (2 次元テンソルを作成)、tf.tensor3d (3 次元テンソルを作成)、tf.tensor4d (4 次元テンソルを作成)、および tf.ones (テンソル内のすべての値が 1) または tf.zeros (テンソル内のすべての値が 0)。

変数

テンソル tensor は不変ですが、変数 variable は可変です。変数はテンソルから初期化されます。コードは次のとおりです。

  1. const initialValues ​​= tf .zeros([5]); //[0, 0, 0, 0, 0]  
  2. constbiases = tf .variable(initialValues); // テンソルを通して変数を初期化する 
  3. biases.print(); //出力[0, 0, 0, 0, 0]

操作

テンソルは、add (加算)、sub (減算)、mul (乗算)、square (平方)、mean (平均) などの演算子で操作できます。

  1. 定数e = tf .tensor2d([[1.0, 2.0], [3.0, 4.0]]);  
  2. 定数f = tf .tensor2d([[5.0, 6.0], [7.0, 8.0]]);  
  3. 定数e e_plus_f = e.add(f);  
  4. e_plus_f.print();

上記の例の出力は次のようになります。

メモリ管理 (dispose と tf.tidy)

dispose と tf.tidy はどちらも GPU キャッシュをクリアするために使用されます。これは、js コードを記述するときにこの変数に null を割り当ててキャッシュをクリアすることと同じです。

  1. var a = {数値: 1};  
  2. a = null ; // キャッシュをクリア

処分する

テンソルと変数は両方とも、破棄することで GPU キャッシュからクリアできます。

  1. 定数x = tf .tensor2d([[0.0, 2.0], [4.0, 6.0]]);  
  2. 定数x x_squared = x.square();  
  3. メソッドの詳細 
  4. x_squared.dispose();  
  5. tf.tidy

テンソルや変数が複数ある場合、一つずつ dispose を呼び出すのは面倒なので、tf.tidy では、テンソルや変数の操作を tf.tidy 関数内に置くことで、自動的に最適化され、キャッシュがクリアされます。

  1. 定数平均= tf .tidy(() = > {  
  2. 定数y = tf .tensor1d([4.0, 3.0, 2.0, 1.0]);  
  3. 定数z = tf .ones([1]);  
  4. y.sub(z) を返します。  
  5. });  
  6. 平均.print()

上記の例の出力は次のようになります。

データのシミュレーション

まず、データセットをシミュレートする必要があります。この 3 次方程式に従って、パラメーター a=-0.8、b=-0.2、c=0.9、d=0.5 を使用して、区間 [-1, 1] に誤ったデータを生成します。データは次のように視覚化されます。

4 つのパラメータ a、b、c、d の値がわからないと仮定すると、この大量のデータ、機械学習、機械学習を使用して、多項式関数方程式とその 4 つのパラメータ値 a、b、c、d を逆に推測する必要があります。

変数を設定する

多項式方程式の a、b、c、d の 4 つのパラメータ値を逆に導き出したいので、まずこれら 4 つの変数を定義し、それらに初期値としていくつかの乱数を割り当てる必要があります。

  1. 定数a = tf .variable(tf.scalar(Math.random()));  
  2. 定数b = tf .variable(tf.scalar(Math.random()));  
  3. 定数c = tf .variable(tf.scalar(Math.random()));  
  4. const d = tf .variable(tf.scalar(Math.random()));

上記の 4 行のコードでは、tf.scalar が 0 次元テンソルを作成し、tf.variable がテンソルを変数に変換して初期化します。JavaScript を記述して簡単に理解すると、上記の 4 行のコードは次のようになります。

  1. a = Math.random ()とします  
  2. b = Math.random () とします。  
  3. c = Math.random () とします。  
  4. d = Math.random () とします。

4 つのパラメータ a、b、c、d に初期ランダム値、a=0.513、b=0.261、c=0.259、d=0.504 を割り当てると、これらのパラメータを式に代入して次の曲線が得られます。

ランダムに生成された 4 つのパラメータ a、b、c、d を多項式に組み込むことで生成されたデータは、実際のデータによってシミュレートされた曲線とは大きく異なることがわかります。これが次に行うことです。機械学習とトレーニングを通じて、4 つのパラメータ a、b、c、d を継続的に調整し、この曲線を実際のデータ曲線にできるだけ近づけます。

オプティマイザーを作成する

  1. 定数学習率= 0.5 ;  
  2. constオプティマイザ= tf .train.sgd(学習率);

learningRate 変数は学習率を定義します。各マシンのトレーニング中、計算されたオフセット調整振幅は学習率に基づきます。学習率が低いほど、予測値はより正確になりますが、プログラムの実行時間と計算の複雑さが増加します。学習率が高いと学習プロセスが高速化されますが、オフセットが大きすぎるため、値が正しい値の周りで変動しやすくなり、計算結果が不正確になります。

tf.train.sgd は、確率的勾配降下法である tensorflow.js にカプセル化された SGD オプティマイザーです。機械学習アルゴリズムを使用する場合、通常は勾配降下法を使用してアルゴリズムをトレーニングします。勾配降下法には、BGD、SGD、MBGD という 3 つの一般的な形式があります。

勾配が下降してトレーニング パラメータを更新するたびに、サンプル数が増えるにつれてマシン トレーニングの速度が非常に遅くなるため、バッチ勾配降下法 SGD を使用します。この問題を解決するために確率的勾配降下法が提案されました。一般線形回帰関数の関数が次の通りであると仮定します。

SGD は各サンプルの損失関数を使用して θ の偏微分と対応する勾配を取得し、θ を更新します。

確率的勾配降下法は、各サンプルを 1 回反復して更新します。1 回の反復ですべてのトレーニング サンプルを必要とする前述のバッチ勾配降下法と比較すると、SGD はより多くの回数反復し、ソリューション空間での検索プロセスは盲目的に見えます。しかし、全体的には価値が高まる方向に進んでいます。確率的勾配降下法の収束グラフは次のようになります。

期待関数モデル(トレーニングプロセス関数)

期待される機能モデルを記述するには、実際には一連の操作を使用して機能モデルを記述します。

  1. 関数予測(x) {  
  2. // y = a * x ^ 3 + b * x ^ 2 + c * x + d  
  3. tf.tidy(() = > {を返す 
  4. a.mul(x.pow(tf.scalar(3, 'int32'))) を返す 
  5. .add(b.mul(x.square()))  
  6. .add(c.mul(x))  
  7. .add(d);  
  8. });  
  9. }

a.mul(x.pow(tf.scalar(3, 'int32'))) は ax^3 (a の x の 3 乗) を表し、b.mul(x.square())) は bx ^ 2 (b の x の 2 乗) を表し、c.mul(x) についても同様です。予測関数が返されるときに、メモリ管理を容易にし、マシントレーニング プロセスのメモリを最適化するために、tf.tidy でラップされることに注意してください。

損失関数を定義する

次に、MSE (平均二乗誤差) を使用して損失関数を定義する必要があります。数理統計学では、平均二乗誤差は、パラメータの推定値とパラメータの真の値との差の二乗の期待値を指し、MSE で表されます。 MSE は「平均誤差」を測定するのに便利な方法です。MSE はデータの変化の度合いを評価できます。MSE 値が小さいほど、実験データを説明する予測モデルの精度が高くなります。 MSE の計算は非常に簡単です。まず、実際の y 値と、指定された x に基づいて予測された y 値との差の二乗を取得し、次にこれらの差の二乗を平均します。

上記によると、損失関数コードは次のようになります。

  1. 関数 loss(予測, ラベル) {  
  2. 定数エラー=予測.sub(labels).square().mean();  
  3. エラーを返します。  
  4. }

期待値の予測から実際の値のラベルを減算し、それを二乗して平均を求めます。

機械トレーニング

さて、ここまで説明して準備を整えてきましたが、ようやく最も重要なステップに到達しました。次のコードと関数は、機械学習とトレーニングを通じてデータに基づいて目的の結果を計算するための最も重要なステップです。 SGD 確率的勾配降下法に基づいてオプティマイザーを定義し、MSE 平均二乗誤差に基づいて損失関数も定義しました。マシン トレーニングと機械学習を実行するには、これら 2 つのデバイスをどのように組み合わせればよいでしょうか。以下のコードを参照してください。

  1. 定数numIterations = 75 ;  
  2. 非同期関数train(xs, ys, numIterations) {  
  3. (let iter = 0 ; iter <   numIterations ; iter++) {  
  4. // オプティマイザー: SGD 確率的勾配降下法 
  5. オプティマイザ.最小化(() = > {  
  6. const pred =予測(xs);  
  7. //損失関数: MSE 平均二乗誤差 
  8. リターンロス(予測値、ys);  
  9. });  
  10. //ブラウザのブロックを防ぐ 
  11. tf.nextFrame() を待機します。  
  12. }  
  13. }

外側の層で numIterations = 75 を定義しました。これは、75 回のマシン トレーニングを実行することを意味します。各ループでは、optimizer.minimize 関数を呼び出します。この関数は、SGD 確率的勾配降下法を継続的に呼び出して、4 つのパラメーター a、b、c、d を継続的に更新および修正し、戻るたびに、MSE 平均二乗誤差損失関数を呼び出して損失を減らします。 75 ラウンドのマシントレーニングと機械学習、さらに SGD 確率的勾配降下法オプティマイザーと損失関数のキャリブレーションを組み合わせると、正しい値に非常に近い 4 つのパラメーター a、b、c、d が得られます。

この関数の最後に tf.nextFrame() という行があることに気付きました。この関数は、機械学習や機械学習中に大量の機械計算が実行され、ブラウザがブロックされ、UI が更新されなくなるという問題を解決するために設計されています。

このマシントレーニング関数を train と呼びます。

  1. import {generateData} from './data'; //このファイルはgitリポジトリにあります 
  2. const trainingData = generateData (100, {a: -.8, b: -.2, c: .9, d: .5});  
  3. トレーニングデータを待機します(トレーニングデータ.xs、トレーニングデータ.ys、75)。

トレーニング関数を呼び出すと、4 つのパラメーター a、b、c、d を取得できます。

  1. コンソールにログ出力します。  
  2. コンソールにログ出力します。  
  3. コンソールにログ出力します。  
  4. コンソールにログ出力します。

得られた値は、a=-0.564、b=-0.207、c=0.824、d=0.590 であり、当初定義した実際の値 a=-0.8、b=-0.2、c=0.9、d=0.5 に非常に近いです。比較チャートは次のとおりです。

プロジェクトの運営と設置

この記事で説明するコードをインストールして実行する手順は次のとおりです。

  1. git クローン https://github.com/tensorflow/tfjs-examples  
  2. cd tfjs-examples/多項式回帰コア 
  3.  
  4. 糸時計

tensorflow.js の公式サンプルには多くのプロジェクトがありますが、その中で polynomial-regression-core はこの記事で重点的に取り上げるコードです。インストール プロセスは私にとってはあまりスムーズではありませんでした。実行するたびに、モジュールが不足しているというエラーが表示されました。読者は、エラー メッセージに従って不足しているモジュールを 1 つずつインストールし、エラー メッセージに従って Google で対応するソリューションを検索するだけで、すべて機能します。

結論

ここまで言ってしまったので結論は書きたくなかったのですが、考えてみるとやはり心の中のおかしくて馬鹿げた考えを表現したいと思いました。なぜ私がこの人工知能の例に興味を持っているのか?それは、私の故郷である広西チワン族自治区(人里離れた山間の村)の人々がかなり封建的で迷信深いからです。彼らはよく人の生年月日を計算してその人の人生の運命を占ったりします。私はいつもこうした風潮をあざ笑ってきました。でも、でも、でも。 。 。 。ここからがおかしな話です。私の義父は10年前、交通事故で足を骨折しました。数年前、私は妻と義父を連れて故郷に帰り、親戚に会わせました。義父は南部の封建的な迷信がとても面白いと思ったので、田舎の老人に自分の生年月日と時間を計算してもらいました。その結果、老人はいろいろと話をして、義父が交通事故に遭った日の正確な日付、その日の午後のおおよその時間まで正確に教えてくれました。 。 。 。 。これ。 。 。 。これは楽しいですね。 。 。突然空気が静かになった光景は、今でも私の心に鮮明に残っています。私はいつもこのことを心に留めています。結局のところ、私はこれらの不気味なものを信じたことはなく、科学こそが私たちを飛躍させることができる最高の真実であると常に信じてきました。

はぁ?これは人工知能とどのような関係があるのでしょうか?ちょうど考えていたのですが、私たちそれぞれの誕生日は、直交平面座標系の次元なのでしょうか、それとも誕生日は多項式関数の a、b、c、d、e の係数なのでしょうか。これらの誕生日の係数を直列に接続して、あなたの人生を記述し、あなたの過去を記録し、あなたの未来を予測できる式を取得できる多項式関数方程式は本当に存在するのでしょうか。 。 。 。 。 。私たちは、自分と対応する次元を見つけて、それを起こったことと結び付け、人工知能を使って機械学習し、私たち自身の人生の軌跡に属する機能を訓練することができるでしょうか? 。 。 。これ以上は言いません。ここまで読んでくださった読者の皆様には申し訳ないです。ただ一生懸命勉強して、私が言ったことは忘れてください。

上記の見解はあくまでも個人的な意見です。 !^_^!

<<:  なぜ記憶はAIの発展を妨げる問題となるのでしょうか?

>>:  プログラマーを怒らせると何が起こるでしょうか?アリババDAMOアカデミーの専門家は嫌がらせ電話に耐えられず、「Erha」AIを開発した

ブログ    
ブログ    

推薦する

自動運転に関して、私たちはこれら 3 つの重要な問題を意図的に避けているのでしょうか?

Leifeng.com によると、「部屋の中の象」という外国の慣用句は、「ワニの涙」と同じくらい有...

Google はなぜいつも AI に芸術を強制するのでしょうか?

Google の人工知能といえば、チェスマシンの AlphaGo や Waymo の自動運転車を思...

確かな情報です! AIテクノロジーアーキテクチャソリューションの実現可能性を判断するのに役立つ3つの重要な要素

[[329919]]近年、人工知能は急速に発展しており、コンピュータービジョンや自然言語処理の分野で...

自動運転車の未来はどうなるのか?マッキンゼーは言う

自動運転車は徐々に現実のものとなりつつありますが、まだ多くの疑問が残っています。消費者は本当に運転の...

...

AIがネットワークゴミを生み出す:古いインターネットは死につつあり、新しいインターネットは困難の中で生まれる

網易科技は6月27日、ここ数カ月、インターネットの方向性が変化したことを示すさまざまな兆候があると報...

OpenAIに勝る完璧な埋め込みモデルであるNomic Embedが、重み、データ、コードがすべてオープンソースで利用可能になりました。

1週間前、OpenAIはユーザーに特典を配布しました。GPT-4が怠惰になる問題を修正した後、より...

...

ビッグデータとAIの連携

人工知能と機械学習は、組織がビッグデータからより優れたビジネス洞察を得るのにどのように役立つのでしょ...

パーソナライズされた推奨の CTR 推定にディープラーニングを使用する理由は何ですか?

ディープラーニングはおそらく、過去 2 年間でコンピューター コミュニティで最もホットな言葉です。エ...

...

AI、IoT、ビッグデータでミツバチを救う方法

現代の農業はミツバチに依存しています。私たちが食べる食物や呼吸する空気を含む生態系のほぼ全体が、花粉...

数学的パラドックスが人工知能の限界を証明する

人間は一般的に何かが間違っていることを認識するのが得意ですが、AI システムはそうではありません。新...

大根畑の問題を解決する C# アルゴリズム

ニンジン畑問題を解決するための C# アルゴリズムは何ですか?まずトピックを見てみましょう:仕事へ向...