機械学習をプログラマーにとってより身近なものにする方法

機械学習をプログラマーにとってより身近なものにする方法

導入

人々は長い間、人工的に生成されたコンテンツを理解するためにアルゴリズムを手動でコーディングしようとしてきましたが、成功は限られていました。たとえば、コンピュータが画像の意味内容を「把握」するのは困難です。 AI 科学者たちは、車、猫、コートなどの低レベルのピクセルを分析することでこの問題を解決しようとしましたが、結果は理想的ではありませんでした。カラーヒストグラムと特徴検出器はある程度は機能しますが、ほとんどの実用的なアプリケーションではその精度は依然として非常に低いです。

過去 10 年間で、ビッグ データとディープラーニングの組み合わせにより、コンピューター ビジョン、自然言語処理、その他の機械学習 (ML) アプリケーションへのアプローチ方法が根本的に変化しました。たとえば、スパム検出からリアルなテキスト、ビデオ合成に至るまでのさまざまなタスクで驚くべき進歩が見られ、これらの特定のアプリケーションでは精度の指標が超人的なレベルに達しています。しかし、これらの改善の顕著な副作用は、ディープ ニューラル ネットワークの中間結果を取得して作成されるモデル コンポーネントである埋め込みの使用が増加したことです。 OpenAI の Web ページには、優れた概要が示されています。

「埋め込みは、機械学習モデルや関連アルゴリズムで簡単に使用できる特別なデータ表現形式です。埋め込みは、テキストの意味を情報密度の高い形で表現したものです。各埋め込みは浮動小数点数のベクトルとして表現できます。したがって、ベクトル空間における 2 つの埋め込み間の距離は、元の形式の 2 つの入力間の意味的類似性に関係します。たとえば、2 つのテキストが類似している場合、それらのベクトル表現も類似しているはずです。」

次の表は、3 つのクエリ画像と、それに対応する埋め込み空間内の上位 5 つの画像を示しています。ここでは、Unsplash Lite Web サイトで提供されている最初の 1000 枚の画像をデータセットとして使用しました。

埋め込みタスクのための新しいモデルのトレーニング

理論的には、新しい ML モデルをトレーニングして埋め込みを生成するのは簡単そうです。最新のアーキテクチャでサポートされている構築済みのモデルを取得し、それをいくつかのデータでトレーニングするだけです。

表面的には、最新のモデル アーキテクチャを使用して最先端の結果を達成するのは簡単なように思えます。しかし、これは真実からかけ離れています。埋め込みモデルのトレーニングに関連する一般的な落とし穴をいくつか確認してみましょう (これらは機械学習モデル全般にも当てはまります)。

1. データが不十分: 十分なデータがない状態で新しい埋め込みモデルを最初からトレーニングすると、過剰適合と呼ばれる現象に簡単につながる可能性があります。実際には、新しいモデルをゼロからトレーニングするのに十分なデータを持っているのは、世界最大規模の組織だけであり、他の企業や個人は繰り返し微調整を行う必要があります。この微調整は実際にはプロセスに対応しており、このプロセスでは通常、大量のデータでトレーニングされたモデルに基づいて、より小さなデータセットを使用して、これに基づいて継続的な抽出操作を実行します。

2. ハイパーパラメータの不適切な選択: ハイパーパラメータは、モデルの学習速度や 1 回のバッチでのトレーニングに使用されるデータの量など、トレーニング プロセスを制御するために使用される定数です。モデルを微調整する場合、特定の値に小さな変更を加えるだけで結果が大きく異なる可能性があるため、適切なハイパーパラメータのセットを選択することが非常に重要です。最近の研究では、トレーニング手順を改善し、同じモデルを最初からトレーニングすることで、ImageNet-1k の精度が 5% 以上向上したことが示されています (これは大きな成果です)。

3. 自己教師ありモデルの過大評価: 自己教師という用語は、ラベルではなくデータ自体を活用して入力データの「真実」を学習するトレーニング プロセスを指します。一般に、自己教師あり学習法は事前トレーニング(大量のラベルなしデータを使用して自己教師あり学習でモデルをトレーニングし、その後、より小さなラベル付きデータセットを使用してモデルを微調整する)に適していますが、自己教師あり埋め込みを直接使用すると、パフォーマンスが最適にならない可能性があります。

