Мульти-выходная регрессия в gpflow
Я использую gpflow для регрессии с несколькими выходами.
Моя цель регрессии - трехмерный вектор (коррелированный), и мне удалось сделать прогноз с полной ковариационной матрицей. Вот моя реализация. Точнее говоря, я использую SVGP после tenorflow, где f_x, Y - тензоры (я использую обучение мини-пакетов). Во время пакетного обучения примеры обучения в мини-пакете коррелируют, в то время как мы можем предположить, что они независимы с другими примерами в обучающем наборе. Следовательно, я хотел бы достичь коррелированного ядра в каждом пакете во время обучения и прогнозирования с полной ковариационной матрицей.
kernel = mk.SharedIndependentMok(gpflow.kernels.RBF(args.feat_dim, ARD=False, name="rbf"), args.output_dim)
# kernel = mk.SeparateIndependentMok([gpflow.kernels.RBF(128, ARD=True, name="rbf_ard"+str(i)) for i in range(3)])
q_mu = np.zeros((args.batch_size, args.output_dim)).reshape(args.batch_size * args.output_dim, 1)
q_sqrt = np.eye(args.batch_size * args.output_dim).reshape(1, args.batch_size * args.output_dim, args.batch_size * args.output_dim)
# feature = gpflow.features.InducingPoints(np.zeros((args.batch_size, 128)))
self.gp_model = gpflow.models.SVGP(X=f_X, Y=Y, kern=kernel, likelihood=gpflow.likelihoods.Gaussian(name="lik"), Z=np.zeros((args.batch_size, args.feat_dim)), q_mu=q_mu, q_sqrt=q_sqrt, name="svgp")
У меня есть два вопроса:
- Какое ядро я должен использовать? Я прочитал учебник по многопрофильному GP в https://gpflow.readthedocs.io/en/develop/notebooks/multioutput.html#Shared-Independent-MOK-&-Shared-Independent-Features-(SLOW-CODE), Может ли кто-нибудь дополнительно объяснить следующее утверждение? В моем понимании, ядра между различными выходными измерениями не коррелированы, однако, мы все еще можем получить полную ковариационную матрицу в прогнозе (условно)?
Все выходы некоррелированы, и для каждого выхода используется одно и то же ядро. Однако при условных вычислениях мы не предполагаем эту конкретную блочно-диагональную структуру.
- технический вопрос. Как я должен установить "функцию", когда я использую gpflow после tenorflow. Должен ли я установить NumPy Matix с нулями или просто как None? Похоже, что при обучении партии заданная точка задается как полная партия по умолчанию. В то время как как установить типы объектов, например SharedIndependentMof, и можем ли мы установить точки побуждения больше, чем размер пакета?
Спасибо!
1 ответ
В записной книжке описана структура мульти-вывода и ее вычислительные аспекты. Выделенный раздел просто выполняет независимую регрессию ГП, но цель состоит в том, чтобы показать, как разные объекты, использующие преимущества разной блочно-диагональной структуры, имеют разные вычислительные свойства. Трудно точно понять, что вы имеете в виду в математическом смысле, когда обучающие примеры исправляются (коррелируют?) В мини-пакете и предполагают, что они не зависят от мини-пакетов. С точки зрения получения вариационной нижней границы это скорее следствия, чем предположения. Однако из вашего описания кажется, что вы хотите:
- Обучение с использованием мини-пакетов (т.е. корреляции между мини-пакетами не нужно принимать во внимание [Hensman et al 2013])
- Ядро, которое дает корреляции между выходами. В настоящее время мы поддерживаем только линейные корреляции в
SeparateMixedMok
, Хороший обзор математики предоставлен Alvarez et al. - Функция, которая использует свойства независимости в предыдущих (
MixedKernelSeparateMof
). - Предсказания с полной ковариацией.
Это покрыто разделом 3. Mixed Kernel & Uncorrelated features (OPTIMAL)
, При использовании обычной функции прогнозирования просто установите full_output_cov=True
,
Размеры мини-партии не зависят от количества индуцирующих точек, хотя обычно бесполезно устанавливать количество индуцирующих точек больше, чем количество обучающих данных. Какую функцию выбрать, описано выше и в записной книжке. Это сложно для случая с несколькими выходами.
Примечание. Записную книжку также можно просмотреть через GitHub https://github.com/GPflow/GPflow/blob/develop/doc/source/notebooks/multioutput.ipynb.