あちこち行って… RAPIDSの物語
Story of RAPIDS, traveling here and there...
By Kris Manohar & Kevin Baboolal
Editor’s Note: We are thrilled to announce that this post has been selected as the winner of the VoAGI & NVIDIA Blog Writing Contest.
はじめに
機械学習は、膨大な量のデータを利用することで、様々な分野を革命化してきました。しかし、コストや不足性のために、十分なデータを取得することが困難な場合があります。このような場合、従来のアプローチは正確な予測を提供するのに苦労することがよくあります。このブログ投稿では、小さなデータセットによって引き起こされる制限を探り、TTLABが提案する最近傍法と専用のカーネルの力を利用した革新的なソリューションを紹介します。アルゴリズムの詳細、その利点、およびGPU最適化が実行速度を加速する方法について掘り下げます。
少ないデータの課題
機械学習において、正確なモデルをトレーニングするためには、膨大な量のデータが必要です。しかし、数百行しか含まない小さなデータセットに直面すると、その不足点が明らかになります。1つの一般的な問題は、ナイーブベイズ分類器のような分類アルゴリズムで遭遇するゼロ頻度の問題です。これは、アルゴリズムがテスト中に未知のカテゴリ値に遭遇した場合に発生し、その場合のゼロ確率推定につながります。同様に、テストセットにトレーニングセットに存在しなかった値が含まれている場合、回帰タスクにも課題が発生します。これらの欠落している特徴が除外された場合、アルゴリズムの選択が改善される場合もあります。これらの問題は、非常に不均衡なクラスを持つより大きなデータセットでも発生します。
データ不足の克服
トレイン-テスト分割はこれらの問題を緩和することがよくありますが、小さなデータセットを扱う場合には隠れた問題が残ります。アルゴリズムを少ないサンプルに基づいて汎化させることは、サブオプティマルな予測につながる場合があります。アルゴリズムが動作しても、その予測は頑健性と正確性を欠く可能性があります。単純にデータを増やすという解決策が常にコストや可用性の制約により実現できるわけではありません。このような状況では、TTLABが提案する革新的なアプローチが頑健で正確であることが証明されています。
TTLABアルゴリズム
TTLABのアルゴリズムは、バイアスのある制限されたデータセットがもたらす課題に取り組みます。彼らのアプローチは、トレーニングデータセット内のすべての行の重み付き平均を取り、テストサンプルのターゲット変数の値を予測することです。キーは、特徴空間内の2つの点の距離を計算するパラメータ化された非線形関数に基づいて、各トレーニング行の重みをすべてのテスト行に対して調整することにあります。使用される重み付け関数は単一のパラメータ(トレーニングサンプルの影響力がテストサンプルからの距離に従って減衰する速度)を持っていますが、このパラメータを最適化するための計算労力は大きい可能性があります。トレーニングデータセット全体を考慮することにより、アルゴリズムは頑健な予測を提供します。このアプローチは、ランダムフォレストやナイーブベイズなどの人気モデルの性能を向上させることにも驚異的な成功を収めています。アルゴリズムが人気を博するにつれて、より効率的にするための取り組みが進んでいます。現在の実装は、グリッドサーチを必要とするハイパーパラメータkappaのチューニングを含みます。このプロセスを迅速化するためには、成功した二次近似探索が探求されています。さらに、継続的なピアレビューは、より広範な採用のためにアルゴリズムを検証および改良することを目指しています。
分類のTTLABアルゴリズムを実装するために、forループとnumpyを使用した方法は非効率であり、非常に長い実行時間になります。リンクされた出版物に示されているCPU実装は分類問題に焦点を当てており、このアプローチの汎用性と効力を示しています。https://arxiv.org/pdf/2205.14779.pdf。出版物には、ベクトル化から算出されるアルゴリズムの利点が示され、CuPyによるGPUアクセラレーションから得られるさらなる速度向上のヒントも示されています。実際に、ハイパーパラメータチューニングやランダムKフォールドによる結果の検証には、テストされる多数のデータセットに対して数週間かかることがあります。GPUの力を利用することで、計算を効果的に分散させることができ、パフォーマンスが向上しました。
GPUによる実行の加速
ベクトル化や.applyのような最適化を行っても、実行時間は現実的なアプリケーションには不適切です。しかし、GPU最適化によって、ランタイムが劇的に短縮され、時間が数時間から数分に短縮されます。この驚異的な加速により、迅速な結果が不可欠なシナリオでアルゴリズムを使用する可能性が開かれます。
CPU実装から得られた教訓に基づいて、私たちは実装をさらに最適化するように試みました。このために、CuDFデータフレームにレイヤを移動しました。CuDFを使用すると、計算をGPUにベクトル化することが簡単になります。私たちにとっては、import pandasをimport CuDFに変更するだけでした(pandasで適切にベクトル化する必要があります)。
train_df["sum_diffs"] = 0
train_df["sum_diffs"] = train_df[diff_cols].sum(axis=1).values
train_df["d"] = train_df["sum_diffs"] ** 0.5
train_df["frac"] = 1 / (1 + train_df["d"]) ** kappa
train_df["part"] = train_df[target_col] * train_df["frac"]
test_df.loc[index, "pred"] = train_df["part"].sum() / train_df["frac"].sum()
ここから先は、Numbaカーネルに頼る必要があります。この時点で、事が複雑になります。アルゴリズムの予測が堅牢である理由を思い出してください。各予測は、トレーニングデータフレーム内のすべての行を使用するためです。ただし、Numbaカーネルでは、CuDFデータフレームの渡し方がサポートされていません。現時点では、この場合を処理するためにGitHubで提案されたいくつかのトリックを試しています。( https://github.com/rapidsai/cudf/issues/13375 )
現時点では、少なくとも生の計算を.numaカーネルに渡すことができます。.apply_rows
def predict_kernel(F, T, numer, denom, kappa):
for i, (x, t) in enumerate(zip(F, T)):
d = abs(x - t) # 距離の測定
w = 1 / pow(d, kappa) # 非線形スケーリングをパラメーター化する
numer[i] = w
denom[i] = d
_tdf = train_df[[att, target_col]].apply_rows(
predict_kernel,
incols={att: "F", "G3": "T"},
outcols={"numer": np.float64, "denom": np.float64},
kwargs={"kappa": kappa},
)
p = _tdf["numer"].sum() / _tdf["denom"].sum() # 予測 - 重み付き平均
この時点では、すべてのループを排除したわけではありませんが、ほとんどの数値計算をNumbaにプッシュするだけで、CuDfランタイムを50%以上削減し、標準の80-20トレーニングテスト分割では約2〜4秒に着地しました。
まとめ
rapids、cupy、およびcudfライブラリの様々な機械学習タスクにおける能力を探求することは、刺激的で楽しい旅でした。これらのライブラリは、ユーザーフレンドリーで理解しやすいため、ほとんどのユーザーに利用可能です。これらのライブラリの設計とメンテナンスは賞賛に値し、ユーザーが必要に応じて複雑なプログラムに深く入り込むことができます。1週間にわたって毎日数時間だけを費やすことで、私たちは初心者から始め、高度にカスタマイズされた予測アルゴリズムを実装することでライブラリの限界に挑戦できました。次の目標は、20Kから30Kまでの大規模なデータセットで、前例のない速度を実現し、マイクロ秒のバリアを破ることです。このマイルストーンが達成されたら、rapidsで動作するpipパッケージとしてアルゴリズムをリリースし、より広範な採用と使用が可能になるようにすることです。
Kris Manoharは、トリニダード・トバゴのICPCのエグゼクティブディレクターです。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles