フロントエンド人工知能: 機械学習による関数方程式の導出 - プラチナ 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を開発した

ブログ    
ブログ    

推薦する

「現時点で最高のヴィンセント動画AI」が登場!広告や映画に使っても問題ない。ネットユーザー:とてもスムーズ

この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...

一緒にデジタル広西を構築し、デジタルの未来に向かって進みましょう! 2023年広西クンペンアセンド人工知能産業エコシステム会議が成功裏に開催されました

9月19日、南寧市ビッグデータ開発局が主催し、華為技術有限公司と南寧産業投資グループ有限公司が共催す...

人工知能が医療をどのように改善できるか

人工知能は医療と医療の分野で大きな力を発揮することが証明されている 人工知能は、特に医療分野において...

AIGC時代のビデオ普及モデル、復旦チームらが分野初のレビューを発表

AI 生成コンテンツは、現在の人工知能分野で最もホットなトピックの 1 つとなっており、この分野の最...

Baidu CTO 王海峰氏:PaddlePaddle ディープラーニング プラットフォームは新しいインフラストラクチャの重要な部分です

産業インテリジェンスの急速かつ徹底的な進歩に伴い、人工知能インフラの構築は不可欠となっています。 5...

ディープラーニング: シンプルだが限界のあるソリューション

ディープラーニング:幾何学的視点ディープラーニングに関する最も驚くべき事実は、それがいかにシンプルで...

ベセット氏との対話:自動運転車が人間の信頼を勝ち取るのはいつでしょうか?

[[257915]]編集者注:自動運転車が私たちの信頼を得られるのはいつでしょうか? 「十分に安全...

無線ルーターのさまざまな暗号化アルゴリズムの包括的な説明

ワイヤレス ルーターは、ワイヤレス ネットワークの開発において非常に重要な役割を果たします。ここでは...

何年も救助ステーションに取り残されていた彼らは、顔認識技術によって愛する人を見つけることができた。

2年前、アンディ・ラウとジン・ボーランが主演した映画「恋の迷宮」は、数え切れないほどのファンを映画...

ディープラーニングの成果は収穫されようとしているのでしょうか? 11人の専門家がAIの現在(2018年)と未来(2019年)について語る

KDnuggets は、学界と産業界のさまざまな分野の機械学習と AI の専門家 11 名に相談し、...

人工知能とビッグデータを開発する際に注意すべき12のポイント

人工知能は近年の科学技術発展の重要な方向です。ビッグデータの時代において、データの収集、マイニング、...

あまり知られていないがプライバシーを保護するトレーニング方法:フェデレーテッドラーニング

[[261420]]ビッグデータダイジェスト制作出典: MITテクノロジーレビュー編集者: stat...

ビッグデータと機械学習は世界のエネルギー業界をどのように変えるのでしょうか?

機械学習、ビッグデータ、自動化は世界の産業システムに革命をもたらしており、エネルギー業界も例外ではあ...

機械翻訳から読心術まで、AIは人類のバベルの塔を再建できるのか?

聖書の旧約聖書創世記には、人類が団結して天国に通じるバベルの塔を建てたという話があります。この計画を...