784-мерный квантовый MNIST

Нет уменьшения размерности

Моя самая просматриваемая статья на Medium за все время — это Quantum MNIST. Если вы рискнете заняться машинным обучением, подмножеством искусственного интеллекта, вы почти наверняка столкнетесь с MNIST, популярным набором данных рукописных цифр, чисел от 0 до 9. Набор данных популярен из-за его качества, которое позволяет вам сосредоточиться на обучение и тестирование вашей модели, не беспокоясь об очистке ваших данных. В реальном мире, конечно, у вас всегда будут проблемы с данными, но чистый набор данных определенно облегчает изучение таких приложений, как сверточные нейронные сети (CNN) и так далее.

Для Quantum MNIST я уменьшил 784-мерный набор данных до 16 измерений в градациях серого, а затем использовал плотное угловое кодирование, чтобы сопоставить эти измерения с 8 кубитами. Я использовал все 10 цифр. Для сравнения, Tensorflow Quantum от Google сократил набор данных до 16 черно-белых измерений и работал только с цифрами 3 и 6. Мыслительный процесс, который лег в основу разработки Quantum MNIST, подробно описан в моей бесплатной электронной книге « Dungeons & Qubits: история авантюриста за рамками учебников по квантовым вычислениям.

Хотя я обошел Google с точки зрения разрешения и использования цифр, мне запомнилось, что мы сократили набор данных до того же количества измерений. Я не хотел соперничать с Google в этом показателе, но симуляторы квантовых вычислений имеют ограничения, и у меня недостаточно кубитов, чтобы запустить это на квантовом процессоре. Однако я решил повторить эксперимент с амплитудным кодированием, чтобы посмотреть, можно ли это сделать вообще без уменьшения размерности.

К сожалению, 784-мерный Quantum MNIST использует Python, дополнительные кубиты и запутанность, поэтому работает очень-очень медленно. Но, если вы все равно хотите узнать, как это делается, следует пошаговый алгоритм.

Алгоритм

  1. Скачайте MNIST в CSV с Kaggle. Или загрузите изображения из Базы данных MNIST и сделайте это сложным способом; ты не заденешь мои чувства. CSV-файлы mnist_train и mnist_test содержат значения для 60 000 и 10 000 изображений размером 28x28 пикселей соответственно. Таким образом, каждое изображение существует в виде 784 значений в диапазоне от 0 до 255, каждое из которых представляет интенсивность определенного пикселя в градациях серого.
  2. Вычислите среднее значение каждого измерения каждой цифры поезда. Каждая цифра поезда имеет примерно 6000 представлений, поэтому для каждого измерения разделите сумму всех значений на количество всех значений: sum_of_values/count_of_values. Ранее я рассматривал альтернативы средним значениям, такие как стандартные отклонения и группирование, однако меня беспокоит то, что десять цифр будут перекрываться, снижая точность классификации.
  3. Для каждого измерения каждой цифры вычислите квадратный корень из значения, деленного на сумму всех значений соответствующей цифры: sqrt(value/sum_of_values). Амплитудное кодирование, как следует из названия, кодирует амплитуды, сумма квадратов которых должна равняться 1.
  4. Дополнить нулями. С 784 измерениями у нас есть два варианта: добавить 240 нулей, чтобы у нас было 1024 измерения для кодирования 10 кубитов, или удалить 272 измерения, чтобы у нас было 512 измерений для кодирования 9 кубитов. Честно говоря, вам действительно нужно удалить измерения, потому что некоторые из 784 измерений в любом случае имеют нулевые средние значения для всех цифр. Но смысл этого конкретного упражнения в том, чтобы избежать уменьшения размерности только ради того, чтобы сказать, что я использовал все 784 измерения, поэтому я добавил нули.
  5. Исправьте ошибки. Для нулевого поезда, например, 1024 амплитуды на самом деле составляют 0,9999999998266969, а не 1. Поскольку все цифры поезда имеют нули в качестве первых нескольких значений, я обновил первое измерение каждой цифры поезда до квадратного корня несоответствия этой цифры: sqrt(ошибка). Однако суммы, превышающие 1, представляют собой проблему, поскольку корректировка должна быть отрицательной. Отрицательный квадрат амплитуды положителен, что фактически увеличивает ошибку. Таким образом, обходной путь состоит в том, чтобы перебирать значения в цикле, пока не будет найдено значение, большее или равное ошибке, а затем обновить это значение до квадратного корня из квадрата исходного значения минус квадрат ошибки: sqrt(value**2 - ошибка**2).
  6. Сравните тестовую цифру с каждой цифрой поезда, используя Тест SWAP, также известный как меры расстояния, также известные как методы ядра, также известные как внутренние продукты. Каждая цифра поезда требует 10 кубитов для 1024 амплитуд, каждая тестовая цифра требует 10 кубитов для 1024 амплитуд, и нам нужен 1 вспомогательный кубит для выполнения сравнения, всего 21 кубит. Вспомогательный кубит начинается и заканчивается воротами Адамара. В промежутке между Адамарами вспомогательный кубит является управляющим кубитом для 10 вентилей Фредкина, также известных как управляемая перестановка, которые сравниваются как кубиты цифры поезда и тестовой цифры. Мы измеряем только вспомогательный кубит.
  7. Ждать.
  8. Подожди еще.
  9. Это занимает довольно много времени.
  10. Сравните нулевые измерения. Когда два квантовых состояния идентичны, они измеряют 0 со 100% вероятностью. Когда два состояния максимально противоположны, они измеряют 0 с вероятностью 50%. Чем они ближе, тем чаще они измеряют 0. Два очень похожих состояния могут измерять 0 с вероятностью 90–95%, например, в то время как два очень непохожих состояния могут измерять 0 с вероятностью 55–60%. Следовательно, цифра поезда с наибольшим количеством 0 измерений — это цифра, к которой ближе всего тестовая цифра. Эта цифра поезда является наиболее вероятной классификацией.

