Path: blob/master/site/pt-br/quantum/tutorials/gradients.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
Calcule gradientes
Este tutorial explora algoritmos de cálculo de gradiente para os valores esperados de circuitos quânticos.
Calcular o gradiente do valor esperado de determinado observável em um circuito quântico é um processo complexo. Os valores esperados dos observáveis não possuem o luxo de ter fórmulas de gradiente analíticas que são sempre fáceis de escrever — ao contrário das transformações de aprendizado de máquina tradicionais, como a multiplicação de matriz ou a adição de vetores, que possuem fórmulas de gradiente analíticas que são fáceis de escrever. Como resultado, há diferentes métodos para o cálculo de gradientes quânticos que podem ser úteis para diferentes cenários. Este tutorial compara e contrasta dos esquemas de diferenciação diferentes.
Configuração
Instale o TensorFlow Quantum:
Agora importe o TensorFlow e as dependências de módulo:
1. Preliminar
Vamos tornar a noção de cálculo de gradientes para circuitos quânticos um pouco mais concreta. Suponha que você tem um circuito parametrizado como este:
Junto com um observável:
Olhando esse operador, você sabe que
e, se você definir , então . Vamos verificar isso:
2. Necessidade de um diferenciador
Com circuitos maiores, você nem sempre terá a sorte de ter uma fórmula que calcula precisamente os gradientes de um determinado circuito quântico. Caso uma fórmula simples não seja suficiente para calcular o gradiente, a classe tfq.differentiators.Differentiator
permite que você defina algoritmos para computar os gradientes dos seus circuitos. Por exemplo, você pode recriar o exemplo acima no TensorFlow Quantum (TFQ) com:
No entanto, se você quiser estimar a expectativa com base na amostragem (o que aconteceria em um dispositivo real), os valores podem mudar um pouco. Isso significa que agora você tem uma estimativa imperfeita:
Isso pode rapidamente se tornar um problema de exatidão mais sério quando se trata de gradientes:
Aqui você pode ver que, embora a fórmula de diferença finita seja rápida em computar os gradientes no caso analítico, quando se trata de métodos baseados em amostragem, há muito ruído. É preciso usar técnicas mais cuidadosas para garantir que um bom gradiente possa ser calculado. Em seguida, você analisará uma técnica muito mais lenta que não seria tão adequada para cálculos de gradiente esperado analíticos, mas tem um desempenho muito melhor no caso real baseado em amostra.
Acima, você pode ver que determinados diferenciadores são mais adequados para cenários de pesquisa específicos. Em geral, os métodos mais lentos baseados em amostragem que são robustos ao ruído dos dispositivos etc. são ótimos diferenciadores ao testar ou implementar algoritmos em um cenário mais "mundo real". Métodos mais rápidos, como a diferença finita, são ótimos para cálculos analíticos e para quando você quer maior produtividade, mas não está preocupado com a viabilidade de dispositivos do seu algoritmo.
3. Vários observáveis
Vamos apresentar um segundo observável e ver como o TensorFlow Quantum é compatível com vários observáveis em um único circuito.
Se esse observável for usado com o mesmo circuito que antes, você terá e . Faça uma rápida verificação:
Temos uma correspondência (próxima o suficiente).
Agora, se você definir , então . A definição de mais de um observável no TensorFlow Quantum para ser usado com um circuito é equivalente a adicionar mais termos a .
Isso significa que o gradiente de um símbolo específico em um circuito é igual à soma dos gradientes em relação a cada observável para esse símbolo aplicado ao circuito. Isso é compatível com a obtenção de gradiente e a retropropagação do TensorFlow (onde você dá a soma dos gradientes de todos os observáveis como o gradiente de um determinado símbolo).
Aqui, você vê que a primeira entrada é o X de Pauli esperado do w.r.t, e a segunda é o Z de Pauli esperado do w.r.t. Agora, você obtém o gradiente:
Aqui, você verificou que a soma dos gradientes para cada observável é realmente o gradiente de . Esse comportamento é compatível com todos os diferenciadores do TensorFlow Quantum e desempenha um papel crucial na compatibilidade com o resto do TensorFlow.
4. Uso avançado
Todos os diferenciadores que existem dentro da subclasse tfq.differentiators.Differentiator
do TensorFlow. Para implementar um diferenciador, um usuário precisa implementar uma das duas interfaces. O padrão é implementar get_gradient_circuits
, que diz à classe de base quais circuitos medir para obter uma estimativa do gradiente. Como alternativa, você pode sobrecarregar differentiate_analytic
e differentiate_sampled
. A classe tfq.differentiators.Adjoint
segue esse caminho.
O código a seguir usa o TensorFlow Quantum para implementar o gradiente de um circuito. Você usará um pequeno exemplo da mudança de parâmetros.
Chame novamente o circuito que você definiu acima, . Como antes, você pode definir uma função como o valor esperado desse circuito para o observável , . Usando as regras de mudança de parâmetro, para esse circuito, você pode encontrar que a derivada é . A função get_gradient_circuits
retorna os componentes dessa derivada.
A classe de base Differentiator
usa os componentes retornados de get_gradient_circuits
para calcular a derivada, como na fórmula de mudança de parâmetro que você viu acima. Esse novo diferenciador agora pode ser usado com objetos tfq.layer
existentes:
Esse novo diferenciador agora pode ser usado para gerar ops diferenciáveis.
Ponto importante: um diferenciador que foi ligado anteriormente a uma op precisa ser atualizado antes de ser ligado a uma nova op, porque ele só pode ser ligado a uma de cada vez.
Sucesso: agora você pode usar todos os diferenciadores que o TensorFlow Quantum tem a oferecer — e definir os seus.