4. 上記の 3 つの問題に対処するための一般的なアプローチは、ラベル付きデータでモデルを微調整する前に、大量のデータを使用して自己教師ありモデルをトレーニングすることです。これは NLP では非常にうまく機能することが示されていますが、CV (コンピューター ビジョン) ではそれほどうまく機能しません。

ここでは、Meta の data2vec トレーニング手法の例を示します。これは、さまざまな非構造化データ タイプにわたってディープ ニューラル ネットワークをトレーニングするための自己教師型アプローチです。 (出典: Meta AI ブログ)

埋め込みモデルの使用における落とし穴

埋め込みモデルをトレーニングするときによく起こる間違いがいくつかあります。埋め込みを使用したい開発者の多くは、ImageNet (画像分類用) や SQuAD (質問応答用) などの学術データセットで事前トレーニング済みのモデルをすぐに使用するのが一般的です。ただし、現在利用可能な事前トレーニング済みモデルが多数あるにもかかわらず、最大の埋め込みパフォーマンスを実現するには、次の落とし穴を避ける必要があります。

1. トレーニング データと推論データの不一致: 他の組織によってトレーニングされた既製のモデルを使用することは、GPU/TPU に何千時間も費やして繰り返しトレーニングすることなく ML アプリケーションを開発する一般的な方法になっています。特定の埋め込みモデルの制限とそれがアプリケーションのパフォーマンスにどのように影響するかを理解することは非常に重要です。モデルのトレーニング データと方法論を理解していないと、結果を誤って解釈してしまう可能性が高くなります。たとえば、音楽の埋め込みでトレーニングされたモデルは、実際の音声アプリケーションに適用するとパフォーマンスが悪くなることが多く、その逆も同様です。

2. 不適切なレイヤー選択: 埋め込みモデルとして完全教師ありニューラル ネットワークを使用する場合、特徴は通常、アクティベーションの最後から 2 番目のレイヤー (一般に最後から 2 番目のレイヤーと呼ばれる) から取得されます。ただし、これによりパフォーマンスが最適ではなくなる可能性があります。もちろん、具体的な状況は実際のアプリケーションによって異なります。たとえば、画像分類のトレーニングを受けたモデルを使用してロゴやブランドの画像を埋め込む場合、早期アクティベーションを使用するとパフォーマンスが向上する可能性があります。これは、この方式では、それほど複雑ではない画像を分類するために重要な低レベルの特徴 (エッジやコーナー) がより適切に保持されるためです。

3. 不均等な推論条件: 埋め込みモデルから最大のパフォーマンスを引き出すには、トレーニング条件と推論条件が同一である必要があります。現実には、そうではない場合がよくあります。たとえば、TorchVision の標準 resnet50 モデルを使用する場合、バイキュービック補間と最近傍補間を使用してダウンサンプリングすると、まったく異なる 2 つの結果が生成されます (以下を参照)。


バイキュービック補間

最新の補間

予測

クーカル

コマドリ、アメリカコマドリ、Turdus migratorius

確率

27.28%

47.65%

埋め込みベクトル

[0.1392、0.3572、0.1988、…、0.2888、0.6611、0.2909]

[0.3463、0.2558、0.5562、…、0.6487、0.8155、0.3422]

組み込みモデルを展開する

モデルのトレーニングに成功し、モデルの検証に関連するすべてのハードルを克服したら、次の重要なステップはプログラムを拡張して展開することです。しかし、モデルのデプロイメントを埋め込むことは、言うほど簡単ではありません。 MLOps は、この目的を達成するために設計された DevOps に関連する分野です。

1. 適切なハードウェアを選択する: 他のほとんどの ML モデルと同様に、埋め込みモデルは、標準的な日常的な CPU からプログラマブル ロジック (FPGA) まで、さまざまな種類のハードウェア上で実行できます。ウェブサイトで公開されているほぼすべての研究論文は、コストと効率のトレードオフの分析に焦点を当てており、ほとんどの組織がこの問題に対処する際に直面する困難を強調しています。

