Skip to content

ClasCat® AI Research

クラスキャット – 生成 AI, AI エージェント, MCP

Menu
  • ホーム
    • ClassCat® AI Research ホーム
    • クラスキャット・ホーム
  • OpenAI API
    • OpenAI Python ライブラリ 1.x : 概要
    • OpenAI ブログ
      • GPT の紹介
      • GPT ストアの紹介
      • ChatGPT Team の紹介
    • OpenAI platform 1.x
      • Get Started : イントロダクション
      • Get Started : クイックスタート (Python)
      • Get Started : クイックスタート (Node.js)
      • Get Started : モデル
      • 機能 : 埋め込み
      • 機能 : 埋め込み (ユースケース)
      • ChatGPT : アクション – イントロダクション
      • ChatGPT : アクション – Getting started
      • ChatGPT : アクション – アクション認証
    • OpenAI ヘルプ : ChatGPT
      • ChatGPTとは何ですか?
      • ChatGPT は真実を語っていますか?
      • GPT の作成
      • GPT FAQ
      • GPT vs アシスタント
      • GPT ビルダー
    • OpenAI ヘルプ : ChatGPT > メモリ
      • FAQ
    • OpenAI ヘルプ : GPT ストア
      • 貴方の GPT をフィーチャーする
    • OpenAI Python ライブラリ 0.27 : 概要
    • OpenAI platform
      • Get Started : イントロダクション
      • Get Started : クイックスタート
      • Get Started : モデル
      • ガイド : GPT モデル
      • ガイド : 画像生成 (DALL·E)
      • ガイド : GPT-3.5 Turbo 対応 微調整
      • ガイド : 微調整 1.イントロダクション
      • ガイド : 微調整 2. データセットの準備 / ケーススタディ
      • ガイド : 埋め込み
      • ガイド : 音声テキスト変換
      • ガイド : モデレーション
      • ChatGPT プラグイン : イントロダクション
    • OpenAI Cookbook
      • 概要
      • API 使用方法 : レート制限の操作
      • API 使用方法 : tiktoken でトークンを数える方法
      • GPT : ChatGPT モデルへの入力をフォーマットする方法
      • GPT : 補完をストリームする方法
      • GPT : 大規模言語モデルを扱う方法
      • 埋め込み : 埋め込みの取得
      • GPT-3 の微調整 : 分類サンプルの微調整
      • DALL-E : DALL·E で 画像を生成して編集する方法
      • DALL·E と Segment Anything で動的マスクを作成する方法
      • Whisper プロンプティング・ガイド
  • Gemini API
    • Tutorials : クイックスタート with Python (1) テキスト-to-テキスト生成
    • (2) マルチモーダル入力 / 日本語チャット
    • (3) 埋め込みの使用
    • (4) 高度なユースケース
    • クイックスタート with Node.js
    • クイックスタート with Dart or Flutter (1) 日本語動作確認
    • Gemma
      • 概要 (README)
      • Tutorials : サンプリング
      • Tutorials : KerasNLP による Getting Started
  • Keras 3
    • 新しいマルチバックエンド Keras
    • Keras 3 について
    • Getting Started : エンジニアのための Keras 入門
    • Google Colab 上のインストールと Stable Diffusion デモ
    • コンピュータビジョン – ゼロからの画像分類
    • コンピュータビジョン – 単純な MNIST convnet
    • コンピュータビジョン – EfficientNet を使用した微調整による画像分類
    • コンピュータビジョン – Vision Transformer による画像分類
    • コンピュータビジョン – 最新の MLPモデルによる画像分類
    • コンピュータビジョン – コンパクトな畳込み Transformer
    • Keras Core
      • Keras Core 0.1
        • 新しいマルチバックエンド Keras (README)
        • Keras for TensorFlow, JAX, & PyTorch
        • 開発者ガイド : Getting started with Keras Core
        • 開発者ガイド : 関数型 API
        • 開発者ガイド : シーケンシャル・モデル
        • 開発者ガイド : サブクラス化で新しい層とモデルを作成する
        • 開発者ガイド : 独自のコールバックを書く
      • Keras Core 0.1.1 & 0.1.2 : リリースノート
      • 開発者ガイド
      • Code examples
      • Keras Stable Diffusion
        • 概要
        • 基本的な使い方 (テキスト-to-画像 / 画像-to-画像変換)
        • 混合精度のパフォーマンス
        • インペインティングの簡易アプリケーション
        • (参考) KerasCV – Stable Diffusion を使用した高性能画像生成
  • TensorFlow
    • TF 2 : 初級チュートリアル
    • TF 2 : 上級チュートリアル
    • TF 2 : ガイド
    • TF 1 : チュートリアル
    • TF 1 : ガイド
  • その他
    • 🦜️🔗 LangChain ドキュメント / ユースケース
    • Stable Diffusion WebUI
      • Google Colab で Stable Diffusion WebUI 入門
      • HuggingFace モデル / VAE の導入
      • LoRA の利用
    • Diffusion Models / 拡散モデル
  • クラスキャット
    • 会社案内
    • お問合せ
    • Facebook
    • ClassCat® Blog
