質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.82%

Log probabilityの計算

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 332

teefpc

score 68

import torch
from torch.distributions import Categorical

# 40%と60%で確率を設定
probs = torch.tensor([0.4, 0.6]])
# カテゴリカル分布クラスをインスタンス化
m = Categorical(probs)
# サンプリング
action = m.sample()
log_prob = m.log_prob(action)


この確率分布クラスは毎回サンプリング値が異なりますが、具体的に、どのような計算を行っているのしょうか。参考ページPROBABILITY DISTRIBUTIONS - TORCH.DISTRIBUTIONS

multinomialを使っているので基本的には並べ替えを変えているようですが、それだけでしょうか。

 def sample(self, sample_shape=torch.Size()):
        sample_shape = self._extended_shape(sample_shape)
        param_shape = sample_shape + torch.Size((self._num_events,))
        probs = self.probs.expand(param_shape)
        probs_2d = probs.reshape(-1, self._num_events)
        sample_2d = torch.multinomial(probs_2d, 1, True)
        return sample_2d.reshape(sample_shape)
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

+1

質問のコードは表が出る確率が0.4、裏が出る確率が0.6のコインをトスしたとき、表裏のどちらが出るかをサンプリングするというものです。
当たり前ですが、裏の出る確率が高くても常に裏が出るとは限りません。これがサンプリングするたびに結果が異なる理由です。

結果が毎回異なるようにする実装は乱数を生成することで実現しています。ここからは想像になりますが、実装としては擬似乱数関数を使って一様分布の値を生成し、各確率分布の定義に沿って実際の乱数に変換しているのではないでしょうか。

なお、離散系の確率分布のベルヌーイ分布・二項分布・他項分布・カテゴリー分布は式変形により導出な関係です。もう少しざっくりいうとベルヌーイ分布を試行回数・クラス数を拡張させると他の分布になります。よって、コードを追いかけていくと最終的にベルヌーイ分布を擬似乱数関数で実装しているのではないでしょうか

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2020/04/08 20:44

    とても分かりやすいです

    キャンセル

+1

具体的に、どのような計算を行っているのしょうか。

Log probability は、確率値に対数をとったものです。

実装の話であれば、こちらでコードを見れます。

torch.distributions.categorical — PyTorch master documentation

追記

multinomialを使っているので基本的には並べ替えを変えているようですが、それだけでしょうか。

カテゴリカル分布は、多項分布で N = 1 とした場合なので、torch.multinomial(probs_2d, 1, True) で計算しています。

ややこしい離散分布に関するまとめ - 作って遊ぶ機械学習。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る