2. モデルの展開に使用できる既製の MLOP と分散コンピューティング プラットフォーム (多くのオープン ソース プラットフォームを含む) がすでに多数存在します。ただし、これらの機能がどのように機能し、アプリケーションにどのように適合するかというロジックを理解すること自体が困難な場合があります。

3. 埋め込みベクトルのストレージ ソリューション: アプリケーションの規模が大きくなるにつれて、埋め込みベクトル用のスケーラブルで耐久性の高いストレージ ソリューションを見つける必要があります。ここでベクター データベースが役立ちます。

全部自分でやるんです!

このような場合は、覚えておくべき重要なことがいくつかあります。

まず、ML はソフトウェア エンジニアリングとは大きく異なります。従来の機械学習は統計学にルーツがあり、ソフトウェア エンジニアリングとはまったく異なる数学の分野です。正規化や特徴選択などの重要な機械学習の概念は、数学にしっかりと根ざしています。トレーニングと推論用の最新のライブラリを使用すると、埋め込みモデルのトレーニングと生成が非常に簡単になりますが、さまざまなハイパーパラメータとトレーニング方法が埋め込みモデルのパフォーマンスにどのように影響するかを理解することは依然として重要です。

第二に、PyTorch や Tensorflow などのフレームワークの使い方を学ぶのは簡単ではないかもしれません。実際、これらのライブラリは、最新の ML モデルのトレーニング、検証、および展開を大幅に高速化します。また、経験豊富な ML 開発者や HDL に精通したプログラマーにとっては、新しいモデルを構築したり、既存のモデルを実装したりするのも直感的です。しかし、それにもかかわらず、この分野に関係する基本的な概念自体は、ほとんどのソフトウェア開発者にとって理解するのが難しい場合があります。もちろん、2 つのフレームワークで使用される実行エンジンには多くの違いがあるため、どちらのフレームワークを選択するかという問題もあります (PyTorch を使用することをお勧めします)。

最後に、コードベースに適した MLOps プラットフォームを見つけるには時間がかかります。全体として、選択できるオプションは数百種類あります。もちろん、各選択肢の長所と短所を評価するだけでも、それ自体が何年もかかる研究プロジェクトになる可能性があります。

そうは言っても、ML と MLOps を学ぶことはお勧めしません。これは比較的長くて面倒なプロセスであり、最も重要なことに費やす時間を奪ってしまう可能性があります。

Towhee でデータ サイエンス アプリケーション開発を加速

Towhee は、ソフトウェア エンジニアがわずか数行のコードで埋め込みモデルを活用できるアプリケーションを開発および展開できるように設計されたオープン ソース プロジェクトです。 Project Towhee は、モデルや機械学習を深く埋め込むことなく、ML アプリケーションを構築する自由と柔軟性をソフトウェア開発者に提供します。

簡単な例

パイプラインは、複数のサブタスク (Towhee では演算子とも呼ばれます) で構成される単一の埋め込み生成タスクです。 Towhee は、パイプライン内のタスク全体を抽象化することで、ユーザーが上記のような埋め込み生成の落とし穴の多くを回避できるように支援します。

 >>> towhee インポート パイプラインから
>>> 埋め込みパイプライン = パイプライン('画像埋め込み-resnet50')
>>> 埋め込み = 埋め込みパイプライン('https://docs.towhee.io/img/logo.png')

上記の例では、画像のデコード、画像の変換、特徴抽出、埋め込みの正規化が 4 つのサブステップとして 1 つのパイプラインにまとめられており、開発者はモデルや推論の詳細について心配する必要がありません。さらに、Towhee は、オーディオ/音楽の埋め込み、画像の埋め込み、顔の埋め込みなど、さまざまなタスク用に事前に構築された埋め込みパイプラインを提供します。

メソッドチェーン API 呼び出し

Towhee は、DataCollection と呼ばれる Python 非構造化データ処理フレームワークも提供します。つまり、DataCollection は、開発者が実際のデータ上で埋め込みやその他の ML モデルのプロトタイプを迅速に作成できるようにするメソッド チェーン API です。次の例では、resnet50 埋め込みモデルを使用して、DataCollection による埋め込みを計算します。

