Распределения вероятностей - torch.distributions
Пакет distributions содержит параметризуемые распределения вероятностей и функции для генерации случайных выборок. Это позволяет создавать стохастические вычислительные графы и стохастические градиентные оценки для оптимизации. Данный пакет в целом следует структуре пакета TensorFlow Distributions.
Невозможно напрямую выполнить обратное распространение (backpropagation) через случайные выборки. Однако существуют два основных метода для создания замещающих функций, через которые можно выполнить обратное распространение градиента. Это метод оценки функции скора/оценки отношения правдоподобия/REINFORCE и метод оценки производной по траектории. REINFORCE часто используется в качестве основы для методов градиента политики в обучении с подкреплением, а метод оценки производной по траектории — в методе перепараметризации в вариационных автоэнкодерах. В то время как функция скора требует только значения выборок , метод оценки производной по траектории требует производной . В следующих разделах эти методы будут рассмотрены на примере обучения с подкреплением. Подробнее см. Gradient Estimation Using Stochastic Computation Graphs.
Функция скора
Когда функция плотности вероятности дифференцируема по своим параметрам, нам необходимо sample() и log_prob() для реализации REINFORCE:
где — параметры, — скорость обучения, — вознаграждение, и — вероятность выполнения действия в состоянии с использованием политики .
На практике мы бы сгенерировали действие из выходного сигнала сети, применили его в среде и затем использовали log_prob для построения эквивалентной функции потерь. Обратите внимание, что мы используем знак минус, так как оптимизаторы используют метод градиентного спуска, в то время как приведенное выше правило предполагает метод градиентного восхождения. При использовании категориальной политики код для реализации REINFORCE будет следующим:
probs = policy_network(state) # Note that this is equivalent to what used to be called multinomial m = Categorical(probs) action = m.sample() next_state, reward = env.step(action) loss = -m.log_prob(action) * reward loss.backward()
Метод оценки производной по траектории
Другой способ реализации этих стохастических/полицейских градиентов — использование метода перепараметризации из rsample() метода, где параметризованная случайная величина может быть построена с помощью параметризованной детерминированной функции от свободной от параметров случайной величины. Таким образом, перепараметризованная выборка становится дифференцируемой. Код для реализации метода оценки производной по траектории будет следующим:
params = policy_network(state) m = Normal(*params) # Any distribution with .has_rsample == True could work based on the application action = m.rsample() next_state, reward = env.step(action) # Assuming that reward is differentiable loss = -reward loss.backward()
Распределение
-
class torch.distributions.distribution.Distribution(batch_shape=torch.Size([]), event_shape=torch.Size([]), validate_args=None)[source]
-
Bases:
objectРаспределение — это абстрактный базовый класс для распределений вероятностей.
-
property arg_constraints: Dict[str, Constraint] -
Возвращает словарь, где ключами являются имена аргументов, а значениями — объекты
Constraint, которые должны удовлетворяться каждым аргументом этого распределения. Аргументы, которые не являются тензорами, необязательно должны присутствовать в этом словаре.
-
property batch_shape: Size -
Возвращает форму, по которой параметры сгруппированы.
-
cdf(value)[source] -
Возвращает функцию накопленной плотности/массы, вычисленную в
value.
-
entropy()[source] -
Возвращает энтропию распределения, сгруппированную по форме `batch_shape`.
- Returns
-
Тензор формы `batch_shape`.
- Return type
-
enumerate_support(expand=True)[source] -
Возвращает тензор, содержащий все значения, поддерживаемые дискретным распределением. Результат будет перебирать размерность 0, поэтому форма результата будет
(cardinality,) + batch_shape + event_shape(гдеevent_shape = ()для одномерных распределений).Обратите внимание, что это перебирает все сгруппированные тензоры последовательно
[[0, 0], [1, 1], …]. Сexpand=Falseперечисление происходит по размерности 0, но остальные размерности группы становятся одномерными[[0], [1], ...Для перебора всей декартовой суммы используйте
itertools.product(m.enumerate_support()).
-
property event_shape: Size -
Возвращает форму одного образца (без группировки).
-
expand(batch_shape, _instance=None)[source] -
Возвращает новый экземпляр распределения (или заполняет существующий экземпляр, предоставленный производным классом) с расширенными размерностями группы до
batch_shape. Этот метод вызываетexpandдля параметров распределения. Таким образом, для экземпляра расширенного распределения не выделяется новая память. Кроме того, это не повторяет проверку аргументов или распределение параметров в__init__.pyпри первом создании экземпляра.- Parameters
-
- batch_shape (torch.Size) – желаемая расширенная форма.
-
_instance – новый экземпляр, предоставленный подклассами, которые должны переопределить
.expand.
- Returns
-
Новый экземпляр распределения с расширенными размерностями группы до
batch_size.
-
icdf(value)[source] -
Возвращает обратную функцию накопленной плотности/массы, вычисленную в
value.
-
log_prob(value)[source] -
Возвращает логарифм функции плотности/массы вероятности, вычисленной в
value.
-
property mean: Tensor -
Возвращает среднее значение распределения.
-
property mode: Tensor -
Возвращает моду распределения.
-
perplexity()[source] -
Возвращает сложность распределения, сгруппированную по форме `batch_shape`.
- Returns
-
Тензор формы `batch_shape`.
- Return type
-
rsample(sample_shape=torch.Size([]))[source] -
Генерирует образец формы `sample_shape` или пакет образцов формы `sample_shape`, если параметры распределения сгруппированы.
- Return type
-
sample(sample_shape=torch.Size([]))[source] -
Генерирует образец формы `sample_shape` или пакет образцов формы `sample_shape`, если параметры распределения сгруппированы.
- Return type
-
sample_n(n)[source] -
Генерирует n образцов или n пакетов образцов, если параметры распределения сгруппированы.
- Return type
-
static set_default_validate_args(value)[source] -
Устанавливает, включена или отключена проверка.
Поведение по умолчанию соответствует утверждению Python’s
assert: проверка включена по умолчанию, но отключена, если Python запускается в оптимизированном режиме (черезpython -O). Проверка может быть дорогостоящей, поэтому вы можете отключить её, когда модель работает.- Parameters
-
value (bool) – Включить ли проверку.
-
property stddev: Tensor -
Возвращает стандартное отклонение распределения.
-
-
property support: Optional[Any] -
Возвращает объект
Constraint, представляющий область определения данного распределения.
-
property variance: Tensor -
Возвращает дисперсию распределения.
-
Семейство экспоненциальных распределений
-
class torch.distributions.exp_family.ExponentialFamily(batch_shape=torch.Size([]), event_shape=torch.Size([]), validate_args=None)[source] -
Базовый класс для вероятностных распределений, принадлежащих семейству экспоненциальных распределений, функция вероятностной массы/плотности которого имеет вид:
где обозначает естественные параметры, обозначает достаточную статистику, — функция логарифмической нормировки для данного семейства, а — мера носителя.
Примечание
Этот класс является промежуточным звеном между классом
Distributionи распределениями, принадлежащими семейству экспоненциальных распределений, главным образом для проверки правильности методов.entropy()и аналитического расчета расхождения Кульбака-Лейблера. Мы используем этот класс для вычисления энтропии и расхождения Кульбака-Лейблера с помощью метода автоматической дифференциации и брегмановских расхождений (благодаря: Франку Нильсену и Ричарду Ноку, Энтропии и кросс-энтропии экспоненциальных семейств).-
entropy()[source] -
Метод для вычисления энтропии с использованием брегмановского расхождения логарифмической нормировки.
-
Биномиальное распределение
-
class torch.distributions.bernoulli.Bernoulli(probs=None, logits=None, validate_args=None)[source] -
Создаёт биномиальное распределение, параметризованное значением
probsилиlogits(но не обоими).Образцы являются двоичными (0 или 1). Они принимают значение
1с вероятностьюpи значение0с вероятностью1 - p.Пример:
>>> m = Bernoulli(torch.tensor([0.3])) >>> m.sample() # 30% chance 1; 70% chance 0 tensor([ 0.])
- Параметры
-
arg_constraints = {'logits': Real(), 'probs': Interval(lower_bound=0.0, upper_bound=1.0)}
-
entropy()[source]
-
enumerate_support(expand=True)[source]
-
expand(batch_shape, _instance=None)[source]
-
has_enumerate_support = True
-
log_prob(value)[source]
-
property logits
-
property mean
-
property mode
-
property param_shape
-
property probs
-
sample(sample_shape=torch.Size([]))[source]
-
support = Boolean()
-
property variance
Бета-распределение
-
class torch.distributions.beta.Beta(concentration1, concentration0, validate_args=None)[source] -
Bases:
ExponentialFamilyРаспределение Бета, параметризованное значениями
concentration1иconcentration0.Пример:
>>> m = Beta(torch.tensor([0.5]), torch.tensor([0.5])) >>> m.sample() # Beta distributed with concentration concentration1 and concentration0 tensor([ 0.1046])
- Параметры
-
arg_constraints = {'concentration0': GreaterThan(lower_bound=0.0), 'concentration1': GreaterThan(lower_bound=0.0)}
-
property concentration0
-
property concentration1
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
log_prob(value)[source]
-
property mean
-
property mode
-
rsample(sample_shape=())[source]
-
support = Interval(lower_bound=0.0, upper_bound=1.0)
-
property variance
Биномиальное
-
class torch.distributions.binomial.Binomial(total_count=1, probs=None, logits=None, validate_args=None)[source] -
Bases:
DistributionСоздаёт биномиальное распределение, параметризованное значением
total_countи либоprobs, либоlogits(но не оба).total_countдолжно быть совместимо по правилам трансляции сprobs/logits.Пример:
>>> m = Binomial(100, torch.tensor([0 , .2, .8, 1])) >>> x = m.sample() tensor([ 0., 22., 71., 100.]) >>> m = Binomial(torch.tensor([[5.], [10.]]), torch.tensor([0.5, 0.8])) >>> x = m.sample() tensor([[ 4., 5.], [ 7., 6.]])- Параметры
-
arg_constraints = {'logits': Real(), 'probs': Interval(lower_bound=0.0, upper_bound=1.0), 'total_count': IntegerGreaterThan(lower_bound=0)}
-
entropy()[source]
-
enumerate_support(expand=True)[source]
-
expand(batch_shape, _instance=None)[source]
-
has_enumerate_support = True
-
log_prob(value)[source]
-
property logits
-
property mean
-
property mode
-
property param_shape
-
property probs
-
sample(sample_shape=torch.Size([]))[source]
-
property support
-
property variance
Категориальное
-
class torch.distributions.categorical.Categorical(probs=None, logits=None, validate_args=None)[source] -
Bases:
DistributionСоздаёт категориальное распределение, параметризованное либо
probs, либоlogits(но не оба сразу).Примечание
Это эквивалентно распределению, из которого
torch.multinomial()осуществляет выборку.Выборка — это целые числа из , где
Kравноprobs.size(-1).Если
probsодномерно и имеет длинуK, каждый элемент является относительной вероятностью выбора класса в этом индексе.Если
probsимеет N-мерность, первые N-1 измерения обрабатываются как набор векторов относительных вероятностей.Примечание
Аргумент
probsдолжен быть неотрицательным, конечным и иметь ненулевую сумму, и он будет нормирован так, чтобы сумма по последнему измерению была равна 1.probsвернёт это нормированное значение. Аргументlogitsбудет интерпретирован как ненормализованные логарифмические вероятности и может, следовательно, быть любым действительным числом. Он также будет нормирован таким образом, что результирующие вероятности суммируются до 1 по последнему измерению.logitsвернёт это нормированное значение.См. также:
torch.multinomial()Пример:
>>> m = Categorical(torch.tensor([ 0.25, 0.25, 0.25, 0.25 ])) >>> m.sample() # equal probability of 0, 1, 2, 3 tensor(3)
- Параметры
-
arg_constraints = {'logits': IndependentConstraint(Real(), 1), 'probs': Simplex()}
-
entropy()[source]
-
enumerate_support(expand=True)[source]
-
expand(batch_shape, _instance=None)[source]
-
has_enumerate_support = True
-
log_prob(value)[source]
-
property logits
-
property mean
-
property mode
-
property param_shape
-
property probs
-
sample(sample_shape=torch.Size([]))[source]
-
property support
-
property variance
Cauchy
-
class torch.distributions.cauchy.Cauchy(loc, scale, validate_args=None)[source] -
Bases:
DistributionВыборка из распределения Коши (Лоренца). Распределение отношения независимых нормально распределённых случайных величин со средними
0следует распределению Коши.Пример:
>>> m = Cauchy(torch.tensor([0.0]), torch.tensor([1.0])) >>> m.sample() # sample from a Cauchy distribution with loc=0 and scale=1 tensor([ 2.3214])
- Параметры
-
arg_constraints = {'loc': Real(), 'scale': GreaterThan(lower_bound=0.0)}
-
cdf(value)[source]
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
icdf(value)[source]
-
log_prob(value)[source]
-
property mean
-
property mode
-
rsample(sample_shape=torch.Size([]))[source]
-
support = Real()
-
property variance
Chi2
-
class torch.distributions.chi2.Chi2(df, validate_args=None)[source] -
Bases:
GammaСоздаёт распределение хи-квадрат, параметризованное параметром формы
df. Это точно эквивалентноGamma(alpha=0.5*df, beta=0.5)Пример:
>>> m = Chi2(torch.tensor([1.0])) >>> m.sample() # Chi2 distributed with shape df=1 tensor([ 0.1046])
-
arg_constraints = {'df': GreaterThan(lower_bound=0.0)}
-
property df
-
expand(batch_shape, _instance=None)[source]
-
НепрерывныйБернулли
-
class torch.distributions.continuous_bernoulli.ContinuousBernoulli(probs=None, logits=None, lims=(0.499, 0.501), validate_args=None)[source] -
Bases:
ExponentialFamilyСоздаёт распределение непрерывного Бернулли, параметризованное
probsилиlogits(но не оба).Распределение поддерживается в [0, 1] и параметризуется ‘probs’ (в (0,1)) или ‘logits’ (вещественные значения). Обратите внимание, что, в отличие от Бернулли, ‘probs’ не соответствует вероятности, а ‘logits’ не соответствует логарифму шансов, но используются те же названия из-за сходства с Бернулли. Подробнее см. [1].
Пример:
>>> m = ContinuousBernoulli(torch.tensor([0.3])) >>> m.sample() tensor([ 0.2538])
- Parameters
[1] Непрерывный Бернулли: исправление распространённой ошибки в вариационных автоэнкодерах, Loaiza-Ganem G и Cunningham JP, NeurIPS 2019. https://arxiv.org/abs/1907.06845
-
arg_constraints = {'logits': Real(), 'probs': Interval(lower_bound=0.0, upper_bound=1.0)}
-
cdf(value)[source]
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
icdf(value)[source]
-
log_prob(value)[source]
-
property logits
-
property mean
-
property param_shape
-
property probs
-
rsample(sample_shape=torch.Size([]))[source]
-
sample(sample_shape=torch.Size([]))[source]
-
property stddev
-
support = Interval(lower_bound=0.0, upper_bound=1.0)
-
property variance
Дирихле
-
class torch.distributions.dirichlet.Dirichlet(concentration, validate_args=None)[source] -
Bases:
ExponentialFamilyСоздаёт распределение Дирихле, параметризованное концентрацией
concentration.Пример:
>>> m = Dirichlet(torch.tensor([0.5, 0.5])) >>> m.sample() # Dirichlet distributed with concentration [0.5, 0.5] tensor([ 0.1046, 0.8954])
- Parameters
-
concentration (Tensor) – параметр концентрации распределения (часто обозначаемый как alpha)
-
arg_constraints = {'concentration': IndependentConstraint(GreaterThan(lower_bound=0.0), 1)}
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
log_prob(value)[source]
-
property mean
-
property mode
-
rsample(sample_shape=())[source]
-
support = Simplex()
-
property variance
Экспоненциальное
-
class torch.distributions.exponential.Exponential(rate, validate_args=None)[source] -
Bases:
ExponentialFamilyСоздаёт распределение Экспоненциального типа, параметризованное через
rate.Пример:
>>> m = Exponential(torch.tensor([1.0])) >>> m.sample() # Exponential distributed with rate=1 tensor([ 0.1046])
-
arg_constraints = {'rate': GreaterThan(lower_bound=0.0)}
-
cdf(value)[source]
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
icdf(value)[source]
-
log_prob(value)[source]
-
property mean
-
property mode
-
rsample(sample_shape=torch.Size([]))[source]
-
property stddev
-
support = GreaterThanEq(lower_bound=0.0)
-
property variance
-
Фишера-Снедекора
-
class torch.distributions.fishersnedecor.FisherSnedecor(df1, df2, validate_args=None)[source] -
Bases:
DistributionСоздаёт распределение Фишера-Снедекора, параметризованное через
df1иdf2.Пример:
>>> m = FisherSnedecor(torch.tensor([1.0]), torch.tensor([2.0])) >>> m.sample() # Fisher-Snedecor-distributed with df1=1 and df2=2 tensor([ 0.2453])
- Параметры
-
arg_constraints = {'df1': GreaterThan(lower_bound=0.0), 'df2': GreaterThan(lower_bound=0.0)}
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
log_prob(value)[source]
-
property mean
-
property mode
-
rsample(sample_shape=torch.Size([]))[source]
-
support = GreaterThan(lower_bound=0.0)
-
property variance
Гамма
-
class torch.distributions.gamma.Gamma(concentration, rate, validate_args=None)[source] -
Bases:
ExponentialFamilyСоздаёт распределение Гамма-типа, параметризованное через shape
concentrationиrate.Пример:
>>> m = Gamma(torch.tensor([1.0]), torch.tensor([1.0])) >>> m.sample() # Gamma distributed with concentration=1 and rate=1 tensor([ 0.1046])
- Параметры
-
arg_constraints = {'concentration': GreaterThan(lower_bound=0.0), 'rate': GreaterThan(lower_bound=0.0)}
-
cdf(value)[source]
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
log_prob(value)[source]
-
property mean
-
property mode
-
rsample(sample_shape=torch.Size([]))[source]
-
support = GreaterThanEq(lower_bound=0.0)
-
property variance
Геометрическое
-
class torch.distributions.geometric.Geometric(probs=None, logits=None, validate_args=None)[source] -
Основы:
DistributionСоздаёт геометрическое распределение, параметризованное
probs, гдеprobs— вероятность успеха в Бернуллииских испытаниях. Оно представляет вероятность того, что в Бернуллииских испытаниях первые испытания будут неуспешными, прежде чем произойдёт успех.Образцы являются неотрицательными целыми числами [0, ).
Пример:
>>> m = Geometric(torch.tensor([0.3])) >>> m.sample() # underlying Bernoulli has 30% chance 1; 70% chance 0 tensor([ 2.])
- Параметры
-
arg_constraints = {'logits': Real(), 'probs': Interval(lower_bound=0.0, upper_bound=1.0)}
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
log_prob(value)[source]
-
property logits
-
property mean
-
property mode
-
property probs
-
sample(sample_shape=torch.Size([]))[source]
-
support = IntegerGreaterThan(lower_bound=0)
-
property variance
Гамбелл
-
class torch.distributions.gumbel.Gumbel(loc, scale, validate_args=None)[source] -
Основы:
TransformedDistributionОбразцы из распределения Гамбелла.
Примеры:
>>> m = Gumbel(torch.tensor([1.0]), torch.tensor([2.0])) >>> m.sample() # sample from Gumbel distribution with loc=1, scale=2 tensor([ 1.0124])
- Параметры
-
arg_constraints: Dict[str, Constraint] = {'loc': Real(), 'scale': GreaterThan(lower_bound=0.0)}
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
log_prob(value)[source]
-
property mean
-
property mode
-
property stddev
-
support = Real()
-
property variance
Полукаучи
-
class torch.distributions.half_cauchy.HalfCauchy(scale, validate_args=None)[source] -
Основы:
TransformedDistributionСоздаёт полукаучи распределение, параметризованное
scale, где:X ~ Cauchy(0, scale) Y = |X| ~ HalfCauchy(scale)
Пример:
>>> m = HalfCauchy(torch.tensor([1.0])) >>> m.sample() # half-cauchy distributed with scale=1 tensor([ 2.3214])
-
arg_constraints: Dict[str, Constraint] = {'scale': GreaterThan(lower_bound=0.0)}
-
cdf(value)[source]
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
icdf(prob)[source]
-
log_prob(value)[source]
-
property mean
-
property mode
-
property scale
-
support = GreaterThanEq(lower_bound=0.0)
-
property variance
-
Полунормальное
-
class torch.distributions.half_normal.HalfNormal(scale, validate_args=None)[source] -
Основы:
TransformedDistributionСоздаёт распределение полунормального распределения, параметризованное
scale, где:X ~ Normal(0, scale) Y = |X| ~ HalfNormal(scale)
Пример:
>>> m = HalfNormal(torch.tensor([1.0])) >>> m.sample() # half-normal distributed with scale=1 tensor([ 0.1046])
-
arg_constraints: Dict[str, Constraint] = {'scale': GreaterThan(lower_bound=0.0)}
-
cdf(value)[source]
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
icdf(prob)[source]
-
log_prob(value)[source]
-
property mean
-
property mode
-
property scale
-
support = GreaterThanEq(lower_bound=0.0)
-
property variance
-
Independent
-
class torch.distributions.independent.Independent(base_distribution, reinterpreted_batch_ndims, validate_args=None)[source] -
Основы:
DistributionПереинтерпретирует некоторые из размерностей пакетных данных распределения как размерности событий.
Это в основном полезно для изменения формы результата
log_prob(). Например, чтобы создать диагональное нормальное распределение с такой же формой, как и многомерное нормальное распределение (чтобы они были взаимозаменяемыми), можно:>>> from torch.distributions.multivariate_normal import MultivariateNormal >>> from torch.distributions.normal import Normal >>> loc = torch.zeros(3) >>> scale = torch.ones(3) >>> mvn = MultivariateNormal(loc, scale_tril=torch.diag(scale)) >>> [mvn.batch_shape, mvn.event_shape] [torch.Size([]), torch.Size([3])] >>> normal = Normal(loc, scale) >>> [normal.batch_shape, normal.event_shape] [torch.Size([3]), torch.Size([])] >>> diagn = Independent(normal, 1) >>> [diagn.batch_shape, diagn.event_shape] [torch.Size([]), torch.Size([3])]
- Параметры
-
- base_distribution (torch.distributions.distribution.Distribution) – базовое распределение
- reinterpreted_batch_ndims (int) – количество пакетных размерностей для переинтерпретации как размерностей событий
-
arg_constraints: Dict[str, Constraint] = {}
-
entropy()[source]
-
enumerate_support(expand=True)[source]
-
expand(batch_shape, _instance=None)[source]
-
property has_enumerate_support
-
property has_rsample
-
log_prob(value)[source]
-
property mean
-
property mode
-
rsample(sample_shape=torch.Size([]))[source]
-
sample(sample_shape=torch.Size([]))[source]
-
property support
-
property variance
Kumaraswamy
-
class torch.distributions.kumaraswamy.Kumaraswamy(concentration1, concentration0, validate_args=None)[source] -
Основы:
TransformedDistributionОбразцы из распределения Кумарасвами.
Пример:
>>> m = Kumaraswamy(torch.tensor([1.0]), torch.tensor([1.0])) >>> m.sample() # sample from a Kumaraswamy distribution with concentration alpha=1 and beta=1 tensor([ 0.1729])
- Параметры
-
arg_constraints: Dict[str, Constraint] = {'concentration0': GreaterThan(lower_bound=0.0), 'concentration1': GreaterThan(lower_bound=0.0)}
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
property mean
-
property mode
-
support = Interval(lower_bound=0.0, upper_bound=1.0)
-
property variance
LKJCholesky
-
class torch.distributions.lkj_cholesky.LKJCholesky(dim, concentration=1.0, validate_args=None)[source] -
Основы:
DistributionРаспределение LKJ для нижнего треугольного фактора Холеского корреляционных матриц. Распределение контролируется параметром
concentration, чтобы сделать вероятность корреляционной матрицы сгенерированной из фактора Холеского пропорциональной . Из-за этого, когдаconcentration == 1, мы получаем равномерное распределение по факторам Холеского корреляционных матриц:L ~ LKJCholesky(dim, concentration) X = L @ L' ~ LKJCorr(dim, concentration)
Обратите внимание, что это распределение генерирует фактор Холеского корреляционных матриц, а не сами корреляционные матрицы, и этим немного отличается от выкладок в [1] для распределения
LKJCorr. Для генерации случайных значений используется метод «Луковицы» из [1], раздел 3.Пример:
>>> l = LKJCholesky(3, 0.5) >>> l.sample() # l @ l.T is a sample of a correlation 3x3 matrix tensor([[ 1.0000, 0.0000, 0.0000], [ 0.3516, 0.9361, 0.0000], [-0.1899, 0.4748, 0.8593]])- Параметры
Ссылки
[1]
Generating random correlation matrices based on vines and extended onion method(2009), Daniel Lewandowski, Dorota Kurowicka, Harry Joe. Журнал многомерного анализа. 100. 10.1016/j.jmva.2009.04.008-
arg_constraints = {'concentration': GreaterThan(lower_bound=0.0)}
-
expand(batch_shape, _instance=None)[source]
-
log_prob(value)[source]
-
sample(sample_shape=torch.Size([]))[source]
-
support = CorrCholesky()
Лаплас
-
class torch.distributions.laplace.Laplace(loc, scale, validate_args=None)[source] -
Создаёт распределение Лапласа, параметризованное
locиscale.Пример:
>>> m = Laplace(torch.tensor([0.0]), torch.tensor([1.0])) >>> m.sample() # Laplace distributed with loc=0, scale=1 tensor([ 0.1046])
- Параметры
-
arg_constraints = {'loc': Real(), 'scale': GreaterThan(lower_bound=0.0)}
-
cdf(value)[source]
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
icdf(value)[source]
-
log_prob(value)[source]
-
property mean
-
property mode
-
rsample(sample_shape=torch.Size([]))[source]
-
property stddev
-
support = Real()
-
property variance
Логарифмически-нормальное
-
class torch.distributions.log_normal.LogNormal(loc, scale, validate_args=None)[source] -
Bases:
TransformedDistributionСоздаёт распределение логнормального типа, параметризованное значениями
locиscale, где:X ~ Normal(loc, scale) Y = exp(X) ~ LogNormal(loc, scale)
Пример:
>>> m = LogNormal(torch.tensor([0.0]), torch.tensor([1.0])) >>> m.sample() # log-normal distributed with mean=0 and stddev=1 tensor([ 0.1046])
- Параметры
-
arg_constraints: Dict[str, Constraint] = {'loc': Real(), 'scale': GreaterThan(lower_bound=0.0)}
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
property loc
-
property mean
-
property mode
-
property scale
-
support = GreaterThan(lower_bound=0.0)
-
property variance
Матрица с низким рангом многомерного нормального распределения
-
class torch.distributions.lowrank_multivariate_normal.LowRankMultivariateNormal(loc, cov_factor, cov_diag, validate_args=None)[source] -
Bases:
DistributionСоздаёт многомерное нормальное распределение с матрицей ковариации, имеющей низкоранговую форму, параметризованную
cov_factorиcov_diag:covariance_matrix = cov_factor @ cov_factor.T + cov_diag
Пример
>>> m = LowRankMultivariateNormal(torch.zeros(2), torch.tensor([[1.], [0.]]), torch.ones(2)) >>> m.sample() # normally distributed with mean=`[0,0]`, cov_factor=`[[1],[0]]`, cov_diag=`[1,1]` tensor([-0.2102, -0.5429])
- Параметры
-
-
loc (Tensor) – среднее значение распределения со формой
batch_shape + event_shape -
cov_factor (Tensor) – множитель низкоранговой формы матрицы ковариации со формой
batch_shape + event_shape + (rank,) -
cov_diag (Tensor) – диагональная часть низкоранговой формы матрицы ковариации со формой
batch_shape + event_shape
-
loc (Tensor) – среднее значение распределения со формой
Примечание
Вычисления для определителя и обратной матрицы ковариации избегаются, когда
cov_factor.shape[1] << cov_factor.shape[0], благодаря тождеству Вудри и лемме о определителе матрицы. Благодаря этим формулам, нам нужно только вычислить определитель и обратную матрицу малой матрицы "ёмкости":capacitance = I + cov_factor.T @ inv(cov_diag) @ cov_factor
-
arg_constraints = {'cov_diag': IndependentConstraint(GreaterThan(lower_bound=0.0), 1), 'cov_factor': IndependentConstraint(Real(), 2), 'loc': IndependentConstraint(Real(), 1)}
-
property covariance_matrix
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
log_prob(value)[source]
-
property mean
-
property mode
-
property precision_matrix
-
rsample(sample_shape=torch.Size([]))[source]
-
property scale_tril
-
support = IndependentConstraint(Real(), 1)
-
property variance
Смесь одинаковой семьи
-
class torch.distributions.mixture_same_family.MixtureSameFamily(mixture_distribution, component_distribution, validate_args=None)[source] -
Bases:
DistributionРаспределение
MixtureSameFamilyреализует (векторное) распределение смеси, где все компоненты имеют разную параметризацию одного и того же типа распределения. Оно параметризуетсяCategorical«распределением выбора» (надkкомпонентами) и распределением компоненты, т.е.Distributionс правым крайним размерностью векторов (равной[k]), которая индексирует каждый (векторный) компонент.Примеры:
>>> # Construct Gaussian Mixture Model in 1D consisting of 5 equally >>> # weighted normal distributions >>> mix = D.Categorical(torch.ones(5,)) >>> comp = D.Normal(torch.randn(5,), torch.rand(5,)) >>> gmm = MixtureSameFamily(mix, comp) >>> # Construct Gaussian Mixture Model in 2D consisting of 5 equally >>> # weighted bivariate normal distributions >>> mix = D.Categorical(torch.ones(5,)) >>> comp = D.Independent(D.Normal( ... torch.randn(5,2), torch.rand(5,2)), 1) >>> gmm = MixtureSameFamily(mix, comp) >>> # Construct a batch of 3 Gaussian Mixture Models in 2D each >>> # consisting of 5 random weighted bivariate normal distributions >>> mix = D.Categorical(torch.rand(3,5)) >>> comp = D.Independent(D.Normal( ... torch.randn(3,5,2), torch.rand(3,5,2)), 1) >>> gmm = MixtureSameFamily(mix, comp)
- Параметры
-
-
mixture_distribution –
torch.distributions.Categorical-подобный экземпляр. Управляет вероятностью выбора компоненты. Количество категорий должно соответствовать правой крайним размерности векторовcomponent_distribution. Должен иметь либо скалярноеbatch_shape, либоbatch_shape, соответствующиеcomponent_distribution.batch_shape[:-1] -
component_distribution –
torch.distributions.Distribution-подобный экземпляр. Правый крайний батч-размер индексирует компонент.
-
mixture_distribution –
-
arg_constraints: Dict[str, Constraint] = {}
-
cdf(x)[source]
-
property component_distribution
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = False
-
log_prob(x)[source]
-
property mean
-
property mixture_distribution
-
sample(sample_shape=torch.Size([]))[source]
-
property support
-
property variance
Мультиномиальное распределение
-
class torch.distributions.multinomial.Multinomial(total_count=1, probs=None, logits=None, validate_args=None)[source] -
Bases:
DistributionСоздаёт распределение многочлена, параметризованное
total_countи либоprobs, либоlogits(но не оба). Внутренняя размерностьprobsиндексирует категории. Все остальные размерности индексируют батчи.Обратите внимание, что
total_countне обязательно указывать, если вызывается толькоlog_prob()(см. пример ниже).Примечание
Аргумент
probsдолжен быть неотрицательным, конечным и иметь ненулевую сумму, и он будет нормирован таким образом, чтобы сумма по последней размерности составляла 1.probsвозвращает это нормированное значение. Аргументlogitsинтерпретируется как ненормированные логарифмы вероятностей и может быть любым вещественным числом. Он также будет нормирован таким образом, чтобы сумма полученных вероятностей по последней размерности составляла 1.logitsвозвращает это нормированное значение.-
sample()требует единого общегоtotal_countдля всех параметров и выборок. -
log_prob()допускает разныеtotal_countдля каждого параметра и выборки.
Пример:
>>> m = Multinomial(100, torch.tensor([ 1., 1., 1., 1.])) >>> x = m.sample() # equal probability of 0, 1, 2, 3 tensor([ 21., 24., 30., 25.]) >>> Multinomial(probs=torch.tensor([1., 1., 1., 1.])).log_prob(x) tensor([-4.1338])
- Parameters
-
arg_constraints = {'logits': IndependentConstraint(Real(), 1), 'probs': Simplex()}
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
log_prob(value)[source]
-
property logits
-
property mean
-
property param_shape
-
property probs
-
sample(sample_shape=torch.Size([]))[source]
-
property support
-
total_count: int
-
property variance
-
Многомерное нормальное распределение
-
class torch.distributions.multivariate_normal.MultivariateNormal(loc, covariance_matrix=None, precision_matrix=None, scale_tril=None, validate_args=None)[source] -
Bases:
DistributionСоздаёт распределение многомерного нормального (также называемого гауссовского) распределения, параметризованное вектором среднего значения и матрицей ковариаций.
Распределение многомерной нормали может быть параметризовано либо положительно определённой матрицей ковариаций или положительно определённой матрицей точности или нижнетреугольной матрицей с положительными значениями диагональных элементов, такими что . Эту треугольную матрицу можно получить, например, с помощью разложения Холецкого ковариационной матрицы.
Пример
>>> m = MultivariateNormal(torch.zeros(2), torch.eye(2)) >>> m.sample() # normally distributed with mean=`[0,0]` and covariance_matrix=`I` tensor([-0.2102, -0.5429])
- Параметры
Примечание
Можно указать только один из
covariance_matrix,precision_matrixилиscale_tril.Использование
scale_trilбудет более эффективным: все вычисления внутри основаны наscale_tril. Если вместо этого передаётсяcovariance_matrixилиprecision_matrix, оно используется только для вычисления соответствующих нижнетреугольных матриц с помощью разложения Холецкого.-
arg_constraints = {'covariance_matrix': PositiveDefinite(), 'loc': IndependentConstraint(Real(), 1), 'precision_matrix': PositiveDefinite(), 'scale_tril': LowerCholesky()}
-
property covariance_matrix
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
log_prob(value)[source]
-
property mean
-
property mode
-
property precision_matrix
-
rsample(sample_shape=torch.Size([]))[source]
-
property scale_tril
-
support = IndependentConstraint(Real(), 1)
-
property variance
NegativeBinomial
-
class torch.distributions.negative_binomial.NegativeBinomial(total_count, probs=None, logits=None, validate_args=None)[source] -
Bases:
DistributionСоздаёт распределение отрицательного биномиального типа, т.е. распределение числа успешных независимых и одинаково распределённых испытаний Бернулли до достижения
total_countнеудач. Вероятность успеха каждого испытания Бернулли равнаprobs.- Параметры
-
arg_constraints = {'logits': Real(), 'probs': HalfOpenInterval(lower_bound=0.0, upper_bound=1.0), 'total_count': GreaterThanEq(lower_bound=0)}
-
expand(batch_shape, _instance=None)[source]
-
log_prob(value)[source]
-
property logits
-
property mean
-
property mode
-
property param_shape
-
property probs
-
sample(sample_shape=torch.Size([]))[source]
-
support = IntegerGreaterThan(lower_bound=0)
-
property variance
Нормальное
-
class torch.distributions.normal.Normal(loc, scale, validate_args=None)[source] -
Bases:
ExponentialFamilyСоздаёт нормальное (также называемое гауссовым) распределение, параметризованное
locиscale.Пример:
>>> m = Normal(torch.tensor([0.0]), torch.tensor([1.0])) >>> m.sample() # normally distributed with loc=0 and scale=1 tensor([ 0.1046])
- Параметры
-
arg_constraints = {'loc': Real(), 'scale': GreaterThan(lower_bound=0.0)}
-
cdf(value)[source]
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
icdf(value)[source]
-
log_prob(value)[source]
-
property mean
-
property mode
-
rsample(sample_shape=torch.Size([]))[source]
-
sample(sample_shape=torch.Size([]))[source]
-
property stddev
-
support = Real()
-
property variance
Одномерно-горячее категорическое
-
class torch.distributions.one_hot_categorical.OneHotCategorical(probs=None, logits=None, validate_args=None)[source] -
Bases:
DistributionСоздаёт распределение вероятностей с одним горячим кодированием, параметризованное значениями
probsилиlogits.Образцы — векторы с одним горячим кодированием размера
probs.size(-1).Примечание
Аргумент
probsдолжен быть неотрицательным, конечным и иметь ненулевую сумму, и он будет нормирован так, чтобы сумма по последнему измерению была равна 1.probsвернёт это нормированное значение. Аргументlogitsбудет интерпретирован как ненормализованные логарифмы вероятностей и может быть любым действительным числом. Аналогичным образом он будет нормирован таким образом, чтобы результирующие вероятности суммировались до 1 по последнему измерению.logitsвернёт это нормированное значение.См. также:
torch.distributions.Categorical()для спецификацийprobsиlogits.Пример:
>>> m = OneHotCategorical(torch.tensor([ 0.25, 0.25, 0.25, 0.25 ])) >>> m.sample() # equal probability of 0, 1, 2, 3 tensor([ 0., 0., 0., 1.])
- Параметры
-
arg_constraints = {'logits': IndependentConstraint(Real(), 1), 'probs': Simplex()}
-
entropy()[source]
-
enumerate_support(expand=True)[source]
-
expand(batch_shape, _instance=None)[source]
-
has_enumerate_support = True
-
log_prob(value)[source]
-
property logits
-
property mean
-
property mode
-
property param_shape
-
property probs
-
sample(sample_shape=torch.Size([]))[source]
-
support = OneHot()
-
property variance
Парето
-
class torch.distributions.pareto.Pareto(scale, alpha, validate_args=None)[source] -
Bases:
TransformedDistributionОбразцы из распределения Парето 1 типа.
Пример:
>>> m = Pareto(torch.tensor([1.0]), torch.tensor([1.0])) >>> m.sample() # sample from a Pareto distribution with scale=1 and alpha=1 tensor([ 1.5623])
- Параметры
-
arg_constraints: Dict[str, Constraint] = {'alpha': GreaterThan(lower_bound=0.0), 'scale': GreaterThan(lower_bound=0.0)}
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
property mean
-
property mode
-
property support
-
property variance
Пуассон
-
class torch.distributions.poisson.Poisson(rate, validate_args=None)[source] -
Bases:
ExponentialFamilyСоздаёт распределение Пуассона, параметризованное значением
rate, параметром скорости.Образцы — неотрицательные целые числа, с функцией вероятности, заданной выражением
Пример:
>>> m = Poisson(torch.tensor([4])) >>> m.sample() tensor([ 3.])
- Параметры
-
rate (Число, Тензор) — параметр скорости
-
arg_constraints = {'rate': GreaterThanEq(lower_bound=0.0)}
-
expand(batch_shape, _instance=None)[source]
-
log_prob(value)[source]
-
property mean
-
property mode
-
sample(sample_shape=torch.Size([]))[source]
-
support = IntegerGreaterThan(lower_bound=0)
-
property variance
RelaxedBernoulli
-
class torch.distributions.relaxed_bernoulli.RelaxedBernoulli(temperature, probs=None, logits=None, validate_args=None)[source] -
Bases:
TransformedDistributionСоздаёт распределение RelaxedBernoulli, параметризованное значением
temperature, и либоprobs, либоlogits(но не оба одновременно). Это расслабленная версия распределенияBernoulli, поэтому значения лежат в интервале (0, 1), и имеет перепараметризуемые образцы.Пример:
>>> m = RelaxedBernoulli(torch.tensor([2.2]), ... torch.tensor([0.1, 0.2, 0.3, 0.99])) >>> m.sample() tensor([ 0.2951, 0.3442, 0.8918, 0.9021])
- Параметры
-
arg_constraints: Dict[str, Constraint] = {'logits': Real(), 'probs': Interval(lower_bound=0.0, upper_bound=1.0)}
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
property logits
-
property probs
-
support = Interval(lower_bound=0.0, upper_bound=1.0)
-
property temperature
LogitRelaxedBernoulli
-
class torch.distributions.relaxed_bernoulli.LogitRelaxedBernoulli(temperature, probs=None, logits=None, validate_args=None)[source] -
Bases:
DistributionСоздаёт распределение LogitRelaxedBernoulli, параметризованное значениями
probsилиlogits(но не оба одновременно), являющимися логарифмом отношения шансов распределения RelaxedBernoulli.Образцы — логарифмы отношений шансов значений в (0, 1). Подробнее см. [1].
- Параметры
[1] The Concrete Distribution: A Continuous Relaxation of Discrete Random Variables (Maddison et al, 2017)
[2] Categorical Reparametrization with Gumbel-Softmax (Jang et al, 2017)
-
arg_constraints = {'logits': Real(), 'probs': Interval(lower_bound=0.0, upper_bound=1.0)}
-
expand(batch_shape, _instance=None)[source]
-
log_prob(value)[source]
-
property logits
-
property param_shape
-
property probs
-
rsample(sample_shape=torch.Size([]))[source]
-
support = Real()
RelaxedOneHotCategorical
-
class torch.distributions.relaxed_categorical.RelaxedOneHotCategorical(temperature, probs=None, logits=None, validate_args=None)[source] -
Bases:
TransformedDistributionСоздаёт распределение RelaxedOneHotCategorical, параметризованное
temperature, и либоprobs, либоlogits. Это релаксированная версия распределенияOneHotCategorical, поэтому её выборки находятся на симплексе и являются перепараметризуемыми.Пример:
>>> m = RelaxedOneHotCategorical(torch.tensor([2.2]), ... torch.tensor([0.1, 0.2, 0.3, 0.4])) >>> m.sample() tensor([ 0.1294, 0.2324, 0.3859, 0.2523])
- Параметры
-
arg_constraints: Dict[str, Constraint] = {'logits': IndependentConstraint(Real(), 1), 'probs': Simplex()}
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
property logits
-
property probs
-
support = Simplex()
-
property temperature
Распределение Стьюдента
-
class torch.distributions.studentT.StudentT(df, loc=0.0, scale=1.0, validate_args=None)[source] -
Bases:
DistributionСоздаёт распределение Стьюдента, параметризованное степенями свободы
df, среднимlocи масштабомscale.Пример:
>>> m = StudentT(torch.tensor([2.0])) >>> m.sample() # Student's t-distributed with degrees of freedom=2 tensor([ 0.1046])
- Параметры
-
arg_constraints = {'df': GreaterThan(lower_bound=0.0), 'loc': Real(), 'scale': GreaterThan(lower_bound=0.0)}
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
log_prob(value)[source]
-
property mean
-
property mode
-
rsample(sample_shape=torch.Size([]))[source]
-
support = Real()
-
property variance
Преобразованное распределение
-
class torch.distributions.transformed_distribution.TransformedDistribution(base_distribution, transforms, validate_args=None)[source] -
Основы:
DistributionРасширение класса Distribution, применяющее последовательность преобразований к базовому распределению. Пусть f — композиция примененных преобразований:
X ~ BaseDistribution Y = f(X) ~ TransformedDistribution(BaseDistribution, f) log p(Y) = log p(X) + log |det (dX/dY)|
Обратите внимание, что
.event_shapeTransformedDistribution— это максимальная форма его базового распределения и его преобразований, так как преобразования могут вводить корреляции между событиями.Пример использования
TransformedDistribution:# Building a Logistic Distribution # X ~ Uniform(0, 1) # f = a + b * logit(X) # Y ~ f(X) ~ Logistic(a, b) base_distribution = Uniform(0, 1) transforms = [SigmoidTransform().inv, AffineTransform(loc=a, scale=b)] logistic = TransformedDistribution(base_distribution, transforms)
Для получения дополнительных примеров обратитесь к реализациям
Gumbel,HalfCauchy,HalfNormal,LogNormal,Pareto,Weibull,RelaxedBernoulliиRelaxedOneHotCategorical.-
arg_constraints: Dict[str, Constraint] = {}
-
cdf(value)[source] -
Вычисляет функцию распределения кумулятивной вероятности, инвертируя преобразование(ия) и вычисляя значение базового распределения.
-
expand(batch_shape, _instance=None)[source]
-
property has_rsample
-
icdf(value)[source] -
Вычисляет обратную функцию распределения кумулятивной вероятности, используя преобразование(ия) и вычисляя значение базового распределения.
-
log_prob(value)[source] -
Оценивает образец, инвертируя преобразование(ия) и вычисляя значение с помощью значения базового распределения и логарифма модуля определителя якобиана.
-
rsample(sample_shape=torch.Size([]))[source] -
Генерирует образец размером sample_shape или пакет образцов размером sample_shape, если параметры распределения сгруппированы. Сначала генерируются образцы из базового распределения, а затем применяется
transform()для каждого преобразования в списке.
-
sample(sample_shape=torch.Size([]))[source] -
Генерирует образец размером sample_shape или пакет образцов размером sample_shape, если параметры распределения сгруппированы. Сначала генерируются образцы из базового распределения, а затем применяется
transform()для каждого преобразования в списке.
-
property support
-
Равномерное
-
class torch.distributions.uniform.Uniform(low, high, validate_args=None)[source] -
Основы:
DistributionГенерирует равномерно распределённые случайные образцы из полуоткрытого интервала
[low, high).Пример:
>>> m = Uniform(torch.tensor([0.0]), torch.tensor([5.0])) >>> m.sample() # uniformly distributed in the range [0.0, 5.0) tensor([ 2.3418])
- Параметры
-
arg_constraints = {'high': Dependent(), 'low': Dependent()}
-
cdf(value)[source]
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
icdf(value)[source]
-
log_prob(value)[source]
-
property mean
-
property mode
-
rsample(sample_shape=torch.Size([]))[source]
-
property stddev
-
property support
-
property variance
Функция распределения Вон Миса
-
class torch.distributions.von_mises.VonMises(loc, concentration, validate_args=None)[source] -
Bases:
DistributionКруговое распределение фон Мизеса.
Эта реализация использует полярные координаты. Аргументы
locиvalueмогут быть любыми действительными числами (чтобы упростить неограниченную оптимизацию), но интерпретируются как углы по модулю 2 пи.- Пример::
-
>>> m = VonMises(torch.tensor([1.0]), torch.tensor([1.0])) >>> m.sample() # von Mises distributed with loc=1 and concentration=1 tensor([1.9777])
- Параметры
-
- loc (torch.Tensor) – угол в радианах.
- concentration (torch.Tensor) – параметр концентрации
-
arg_constraints = {'concentration': GreaterThan(lower_bound=0.0), 'loc': Real()}
-
expand(batch_shape)[source]
-
has_rsample = False
-
log_prob(value)[source]
-
property mean -
Указанное среднее значение является круговым.
-
property mode
-
sample(sample_shape=torch.Size([]))[source] -
Алгоритм выборки для распределения фон Мизеса основан на следующей статье: Best, D. J., and Nicholas I. Fisher. “Efficient simulation of the von Mises distribution.” Applied Statistics (1979): 152-157.
-
support = Real()
-
property variance -
Указанная дисперсия является круговой.
Weibull
-
class torch.distributions.weibull.Weibull(scale, concentration, validate_args=None)[source] -
Bases:
TransformedDistributionВыборка из двухпараметрического распределения Вейбулла.
Пример
>>> m = Weibull(torch.tensor([1.0]), torch.tensor([1.0])) >>> m.sample() # sample from a Weibull distribution with scale=1, concentration=1 tensor([ 0.4784])
- Параметры
-
arg_constraints: Dict[str, Constraint] = {'concentration': GreaterThan(lower_bound=0.0), 'scale': GreaterThan(lower_bound=0.0)}
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
property mean
-
property mode
-
support = GreaterThan(lower_bound=0.0)
-
property variance
Wishart
-
class torch.distributions.wishart.Wishart(df, covariance_matrix=None, precision_matrix=None, scale_tril=None, validate_args=None)[source] -
Bases:
ExponentialFamilyСоздаёт распределение Вишарта, параметризованное симметричной положительно определённой матрицей , или её нижнетреугольным разложением
Пример
>>> m = Wishart(torch.Tensor([2]), covariance_matrix=torch.eye(2)) >>> m.sample() # Wishart distributed with mean=`df * I` and >>> # variance(x_ij)=`df` for i != j and variance(x_ij)=`2 * df` for i == j
- Параметры
-
- df (float или Tensor) – действительное значение параметра, большее чем (размер квадратной матрицы) - 1
- covariance_matrix (Tensor) – положительно определённая ковариационная матрица
- precision_matrix (Tensor) – положительно определённая матрица обратной ковариации
- scale_tril (Tensor) – нижнетреугольная факторизация ковариации, с положительными значениями на диагонали
Примечание
Можно указать только один из
covariance_matrixилиprecision_matrixилиscale_tril. Использованиеscale_trilбудет более эффективным: все вычисления внутри основаны наscale_tril. Еслиcovariance_matrixилиprecision_matrixпередаются вместо этого, они используются только для вычисления соответствующих нижнетреугольных матриц с помощью разложения Холецкого. ‘torch.distributions.LKJCholesky’ — это ограниченное распределение Вишарта.[1]Ссылки
[1] Wang, Z., Wu, Y. and Chu, H., 2018.
On equivalence of the LKJ distribution and the restricted Wishart distribution. [2] Sawyer, S., 2007.Wishart Distributions and Inverse-Wishart Sampling. [3] Anderson, T. W., 2003.An Introduction to Multivariate Statistical Analysis (3rd ed.). [4] Odell, P. L. & Feiveson, A. H., 1966.A Numerical Procedure to Generate a SampleCovariance Matrix. JASA, 61(313):199-203. [5] Ku, Y.-C. & Bloomfield, P., 2010.Generating Random Wishart Matrices with Fractional Degrees of Freedom in OX.-
arg_constraints = {'covariance_matrix': PositiveDefinite(), 'df': GreaterThan(lower_bound=0), 'precision_matrix': PositiveDefinite(), 'scale_tril': LowerCholesky()}
-
property covariance_matrix
-
entropy()[source]
-
expand(batch_shape, _instance=None)[source]
-
has_rsample = True
-
log_prob(value)[source]
-
property mean
-
property mode
-
property precision_matrix
-
rsample(sample_shape=torch.Size([]), max_try_correction=None)[source] -
Предупреждение
В некоторых случаях алгоритм выборки, основанный на разложении Бартлетта, может возвращать вырожденные матричные выборки. По умолчанию выполняется несколько попыток исправить вырожденные выборки, но в итоге могут быть возвращены вырожденные матричные выборки. Вырожденные выборки могут возвращать
-infзначения в.log_prob(). В этих случаях пользователь должен проверить выборки и либо исправить значениеdf, или отрегулировать значениеmax_try_correctionдля аргумента в.rsampleсоответственно.
-
property scale_tril
-
support = PositiveDefinite()
-
property variance
KL Divergence
-
torch.distributions.kl.kl_divergence(p, q)[source] -
Вычисление расхождения Куллбека-Лайблера между двумя распределениями.
- Параметры
-
-
p (Distribution) – Объект типа
Distribution. -
q (Distribution) – Объект типа
Distribution.
-
p (Distribution) – Объект типа
- Возвращает
-
Массив расхождений Куллбека-Лайблера формы
batch_shape. - Тип возвращаемого значения
- Возбуждает
-
NotImplementedError – Если типы распределений не зарегистрированы с помощью
register_kl().
- В настоящее время расхождение Куллбека-Лайблера реализовано для следующих пар распределений:
-
-
BernoulliиBernoulli -
BernoulliиPoisson -
BetaиBeta -
BetaиContinuousBernoulli -
BetaиExponential -
BetaиGamma -
BetaиNormal -
BetaиPareto -
BetaиUniform -
BinomialиBinomial -
CategoricalиCategorical -
CauchyиCauchy -
ContinuousBernoulliиContinuousBernoulli -
ContinuousBernoulliиExponential -
ContinuousBernoulliиNormal -
ContinuousBernoulliиPareto -
ContinuousBernoulliиUniform -
DirichletиDirichlet -
ExponentialиBeta -
ExponentialиContinuousBernoulli -
ExponentialиExponential -
ExponentialиGamma -
ExponentialиGumbel -
ExponentialиNormal -
ExponentialиPareto -
ExponentialиUniform -
ExponentialFamilyиExponentialFamily -
GammaиBeta -
GammaиContinuousBernoulli -
GammaиExponential -
GammaиGamma -
GammaиGumbel -
GammaиNormal -
GammaиPareto -
GammaиUniform -
GeometricиGeometric -
GumbelиBeta -
GumbelиContinuousBernoulli -
GumbelиExponential -
GumbelиGamma -
GumbelиGumbel -
GumbelиNormal -
GumbelиPareto -
GumbelиUniform -
HalfNormalиHalfNormal -
IndependentиIndependent -
LaplaceиBeta -
LaplaceиContinuousBernoulli -
LaplaceиExponential -
LaplaceиGamma -
LaplaceиLaplace -
LaplaceиNormal -
LaplaceиPareto -
LaplaceиUniform -
LowRankMultivariateNormalиLowRankMultivariateNormal -
LowRankMultivariateNormalиMultivariateNormal -
MultivariateNormalиLowRankMultivariateNormal -
MultivariateNormalиMultivariateNormal -
NormalиBeta -
NormalиContinuousBernoulli -
NormalиExponential -
NormalиGamma -
NormalиGumbel -
NormalиLaplace -
NormalиNormal -
NormalиPareto -
NormalиUniform -
OneHotCategoricalиOneHotCategorical -
ParetoиBeta -
ParetoиContinuousBernoulli -
ParetoиExponential -
ParetoиGamma -
ParetoиNormal -
ParetoиPareto -
ParetoиUniform -
PoissonиBernoulli -
PoissonиBinomial -
PoissonиPoisson -
TransformedDistributionиTransformedDistribution -
UniformиBeta -
UniformиContinuousBernoulli -
UniformиExponential -
UniformиGamma -
UniformиGumbel -
UniformиNormal -
UniformиPareto -
UniformиUniform
-
-
torch.distributions.kl.register_kl(type_p, type_q)[source] -
Декоратор для регистрации парной функции с
kl_divergence(). Использование:@register_kl(Normal, Normal) def kl_normal_normal(p, q): # insert implementation hereПоиск возвращает наиболее специфичную (тип, тип) пару, отсортированную по подклассу. Если соответствие неоднозначно, возникает
RuntimeWarning. Например, для разрешения неоднозначной ситуации:@register_kl(BaseP, DerivedQ) def kl_version1(p, q): ... @register_kl(DerivedP, BaseQ) def kl_version2(p, q): ...
следует зарегистрировать третье самое специфичное реализацию, например:
register_kl(DerivedP, DerivedQ)(kl_version1) # Break the tie.
Transforms
-
class torch.distributions.transforms.AbsTransform(cache_size=0)[source] -
Преобразование с помощью отображения .
-
class torch.distributions.transforms.AffineTransform(loc, scale, event_dim=0, cache_size=0)[source] -
Преобразование с помощью точечно-аффинного отображения .
-
class torch.distributions.transforms.CatTransform(tseq, dim=0, lengths=None, cache_size=0)[source] -
Функтор преобразования, который применяет последовательность преобразований
tseqкомпонентно к каждой подматрице поdim, длинойlengths[dim], совместимым сtorch.cat().Пример:
x0 = torch.cat([torch.range(1, 10), torch.range(1, 10)], dim=0) x = torch.cat([x0, x0], dim=0) t0 = CatTransform([ExpTransform(), identity_transform], dim=0, lengths=[10, 10]) t = CatTransform([t0, t0], dim=0, lengths=[20, 20]) y = t(x)
-
class torch.distributions.transforms.ComposeTransform(parts, cache_size=0)[source] -
Компонует несколько преобразований в цепочку. Ответственные за кэширование преобразования.
-
class torch.distributions.transforms.CorrCholeskyTransform(cache_size=0)[source] -
Преобразует несвязанный вещественный вектор длины в фактор Холески корреляционной матрицы размерности D. Данный фактор Холески представляет собой нижнюю треугольную матрицу с положительными диагональными элементами и единичной евклидовой нормой для каждой строки.
Преобразование выполняется следующим образом:
- Сначала мы преобразуем x в нижнюю треугольную матрицу в порядке строк.
- Для каждой строки нижней треугольной части мы применяем знаковый аналог класса
StickBreakingTransformдля преобразования в вектор с единичной евклидовой нормой, выполняя следующие шаги: - Масштабирование в интервал : . - Преобразование в беззнаковый домен: . - Применение . - Преобразование обратно в знаковый домен: .
-
class torch.distributions.transforms.CumulativeDistributionTransform(distribution, cache_size=0)[source] -
Преобразование с помощью функции распределения вероятностей.
- Параметры
-
distribution (Распределение) – Распределение, функция распределения вероятностей которого используется для преобразования.
Пример:
# Construct a Gaussian copula from a multivariate normal. base_dist = MultivariateNormal( loc=torch.zeros(2), scale_tril=LKJCholesky(2).sample(), ) transform = CumulativeDistributionTransform(Normal(0, 1)) copula = TransformedDistribution(base_dist, [transform])
-
class torch.distributions.transforms.ExpTransform(cache_size=0)[source] -
Преобразование с помощью отображения .
-
class torch.distributions.transforms.IndependentTransform(base_transform, reinterpreted_batch_ndims, cache_size=0)[source] -
Оборачивает другое преобразование, чтобы рассматривать
reinterpreted_batch_ndimsдополнительных правых измерений как зависимых. Это никак не влияет на прямые или обратные преобразования, но суммируетreinterpreted_batch_ndimsправых измерений вlog_abs_det_jacobian().
-
class torch.distributions.transforms.LowerCholeskyTransform(cache_size=0)[source] -
Преобразование из несвязанных матриц в нижнетреугольные матрицы с неотрицательными диагональными элементами.
Это полезно для параметризации положительно определенных матриц через их факторизацию Холески.
-
class torch.distributions.transforms.PositiveDefiniteTransform(cache_size=0)[source] -
Преобразование из несвязанных матриц в положительно определенные матрицы.
-
class torch.distributions.transforms.PowerTransform(exponent, cache_size=0)[source] -
Преобразование посредством отображения .
-
class torch.distributions.transforms.ReshapeTransform(in_shape, out_shape, cache_size=0)[source] -
Преобразование с единичным якобианом для изменения формы правой части тензора.
Обратите внимание, что
in_shapeиout_shapeдолжны иметь одинаковое количество элементов, как и дляtorch.Tensor.reshape().- Параметры
-
- in_shape (torch.Size) – Форма входного события.
- out_shape (torch.Size) – Форма выходного события.
-
class torch.distributions.transforms.SigmoidTransform(cache_size=0)[source] -
Преобразование посредством отображения и .
-
class torch.distributions.transforms.SoftplusTransform(cache_size=0)[source] -
Преобразование посредством отображения . Реализация переходит к линейной функции, когда .
-
class torch.distributions.transforms.TanhTransform(cache_size=0)[source] -
Преобразование посредством отображения .
Это эквивалентно
` ComposeTransform([AffineTransform(0., 2.), SigmoidTransform(), AffineTransform(-1., 2.)]) `. Однако это может быть нечисленно устойчивым, поэтому рекомендуется использоватьTanhTransformвместо этого.Обратите внимание, что следует использовать
cache_size=1, когда речь идёт оNaN/Infзначениях.
-
class torch.distributions.transforms.SoftmaxTransform(cache_size=0)[source] -
Преобразование из неограниченного пространства в симплекс с помощью , затем нормализация.
Это не взаимно однозначное соответствие и не может быть использовано для HMC. Однако оно в основном действует по координатам (кроме конечной нормализации), и поэтому подходит для алгоритмов оптимизации по координатам.
-
class torch.distributions.transforms.StackTransform(tseq, dim=0, cache_size=0)[source] -
Функтор преобразования, применяющий последовательность преобразований
tseqкомпонентно к каждой подматрице вdimспособом, совместимым сtorch.stack().Пример:
x = torch.stack([torch.range(1, 10), torch.range(1, 10)], dim=1) t = StackTransform([ExpTransform(), identity_transform], dim=1) y = t(x)
-
class torch.distributions.transforms.StickBreakingTransform(cache_size=0)[source] -
Преобразование из неограниченного пространства в симплекс одной дополнительной размерности с помощью процесса разрушения палок.
Это преобразование возникает в качестве итеративного преобразования сигмоиды в конструктивном процессе разрушения палок распределения
Dirichlet: первый logit преобразуется с помощью сигмоиды в первую вероятность и вероятность всего остального, а затем процесс повторяется.Это взаимно однозначное соответствие и подходит для использования в HMC; однако оно смешивает координаты вместе и менее подходит для оптимизации.
-
class torch.distributions.transforms.Transform(cache_size=0)[source] -
Абстрактный класс для обратимых преобразований с вычисляемыми логарифмами определителей якобианов. Они в основном используются в
torch.distributions.TransformedDistribution.Кэширование полезно для преобразований, обратные функции которых являются либо трудоёмкими, либо численно неустойчивыми. Обратите внимание, что необходимо быть осторожными с кэшированными значениями, так как граф autograd может быть обращён. Например, следующее работает как с кэшированием, так и без него:
y = t(x) t.log_abs_det_jacobian(x, y).backward() # x will receive gradients.
Однако следующее вызовет ошибку при кэшировании из-за обратного порядка зависимостей:
y = t(x) z = t.inv(y) grad(z.sum(), [y]) # error because z is x
Производные классы должны реализовать один или оба из
_call()или_inverse(). Производные классы, которые устанавливаютbijective=True, также должны реализоватьlog_abs_det_jacobian().- Параметры
-
cache_size (int) – Размер кэша. Если равно нулю, кэширование не выполняется. Если равно единице, кэшируется последнее значение. Поддерживаются только значения 0 и 1.
- Переменные
-
-
domain (
Constraint) – Ограничение, представляющее допустимые входные данные для этого преобразования. -
codomain (
Constraint) – Ограничение, представляющее допустимые выходные данные для этого преобразования, которые являются входными данными для обратного преобразования. -
bijective (bool) – Является ли это преобразование биективным. Преобразование
tявляется биективным, еслиt.inv(t(x)) == xиt(t.inv(y)) == yдля каждогоxв области иyв кодомен. Преобразования, которые не являются биективными, должны по крайней мере сохранять более слабые свойства псевдообратныхt(t.inv(t(x)) == t(x)иt.inv(t(t.inv(y))) == t.inv(y). - sign (int или Tensor) – Для биективных одномерных преобразований это должно быть +1 или -1 в зависимости от того, является ли преобразование монотонно возрастающим или убывающим.
-
domain (
-
property inv -
Возвращает обратное
Transformэтого преобразования. Это должно удовлетворятьt.inv.inv is t.
-
property sign -
Возвращает знак определителя якобиана, если применимо. В общем случае это имеет смысл только для биективных преобразований.
-
log_abs_det_jacobian(x, y)[source] -
Вычисляет логарифм определителя якобиана
log |dy/dx|, заданных входными и выходными данными.
-
forward_shape(shape)[source] -
Определяет форму вычисления для прямого преобразования, исходя из формы входных данных. По умолчанию сохраняет форму.
-
inverse_shape(shape)[source] -
Определяет форму вычисления для обратного преобразования, исходя из формы выходных данных. По умолчанию сохраняет форму.
Constraints
Следующие ограничения реализованы:
constraints.booleanconstraints.catconstraints.corr_choleskyconstraints.dependentconstraints.greater_than(lower_bound)constraints.greater_than_eq(lower_bound)constraints.independent(constraint, reinterpreted_batch_ndims)constraints.integer_interval(lower_bound, upper_bound)constraints.interval(lower_bound, upper_bound)constraints.less_than(upper_bound)constraints.lower_choleskyconstraints.lower_triangularconstraints.multinomialconstraints.nonnegativeconstraints.nonnegative_integerconstraints.one_hotconstraints.positive_integerconstraints.positiveconstraints.positive_semidefiniteconstraints.positive_definiteconstraints.real_vectorconstraints.realconstraints.simplexconstraints.symmetricconstraints.stackconstraints.squareconstraints.symmetricconstraints.unit_interval
-
class torch.distributions.constraints.Constraint[source] -
Абстрактный базовый класс для ограничений.
Объект ограничения представляет область, в которой переменная является допустимой, например, в пределах которой переменная может быть оптимизирована.
- Переменные
-
check(value)[source] -
Возвращает бинарный тензор
sample_shape + batch_shape, указывающий, удовлетворяет ли каждое событие в значении этому ограничению.
-
torch.distributions.constraints.cat -
псевдоним для
_Cat
-
torch.distributions.constraints.dependent_property -
псевдоним для
_DependentProperty
-
torch.distributions.constraints.greater_than -
псевдоним для
_GreaterThan
-
torch.distributions.constraints.greater_than_eq -
псевдоним для
_GreaterThanEq
-
torch.distributions.constraints.independent -
псевдоним для
_IndependentConstraint
-
torch.distributions.constraints.integer_interval -
псевдоним для
_IntegerInterval
-
torch.distributions.constraints.interval -
псевдоним для
_Interval
-
torch.distributions.constraints.half_open_interval -
псевдоним для
_HalfOpenInterval
-
torch.distributions.constraints.less_than -
псевдоним для
_LessThan
-
torch.distributions.constraints.multinomial -
псевдоним для
_Multinomial
-
torch.distributions.constraints.stack -
псевдоним для
_Stack
Constraint Registry
Библиотека PyTorch предоставляет два глобальных объекта ConstraintRegistry, которые связывают объекты Constraint с объектами Transform. Оба объекта принимают на вход ограничения и возвращают преобразования, но у них разные гарантии биективности.
-
biject_to(constraint)ищет биективноеTransformотconstraints.realк заданномуconstraint. Возвращаемое преобразование гарантированно имеет.bijective = Trueи должно реализовывать.log_abs_det_jacobian(). -
transform_to(constraint)ищет, возможно, небиективноеTransformотconstraints.realк заданномуconstraint. Возвращаемое преобразование не гарантируется, что будет реализовывать.log_abs_det_jacobian().
Регистр transform_to() полезен для выполнения неограниченной оптимизации ограниченных параметров вероятностных распределений, которые указаны в словаре .arg_constraints каждого распределения. Эти преобразования часто переопределяют пространство, чтобы избежать вращения; таким образом, они более подходят для алгоритмов оптимизации по координатам, таких как Adam:
loc = torch.zeros(100, requires_grad=True) unconstrained = torch.zeros(100, requires_grad=True) scale = transform_to(Normal.arg_constraints['scale'])(unconstrained) loss = -Normal(loc, scale).log_prob(data).sum()
Регистр biject_to() полезен для Гамильтоновой Монте-Карло, где образцы из вероятностного распределения с ограниченными .support распространяются в неограниченном пространстве, а алгоритмы обычно инвариантны к вращению:
dist = Exponential(rate) unconstrained = torch.zeros(100, requires_grad=True) sample = biject_to(dist.support)(unconstrained) potential_energy = -dist.log_prob(sample).sum()
Примечание
Пример, где transform_to и biject_to различаются, это constraints.simplex: transform_to(constraints.simplex) возвращает SoftmaxTransform, который просто возводит в степень и нормализует свои входные данные; это дешевая и в основном координатная операция, подходящая для алгоритмов, таких как SVI. В отличие от этого, biject_to(constraints.simplex) возвращает StickBreakingTransform, который отображает свой вход в пространство на одну размерность меньше; это более дорогое и менее численно устойчивое преобразование, но необходимо для алгоритмов, таких как HMC.
Объекты biject_to и transform_to могут быть расширены пользователем определёнными ограничениями и преобразованиями с помощью метода .register() либо как функция на одиночных ограничениях:
transform_to.register(my_constraint, my_transform)
или как декоратор на параметризованных ограничениях:
@transform_to.register(MyConstraintClass)
def my_factory(constraint):
assert isinstance(constraint, MyConstraintClass)
return MyTransform(constraint.param1, constraint.param2)
Вы можете создать свой собственный регистр, создав новый объект ConstraintRegistry.
-
class torch.distributions.constraint_registry.ConstraintRegistry[source] -
Регистр для связи ограничений с преобразованиями.
-
register(constraint, factory=None)[source] -
Регистрирует подкласс
Constraintв этом регистре. Использование:@my_registry.register(MyConstraintClass) def construct_transform(constraint): assert isinstance(constraint, MyConstraint) return MyTransform(constraint.arg_constraints)- Параметры
-
-
constraint (подкласс
Constraint) – ПодклассConstraintили одиночный объект желаемого класса. -
factory (Callable) – Функция, которая принимает объект ограничения и возвращает объект
Transform.
-
constraint (подкласс
-
© 2024, PyTorch Contributors
PyTorch has a BSD-style license, as found in the LICENSE file.
https://pytorch.org/docs/2.1/distributions.html