細胞の遺伝子発現とキャラクター対話の一部分は、異なるデータに見える。しかし、観測の背後にどのような状態があり、その状態がどこへ向かうのかという問いは共通する。この講義では、その問いを一続きの機械学習の流れとして扱う。
$$\boxed{\text{Observation}\to\text{Representation}\to\text{Geometry}\to\text{Trajectory}\to\text{Dynamics}\to\text{Fate}}$$細胞分化と物語の進行を毎回並べて考える。ただし、同じ証拠が得られるわけではない。一般的な単一細胞の発現測定は細胞を破壊するため、同じ細胞の連続観測ではない。対話ログにはセッション内の発話順序が残る。この違いが、直接測れる遷移と仮定が必要な遷移を分ける。
点だけを見る場合と時間が分かる場合
教育用の2次元合成模式図。線は推論結果ではなく、シミュレータが知る個体内の順序を示す。スナップショットの色には時間や分岐の正解を含めていない。
図で時間を隠すと分岐の形は見えるが、出発点と方向は決まらない。個体IDと時間を表示すれば、どの点を結ぶかが分かる。第7講までは主に前者を、第8講以降は系列、集団の移動、帰結を扱う。
対象と進め方
対象はPythonの配列、行列積、平均と分散、条件付き確率、微分を学んだCS学部3年生程度。生物学の前提知識は不要だ。固有ベクトルは第2講で復習し、確率微分方程式や因果識別の詳細な証明は発展学習とする。
第1–10講は約90分、説明60分と実習・討論30分を基本とする。第11講は100分、最後の統合講義は110分を見込む。具体的な問題、小さな例、数式、アルゴリズム、Python実装、生物学への適用、対話への適用を繰り返す。外部講義の翻訳や書き起こしではなく、このシリーズのための講義原稿である。
12講の地図
| 講義 | 問い | 方法 | 共通課題の成果物 |
|---|---|---|---|
| 1. 観測と隠れた状態 | 1行は何を表すか | 観測モデル、識別可能性 | データ定義と評価分割 |
| 2. PCA | 圧縮で何を失うか | 共分散、固有ベクトル、SVD | 射影と再構成誤差 |
| 3. 表現学習 | 曲がった構造をどう表すか | Autoencoder、VAE | 学習した潜在座標 |
| 4. 多様体 | 近さとは何か | kNN、Isomap、UMAP | 近傍関係の比較 |
| 5. 拡散とスペクトル | 局所から全体をどう捉えるか | Laplacian、Diffusion Map | 拡散座標と時間尺度 |
| 6. クラスタとコミュニティ | 状態の境界をどこに置くか | k-means、DBSCAN、Louvain、Leiden | 解像度による状態分割 |
| 7. 軌跡推論 | 点をどう経路にするか | MST、Principal Graph、PAGA | rootに依存する擬似時間 |
| 8. 系列モデル | 順序があると何が変わるか | Markov、HMM、State Space Model | 遷移と隠れ状態の推論 |
| 9. 速度とベクトル場 | 今どこへ動くか | RNA Velocity、回帰 | 次の状態と予測誤差 |
| 10. 集団の輸送 | 個体の対応なしで移動を考えられるか | Optimal Transport、Sinkhorn | 周辺分布を満たす輸送計画 |
| 11. 連続動力学 | 連続する移動規則を学べるか | Neural ODE/SDE、Flow Matching | 積分で得た分布 |
| 12. 帰結と因果 | 何を予測し、何を変えられるか | Survival、Fate Prediction、Causal Inference | 打ち切りを考慮した分析と効果 |
実装はCPUで実行できる小規模な例に絞る。紹介する全手法を再実装するわけではない。例えば第7講のコードはクラスタ中心のMST基準線であり、PAGAそのものではない。各講で実装範囲と概念的な拡張を明記する。
実習の開始
全実習のZIPをダウンロードして展開する。common.py、lesson01.pyからlesson12.py、実行器、依存パッケージ一覧が同じフォルダにある。Python 3.12で次を実行する。
python3.12 -m venv .venv
source .venv/bin/activate
python -m pip install -r requirements.txt
python run_all.py --output outputs
Windowsでの有効化は.venv\Scripts\activate。インストールには通信が必要だが、実習は外部データ、APIキー、GPUを必要としない。UMAPの初回実行はコンパイルで時間がかかることがある。
python lesson02.py --output outputs
python run_all.py --lessons 2 5 7 --output outputs
図と数値はoutputs/に保存する。検証実行の記録にはPythonとパッケージのバージョンも含む。乱数seedを固定してもOSや数値ライブラリによる小さな差はあり得る。固有ベクトルの符号が反転しただけなら誤りではない。
共通データの意味
共通合成データのNPZも直接ダウンロードできる。numpy.load("branching-trajectories.npz", allow_pickle=False)で開く。生成器の既定値と同じデータである。
120個体を16時点で観測するため、行数は1,920、各行の特徴量は24個である。既知の2次元分岐状態を非線形関数と固定混合行列で変換し、観測ノイズを加える。ノートPCで挙動を確かめるための大きさであり、実際の発現データや言語のベンチマークではない。
| フィールド | 単位と意味 | 用途 |
|---|---|---|
X | 1,920 × 24の観測行列 | モデル入力 |
z_true | シミュレータの2次元状態 | 正解の図示・評価専用 |
time, session, next_index | 時点、個体ID、次行番号 | 系列分析、終端は-1 |
branch | 行ごとの分岐符号−1または+1 | 事後評価の正解 |
train | セッション単位の分割マスク | 学習90、評価30セッション |
fate | セッションの最終分岐0または1 | 予測対象 |
duration, event | 追跡期間、イベント観測フラグ | 右打ち切り生存分析 |
baseline, treatment, outcome | 処置前のリスク、無作為処置、後続の連続結果 | 因果推論実習 |
durationの時計は16フレームの観測が終わってから始まる。0から1までの軌跡のtimeとは別の時計だ。離脱後の未来フレームを観測したことにはしない。第12講では初期部分からのfate予測と、別の追跡イベント・処置効果の問題を分ける。
処置結果は$Y=0.7B+0.8A+\epsilon$で生成し、$A$を無作為に割り付ける。この世界の平均処置効果は0.8なので推定値と比較できる。現実のプロンプトや治療の効果が0.8という意味ではない。
評価するもの
| 目的 | 検査 | 不十分な証拠 |
|---|---|---|
| 表現 | 未使用セッションの再構成、近傍保存 | 美しく分離した島 |
| 軌跡 | root・近傍数への感度、既知順序との一致 | 一つの高い相関 |
| 動力学 | 次時点と複数ステップの予測誤差 | 学習点上の矢印 |
| 分布 | 周辺分布誤差、輸送コスト、未使用分布 | 個体の正しい対応という主張 |
| 帰結 | 分割したセッションでのBrier score、較正、打ち切り | accuracyだけ |
| 因果 | 無作為化、または識別仮定と不確実性 | 状態と離脱の相関 |
標準化やPCAも評価データを使って学習してはいけない。早期予測では未来フレームが表現の選択に入っていないか確認する。scikit-learnのデータリーク解説に実装上の注意がある。
最終課題: 実際の対話へ
利用権限があり個人を識別する情報を除いた対話、または自作の公開可能な対話を使う。分析単位を1メッセージか直前数ターンの窓に固定する。各特徴はその時点までの文章だけから作る。セッション全体の要約を初期状態に使えば結末が漏れる。
同じユーザーやキャラクターが複数セッションに現れる場合、セッション分割だけでは不十分なことがある。ユーザー、キャラクター、実時間のどの軸で分離したかを記す。会話長だけの基準線と比較し、話題変更を感情変化と誤認した例も読む。
提出物は問いとデータ定義1ページ、再現可能なコード、主要図3枚、失敗例2件、限界1ページ。配点は問題・データ定義20%、リークのない評価25%、方法と基準線25%、解釈・失敗分析20%、再現性10%。生物学側を選ぶならdonor・batchの分割を考え、lineage tracingと推論した経路を区別する。
第1講では、アルゴリズムより先に観測の1行が何を意味するかを決める。