この例では、簡単なアプリケーションを構築します。このプログラムでは、1 桁の数字 3 を使用して素数をフィルタリングできます。

 >>> towhee. functional から DataCollection をインポートします
>>> is_prime(x)を定義します:
... x <= 1 の場合:
... False を返す
... iが範囲(2, int(x/2)+1)内にある場合:
... x % i でない場合:
... False を返す
... True を返す
...
>>> dc = (
... データコレクション.範囲(100)
... .filter(is_prime) #フェーズ 1: 素数を見つける
... .filter(lambda x: x%10 == 3) #フェーズ 2: 3 で終わる素数を見つける
... .map(str) #フェーズ2: 文字列に変換する
... )
...
>>> dc.to_list()

DataCollection を使用すると、たった 1 行のコードでアプリケーション全体を開発できます。たとえば、次のコンテンツでは、逆画像検索アプリケーションの開発方法を説明します。

トウヒのトレーニング

前述のように、完全教師ありまたは自己教師ありのトレーニング モデルは、一般的に一般的なタスクに適しています。ただし、猫と犬の区別など、特定のことに特化した埋め込みモデルを作成したい場合もあります。この目的のために、Towhee は専用のトレーニング/微調整フレームワークを提供します。

 >>> towhee.trainer.training_config から TrainingConfig をインポートします
>>> トレーニング_config = トレーニングConfig(
... バッチサイズ=2、
... エポック番号=2、
... output_dir='クイックスタート出力'
... )

トレーニングするデータセットも指定する必要があります。

 >>> train_data = データセット('train'、サイズ=20、変換=my_data_transformer)
>>> eval_data = データセット('eval'、サイズ=10、変換=my_data_transformer)

すべてが整ったら、既存の演算子から新しい埋め込みモデルをトレーニングするのは簡単です。

 >>> op.train(
...トレーニング構成、
... トレーニングデータセット = トレーニングデータ、
... eval_dataset=eval_data
... )

上記のコードが完成したら、残りのコードを変更せずに、アプリケーションで同じ演算子を使用できます。

上記は、埋め込みモデルがエンコードしようとしている画像のコア領域の注目ヒートマップです。 Towhee の将来のバージョンでは、注目ヒートマップやその他の視覚化ツールを微調整フレームワークに直接統合する予定です。

サンプルアプリケーション: 逆画像検索

Towhee の使い方を説明するために、小さな逆画像検索アプリケーションを簡単に構築してみましょう。逆画像検索はよく知られています。したがって、詳細には触れず、要点だけ述べます。

 >>> トウヒをインポートする
>>> towhee. functional から DataCollection をインポートします

10 個のクエリ画像を含む小さなデータセットを使用します。プログラムでは、DataCollection を使用してデータセットを読み込み、画像をクエリします。

 >>> データセット = DataCollection.from_glob('./image_dataset/dataset/*.JPEG').unstream()
>>> クエリ = DataCollection.from_glob('./image_dataset/query/*.JPEG').unstream()

次のステップは、データセット全体にわたって埋め込みを計算することです。

 >>> dc_data = (
... dataset.image_decode.cv2()
... .image_embedding.timm(モデル名='resnet50')
... )
...

このステップでは、データセット内の画像ごとに 1 つのベクトル、つまりローカル埋め込みベクトルのセットを作成します。この段階で、最も近い隣接データをクエリできます。

 >>> 結果 = (
... query.image_decode.cv2() #クエリセット内のすべての画像をデコードします
... .image_embedding.timm(model_name='resnet50') #埋め込みを計算するために'resnet50'埋め込みモデルを使用する
... .towhee.search_vectors(data=dc_data, cal='L2', topk=5) #データセットの検索
... .map(lambda x: x.ids) #類似結果のIDを取得します(ファイルパス)
... .select_from(dataset) #結果画像を取得する
... )
...

