Pomegranate — библиотека Python для создания вероятностных моделей, таких как байесовские сети или марковские модели |
||
МЕНЮ Главная страница Поиск Регистрация на сайте Помощь проекту Архив новостей ТЕМЫ Новости ИИ Голосовой помощник Разработка ИИГородские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Искусственный интеллект Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Нейронные сети начинающим Психология ИИ Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Творчество ИИ Техническое зрение Чат-боты Авторизация |
2024-07-21 11:42 Pomegranate — это библиотека для вероятностного моделирования, определяемая ее модульной реализацией и трактовкой всех моделей как распределений вероятностей, которыми они являются. Модульная реализация позволяет легко добавлять нормальное распределение в модель смеси для создания модели гауссовой смеси так же легко, как добавлять гамма-распределение и распределение Пуассона в модель смеси для создания гетерогенной смеси. Но это не все! Поскольку каждая модель рассматривается как распределение вероятностей, байесовские сети можно объединить в смесь так же легко, как и нормальное распределение, а скрытые модели Маркова можно добавить в классификаторы Байеса, чтобы создать классификатор последовательностей. Вместе эти два варианта проектирования обеспечивают гибкость, не встречающуюся ни в одном другом пакете вероятностного моделирования. Недавно Pomegranate (v1.0.0) был переписан с нуля с использованием PyTorch, чтобы заменить устаревший бэкэнд Cython. Эта переработка дала мне возможность исправить многие неудачные дизайнерские решения, которые я сделал, будучи инженером-программистом. К сожалению, многие из этих изменений не имеют обратной совместимости и нарушат рабочие процессы. С другой стороны, эти изменения значительно ускорили работу большинства методов, улучшили и упростили код, исправили многие проблемы, поднимавшиеся сообществом на протяжении многих лет, и значительно облегчили внесение вклада. Я написал больше ниже, но вы, вероятно, сейчас здесь, потому что ваш код не работает, и это ошибка. Особая благодарность NumFOCUS за поддержку этой работы специальным грантом на развитие. Монтаж
Если вам нужна последняя версия Cython перед перезаписью, используйте Зачем переписывать? Это переписывание было мотивировано четырьмя основными причинами:
Изменения высокого уровня
Скорость Большинство моделей и методов в Pomegranate v1.0.0 работают быстрее, чем их аналоги в более ранних версиях. Обычно это масштабируется по сложности: наблюдается лишь небольшое ускорение для простых распределений на небольших наборах данных, но гораздо большее ускорение для более сложных моделей на больших наборах данных, например, обучение скрытой марковской модели или вывод байесовской сети. Заметным исключением на данный момент является то, что обучение структуре байесовской сети, за исключением построения дерева Чоу-Лю, все еще не завершено и не намного быстрее. В примерах ниже K-средние Кто знает, что здесь происходит? Дикий. Скрытые марковские модели Плотная матрица перехода (ЦП) Разреженная матрица перехода (ЦП) Обучение модели из 125 узлов с плотной матрицей перехода Байесовские сети Функции
Переход с бэкэнда Cython на бэкэнд PyTorch включил или расширил большое количество функций. Поскольку перезапись представляет собой тонкую оболочку над PyTorch, по мере выпуска новых функций для PyTorch их можно применять к моделям граната без необходимости получения от меня новой версии. Поддержка графического процессора Все дистрибутивы и методы в Pomegranate теперь поддерживают графический процессор. Поскольку каждый дистрибутив является >>> X = torch.exp(torch.randn(50, 4)) # Will execute on the CPU >>> d = Exponential().fit(X) >>> d.scales Parameter containing: tensor([1.8627, 1.3132, 1.7187, 1.4957]) # Will execute on a GPU >>> d = Exponential().cuda().fit(X.cuda()) >>> d.scales Parameter containing: tensor([1.8627, 1.3132, 1.7187, 1.4957], device='cuda:0') Аналогично, все модели являются дистрибутивами и поэтому могут аналогичным образом использоваться на графическом процессоре. Когда модель перемещается в графический процессор, все связанные с ней модели (например, распределения) также перемещаются в графический процессор. >>> X = torch.exp(torch.randn(50, 4)).cuda() >>> model = GeneralMixtureModel([Exponential(), Exponential()]).cuda() >>> model.fit(X) [1] Improvement: 1.26068115234375, Time: 0.001134s [2] Improvement: 0.168121337890625, Time: 0.001097s [3] Improvement: 0.037841796875, Time: 0.001095s >>> model.distributions[0].scales Parameter containing: >>> model.distributions[1].scales tensor([0.9141, 1.0835, 2.7503, 2.2475], device='cuda:0') Parameter containing: tensor([1.9902, 2.3871, 0.8984, 1.2215], device='cuda:0') Смешанная точность Модели граната теоретически могут работать в тех же смешанных или низкоточных режимах, что и другие модули PyTorch. Однако, поскольку гранат использует более сложные операции, чем большинство нейронных сетей, это иногда не работает или не помогает на практике, поскольку эти операции не были оптимизированы или реализованы в режиме низкой точности. Итак, надеемся, что со временем эта функция станет более полезной. >>> X = torch.randn(100, 4) >>> d = Normal(covariance_type='diag') >>> >>> with torch.autocast('cuda', dtype=torch.bfloat16): >>> d.fit(X) Сериализация Все дистрибутивы граната являются экземплярами Сохранение: >>> X = torch.exp(torch.randn(50, 4)).cuda() >>> model = GeneralMixtureModel([Exponential(), Exponential()], verbose=True) >>> model.cuda() >>> model.fit(X) >>> torch.save(model, "test.torch") Загрузка: >>> model = torch.load("test.torch") факел.компилировать
В PyTorch v2.0.0 # Create your object as normal >>> mu = torch.exp(torch.randn(100)) >>> d = Exponential(mu).cuda() # Create some data >>> X = torch.exp(torch.randn(1000, 100)) >>> d.log_probability(X) # Compile the `log_probability` method! >>> d.log_probability = torch.compile(d.log_probability, mode='reduce-overhead', fullgraph=True) >>> d.log_probability(X) К сожалению, мне было трудно приступить Отсутствующие значения гранат поддерживает обработку данных с пропущенными значениями через >>> X = <your tensor with NaN for the missing values> >>> mask = ~torch.isnan(X) >>> X_masked = torch.masked.MaskedTensor(X, mask=mask) >>> d = Normal(covariance_type='diag').fit(X_masked) >>> d.means Parameter containing: tensor([0.2271, 0.0290, 0.0763, 0.0135]) Все алгоритмы в настоящее время рассматривают пропуски как нечто, что следует игнорировать. Например, при вычислении среднего значения столбца с отсутствующими значениями среднее значение будет просто средним значением текущих значений. Пропущенные значения не вменяются, поскольку неправильное вменение может привести к искажению ваших данных, получению маловероятных оценок, которые искажают распределения, а также уменьшают дисперсию. Поскольку для MaskedTensors пока доступны не все операции, для отсутствующих значений пока не поддерживаются следующие распределения: Бернулли, категориальное, нормальное с полной ковариацией, равномерное. Априорные вероятности и полуконтролируемое обучение Новой функцией граната v1.0.0 является возможность передавать априорные вероятности для каждого наблюдения для моделей смеси, классификаторов Байеса и скрытых моделей Маркова. Это априорная вероятность того, что наблюдение принадлежит компоненту модели до оценки вероятности, и она должна находиться в диапазоне от 0 до 1. Когда эти значения включают 1,0 для наблюдения, оно рассматривается как метка, поскольку вероятность больше не имеет значения. с точки зрения присвоения этого наблюдения состоянию. Следовательно, можно использовать эти априорные вероятности для помеченного обучения, когда каждое наблюдение имеет значение 1,0 для некоторого состояния, полуконтролируемого обучения, когда подмножество наблюдений (в том числе когда последовательности помечены лишь частично для скрытых марковских моделей) или для более сложных форм взвешивание, когда значения находятся между 0 и 1. О Источник: github.com Комментарии: |
|