Какие результаты?

В последний раз, когда я делал Quantum MNIST, я запускал его один раз, потому что классическая предварительная обработка была очень утомительной, и я поставил перед собой задачу не использовать Python. В моем первоначальном эксперименте Quantum MNIST для классической предварительной и последующей обработки использовался MS Excel, а схема была построена с использованием редактора IBM Quantum OpenQASM. К счастью, тестовый нуль измерялся ближе всего к нулю поезда, так что эксперимент удался. Мне хватило, чтобы опубликовать статью с этой оговоркой.

На этот раз я запустил его как ноутбук IBM Quantum Jupyter. Я по-прежнему выполнял классическую предварительную обработку в MS Excel, но это было определенно менее утомительно, чем в прошлый раз. Это хорошая новость. Это было чрезвычайно, мучительно медленно, и это плохая новость. Но я вынужден использовать классический симулятор, а классический MNIST работает медленно. Я предполагаю, что на квантовом процессоре это должно занять всего несколько минут, однако 10 вентилей Фредкина на устройстве NISQ не приведут ни к чему, кроме шума.

В то время, когда я пишу это, я смог выполнить только 10 выстрелов на цифру поезда. Пока я печатаю, он делает 100 снимков на каждую цифру, но я думаю, что умру естественной смертью до того, как он закончится. Между пробегом из 10 выстрелов и видимыми результатами пробега из 100 выстрелов я, по сути, смотрю на случайные числа. Для сравнения, мой оригинальный Quantum MNIST выполнил 8 192 выстрела на цифру поезда за разумное время, и разброс результатов был значимым. Но Quantum MNIST сравнил восемь кубитов с отдельными вращениями с восемью кубитами с отдельными вращениями, в отличие от сравнения десяти запутанных кубитов с 10 запутанными кубитами. Таким образом, хотя квантовая классификация с тестом SWAP абсолютно эффективна, вопрос о том, работает ли квантовая классификация с амплитудным кодированием, остается нерешенным.

Преимущество квантовых вычислений?

Я подумал о том, чтобы запустить исправление ошибок один раз, а затем жестко запрограммировать корректировки для ускорения выполнения. Однако, когда я добавил операторы печати по всему коду, эти вычисления были практически мгновенными. Замедление происходит, когда задание начинает выполняться. Следовательно, это может быть хорошей проверкой преимущества квантовых вычислений.

Несмотря на то, что результаты будут чистым шумом на устройстве NISQ, как упоминалось ранее, сколько времени действительно потребуется, чтобы запустить это на 21 кубите? Я думаю, что ожидание в очереди на реальное оборудование все равно будет выполняться быстрее, тем более что 10 цепей можно запустить как пакет и поставить в очередь только один раз. Кроме того, мы должны учитывать, что 1024 выстрела, не говоря уже о большем количестве выстрелов, на симуляторе могут никогда не завершиться из-за всего, что может прервать работу ядра.

И, опять же, классический MNIST медленный. Если NISQ MNIST занимает всего несколько минут, то даже его замедление в будущем с отказоустойчивостью по-прежнему предвещает вычислительное преимущество.

Можете ли вы сделать лучше?

Я создал репозиторий GitHub с блокнотом Jupyter, который использовал для запуска 784-мерного Quantum MNIST в IBM Quantum Lab. К сожалению, файл MS Excel, который я использовал для классической предварительной обработки, значительно превышает ограничение GitHub в 25 МБ, даже со сжатием, поэтому я загрузил как 162 МБ сжатый файл .zip, так и 189 МБ несжатый файл .xlsx. » на Google Диск, чтобы смягчить ваши настройки безопасности в Интернете.

Что дальше для меня?

Я подумываю найти меньший набор данных реального мира, чтобы проверить это. Я пошел прямо к MNIST, потому что мне нужно провести прямое сравнение. Но чтобы подтвердить, работает ли квантовая классификация с амплитудным кодированием, я думаю, что набор данных с 8 или 16 измерениями был бы лучше, требуя 3 или 4 кубита соответственно. Хотя я мог бы запустить 2-кубитный 4-мерный набор данных на реальном оборудовании, он слишком мал, чтобы кого-то впечатлить, и результаты все равно были бы сплошным шумом. К сожалению, симуляция — единственный жизнеспособный вариант в эпоху NISQ, поэтому я думаю, что 3 или 4 кубита будут хорошим тестом.

У меня также есть актуальная идея, за которую я цеплялся в надежде получить микрогрант, но не похоже, что это произойдет, поэтому я просто опубликую ее здесь. Вероятно, мне следует усвоить урок и не начинать с 784 измерений, но это будет гораздо более впечатляюще, если это сработает таким образом, поэтому я выберу подход «иди по-крупному или иди домой».