Menu

TensorFlow : Edward Tutorials : 混合分布モデル (教師なし学習)

Posted on 10/21/2018 by Sales Information

TensorFlow : Edward : 混合分布モデル (教師なし学習) (翻訳/解説)

翻訳 : (株)クラスキャット セールスインフォメーション
更新日時 : 11/15 (v0.5.0), 11/02/2018
作成日時 : 10/21/2018

* 本ページは、Edward サイトの Tutorials : Unsupervised Learning を翻訳した上で適宜、補足説明したものです:

  • http://edwardlib.org/tutorials/unsupervised

* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。

 

混合分布モデル (教師なし学習)

教師なし学習では、タスクは訓練サンプル $\{x_n\}$ から成る、ラベル付けされていないデータから隠れ構造を推論します。

Edward の例で示します。Jupyter notebook による対話的バージョンは こちら で利用可能です。

 

データ

2-次元データポイント $\mathbf{x}_n\in\mathbb{R}^2$ のシミュレートされたデータセットを使用します。

def build_toy_dataset(N):
  pi = np.array([0.4, 0.6])
  mus = [[1, 1], [-1, -1]]
  stds = [[0.1, 0.1], [0.1, 0.1]]
  x = np.zeros((N, 2), dtype=np.float32)
  for n in range(N):
    k = np.argmax(np.random.multinomial(1, pi))
    x[n, :] = np.random.multivariate_normal(mus[k], np.diag(stds[k]))

  return x

N = 500  # number of data points
D = 2  # dimensionality of data

x_train = build_toy_dataset(N)

生成されたデータポイントを可視化します。

plt.scatter(x_train[:, 0], x_train[:, 1])
plt.axis([-3, 3, -3, 3])
plt.show()

 

モデル

混合分布モデル (= mixture model) は典型的にはクラスタリングのために使用されるモデルです。それは各データポイントに混合成分 (= mixture component) を割り当てて、この混合成分はデータポイントが生成される分布を決定します。ガウシアン混合分布 はこのデータを生成するためにガウシアン分布を使用します (Bishop, 2006)。

$N$ データポイントのセットについて、各観測 $\mathbf{x}_n$ の尤度は :

\[
\begin{aligned}
p(\mathbf{x}_n \mid \pi, \mu, \sigma)
&=
\sum_{k=1}^K \pi_k \, \text{Normal}(\mathbf{x}_n \mid \mu_k, \sigma_k).\end{aligned}
\]

潜在変数 $\pi$ は $K$-次元確率ベクトルで個々のガウス分布を混合します、それぞれは平均 $\mu_k$ と標準偏差 $\sigma_k$ で特徴付けられます。

$\sum_{k=1}^K\pi_k=1$ であるような $\pi\in[0,1]$ 上の事前分布を (固定された $\alpha=1$ に対して)

\[
\begin{aligned}
p(\pi)
&=
\text{Dirichlet}(\pi \mid \alpha \mathbf{1}_{K})\end{aligned}
\]

と定義します。各成分 $\mathbf{\mu}_k\in\mathbb{R}^D$ 上の事前分布を

\[
\begin{aligned}
p(\mathbf{\mu}_k)
&=
\text{Normal}(\mathbf{\mu}_k \mid \mathbf{0}, \mathbf{I})\end{aligned}
\]

と定義します。各成分 $\mathbf{\sigma}_k^2\in\mathbb{R}^D$ 上の事前分布を

\[
\begin{aligned}
p(\mathbf{\sigma}_k^2)
&=
\text{InverseGamma}(\mathbf{\sigma}_k^2 \mid a, b)\end{aligned}
\]

と定義します。

私達は Edward でモデルの 2 つのバージョンを構築します: 一つは潜在変数として混合割り当て $c_n\in\{0,\ldots,K-1\}$ を結合的に (= jointly) 伴い、そしてもう一つはそれらを総計したものを伴います。

結合バージョンは混合割り当てに対して明示的な潜在変数を含みます。私達はこれを ParamMixture 確率変数で実装します; それは入力として混合確率、成分のパラメータ、そして成分の分布を取ります。(これを最初に z に対する ‘Categorical‘ 確率変数を構築してから x を構築することにより別々に書くこともまたできることに注意してください; ParamMixture は tf.gather の要求を回避します、それは少しだけより効率的です。)

from edward.models import Dirichlet, InverseGamma, MultivariateNormalDiag, \
    Normal, ParamMixture

K = 2  # number of components

pi = Dirichlet(tf.ones(K))
mu = Normal(tf.zeros(D), tf.ones(D), sample_shape=K)
sigmasq = InverseGamma(tf.ones(D), tf.ones(D), sample_shape=K)
x = ParamMixture(pi, {'loc': mu, 'scale_diag': tf.sqrt(sigmasq)},
                 MultivariateNormalDiag,
                 sample_shape=N)
z = x.cat

崩壊型 (= collapsed) バージョンは混合割り当てを重視しません。これを Mixture 確率変数で実装します; それは入力として Categorical 分布と個々の分布成分のリストを取ります。それは混合割り当てを総計した (= sum out) 混合分布です。

from edward.models import Categorical, Dirichlet, InverseGamma, Mixture, \
    MultivariateNormalDiag, Normal

K = 2  # number of components

pi = Dirichlet(tf.ones(K))
mu = Normal(tf.zeros(D), tf.ones(D), sample_shape=K)
sigma = InverseGamma(tf.ones(D), tf.ones(D), sample_shape=K)
cat = Categorical(probs=pi, sample_shape=N)
components = [
    MultivariateNormalDiag(mu[k], sigma[k], sample_shape=N)
    for k in range(K)]
x = Mixture(cat=cat, components=components)

この解析では結合バージョンを使用します。

 

推論

モデルの各分布は共役事前分布で書かれますので、Gibbs サンプリングを使用できます。それは各分布の完全条件付き分布 (= complete conditionals) (i.e. 前にドローされた値上で条件付けられた各分布) からのドローに渡る反復によりマルコフ連鎖モンテカルロを遂行します。最初に Empirical 確率変数をセットアップします、これはサンプルのコレクションを使用して事後分布を近似します。

T = 500  # number of MCMC samples
qpi = Empirical(tf.get_variable(
    "qpi/params", [T, K],
    initializer=tf.constant_initializer(1.0 / K)))
qmu = Empirical(tf.get_variable(
    "qmu/params", [T, K, D],
    initializer=tf.zeros_initializer()))
qsigmasq = Empirical(tf.get_variable(
    "qsigmasq/params", [T, K, D],
    initializer=tf.ones_initializer()))
qz = Empirical(tf.get_variable(
    "qz/params", [T, N],
    initializer=tf.zeros_initializer(),
    dtype=tf.int32))

Gibbs サンプリングを実行します、クラスター mean をサンプラー進捗として追跡できるように訓練ループを明示的に書きます。

inference = ed.Gibbs({pi: qpi, mu: qmu, sigmasq: qsigmasq, z: qz},
                     data={x: x_train})
inference.initialize()

sess = ed.get_session()
tf.global_variables_initializer().run()

t_ph = tf.placeholder(tf.int32, [])
running_cluster_means = tf.reduce_mean(qmu.params[:t_ph], 0)

for _ in range(inference.n_iter):
  info_dict = inference.update()
  inference.print_progress(info_dict)
  t = info_dict['t']
  if t % inference.n_print == 0:
    print("\nInferred cluster means:")
    print(sess.run(running_cluster_means, {t_ph: t - 1}))

訓練の間に追跡された推論されたクラスタ mean については関連する Jupyter notebook を見てください。

 

批評

各データポイントの予測されたメンバーシップを可視化します。各データポイントに対する最高事後予測密度 (= the highest posterior predictive density) を生成するクラスタ割り当てを選択します。

これを行なうために、最初に事後分布からサンプルをドローして対数尤度の $N\times K$ 行列を計算します、各データポイント $\mathbf{x}_n$ とクラスタ割り当て $k$ のために一つです。100 事後分布サンプルに渡りこれを平均化して遂行します。

# Calculate likelihood for each data point and cluster assignment,
# averaged over many posterior samples. ``x_post`` has shape (N, 100, K, D).
mu_sample = qmu.sample(100)
sigmasq_sample = qsigmasq.sample(100)
x_post = Normal(loc=tf.ones([N, 1, 1, 1]) * mu_sample,
                scale=tf.ones([N, 1, 1, 1]) * tf.sqrt(sigmasq_sample))
x_broadcasted = tf.tile(tf.reshape(x_train, [N, 1, 1, D]), [1, 100, K, 1])

# Sum over latent dimension, then average over posterior samples.
# ``log_liks`` ends up with shape (N, K).
log_liks = x_post.log_prob(x_broadcasted)
log_liks = tf.reduce_sum(log_liks, 3)
log_liks = tf.reduce_mean(log_liks, 1)

それからカラムに沿って $\arg\max$ を取ります (クラスタ割り当て)。

clusters = tf.argmax(log_liks, 1).eval()

データポイントをそれらの予測されたメンバーシップにより彩色してプロットします。

plt.scatter(x_train[:, 0], x_train[:, 1], c=clusters, cmap=cm.bwr)
plt.axis([-3, 3, -3, 3])
plt.title("Predicted cluster assignments")
plt.show()

モデルはデータを正しくクラスタリングしました。

 

References

  • Bishop, C. M. (2006). Pattern recognition and machine learning. Springer New York.
 

以上






クラスキャット

最近の投稿

  • Agno : コンセプト :- ツールキット : 検索 (Arxiv, DuckDuckGo, Exa, Google Search 等)
  • Agno : コンセプト : ツール – Human in the loop
  • Agno : コンセプト : ツール – 例外, フック
  • Agno : コンセプト : ツール – 概要 / 独自ツールの作成
  • Agno : コンセプト : モデル – 概要, OpenAI, Anthropic Claude

タグ

Agno (28) AutoGen (13) ClassCat Press Release (20) ClassCat TF/ONNX Hub (11) DGL 0.5 (14) Eager Execution (7) Edward (17) FLUX.1 (16) Gemini (20) HuggingFace Transformers 4.5 (10) HuggingFace Transformers 4.6 (7) HuggingFace Transformers 4.29 (9) Keras 2 Examples (98) Keras 2 Guide (16) Keras 3 (10) Keras Release Note (17) Kubeflow 1.0 (10) LangChain (45) LangGraph (24) LangGraph 0.5 (9) MediaPipe 0.8 (11) Model Context Protocol (16) NNI 1.5 (16) OpenAI Agents SDK (8) OpenAI Cookbook (13) OpenAI platform (10) OpenAI platform 1.x (10) OpenAI ヘルプ (8) TensorFlow 2.0 Advanced Tutorials (33) TensorFlow 2.0 Advanced Tutorials (Alpha) (15) TensorFlow 2.0 Advanced Tutorials (Beta) (16) TensorFlow 2.0 Guide (10) TensorFlow 2.0 Guide (Alpha) (16) TensorFlow 2.0 Guide (Beta) (9) TensorFlow 2.0 Release Note (12) TensorFlow 2.0 Tutorials (20) TensorFlow 2.0 Tutorials (Alpha) (14) TensorFlow 2.0 Tutorials (Beta) (12) TensorFlow 2.4 Guide (24) TensorFlow Deploy (8) TensorFlow Probability (9) TensorFlow Programmer's Guide (22) TensorFlow Release Note (18) TensorFlow Tutorials (33) TF-Agents 0.4 (11)
2018年10月
月 火 水 木 金 土 日
1234567
891011121314
15161718192021
22232425262728
293031  
« 9月   11月 »
© 2025 ClasCat® AI Research | Powered by Minimalist Blog WordPress Theme