何か新しいことを受け入れたり、始めたりするのは決して簡単なことではありません。機械学習は、新しいプロジェクトのためにすぐに習得する必要があるプログラミング スキルの 1 つですが、どこから始めればよいかわからない場合があります。もちろん、この大手ソーシャルメディアやポータルサイトで頻繁に表示されるこの単語は、履歴書に記載する良い証拠になるかもしれません。 この記事では、機械学習に Clojure と Cortex を使用します。理解しやすくすぐに使えるニューラル ネットワークをゼロから作成する方法と、トレーニング済みのネットワーク REPL と LISP を使用して即座に結果を得る方法を学びます。
Cortex は比較的新しい概念かもしれませんが、既存の機械学習フレームワークに代わる非常に強力な選択肢です。これは Clojure をベースとしており、独自のネットワークを拡張して実行するために必要なコードのほとんどが不要になります。 ネットワークをトレーニングして使用する方法を強調するために、この投稿では、単純な秘密関数 (ネットワークの秘密) を作成し、ネットワークをトレーニングしてこれまでに見たことのない入力を計算し、すぐに良好な結果を得るまでの手順を説明します。 Cortex 自体は、カスタム入力、出力、隠し層を含む独自のネットワークを作成およびトレーニングし、現在トレーニングされているネットワークの良さを推定するための API を提供する Clojure ライブラリです。 最小限の Clojure プロジェクトのセットアップは、かなり標準的な Leiningen セットアップです。Leiningen は Clojure の事実上のビルド ツールであり、インストールも簡単です。
また、後で説明するように、Web REPL を描画して関数を描画するために、REPL の 1 つである Gorilla REPL も使用します。ゼロから始める: すぐに使えるニューラル ネットワークをあなたも作成できます! Gorilla プラグインを使用すると、Web REPL を実行でき、上記の project.clj ファイルで提供されるノートブック エイリアスを使用して起動できます。 簡単なターミナルまたはコンソール コマンドは次のようになります。 Clojure 名前空間では、次の 3 つのものが定義されています。 ネットワークは秘密関数を正しくマッピングする必要がある ランダム入力シーケンスのジェネレーター トレーニング用のネットワークを提供するデータセット ジェネレーター。 これにより、secret-fn が呼び出され、ネットワークのトレーニングに必要な入力と出力が生成されます。 このプロジェクトでは、コードを含む Clojure 名前空間が src/tutorial.clj で定義され、2 つの Gorilla ノートブックによって使用されます。 Gorilla REPL が起動したら、次のローカル URL に移動します。 ここには REPL があり、ノートブックに沿って Clojure コードとコマンドをブラウザーに直接入力することができます。 準備する 最初のタスクは、いくつかの Cortex 名前空間をインポートすることです。 ネットワークとレイヤーの名前空間は、ネットワークの内部を定義するために使用されます。 train 名前空間は、ネットワーク定義とデータセットを受け取り、トレーニング済みのネットワークを生成します。 最後に、実行名前空間はトレーニング済みのネットワークと追加の入力のみのデータセットを受け取り、提供された入力を使用してネットワークを実行します。チュートリアル名前空間には、上記で記述したコードと、隠し関数およびデータセット ジェネレーターが含まれています。 入力ジェネレーターを作成してテストすることが最初のステップになります。 入力ジェネレーターは、2 つの要素からなるタプルを多数生成します。 ランダム シーケンス ジェネレーターは、入力データ セットと出力データ セットを提供でき、内部で隠し関数を使用します。 生成されたデータがどのようなものかがわかったので、20,000 個の要素を持つ 2 つのデータセットを作成しましょう。 ティーチング データセットは、ネットワークに何が既知で、何を真実として記憶すべきかを伝えるために使用され、テスト データセットは、ネットワークの正確性をテストし、そのスコアを計算するために使用されます。 通常、完全に異なる 2 つのセットを用意する方がよいでしょう。 強力で素晴らしいデータセットが 2 つできたので、4 つのレイヤーで構成される共線ネットワークとして定義されるネットワークを記述できます。 2 つのレイヤーは予想される入力と出力に使用され、他の 2 つのレイヤーは内部構造を定義します。 ニューラル ネットワークのレイヤーを定義することは、それ自体が芸術です。 ここでは、活性化関数として双曲正接を使用します。実際、十分にトレーニングされたネットワークには 2 つのアクティベーション レイヤーがあります。 これを紹介する良いトピックについては、こちらをご覧ください。 最初の層はネットワークエントリと入力を定義し、入力として2つの要素を持ち、入力ラベルはxという名前が付けられます。 最後の層はネットワークの出力を定義します。出力には要素が1つだけあり、そのIDは次のようになります: y Cortex API を使用すると、次の小さなネットワーク コードが提供されます。 女王がかつて言ったように、ネットワークをトレーニングするために必要なすべてのモジュールが定義されています。 すべてはトレーニング次第です。十分にトレーニングすれば、多くのことが可能になります。 —エリザベス2世女王 電車 トレーニングの目的は、すぐに使用できる独自のトレーニング済みネットワークを作成すること、または他のユーザーが完全に独立してネットワークを使用できるようにすることです。 トレーニングは段階的に行われます。各ステップでは、ティーチング データセットの要素をバッチで取得し、各レイヤーのチャンクをいくつかの係数でゆっくりと適合させて、レイヤーのグループ全体が目的の出力に近い結果を生成できるようにします。私たちが使用している活性化関数は、ある意味では人間の記憶プロセスを模倣することを目的としています。 各ティーチングステップの後、提供されたテストデータセットを使用してネットワークの精度がテストされます。このフェーズでは、ネットワークは既存の内部部門を使用して実行され、以前のバージョンと比較してパフォーマンスが向上したかどうかが確認され、ネットワーク損失と呼ばれるものが計算されます。 ネットワークが前回よりも優れていることが判明した場合、Cortex はネットワークを NIPPY ファイルとして保存します。これは、マップの形式で表されたネットワークの圧縮バージョンです。話はこれくらいにして、いよいよトレーニングを始めましょう。 トレーニングの出力はログ ファイルに記録されます。ログを見ると、ネットワークが内部的にどのように表現されているかが最初にわかります。 以下に、さまざまなレイヤー、各レイヤーの入力と出力の次元、および適合するパラメーターの数を示します。 次に、各ステップ/エポックで新しいスコアを取得し、ネットワークが優れているかどうかを確認します。優れている場合は、それを保存します。 各ステップのスコアはネットワークの有効性を示し、損失がゼロに近いほどネットワークのパフォーマンスは良好です。 したがって、ネットワークをトレーニングする際は、損失値をできるだけゼロに近づけることが目標になります。 3,000 エポックの完全なトレーニングには数分しかかからず、完了すると、トレーニングされたネットワークのパフォーマンスをすぐに理解できます。 時間が重要である場合、速度と適度に正確にトレーニングされたネットワークの間で妥協できる 1,500 ~ 2,000 が適切な範囲です。 トレーニングが終了すると、現在のフォルダーに新しい my-fn.nippy ファイルが作成されます。 これは、Cortex ネットワークのトレーニング済みバージョンに基づく zip ファイルです。 トレーニング済みのネットワーク mynetwork.nippy のコピーは、コンパニオン プロジェクトに含まれています。 ネットワークの損失の側面は非常に満足のいくもので、以下に示すように値はゼロに近いです。 手動で定義したカスタム入力を使用して、新しくトレーニングしたネットワークを試してみましょう。 これは予想される 0*1=0 出力に非常に近いです。 ここで、ネットワークがこれまで見たことのない 2 つの値のタプルを試してみましょう。 7.42 は、予想された結果 5 * 1.5 = 7.5 よりもかなり優れています。 ネットワークの使用 ご覧のとおり、トレーニングされたネットワークは NIPPY ファイルに保存されます。 このファイルは、ネットワークの外部の「ユーザー」が読み込んで使用できます。 今後は、提供されたノートブックを見ると、次のコメントを読み込むことができます: コメント: ユーザーには何らかの名前空間が必要です。 このチュートリアルでは、実行名前空間 (util) を使用してファイルからネットワークをロードし、値をプロットするためのプロットは Gorilla プラグインによって提供されます。 その後、予想される結果とネットワークによって提供された結果をプロットする予定です。 トレーニング済みのネットワークをロードすることは、Cortex が提供する read-nippy-file 関数を使用する簡単な方法です。 これまで見たことがありませんでしたが、ネットワークは実際にはマップであり、その最上位のキーを調べることができます。 ネットワークが経過したエポック数と現在の損失値を確認することをお勧めします。
ネットワークをロードした結果が、前のセクションでトレーニングしたバージョンと同じであることを確認できます。
それでは、ロードしたネットワークで一連の結果を生成し、プロットしてみましょう。 (新しい入力セットでネットワークを実行するのは、おそらく今では簡単なことでしょう!) もちろん、ネットワークによって生成された結果の値の一部を検査することもできます。
プロットには、Gorilla が gorilla-plot.core 名前空間から提供するプロット関数を使用できます。 ここでは、出力のみに焦点を当て、結果にあるベクトルのシーケンスではなく、Clojure の flatten 関数を使用してフラットな出力値のセットを作成します。 色を指定した後、プロットでは点ではなく線を使用する必要があることを知っていれば、ブラウザの REPL で直接次のプロットを見ることができます。
既知または非表示でない関数によって直接生成される予想される結果と、トレーニングされたネットワークによって生成される結果で構成される「組み合わせ」プロットを生成することもできます。 2 本の線は実際には非常に接近しており、完全に重なり合っています。
再訓練 そこからの興味深い進歩の道筋は、現在トレーニング済みのネットワークを取得し、より多くのデータセットを使用して cortex trainn 関数を再度実行することで、ネットワークを改善することです。 注: 新しいネットワーク ファイルを指定すると、更新されたネットワークの別のバージョンを保持できます。 さらに、新しいデータセットと新しいトレーニング サイクルを使用すると、より優れたネットワークを実現できる可能性がまだあります。その場合は、新しいファイル名を使用してネットワークを再度保存します。 結論は この投稿では、既知の関数の出力を模倣するように独自のニューラル ネットワークをトレーニングする方法を説明しました。 トレーニングに必要なデータセットを生成して提供する方法と、Cortex が最適なネットワークのファイル バージョンを保存する方法について学習しました。 いくつかのアイデアは次のとおりです。 同じものを別の非表示機能で試してみてください。 ネットワーク メタデータ内の関数とネットワークの入力および出力パラメータの数を変更します。 ネットワーク パフォーマンスが期待どおりに向上しない場合は、ネットワークのさまざまなレイヤーに時間をかけて、より適切な構成を見つけてください。 |
<<: Splunk は 2018 年の人工知能と機械学習の 3 つのトレンドを予測しています
>>: 2017 ナレッジ グラフ ストレージ システム ランキング: あまり知られていないナレッジ グラフ ストレージ システム
家族よ、ついに来たぞ!先ほど、ChatGPT「コードインタープリター」ベータ版がすべてのPlusユー...
この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より許可を得て転載...
[[315663]]人工知能(AI)とは、人間と同等かそれ以上の知覚、認知、行動などの知能を機械に実...
[[442868]]著者: ユン・チャオこの記事は、2021年の業界レビュー、2021年のビッグモ...
2021年8月29日、カブールの空に大きな爆発音が響き、米軍の無人機が7人の子供を含む10人の罪のな...
[[384945]]近年、人工知能 (AI) は強化学習アルゴリズムのサポートにより目覚ましい成果を...
[[229403]]現在の人工知能の発展は「実用的な」段階に入っています。 2018年の初め、国家...
新興技術のデジタル時代において、大規模言語モデル (LLM) は、人間社会と文化の多くの側面に革命を...
[51CTO.comより引用] Alimamaは、誰もが簡単にマーケティングを行えるようにすることを...
[[210306]]以下は、AI ビジネスを始める方法の紹介です。これは比較的人気のある科学講演で...