さらに、Ray フレームワークを使用してアプリケーションをデプロイする方法も提供します。これを行うには、コマンド query.set_engine('ray') を呼び出すだけで、あとはすべて簡単になります。

要約する

最後に、私たちは Project Towhee を本格的なエンドツーエンドのモデル サービングや MLOps プラットフォームとは考えていませんし、それを実現するつもりもありません。代わりに、私たちの目標は、埋め込みやその他の ML タスクを必要とするアプリケーションの開発を加速することです。ただし、Towhee オープンソース プロジェクトでは、ローカル マシン (パイプライン + トレーナー) 上での埋め込みモデルとパイプラインの迅速なプロトタイピングを可能にし、特に、わずか数行のコードで ML 中心のアプリケーション (データ収集) を開発し、クラスターへの簡単かつ迅速な展開 (Ray フレームワーク経由) を可能にすることを目指しています。

翻訳者紹介

Zhu Xianzhong 氏は、51CTO のコミュニティ エディターであり、51CTO の専門ブロガー兼講師であり、濰坊の大学のコンピューター教師であり、フリーランス プログラミング コミュニティのベテランです。初期にはさまざまな Microsoft テクノロジに注力し (ASP.NET AJX および Cocos 2d-X に関連する 3 冊の技術書を編纂)、オープンソースの世界に 10 年近く携わってきました (人気のフルスタック Web 開発テクノロジに精通)。OneNet/AliOS+Arduino/ESP32/Raspberry Pi をベースとした IoT 開発テクノロジや、Scala+Hadoop+Spark+Flink などのビッグデータ開発テクノロジを理解しています。


原題: アプリケーション開発者にとって機械学習をより身近なものにする、著者: Frank Liu

リンク: https://dzone.com/articles/making-machine-learning-more-accessible-for-applic-1

<<:  機械学習を使うべきタイミング

>>:  MLOps 実装を成功させるためのベストプラクティス

ブログ    

推薦する

AIと5Gテクノロジーがスマートグリッドのセキュリティ課題解決に貢献

[[334279]]この記事の主な内容:マイクログリッド、発電機、太陽光パネルなどのスマートグリッド...

...

公共の安全を守るために都市に AI を導入するにはどうすればよいでしょうか?

[[347520]]今日私たちが直面している脅威の状況は絶えず変化しています。世界的に、法執行機関...

心を込めてツイートしましょう! Synchron 脳コンピューターインターフェースは ALS 患者が自分の考えで携帯電話を閲覧するのを助けます

こんにちは世界!プログラマーが初めて新しいプログラミング言語に触れるとき、その言語が世に登場したこと...

教師なし機械学習技術は金融セキュリティの懸念を解決できる

「テクノロジーがなければ、金融は存在しない。」モバイルインターネット時代の到来により、テクノロジーや...

大規模言語モデルに基づくインテリジェントエージェントのモデリングとシミュレーション:レビューと展望

この記事は、Heart of Autonomous Driving の公開アカウントから許可を得て転...

OpenAIの年間収益は13億ドルに達し、月間1億ドル以上となり、夏に比べて30%増加した。

10月13日、The Informationは現地時間12日、複数の関係者の話として、OpenAI...

レポートの解釈: 企業の 91% が 2023 年に AI がビジネスの成長を促進すると予想

[[245538]]人工知能 (AI) により、早期導入メーカーはすでに分析、ビジネス インテリジェ...

AI導入によるエッジインテリジェンスの強化

エッジに AI を導入すると、強力なリアルタイム分析と処理を実現できる可能性があります。使用例には、...

...

米政府、AIの競争力と倫理について助言する委員会を設立

[[422878]]海外メディアCNETによると、米商務省は水曜日、人工知能の研究開発についてジョー...

...

人工知能が広く利用され、アルゴリズムの公平性の重要性が強調されている

最近、大学入試の受験生が試験会場で小校舎を使って問題を検索する問題が大きな論争を引き起こし、大学入試...

百度地図のデータ収集リンクの80%はAIベースになっており、旅行業界はインテリジェントにアップグレードされている

人工知能時代の地図データ制作はどのような変化を遂げるのでしょうか?7月3日、「Baidu Creat...