🐈‍⬛

ねこでもできる!やさしい生成モデル

2024/07/25に公開

話すこと

  • 簡単な生成モデルの作成ステップの説明
  • 読めば、生成モデルが作れる

読者対象

  • stable diffusionとかの拡散モデル、画像生成モデルを理解したい人の一歩目
  • とにかく何か生成モデルってやつを作りたい人

生成モデルとは

  • 観測データを基にして作られ、新たなデータサンプルを生成できる
  • 生成モデルは観測データの真(母集団)の確率分布をモデル化したもの
  • モデル化とは数式で表わすこと

難しくする点

  • 母集団の確率分布がわからない
  • 手元にある情報が母集団から取得されたサンプルのみ(とこの回では前提を置く)

生成モデルの作成ステップ

  1. モデル化(確率分布の型を決める)(パラメーターがあるもの)

    • 真の確率分布が不明である場合、人間が扱える分布(例: 正規分布)のパラメータ(正規分布なら平均、分散)を調整して、実際の分布を模倣する。
  2. サンプル(全体)が最も出現しやすいパラメータを推定

    • パラメータの推定には最尤推定が用いられる。正規分布の場合、サンプルの平均と分散がパラメータとなる。
    • サンプルの各データは独立に生成されていると仮定する。

これは、NBA選手(真の確率分布)に憧れる小柄な日本人が、自分の体(正規分布)の動かし方を調整して(平均、分散を決めて)素晴らしいプレイをすることに似ている。大関先生の考えに自分の言葉も追加したくて作った比喩。

生成モデルの作成具体例(コード)

高校生5人の身長から高校生の身長10人を生成
1 モデル化を正規分布と決める
2 サンプルの平均、分散を求める

import numpy as np

# 高校生5人の身長サンプルデータ
data = np.array([1.7,1.6,1.75,1.65,1.68])

# 平均の最尤推定量
mu_hat = np.mean(data)

# 分散の最尤推定量
sigma_hat = np.var(data, ddof=0)

# 推定されたモデルを用いて新しいサンプルを生成
generated_samples = np.random.normal(mu_hat, np.sqrt(sigma_hat), 10)

print("生成された高校生の身長サンプル:")
print(generated_samples)

参考文献

あとがき(本編はここまでで終わっている)

初めて情報共有サイトに投稿しました。
慣れてないので、修正や参照先の情報など、記事修正すると思います。ご容赦ください。
AI中心に、書いていきます。

この記事の関連として、以下の内容も別記事として書きたいです。
尤度と対数尤度(対数関数は単調増加関数)
積の対数は対数の和
微分を使って最大値を探す(解析的に解ける)
正規分布の最尤推定のパラメータが平均、分散となる導出過程 (確率密度⇒偏微分(平均、分散)⇒0になる値を求める)
確率分布からの確率の計算(累積分布関数)
サンプルの個々データは独立に生成されている仮定の問題点

記事よかったら、いいね♡ ボタン押していただけると嬉しいです。

Discussion