AI/ML 集中学習の振り返り (1) 全体原則と NN 以外のモデル
背景
Kyndryl に入社して AI と触れる機会が多くなった。LLM おじさんになりたくないという思いと、AI/ML のドメインを体系的に理解したいという思いから、年末にこの分野の集中学習をした。
せっかくブログを始めたので、今回はそこで調べたことの整理として、いくつかの記事に分けてまとめていく。 教科書的な詳細解説ではなく、網羅性を重視しつつも、自分なりに重要な情報を簡潔にまとめようと思う。個々の詳細な解説は、気が向いたら書くかもしれない。
今回計画している記事の一覧は以下の通り。
- NN以外のモデルの概要と使い分け(本記事)
- NN 系(生成AIを除く)のモデル発展の歴史
- 生成AI系のモデルと周辺知識の整理
- AI/ML のシステム設計
- AI/ML の実装と運用(ライブラリ、コミュニティ、Kaggle、MLOps、LLMOps)
今回は、深層学習(NN)以外の、いわゆる古典的・典型的な機械学習アルゴリズム(回帰・分類・クラスタリング・次元削減)について整理する。
私の知識源
今回の学習・整理にあたってベースとなっている私の知識源は以下の通り。 実務で ML システムに触ったことがないので、その周辺知識は誤解があるかもしれない。 気になる点があれば、ぜひコメントにて教えてください。
学生時代
- 大学や大学院での講義・実習・研究
- Numpy, Pandas, Scikit-Learn での実験
- ゼロから作る Deep Learning
- RとRubyによるデータ解析入門
過去数年間
- Andrew Ng 先生の Coursera のコース
- LLM を用いた簡単な AI 機能のプロダクトへの組み込み
- マルチモーダル RAG を用いた Web サイト作成効率化の実験的プロジェクト
今回(年末の集中学習)
- Numpy, Pandas, Scikit-Learn の復習
- PyTorch, Hugging Face の学習
- Kaggle のソースコード
- Andrej Karpathy の YouTube チャンネル
- ByteByteGo の ML/GenAI システム設計
- Gemini との対話
モデルの選び方
具体的なアルゴリズムを見る前に、回帰や分類において「どのモデルを選ぶべきか」という全体的な方針をいくつかのアプローチ軸から考えてみる。
-
ドメインやデータタイプごとの「定石」
データタイプ毎に「まずはこれから試す」という定石が存在する。とりあえずベースラインを作り、精度や要件に不満があれば次点に移行する、というアプローチが基本になる。- テキスト分類(スパム判定や感情分析など)
圧倒的な計算スピードを持つ「ナイーブベイズ」から試す。 精度が出ず、独立性の仮定が怪しいと判断できた場合には、「TF-IDF」や「Word2Vec」で単語をベクトル化し、「ロジスティック回帰」や「SVM」にかける。「TF-IDF」は「ロジスティック回帰」の章で軽く説明するが、「Word2Vec」は NN 系なのでまた次回説明する。それでもダメなら NN を検討する。 - テーブルデータ(CSVやDBの構造化データ)
分類・回帰問わず、まずは「線形モデル」でデータの「健康診断」を行い、ベースラインを作るのが基本だ。ただし実務においては、「スケーリングなどの面倒な前処理なしで、とりあえず生データを突っ込んで手っ取り早く特徴量の重要度を見たい」というズボラな(もとい、効率的な)理由で、「ランダムフォレスト」が最初のベースラインとして重宝されることも多い。もし、業務上「なぜこの予測になったのか(説明可能性)」が強く求められる場合や、データにどんなルールが潜んでいるかを可視化したい場合は、より簡単な単一の「決定木」を最初のステップとして採用する。データ量が多く(数万件以上)、かつ数%の精度向上がビジネス価値に直結する場合には、Kaggleでの王道である「勾配ブースト木」を使い、ハイパーパラメータをゴリゴリにチューニングする。 - 時系列データ(株価やセンサーデータ)
短期的なトレンドや自己相関、季節性等を考慮した「古典的な統計モデル」から試す。限界が来たら、「勾配ブースト木」や 「NN」に移行。ここは今回の学習でカバーしていないので、詳しくは説明しない。 - 画像・音声(複雑な非構造化データ)
古典的なMLではピクセルや波形から直接特徴量を抽出するのが非常に困難。そのため、基本的には「NN」を使うのが定石。分類に関しては、NN を動かすコストがない場合、学習済みのモデル(ResNet や CLIP 等)を使ってデータをベクトルに変換し、それを「SVM(RBFカーネル)」や「ロジスティック回帰」で分類する手法がよく取られる。
- テキスト分類(スパム判定や感情分析など)
-
データ量 (サンプル数: n)
- ~1万件
データが比較的少ないため、複雑なモデル(NNなど)は過学習を起こしやすい。まずは「線形回帰」や単一の「決定木」といったシンプルなモデルが初期候補となる。一方で、データが複雑なパターンを持つ場合は「SVM(RBFカーネル)」が強力な選択肢になる。後述するが、SVM はデータ量が少なくとも非常に効率よく学習できるという特異な強みがある。逆にデータ量が多すぎると計算コストが跳ね上がるため、この規模のデータでこそ輝く。 - 1万 ~ 100万件
複雑なパターンを学習するのに十分なデータ量でありつつ、一般的なマシンのメモリにも乗る扱いやすい規模。この帯域では、表現力が高い「ランダムフォレスト」や「勾配ブースト木」といったアンサンブルモデルが最も性能を発揮しやすい。 - 100万件以上
データが膨大になり、全データをメモリに乗せて総当たりで計算する古典的アルゴリズム(単純な決定木やSVMなど)では、メモリ不足や計算時間爆発の限界を迎える。そのため、データを近似して計算を大幅に削減する「ヒストグラムベースの勾配ブースト木」や、データを小分けにして学習(ミニバッチ学習・オンライン学習)できる「NN」を選ぶ必要が出てくる。
- ~1万件
-
データ量と特徴量数(次元)のバランス
機械学習には「The rule of ten(1つの特徴量につき最低10件のサンプルが必要)」という経験則がある。- 理想的な状態 (n/p > 10)
サンプル数が十分に多く、複雑なモデル(勾配ブースト木や NN など)も過学習を起こしにくく、安定して学習できる。 - 高次元・少数サンプル (n/p < 1)
特徴量(次元)がサンプル数を上回っている状態。ノイズも含めて丸暗記してしまうため過学習のリスクが極めて高い。試験前に「問題の意味は全く理解していないが、過去問の答えは全部『C』だったから本番でも『C』と書く」という丸暗記をして、少しひねられた本番のテストで無事爆死する学生のような状態になる。後で説明するが、PCA(主成分分析)による次元削減や、Lasso 回帰(不要な特徴量を削る正則化)等の前処理が必須になる。
- 理想的な状態 (n/p > 10)
-
データの複雑さと非線形性
- データが直線的な関係(線形)なのか、複雑に絡み合った関係(非線形)なのか。
- とりあえず線形モデルをデータの「健康診断」として使う。エンジニアという生き物は、隙あらば複雑な NN やアンサンブルモデルで精密検査をしたがるものだが、ぐっと堪えてまずは聴診器から当ててみるのが社会人の常識だ。もし十分な精度が出るなら、モデルの保守性を考えてあえて複雑なモデルを使う必要はない。逆に線形モデルの精度が極端に悪い場合は、データに強い非線形性(例:AとBの条件が揃った時だけ結果が跳ね上がる等)が隠れていると判断し、勾配ブースト木や NN へステップアップする。
-
非機能要件(推論レイテンシ・学習コスト)
本番環境での運用を見据えると、精度の高さ以上にシステム上の制約が決定打になることが多い。- 推論レイテンシ
例えば「10ms以内のリアルタイム応答」が必須な場合、重いアンサンブルモデル(ランダムフォレストや勾配ブースト木等)は遅すぎて使えないことがある。その場合、推論が爆速なナイーブベイズや線形モデル、もしくは極限まで軽量化したモデルが主候補になる。 - 学習コスト(計算資源)
NN の学習には高価な GPU と膨大な時間が必要になることが多いが、LightGBM などのアルゴリズムは CPU でも非常に高速に学習できる。毎日再学習を回すようなシステムでは、この学習コストの低さが極めて重要になる。
- 推論レイテンシ
-
説明可能性と性能のトレードオフ 「なぜその予測になったのか」の根拠を人間が解釈できるかどうかの観点。
- ブラックボックス(高精度)
NN、勾配ブースト木、SVM(RBFカーネル)は高性能だが、内部の予測ロジックが複雑すぎて人間が完全に追うことは難しい。 - ホワイトボックス(高解釈性)
単一の決定木や線形モデルは「どの変数がどう効いたか(分岐したか)」を明確に説明できる。「なぜこの顧客のローン審査を落としたのか?」と詰め寄られた際、「過去の滞納歴が X 回以上だったからです」と胸を張って言えるのだ。時と場合によっては、「言い訳(謝罪)機能」は超大切なのだ。
- ブラックボックス(高精度)
回帰・分類 (Regression & Classification)
まずは簡単な復習から。回帰は連続値の予測で、簡単な例としては株価予想や家賃予想など。分類はカテゴリの予測で、2値分類ではスパムメールの判定、多値分類では天気予報などが例として考えられる。 多くの回帰・分類アルゴリズムは、元々どちらかを主目的として考案されているが、たいていは少しの工夫でもう一方のタスクにも応用できるようになっている。ここでは、アルゴリズムの系統ごとにその仕組みを整理する。
線形モデル系
線形回帰 (Linear Regression)
言わずもがなの線形回帰。損失関数に平均二乗誤差(MSE)を用いて予測値と正解の距離を最小化するように学習する。 家賃の例において、最寄り駅と駅からの距離の掛け合わせが家賃価格に影響を与えるような、データ分布がそもそも非線形である場合にはうまく予測ができない。
うまく予測がいかない、とは合計のエラー数が多いということであり、実はこれは以下のように分解できる。
合計のエラー = バイアス^2 + 分散 + 解消できないエラー
これは バイアスと分散のトレードオフ を表す有名な数式であり、うまく予測がいかない場合には大きく2つのケースが考えられることを示している。 ひとつはバイアスが大きい状態、もう一つは分散が大きい状態だ。バイアスが大きい状態とは、モデルが単純すぎる状態である。線形回帰が良い例だが、例えば現実のデータが複雑なカーブを描いているのに、それを直線で説明しようとしたときに発生する。分散が大きい状態は、いわゆる過学習が起きている状態である。これについては、決定木のセクションで説明する。
ロジスティック回帰 (Logistic Regression)
名前に「回帰」とつくが、線形回帰を応用した2クラス分類器。線形回帰の出力、いわゆる Logits をシグモイド関数で確率に変換して、損失関数 Binary Cross Entropy を用いてエラーを計算し、これを最小化するように学習する。
ロジスティック回帰を非構造化データ(テキスト、画像など)の分類に応用するには、データをモデルが処理できる数値の配列(ベクトル)に変換する必要がある。テキスト分類における代表的なベクトル化手法が TF-IDF だ。
TF-IDF (Term Frequency - Inverse Document Frequency) とは、単語の出現頻度(TF)と、その単語の全文書におけるレア度(IDF)を掛け合わせた指標のこと。「その文書に頻出するが、他の文書にはあまり出てこない単語」ほどスコアが高くなるように計算される。例えば、スパム判定において「無料」という単語はスパムメールに頻出する(TFが高い)が、普通のメールにはあまり出てこない(IDFが高い)ため、TF-IDFスコアが非常に高くなる。一方で「です」「ます」のような単語は、どのメールにも頻出するためIDFが低くなり、スコアは低く抑えられる。
ベクトル化の具体的なイメージは以下の通りだ。まず、学習に用いる「全文書の単語一覧」を作成し、その総単語数をベクトルの次元数とする。そして、個々の文章をその次元数分の TF-IDF スコアの配列として表現する。
ベクトル化は腹落ちしにくいので(私調べ)、例として以下の文書群を考える。
- 猫 が 好き (3語)
- 私 は 猫 と 犬 が 大好き (6語)
- 犬 は 怖い (3語)
まず、すべての文書群から、登場する全単語のリストを作る。これが、文書ベクトルの次元となる。
[私, は, 猫, と, 犬, が, 好き, 大好き, 怖い](計9単語 = 9次元)
文書ごとに、該当する単語のスロットに TF-IDF スコアが入ったものが、その文書のベクトルとなる。
- 文書1のベクトル:
[0, 0, TF-IDF(猫), 0, 0, TF-IDF(が), TF-IDF(好き), 0, 0] - 文書2のベクトル:
[TF-IDF(私), TF-IDF(は), TF-IDF(猫), TF-IDF(と), TF-IDF(犬), TF-IDF(が), TF-IDF(大好き), 0, 0] - 文書3のベクトル:
[0, 0, 0, 0, 0, 0, 0, 0, TF-IDF(怖い)]
このようにして、すべての文章が同じ長さ(9次元)のベクトルに変換されたものが、ロジスティック回帰に入力される。
決定木系
決定木は分類の文脈で良く登場する、データの条件分岐を木構造で作るシンプルなモデル。アキネイターみたいなイメージ。
決定木
上記の通り、決定木はデータを再帰的に分割する。効率的に分類を行う(アキネイターの例では、なるべく少ない質問で答えにたどり着く)ために、 この分割条件の選定が非常に重要になる。これは、データを総当たりしてすべての分割条件を試し、分割前後のジニ不純度(ランダムに2つのデータを取り出したときに、それらのクラスが一致しない確率を表す)を比較することで一番効率よく分類できる分割条件を選択する、というプロセスを再帰的に適用することで達成される。
弱点は、木を深くしすぎると過学習になること。わかりやすいように、天気予報で説明してみる。
期待している予測: 「現在の気圧は1015hPa、湿度は65%ですね。過去のデータに照らし合わせると、これは『晴れ』の兆候です。」
過学習気味: 「南南西から風速2.1メートルの微風が吹いています。10 年前の今日、全く同じ風が吹いた午後にゲリラ豪雨がありましたから、午後は『雨』かもしれません。」
過学習(ノイズへの執着): 「過去1年間でサイコロの目を3回降った結果が 1, 2, 3 である日は全て晴れでした。今日もこの条件にあてはまるので、晴れに違いない!」
少し実装寄りの話になるが、簡潔に過学習対策とハイパーパラメータ探索の話をする。
過学習の検知は、訓練データと検証データの学習曲線(エラー率)をモニターすることで行う。訓練データのエラーが下がり続け、かつ検証データのエラーがある時点から下がらなくなるもしくは上がり始めるのが観測できたら、それは過学習。この時点で、学習は止める。また、バッチ正規化や交差検証等のベストプラクティスは副次的に過学習対策にもなるので、簡単な実験でもさぼらずにきちんと行う。
過学習の対策として、最優先で行うのはデータの改善。データをもっと取る、データを人工的に拡張する(Data Augmentation)、特徴量選択や次元削減(特徴量の効率的な合成)を行う。次点で、モデルにあえて制約をかけて、データの丸暗記を防ぐ。モデルの単純化(木の深さを制限する、そもそもモデルを単純なものに置き換える等)、Ridge 正則化(全体的に重みを小さくする)、Lasso 正則化(不要な特徴量の重みを消す)等。
また、過学習対策を実施するモデルは、表現力が高すぎるくらいの巨大モデルを用意するのが良いらしい。これは、訓練誤差がゼロになる = モデルに十分な表現力がある、と思われていた時期があったが、検証誤差の二重降下現象(モデルがデータを完全に丸暗記できる境界線のあたりが一番検証誤差が悪化し、そこからさらにモデルを巨大化させると、ノイズの丸暗記ではなく本質的な特徴を捉えるようになり、結果的に汎化性能が上がる)の発見により、現在では大きめのモデル + 正則化のアプローチが定石となっているため。とりあえずは、訓練誤差がゼロまで下がる程度のハイパーパラメータを見極め、ここをベースラインとして調整する。ハイパーパラメータ探索は、探索空間に応じて GridSearchCV(総当たり)や Optuna (総当たりではなくベイズ最適化を利用)を利用する。
回帰木
回帰木は、決定木を回帰に応用したもの。分割後のデータの「分散」が最小になるように(似たような数値が同じグループになるように)データを分割していく。家賃予測の例では、例えば最寄り駅、駅からの距離、広さで分岐を作っていき、最終的な葉ノードに入った学習データの家賃の「平均値」が、未知の物件に対する予測家賃になる。
決定木と同様に過学習になりやすい。
ランダムフォレスト
単純な決定木を横につなぎ、最終結果はこれらの多数決をとることによって、決定木の弱点である過学習(モデルの分散)を抑えよう、というアプローチ。各決定木には、異なる特徴量セットやデータセットのサブセットを学習データとして与える。データセットが小さく、過学習リスクが高いときに選ぶ。
わかりやすい例として、システム開発を考える。ランダムフォレストは、仕様を 10 人の開発者に口頭で伝えて(情報漏れあり)システムを作らせ、あとで多数決でガッチャンコするようなものだ。まさに「三人寄れば文殊の知恵」である。
勾配ブースト木 (GBDT: Gradient Boosting Decision Tree)
ランダムフォレストと同様に単純な木を複数使用するが、木は縦に繋ぐ。後段の木は前段の木のエラー(残差)をできる限りなくすように学習していく。単純なモデルから始めて、木を段階的に足していくことで、モデルのバイアスを少しずつなくしていく(モデルの表現力をあげていく)アプローチ。
システム開発の例だと、1 人目が作った動くプロトタイプを、2 人目が徹夜でバグ修正し、3 人目が機能拡張をする、といったイメージ。
Kaggle でも頻繁に使用される手法。データ量が多く、ハイパーパラメータチューニングを行う余地がある時に選ぶ。学習率や各木の階層などがハイパーパラメータになる。十分なデータ量がある場合、限られた情報から出てくる答えの平均をとる(決定境界が滑らかになる)というランダムフォレストでは捉えきれない、高次元での複雑な交互作用(特定の複数の特徴量が特定の条件を満たす時に結果が劇的に変わる等)が捉えられる。
勾配ブースト木にはいくつか有名な実装がある。
- XGBoost (2014年〜): 勾配ブースト木を一躍有名にした立役者。並列処理や正則化(過学習防止)を組み込み、かつての標準だった Scikit-Learn の
GradientBoostingClassifierに比べて圧倒的な速度と精度を誇った。長らく Kaggle の覇権を握っていた。 - LightGBM (2017年〜): Microsoft が開発。XGBoost の弱点であった「学習時のメモリ使用量」と「計算速度」を劇的に改善した。ヒストグラムベースのアルゴリズム(連続値をいくつかのビンに分けて計算を省略する)や、精度に影響しやすいデータ(勾配が大きいもの)から優先的に分岐を作る(Leaf-wise growth)仕組みを導入。現在、テーブルデータにおいてはとりあえずこれが最強のベースラインとして扱われることが多い。
- HistGradientBoosting (Scikit-Learn 0.21以降): Scikit-Learn が LightGBM のアルゴリズムを取り込んだもの。LightGBM などの外部ライブラリをインストールしたくない・できない環境では、このアルゴリズムを使う。
ナイーブベイズ
ベイズの定理(前提条件を考慮した確率計算、例えば B が起きた場合の A の確率 = P(A|B) = P(B|A) * P(A) / P(B))を応用した高速分類器で、スパムメール判定などのテキスト分類に利用されている。
ナイーブベイズは、すべての特徴量が互いに独立である、という非常に大胆な仮定を打って計算を簡略化する。たとえばスパムメールのケースでは、今回のメールにスパム、無料が入っていたとして、
スパムの確率: P(スパム|無料,当選) = P(無料|スパム) * P(当選|スパム) * P(スパム)
スパムでない確率: P(普通|無料,当選) = P(無料|普通) * P(当選|普通) * P(普通)
を計算することで、分類を行う。ロジスティック回帰よりも軽いが、特徴量が独立でない場合(例えば、”AI * ”投資”など、掛け合わせで怪しさが激増するケース)や、学習データにない情報への対応が不可能な点がデメリットとなる。テキスト分類ならとりあえずの筆頭候補であり、次点で、TF-IDF や Bag-of-Words, Embedding モデルを使ったベクトル化 + ロジスティック回帰。それでだめならデータ量に応じてより複雑なモデルを検討する。
サポートベクターマシン (SVM)
SVM は2クラス分類を主な用途とするが、多クラス分類や回帰にも応用される。
概念の理解のため、2クラス分類を考える。SVM は、データを分割する面(ハイパープレーン)を、サポートベクター(両クラスの、ハイパープレーンに近くにあるデータ群)への最短距離を最大化する形で計算するもの。ハイパープレーンから遠くにあるデータは計算に関係しない。
2クラスのデータ群の間にできるだけ太いパイプを引くイメージだ。このパイプがどれくらい柔軟に形をかえられるかは、カーネルの種類、簡単に言うと距離計算の仕組みの違いによって決まる。線形、多項式(次元数を指定)、ガウス(次元数は無限)から選択するが、実務で SVM を試す際にはガウス(RBF)一択。これは、ほかのカーネルならわざわざ複雑な SVM を使う必要性が薄い(ナイーブベイズやロジスティク回帰で良くない?となる)から。しかし、ガウスカーネルだけは、少量(1万件程度まで)のデータを超効率的に活用できるので、勾配ブースト木や NN では解けないニッチなニーズがある。
上でも少し触れたが、非構造化データ(文章、画像、音声)に対しては Embedding モデル等を使って構造化(ベクトル化)して、それに対して RBF カーネルを使うのもあり。理論上は CLIP みたいなマルチモーダルエンベディングモデルを使うと、そのままマルチモーダルの分類器が作れる。
これを回帰に応用したものは SVR (Support Vector Regression) と呼ばれる。これは上記とは逆転の発想で、データ群をパイプの中に収め、パイプをできるだけ細くするイメージ。
また、多クラスへの応用は、多クラス分類の場合は「one-vs-rest」や「one-vs-one」など、複数の2クラス分類器を組み合わせる手法を用いる。
クラスタリング (Clustering)
データを似たもの同士のグループに分ける。分類と違って正解ラベルがない(教師なし学習)ため、評価手法が重要になる。
K-Means
分類したいクラスタ数 K を指定し、K-Means はデータから K 個の円を探す。最初は適当な K 個の重心(円の中心)からスタートし、それぞれの点を中心とした円を描く。その後、円内の点をグループとして、円を動かして、円の中心を最も近い点に動かす。これを 10-50 回程度繰り返す。距離に基づくアルゴリズムなので、事前のデータスケーリング(正規化や標準化)が必須。結果は初期重心値への依存性があり、初期重心値は単純なランダムではなく、アルゴリズム的に離れた距離にあるものを選択する工夫(K-Means++等)をすることが一般的。
K が適切かどうかは、エルボー法(Elbow Method、縦軸にクラスタ内のバラツキ、横軸にクラスタ数 K のグラフを描く)で評価する。K がある点に達すると、クラスタ内のバラツキが水平移動するようになるので、そこが適切なクラスタ数だと考える。 また、円形のクラスタリングなので、円形でないデータに対しては適さない。シルエット分析(Silhouette Analysis、各データ点に対して、同クラスタ内の点との距離と、最も近い異クラスタとの距離の比を計算する)の値が低い場合には、データ分布が円形でないことを疑い、DBSCAN などの密度ベースのクラスタリングを検討する。
時間計算量はデータ数、クラスタ数、次元数、繰り返し回数の積(NKDI)。I は一般的には 10-50 程度。メモリはデータ本体(ND)と重心(KD)のみ。 次元数(D)がパフォーマンスに大きく影響(次元の呪い)。前処理として、次元削減を検討する。
DBSCAN
友達の友達は友達理論で、芋づる式にクラスタの領域を広げる。どこまでを友達とみなすか(隣の点との距離)、最低何人いればグループとして認定するのか(最小点数)、がハイパーパラメータ。クラスタ数を事前に指定する必要はない。離れた点はノイズとして、外れ値として扱われる。
KDTree 空間インデックスを使用した実装では、時間(N logN D)、メモリはこのインデックス保持用に(ND)。ただ、時間計算量は D が大きくなると(NN)に近づき、次元数の影響を受けやすい(これは KDTreeの特性)。 K-means と同様に、次元数(D)がパフォーマンスに大きく影響(次元の呪い)。前処理として、次元削減を検討する。
次元削減 (Dimensionality Reduction)
データの持つ情報量をできるだけ保ったまま、特徴量(次元)の数を減らす手法。
PCA (主成分分析)
特徴量を複合的にみて、分散が大きい方向を特定する。これは、数学の得点と物理の得点を理数系の得点とみなす、みたいなもの。これを第1主成分とし、第2主成分はこれと直交するもの(ベクトルの内積がゼロになるもの)で、これまた分散が最大になるものを選ぶ。たとえば、言語系の得点(国語、英語)みたいに。共分散行列や固有値ベクトルなど、行列計算満載。
ふと、私は最近の家探しで脳内 PCA をしていたのだなぁ、と思った。「UA値」と「C値」の相関が高いことに目をつけて、まとめて「断熱性能」という1つのパラメータに圧縮して、脳内パンク(次元の呪い)を防いだのだ。分散の特定は私の直観というヒューリスティックだっのだが。
ML と GenAI の対応ドメインを再考してみる
ここ最近の生成AIの発展を踏まえて、今回整理したような古典的な ML の領域がどうなっているかについて少し考えてみた。
「高速な応答が必要なシステム」 と 「ランダム性に起因するリスクが許容できない領域」 においては、まだまだ古典的 ML モデルの独壇場であり、GenAI には侵食されていない。
一方で、スタートアップの PoC など「ML タスクとして厳密に定義しきれていないケース」や「とりあえず動くプロトタイプを作る段階」では、LLM の API コールで済ませてしまうケースが増えてきている。
実際、私自身の個人プロジェクトでも「類似アイテム推薦機能」が欲しかった際、かつてならデータを集めて特徴量を作り、専用の分類器や協調フィルタリングモデルを学習・評価する(交差検証やハイパーパラメータ探索を行う)必要があった。しかし今は、LLM を呼び出すだけでそれなりの精度で完結してしまい、動作の調整もプロンプトを変えるだけという手軽さだった。テキスト分類においても、とりあえずナイーブベイズを試す前に、まずは LLM に分類させてみるというアプローチが増えているのではないだろうか。
まとめ
今回は機械学習の全体原則から、線形モデル、決定木ベースのアンサンブル、SVM、そしてクラスタリングや次元削減の手法までを振り返った。
改めて整理してみて痛感したが、機械学習のスコープはとにかく広すぎる。「週末でサクッとまとめ記事を書くか」と軽い気持ちで始めたはずが、気がつけば小論文のような文量になってしまった。私の脳内メモリもそろそろ限界だ。
とはいえ、今回の振り返りで以下のポイントを再確認できた。
- モデル選びは「チートシート」を見るだけでは成立しない。ネット上には「このデータならこのモデル」という簡易なフローチャートが溢れているが、実務ではそれだけでは不十分だ。各アルゴリズムの原理や特性(なぜ少量のデータに強いのか、なぜ過学習しやすいのか等)を深く理解した上で、推論レイテンシや学習コストといった「システム上の制約」や、ステークホルダーに対する「説明可能性」といったビジネス要件を天秤にかけ、多角的なトレードオフを考慮しなければ最適なアプローチは導き出せない。
- 一方で、明確な「定石」とステップアップの順序は存在する。チートシートだけでは無理だとしても、データの種類や規模によって「まずはどのベースラインから試すべきか」はほぼ決まっている。そこから「データの非線形性」や「過学習の有無」等の結果を見て、アルゴリズムの特性を理解した上で徐々に複雑なモデルへ移行していくのが、遠回りに見えて一番の王道である。
- LLM(GenAI)時代においても古典的MLの役割は消えない。PoCや手軽な分類タスクではLLMが台頭しているが、「数ミリ秒の応答速度」「厳格なリスク管理」「大規模データの低コスト処理」が求められる本番環境においては、今後も LightGBM や各種古典的モデルが不可欠なピースであり続ける。
実務で ML システムを運用している方からすると「今の現場だとそこはちょっと違う」といったツッコミどころもあるかもしれないので、もし何かあればぜひコメント等で教えてほしい。
次回は、「NN 系(生成AIを除く)のモデル発展の歴史」について整理する。
コメント (0)
まだコメントはありません。最初のコメントを投稿しましょう!