第3週が終わりました。
今週は単純なアルゴリズムを学びました - 線形回帰、ロジスティック回帰、DBSCAN、PCA。
LLMsは関係ありません。ChatGPTの統合も関係ありません。誰もが作っているAIアプリケーションでもありません。
数十年前の基本的な機械学習アルゴリズム。
そして自分に何度も問いかけました:なぜ自分はこれをしているのか?
私がよく受ける質問
「AIを学んでいるんですよね?GPTやClaudeを使って何かを作るのはいつですか?」
正当な質問です。LLMアプリケーションに直接飛ぶこともできます。そうしている人はたくさんいます。
しかし今週気づいたことはこうです:実際に何が起こっているのかを理解したい。単にAPIを呼ぶだけではなく。
なぜ最初に単純なアルゴリズムなのか
1. 実際に本番で動いているのはこれらです
ほとんどの企業は巨大なニューラルネットワークを動かしているわけではありません。彼らは以下を動かしています:
- 詐欺検出のためのロジスティック回帰
- 需要予測のための線形回帰
- 顧客セグメンテーションのためのクラスタリング
- 特徴量削減のためのPCA
「つまらない」アルゴリズムが実際のシステムを支えている。
2. それらはMLが実際にどう機能するかを教えてくれる
LLM APIを呼ぶとき:
response = openai.chat.completions.create(
model = "gpt-4",
messages=[{"role": "user", "content": "Hello"}]
)
私はMLを使っています。MLを理解していません。
線形回帰を実装するとき:
from sklearn.linear_modelimportLinearRegressionmodel = LinearRegression() model.fit(X_train, y_train) predictions = model.predict(X_test)
私は気づきました:学習データ → パターンを学習 → 予測を行う。
それはニューラルネットワークが使うのと同じプロセスです。ただし、より単純です。
3. 実際にデバッグできる
線形回帰モデルの性能が悪い場合、私は以下ができます:
- 特徴量を確認する
- 係数を確認する
- 何が重みづけされているかを理解する
もし私のLLM呼び出しが奇妙な結果を出す場合、内部で何が起きているのか全く分かりません。
まずはシンプルに始めることで、ブラックボックスに飛び込む前に直感を養うことができます。
実際に学んだこと
線形回帰 - 特徴量(平方フィート、部屋数、年齢)から住宅価格を予測する
モデルは学習します:price = w1×sqft + w2×bedrooms + w3×age + bias
予測誤差を最小化することによって、最適な重み(w1、w2、w3)を見つけます。
これは私が長年システムを最適化してきた経験と同じです。同じ概念 - 誤差を最小化するようにパラメータを反復的に調整します。
ロジスティック回帰 - 健康と疾病を分類する
名前にもかかわらず、これは回帰ではなく分類のためのものです。この点に数日間混乱しました。
これは確率(0から1)を出力します。0.5を超えると疾病、以下は健康。
DBSCAN - 画像内の類似ピクセルをグループ化する
クラスタは自動的に密な領域をグループ化します。事前にクラスタ数を指定する必要はありません。
分散システムでホットスポットを見つける作業を思い出させました。密度ベースのグルーピングという同じ概念です。
PCA - 100 の特徴量を 10 に削減する
最も重要な情報を保持し、ノイズを捨てます。
パイプラインでデータを圧縮するようなものです。細部を多少失いますが、重要なものは保持します。
私をイライラさせた部分
ハイパーパラメータの調整
すべてのアルゴリズムには、調整するつまみが備わっています:
- DBSCAN:『似ている』とはどれくらい近さが必要ですか?クラスタを作るには何ポイント必要ですか?
- PCA:保持する成分はいくつですか?
例はうまく動作します。自分の実験は?試行錯誤です。
画像をクラスタリングしてみたところ、次のいずれかになりました:
- すべてが1つの巨大なクラスタ(しきい値が緩すぎる)
- すべてがノイズとしてラベル付けされる(しきい値が厳しすぎる)
この直感をまだつかめていません。
私が犯したミス
1. トレーニングデータでテストした
model.fit(X, y) # Train on all data
score = model.score(X, y) # Test on same data
# Score: 98%! Amazing!
Except the model had already seen the answers. Not a real test.
Should have split train/test:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
model.fit(X_train, y_train)
score = model.score(X_test, y_test)
# Score: 73%. More honest.
ソフトウェアエンジニアリングにはステージング環境があるという前提から、私はもっと賢くあるべきでした。
2. 回帰と分類の混同
私は線形回帰を使うべき場面で、ロジスティック回帰を使い続けていました。
ついに腑に落ちました:
- 数値を予測する(価格、温度、年齢) → 回帰
- カテゴリを予測する(はい/いいえ、猫/犬、病気) → 分類
認めたくなるほど多くの失敗した実験を要しました。
3. 特徴量をスケールするのを忘れた
# 大きく異なるスケールを持つ特徴量
X = [[2000, 3], ...] # square_feet=2000, bedrooms=3
平方フィートの値が大きいため支配的になる。まず全てを同じスケールに正規化する必要がありました。
役立ったパターン
すべての scikit-learn アルゴリズムは同じ構造に従います:
model = SomeAlgorithm()
model.fit(X_train, y_train) # データから学習
predictions = model.predict(X_test) # 予測を行う
score = model.score(X_test, y_test) # 評価
このパターンを見たとき、新しいアルゴリズムの実験が楽になった。
別の分類器を試してみたいですか? アルゴリズムを交換しましょう。同じインタフェース。
Kafka、Flink、その他のストリームツールは内部構造が異なる一方で、APIは似ている、という点を思い出させてくれました。
分散システムとの関連性
勾配降下法(これらのモデルが学習する方法)は、ロードバランサのチューニングのように機能します:
ロードバランシング:
- 設定を試す
- 性能を測定する
- 結果に基づいて調整する
- 繰り返す
機械学習:
- 予測を行う
- 誤差を測定する
- 誤差に基づいて重みを調整する
- 繰り返す
同じ反復的最適化。異なるドメイン。
このメンタルモデルは、MLの概念が馴染みの薄いときに役立ちました。
今週の作業時間
今週は約8〜10時間です。
今後取り組むこと
浅いアルゴリズムは“本物の ML”への踏み石ではない。彼らは本物の ML だ。
ほとんどの本番環境のシステムはこれらの手法を使います。ニューラルネットワークが話題を集めます。ロジスティック回帰も導入されます。
LLMs に飛びつく前に基礎を理解するのは意味がある。
今すぐ GPT のラッパーを作っているかもしれない。しかし、以下が理解できないだろう:
- トレーニングがどのように機能するか
- なぜモデルは失敗するのか
- どのアプローチをいつ使うべきか
- 問題をデバッグする方法
まずはシンプルなことから始めると、直感を養うことができます。
すべてを理解せずとも生産的になれる。
これらのアルゴリズムを、すべての数学的詳細を完全には把握していなくても効果的に使えます。
理解は練習とともに深まる。
まだ不明な点
- 新しい問題に対して適切なアルゴリズムを選ぶこと(私はこれを常に Google します)
- ハイパーパラメータを体系的に調整すること(まだ試行錯誤を繰り返している)
- モデルが「十分良い」と判断するタイミングを知ること
私は3週間目で、3年ではありません。まだ学習中です。
なぜこれが重要か
数週間のうちに、LLMアプリケーションの構築を始めます。RAGシステム、エージェントなど、何でも。
しかし、私は以下を理解します:
- 「トレーニング」が意味すること
- モデルがパターンを学習する仕組み
- なぜ評価が重要か
- よりシンプルなアプローチがより効果的な場合
APIを呼ぶだけではありません。これらのAPIが裏で何をしているのかを理解します。
それは“退屈な”アルゴリズムに時間を費やす価値があります。
3週目終了。今週は ML モデルを構築しては壊しました。
LLMs に飛びつく前に ML の基礎を学ぶべきですか?それとも GPT API に直接進みましたか?他の人がどの道を選んでいるのか気になります。