AI開発の基礎知識メモ ニューラルネット・PyTorch・ONNXの関係を整理する
このメモ書きは、音楽解析ツールを小さいVPS(メモリ512MB)で動かそうとした過程で出てきたAI関連の用語と仕組みを、基礎から整理したものである。机上の学習ではなく「なぜ本番環境で動かないのか」という実務の問題から逆算して理解を組み立てている。
全体像
「作る(学習)」と「使う(推論)」は別工程であり、使う側に作る道具を持ち込む必要はない。この分離が全体の要点になる。
ニューラルネットとは
脳の神経細胞(ニューロン)の仕組みを模した計算方法である。
| 脳のニューロン | ニューラルネット | |
|---|---|---|
| 入力 | 他のニューロンからの信号 | 数値の並び |
| 処理 | 合計が一定を超えたら発火 | 重みを掛けて足し、関数を通す |
| 出力 | 次のニューロンへ信号 | 次の層へ数値 |
| 規模 | 数百億個が接続 | 数千〜数千億個の重み |
1つ1つの計算は掛け算と足し算だけの単純なものである。これを大量に並べ、何層も重ねることで「この音は何Hzか」「この画像に猫はいるか」といった複雑な判断が可能になる。
出力 = 関数( 入力1 × 重み1 + 入力2 × 重み2 + 入力3 × 重み3 + バイアス )
活性化関数:上式の「関数」にあたる部分。足し算の結果をそのまま次に渡すと、何層重ねても1層分の表現力しか持たない。ReLU(負の値を0にする)などの関数を挟むことで、層を重ねる意味が生まれる。
脳との対応
ニューロンと神経細胞は同じものを指す。ニューラルネットはニューロンとシナプスの関係を模している。
| 脳 | ニューラルネット |
|---|---|
| ニューロン(神経細胞) | ノード(計算する点) |
| シナプスのつながりの強さ | 重み |
| ニューロンが発火するかどうか | 活性化関数 |
| よく使うシナプスが太くなる | 学習で重みが調整される |
判断の中身はノードではなく、シナプスにあたる重みに宿る。ノード自体は受け取った値を足して関数に通すだけである。学習済みモデルの配布物が重みの塊になるのはこのためである。
脳では、よく使われる回路のシナプスが強化され、使われない回路は弱まる。ニューラルネットの学習も、正解に近づく方向へ重みを強めたり弱めたりする点で同じ発想になっている。
学習と推論
| 工程 | 内容 | 必要なもの |
|---|---|---|
| 学習 | お手本を見せながら、出力が正解に近づくようにつまみを自動で少しずつ回す | 大量の正解付きデータ、GPU、時間 |
| 推論 | 回し終わったミキサーに新しい入力を通して結果を得る | 学習済みの重み、実行環境 |
学習で決まったつまみの位置が「学習済みの重み」であり、モデル配布の実体はこの数値の塊である。
学習の現実的な壁
・データ:「この音はこの音程」といったラベル付きデータが大量に必要になる。収集が最も困難である
・GPU:学習はCPUでは遅すぎるため、実質NVIDIAのGPUが必須になる
・時間:一から学習すると数日〜数週間かかることもある
個人では一から作るより、既存モデルを自分のデータで追加学習させる「ファインチューニング」が現実的である。
過学習:お手本を丸暗記してしまい、見たことのない入力に弱くなる状態。学習用とは別の検証用データで性能を確かめるのが定石である。
フレームワーク(PyTorch / TensorFlow)
ニューラルネットを作るための専用道具である。
- 配線を組む(層の構造を定義する)
- 学習させる(重みを自動調整する)
- 推論する(完成したモデルに入力を通す)
これらを全部こなせる。
| フレームワーク | 開発元 | 特徴 |
|---|---|---|
| PyTorch | Meta | 研究分野で主流。公開モデルの多くがこれで作られている |
| TensorFlow | 実務・モバイル展開で強い |
PyTorchは全部入りの開発環境であり、単なるランタイムではない。その代わり導入するだけで1GB以上、起動するだけでメモリを200〜300MB消費する。
| 機能 | PyTorch | onnxruntime |
|---|---|---|
| 推論 | できる | できる |
| 学習 | できる | できない |
| 中身をいじりながらの試行 | できる | できない |
| 重さ | 重い | 軽い |
プログラミングに置き換えると、PyTorchは「コンパイラもデバッガも実行環境も全部入りのIDE」、onnxruntimeは「完成品を動かすだけのランタイム」にあたる。
テンソル:PyTorchの「Torch」やTensorFlowの「Tensor」が示すもの。多次元の数値配列のことで、ニューラルネットの入出力や重みはすべてテンソルとして扱われる。音声なら「時間×周波数」、画像なら「縦×横×色」の配列になる。
ONNXとは
Open Neural Network Exchange の略である。2017年にFacebook(現Meta)とMicrosoftが策定した、ニューラルネットの共通ファイル形式である。
アプリではなく規格とファイルである点に注意が必要になる。音楽で言えばMIDIファイルの立ち位置に近い。
| 役割 | 音楽 | AI |
|---|---|---|
| 作る道具 | DAW | PyTorch / TensorFlow |
| 共通形式 | MIDI | ONNX |
| 動かす側 | 音源・DAW | onnxruntime |
MIDIファイル自体が音を鳴らさないのと同様に、ONNXファイル自体も何も実行しない。読み込む側(onnxruntime)が計算する。
ONNXに入っているもの
- 計算の順番(配線図、計算グラフ)
- 学習済みの重み(つまみの位置)
ONNXに書き出すとは、フレームワーク依存を切り離して、単体で呼べる関数として固めることである。
# イメージ
def model(audio):
# 学習で決まった数値が定数として埋め込まれている
# 決まった順番で計算する
return pitch
引数(入力)は毎回変わってよい。中の定数(重み)と処理順は固定される。
DAWのフリーズとの違い
| フリーズ | ONNX | |
|---|---|---|
| 書き出すもの | 結果(音) | 計算のしかた |
| 入力を変えたら | 再フリーズが必要 | そのまま新しい入力を処理できる |
| 計算 | 済んでいる | 実行のたびに行う |
フリーズは「料理を作って冷凍したもの」、ONNXは「レシピを固めて誰でも作れるようにしたもの」にあたる。
ONNXは音楽系に限らず、画像認識、音声認識、翻訳、スマホカメラの補正など、ニューラルネット全般で使われている。
ONNX化の条件
| 条件 | 種類 | 内容 |
|---|---|---|
| ① AIモデルである | 可否 | 学習済みの重みを持つ。持たなければ書き出す対象がない |
| ② 計算をONNXの部品で表現できる | 可否 | ONNXが対応していない演算を使っていると書き出せない |
| ③ モデル自体が軽い | 価値 | ONNX化で消えるのはフレームワークの重さだけである |
①と②が揃えばONNX化できる。③まで揃えばONNX化する価値がある。
ONNX化で軽くなるのは「PyTorchという道具の分」だけであり、モデル自体の計算量や重みの大きさは変わらない。中身そのものが重いモデルは、書き出しても重いままになる。
opset:ONNXが対応している演算の版。版が上がるごとに対応演算が増える。書き出しに失敗した場合、opsetを上げると通ることがある。
前処理は含まれないことが多い:音声をスペクトログラム(周波数の分布)に変換するSTFTなどの前処理は、ONNXの外でPython側に書かれていることが多い。ONNX化するときはこの前処理をnumpyなどで書き直し、元のPyTorch版と出力が一致するか検証する必要がある。
実例:音楽解析ツールで使っているモデル
| 分類 | モデル | ONNX | 状況 |
|---|---|---|---|
| ドラム検出 | ADTOF | 済 | VPSで稼働 |
| ドラム分離 | LarsNet | 書き出しは可能 | 重みだけで590MBあり512MBに収まらない |
| 音源分離 | Demucs | 困難 | 複素数演算で書き出しが詰まる。書き出せても計算量が大きい |
| 音程検出 | RMVPE | 済 | 8ビット量子化して稼働 |
| 音程検出 | FCPE | 可能見込み | 数MBの小型モデル。次のONNX化候補 |
| 音程検出 | SwiftF0 | 元からONNX | 配布元がONNXで提供 |
| 音程検出 | basic-pitch | 元からONNX版あり | 配布元がONNX版を用意 |
| 拍検出 | Beat This! | 済 | |
| 和音検出 | madmom | 不要 | PyTorch非依存で元から軽い |
| 音の種類 | YAMNet | 済 | 元はTensorFlow製 |
| 音の種類 | EfficientAT | 済 | |
| 帯域ごとの立ち上がり | (自作の計算) | 不要 | AIモデルではない |
FCPEは「中身は小さいのに、PyTorchを起動しないと動かない」状態だった。ONNX化の恩恵が最も大きい典型例である。
軽量化の手段:量子化
重みの数値の精度を落としてサイズを縮める手法である。
| 精度 | 1つの数値のサイズ | 備考 |
|---|---|---|
| 32ビット浮動小数 | 4バイト | 学習時の標準 |
| 16ビット浮動小数 | 2バイト | 精度劣化はほぼない |
| 8ビット整数 | 1バイト | 重みのメモリが約1/4になる。精度はわずかに落ちる |
量子化で縮むのは重みのメモリであり、計算回数そのものは減らない。計算量の大きいモデル(Demucsなど)の処理時間は量子化しても大きくは縮まない。
ONNX以外の形式
用途ごとに得意な形式が分かれている。
| 形式 | 主な用途 |
|---|---|
| ONNX | 汎用。サーバー、PC、各種言語から利用 |
| TFLite | TensorFlow系のモバイル・組込み向け |
| Core ML | Apple製品向け |
| GGUF | 大規模言語モデル(LLM)を手元PCで動かす用途 |
ChatGPTやClaudeのような大規模言語モデルは桁違いに重いため、ONNXより専用形式(GGUFなど)で配布されることが多い。
CPUとGPU
| CPU | GPU | |
|---|---|---|
| 得意 | 複雑な処理を少数ずつ | 単純な計算を大量に同時に |
| 学習 | 遅すぎて実用的でない | 主戦場 |
| 推論 | 小さいモデルなら十分 | 大きいモデルで有利 |
ニューラルネットの計算は「単純な掛け算と足し算の大量の繰り返し」であるため、GPUと相性がよい。一方、小型モデルの推論であればVPSのCPUでも実用になる。
まとめ
| 論点 | 結論 |
|---|---|
| ニューラルネット | 脳のニューロンを模した、掛け算と足し算を大量に重ねた計算方法 |
| 重み | 学習で決まったつまみの位置。モデル配布の実体 |
| 学習と推論 | 作る工程と使う工程は別物。使う側に作る道具は不要 |
| PyTorch | 学習も推論もできる全部入りのフレームワーク。重い |
| ONNX | Open Neural Network Exchange。フレームワーク非依存の共通ファイル形式 |
| onnxruntime | ONNXを実行するだけの軽量ランタイム |
| ONNX化の条件 | AIモデルである、計算がONNXで表現できる、モデル自体が軽い |
| ONNX化で消える重さ | フレームワークの分だけ。モデル自体の重さは残る |
| 量子化 | 重みの精度を落としてメモリを縮める。計算量は減らない |
| 学習の現実解 | 一から作らず既存モデルのファインチューニング |
あとがき
ニューラルネット、フレームワーク、ONNX、ランタイムという用語は個別に聞くと抽象的だが、「メモリ512MBのサーバーでなぜ動かないのか」という具体的な問題に当てはめると一本の線でつながる。作る道具と使う道具を分ける発想は、DAWとMIDI、IDEとランタイムといった既存の知識に置き換えられる。次の段階は、小型モデルを実際に1つONNXへ書き出し、元の出力と一致するか検証することになる。