開発者はよく、機械学習を始めたいなら、まずアルゴリズムを学ぶべきだと言います。しかし、それは私の経験ではありませんでした。 まず、アプリケーションがどのように動作するかを理解する必要があると言いました。これを理解すれば、アルゴリズムの内部の仕組みを詳しく調べることがはるかに簡単になります。 では、機械学習を理解するために直感力を養うにはどうすればよいでしょうか? 優れた方法の 1 つは、機械学習モデルを作成することです。 これらすべてのアルゴリズムをゼロから作成する方法がまだわからない場合は、すでにすべてのアルゴリズムを実装しているライブラリを使用できます。そのライブラリは TensorFlow です。 この記事では、テキストをカテゴリに分類する機械学習モデルを作成します。以下のトピックを取り上げます。
きっとたくさんの新しいことを学ぶことになるでしょうから、始めましょう! テンソルフロー TensorFlow は、Google が開発した機械学習用のオープンソース ライブラリです。ライブラリの名前は、その使用方法を理解するのに役立ちます。テンソルは、グラフのノードを通過する多次元配列です。 tf.グラフ TensorFlow のすべての計算は、次の 2 種類の要素を持つデータ フロー グラフとして表されます。
これがどのように機能するかを確認するには、次のデータ フロー グラフを作成する必要があります。 (x+yを計算するグラフ) x = [1,3,6]、y = [1,1,1]と定義する必要があります。グラフはデータ単位を表すために tf.Tensor を使用するため、定数 Tensor を作成する必要があります。
次に、操作単位を定義します。
図の要素がすべて揃いました。次にグラフを構築する必要があります。
TensorFlow ワークフローは次のように動作します。まずグラフを作成し、次に計算 (操作を使用してグラフ ノードを実際に「実行」) します。グラフを実行するには、tf.Session を作成する必要があります。 tf.セッション tf.Session オブジェクトは、Operation オブジェクトの実行環境をカプセル化します。テンソル オブジェクトが計算されます (ドキュメントより)。これを行うには、セッションでどのグラフを使用するかを定義する必要があります。
操作を実行するには、tf.Session.run() メソッドを使用する必要があります。このメソッドは、各 Operation オブジェクトを実行するために必要なグラフを実行し、パラメータ fetches で渡された各 Tensor の値を計算することにより、TensorFlow 計算の「ステップ」を実行します。
予測モデル TensorFlow の仕組みがわかったので、予測モデルを作成する方法を知る必要があります。要するに 機械学習アルゴリズム + データ = 予測モデル モデルを構築するプロセスは次のとおりです。 (予測モデルを構築するプロセス) ご覧のとおり、モデルはデータで「トレーニング」された機械学習アルゴリズムで構成されています。モデルが完成すると、次のようなものが得られます。 (予測ワークフロー) 作成したモデルの目的はテキストを分類することです。以下を定義しました。 入力: テキスト、結果: カテゴリ ラベル付きテキストを使用してトレーニングされたデータセットがあります (各テキストには、それがどのカテゴリに属するかを示すラベルがあります)。機械学習では、このタイプのタスクは教師あり学習と呼ばれます。 「私たちは正しい答えを知っています。アルゴリズムはトレーニングデータを反復処理し、教師によって修正されます。 — ジェイソン・ブラウンリー データをクラスに分類するので、これも分類タスクです。 このモデルを作成するには、ニューラル ネットワークを使用します。 ニューラルネットワーク ニューラル ネットワークは計算モデル (機械言語と数学的概念を使用してシステムを記述する方法) です。これらのシステムは、明示的にプログラムされるのではなく、自律的に学習し、トレーニングされます。 ニューラル ネットワークも私たちの中枢神経系からヒントを得ています。そこには私たちの神経に似た接続ノードがあります。 パーセプトロンは最初のニューラル ネットワーク アルゴリズムでした。この記事は、パーセプトロンの内部の仕組みをわかりやすく説明しています (「人工ニューロンの内部」のアニメーションは素晴らしいです)。 ニューラル ネットワークの仕組みを理解するために、TensorFlow を使用してニューラル ネットワーク アーキテクチャを構築します。この例では、このアーキテクチャは Aymeric Damien によって使用されました。 ニューラルネットワークアーキテクチャ ニューラル ネットワークには 2 つの隠し層があります (アーキテクチャ設計の一部として、ネットワークに含める隠し層の数を選択できます)。各隠れ層の役割は、入力を出力層が使用できるものに変換することです。 隠しレイヤー1 (入力層と最初の隠れ層) 最初の隠し層に含まれるノードの数も定義する必要があります。これらのノードは特徴またはニューロンとも呼ばれ、上記の例では各円を使用してノードを表しています。 入力層の各ノードはデータセット内の単語に対応しています(これがどのように機能するかは後で説明します) ここで説明したように、各ノード (ニューロン) に重みが掛けられます。各ノードには重み値があり、トレーニングフェーズではニューラルネットワークがこれらの値を調整して正しい出力を生成します(これについては後で詳しく説明します) 入力のない重みを乗算することに加えて、ネットワークはエラーも追加します (ニューラル ネットワークにおけるエラーの役割)。 アーキテクチャでは、入力に重みを掛けてその値をバイアスに追加し、このデータもアクティベーション関数に渡されます。この活性化関数は、各ノードの最終出力を定義します。たとえば、各ノードがライトであり、アクティベーション関数によってライトが点灯するかどうかが決定されるとします。 活性化関数には多くの種類があります。 Rectified Linear Unit (ReLu) を使用します。この関数は次のように定義されます: f(x) = max(0,x) [xと0(ゼロ)の間の最大の数値を出力する] たとえば、x = -1 の場合、f(x) = 0 (ゼロ)、x = 0.7 の場合、f(x) = 0.7 です。 隠しレイヤー2 2 番目の隠し層は最初の隠し層とまったく同じことを行いますが、2 番目の層への入力は最初の層の出力になります。 (*** および 2 番目の隠し層) 出力層 さて、いよいよ最後の層である出力層に到達します。このレイヤーの結果を取得するには、One-Hot エンコーディングを使用します。このエンコーディングでは、1 ビットのみが値 1 を持ち、他のすべてのビットは値 0 を持ちます。たとえば、3 つのカテゴリ (スポーツ、宇宙、コンピュータ グラフィックス) をエンコードする場合は、次のようになります。 したがって、出力ノードの数は、入力データセットのクラスの数になります。 出力層の値にも重みが掛けられ、誤差も加算されますが、今度は活性化関数が異なります。 各テキストにカテゴリのラベルを付けますが、これらのカテゴリは互いに独立しています (テキストは同時に 2 つのカテゴリに属することはできません)。これを念頭に置いて、ReLu 活性化関数の代わりに Softmax 関数を使用します。この関数は、各完全な出力を 0 から 1 の間の値に変換し、すべての単位の合計が 1 になるようにします。この方法では、出力によって各カテゴリ内の各テキストの確率がわかります。
これで、ニューラル ネットワークのデータ フロー グラフができました。これまで見てきた内容をコードに変換すると、結果は次のようになります。
(出力層の活性化関数については後ほど説明します) ニューラルネットワークはどのように学習するのでしょうか? 先ほど見たように、ニューラル ネットワークがトレーニングされると、重みの値が更新されます。ここで、TensorFlow のコンテキストでこれがどのように起こるかを見てみましょう。 tf.変数 重みと誤差は変数 (tf.Variable) に保存されます。これらの変数は、run() の呼び出し全体にわたってグラフ内に保持されます。機械学習では通常、正規分布を通じて重みとバイアスの値を決定します。
ニューラル ネットワークを初めて実行するとき (つまり、重みが正規分布によって定義されるとき) は次のようになります。
ネットワークが学習しているかどうかを知るには、出力値 (Z) と期待値 (expected) を比較する必要があります。この差(損失)をどのように計算するのでしょうか?この問題を解決する方法はたくさんあります。分類タスクを実行しているため、損失を測定する最良の方法はクロスエントロピー誤差です。 James D. McCaffrey 氏は、なぜこれがこの種のタスクに最適なアプローチなのかについて優れた説明を書いています。 TensorFlow では、tf.nn.softmax_cross_entropy_with_logits() メソッドを使用してクロスエントロピー誤差 (これはソフトマックス活性化関数です) を計算し、平均誤差 (tf.reduced_mean()) を計算します。
出力エラー(取得した実際の値と正しい値の差)を最小限に抑えるために、重みとエラーの最適な値を渡す必要があります。これを実行するには、勾配降下法を使用します。より具体的には、確率的勾配降下法を使用する必要があります。 (勾配降下法。出典: https://sebastianraschka.com/faq/docs/closed-form-vs-gd.html) 勾配降下法を計算するには、Adaptive Moment Estimation (Adam) を使用します。 TensorFlow でこのアルゴリズムを使用するには、最適な重み値を見つけるための値の増分ステップ サイズを決定する learning_rate 値を渡す必要があります。 メソッド tf.train.AdamOptimizer(learning_rate).minimize(loss) は、次の 2 つのことを実行する構文糖です。
このメソッドはすべての tf.Variables を新しい値で更新するため、変数のリストを渡す必要はありません。これで、ネットワークをトレーニングするためのコードができました。
データ操作 使用するデータセットには英語のテキストが大量に含まれているため、このデータを操作してニューラル ネットワークに渡す必要があります。これを実現するには、次の 2 つのことが必要です。
このプロセスを理解するためにコードを見てみましょう。
上記の例では、テキストは「Hi from Brazil」で、マトリックスは[1.1.1.]です。テキストが「Hi」だけだったらどうなるでしょうか?
これはラベル (テキストの分類) と同じになりますが、ワンホット エンコーディングを使用します。
グラフを実行して結果を取得する ここで、最も重要な部分、つまりモデルから結果を取得する作業が始まります。まず、入力データセットを詳しく見てみましょう。 データセット 約 20 のトピックを含む 18,000 件の投稿のデータセットの場合、20 のニュースグループが使用されます。これらのデータセットをロードするには、scikit-learn ライブラリを使用します。使用しているカテゴリは、comp.graphics、sci.space、rec.sport.baseball の 3 つだけです。 scikit-learn には、トレーニング用とテスト用の 2 つのサブセットがあります。モデルを作成するときに選択に影響する可能性があるため、テスト データを確認しないことをお勧めします。一般化に適したモデルを作成する必要があるため、この特定のテスト データを予測するモデルを作成する必要はありません。 データセットをロードする方法のコードは次のとおりです。
モデルのトレーニング ニューラル ネットワークの用語では、エポック = 前方パス (出力値の取得) とすべてのトレーニング例を通る後方パス (重みの更新) です。 tf.Session.run() メソッドを覚えていますか? 詳しく見てみましょう:
この記事の冒頭のデータフロー図では、 and 演算子を使用しましたが、実行する項目のリストを渡すこともできます。このニューラル ネットワークの実行中には、損失の計算と最適化のステップという 2 つのことが行われます。 feed_dict パラメータは、各実行にフィードするデータです。このデータを渡すには、tf.placeholders(feed_dictに提供)を定義する必要があります。 TensorFlow のドキュメントに記載されているとおりです。 「プレースホルダーは入力先としてのみ存在します。初期化する必要はなく、データも含まれません。」— 出典 したがって、プレースホルダーは次のように定義されます。
トレーニング データをバッチで分離することも必要です。 「入力目的でプレースホルダーを使用する場合、 tf.placeholder(…, shape=[None, …]) を使用してプレースホルダーを作成することで、可変バッチディメンションを指定できます。shape の None 要素は、サイズ変更可能なディメンションに対応します。」 — 出典 モデルをテストするときは、辞書に大きなバッチを入力するため、可変バッチ ディメンションを定義する必要があります。 get_batches() 関数はバッチ サイズ内のテキストの数を返します。これでモデルを実行できます。
これで、トレーニング済みのモデルができました。テストするには、ダイアグラム要素も作成する必要があります。モデルの精度を測定するため、予測値のインデックスと正しい値のインデックス(ワンホットエンコーディングを使用しているため)を取得し、それらが等しいかどうかを確認し、すべてのテストデータセットの平均を計算する必要があります。
これで完了です。ニューラル ネットワークを使用してテキストをさまざまなカテゴリに分類するモデルを作成しました。おめでとう! 最終的なコードを含むノートブックはここから見ることができます。 ヒント: 定義した値を変更して、その変更がトレーニング時間とモデルの精度にどのように影響するかを確認します。 他にご質問やご提案がございましたら、コメントを残してください。読んでくれてありがとう! |
<<: 決定木からランダムフォレストへ: ツリーベースアルゴリズムの原理と実装
>>: マッキンゼーのレポート:これらの業界が人工知能に転換しなければ、ますます取り残されることになる
製造業は過去 1 世紀にわたって大きく変化しました。 新しい高度なテクノロジーが業界を前進させるにつ...
6月21日、WOT2019グローバルテクノロジーサミットとグローバル人工知能テクノロジーサミットが北...
Appleは、ChatGPTやGoogleのBardのような大規模言語モデル(LLM)と競合する独自...
[[279290]] [51CTO.com クイック翻訳] 大学はどのようにして、個人の教育キャリ...
急速に進化するデジタル環境において、人工知能 (AI) とサイバーセキュリティの組み合わせは、進化す...
専門家の混合 (MoE) は、LLM の効率性と精度を向上させるためによく使用される手法です。このア...
10月9日、清華大学の公式Weiboアカウントは、オンチップ学習をサポートする世界初のメモリスタス...
映画鑑賞の夜に快適なアームチェアに腰を下ろすと、プロジェクターが起動し、スマートライトが自動的に暗く...
「この記事はAI新メディアQuantum Bit(公開アカウントID:QbitAI)より転載を許可さ...