表达式

VQNet 中执行反向传播时,我们使用网络的根变量来定义表达式。 表达式是一个变量包,它是一个保存变量信息并支持前向和后向传播的对象,在表达式上可以执行反向传播并获得损失函数的梯度。

接口介绍

class expression
expression(var root)
功能
通过一个变量来构造表达式。
参数
  • root 表达式变量
返回值
var getRoot() const
功能
获取表达式对应的变量。
参数
返回值
表达式对应的变量。
std::vector<var> findLeaves()
功能
获取表达式变量的叶子节点。
参数
返回值
表达式变量的叶子节点。
MatrixXd propagate()
功能
对表达式进行前向传播赋值并计算表达式的值。
参数
返回值
表达式的值。
MatrixXd propagate(const std::vector<var> &leaves)
功能
通过指定的叶子节点对表达式进行前向传播赋值并计算表达式的值。
参数
  • leaves 叶子节点
返回值
表达式的值。
std::unordered_set<var> findNonConsts(const std::vector<var> &leaves)
功能
找到从根节点到该给定叶子节点的所有非常量变量。 如果从根节点到叶子节点的路径中存在一些不相关的变量,则不会将其添加到集合中。
参数
  • leaves 叶子节点
返回值
根节点到该给定叶子节点的所有非常量变量。
std::unordered_set<var> findNonConsts(const std::unordered_set<var> &leaves)
功能
重装函数。找到从根节点到该给定叶子节点的所有非常量变量。 如果从根节点到叶子节点的路径中存在一些不相关的变量,则不会将其添加到集合中。
参数
  • leaves 叶子节点
返回值
根节点到该给定叶子节点的所有非常量变量。
void backpropagate(std::unordered_map<var, MatrixXd> &leaves)
功能
反向传播计算所有的梯度值。
参数
  • leaves 待求变量与梯度值的映射
返回值
void backpropagate(std::unordered_map<var, MatrixXd> &leaves, const std::unordered_set<var> &nonconsts)
功能
反向传播计算非常量节点变量的梯度值。
参数
  • leaves 待求变量与梯度值的映射
  • nonconsts 非常量节点变量
返回值
std::unordered_set<var> findVariables()
功能
查找该表示所有可微节点变量。
参数
返回值
表达式的值。

VQNet 中还封装了一些实用接口用来计算变量的值及梯度值。

MatrixXd eval(var v, bool iter)
功能
计算变量的值。
参数
  • v 变量
  • iter 如果为true则计算变量中所有非常量孩子节点的值,否则全部节点都重新计算
返回值
变量节点的值。
void back(const var &root, std::unordered_map<var, MatrixXd> &map)
功能
计算指定变量在根变量中的梯度值。
参数
  • root 变量
  • map 待求变量与梯度值的映射
返回值
void back(const expression &exp, std::unordered_map<var, MatrixXd> &map)
功能
计算指定变量在变量表达式中的梯度值。
参数
  • exp 变量表达式
  • map 待求变量与梯度值的映射
返回值
void back(const var &root, std::unordered_map<var, MatrixXd> &map, const std::unordered_set<var> &nonconsts)
功能
计算指定变量在根变量中的梯度值。
参数
  • root 变量
  • map 待求变量与梯度值的映射
  • nonconsts 非常量节点变量
返回值
void back(const expression &exp, std::unordered_map<var, MatrixXd> &map, const std::unordered_set<var> &nonconsts)
功能
计算指定变量在根变量中的梯度值。
参数
  • exp 变量表达式
  • map 待求变量与梯度值的映射
  • nonconsts 非常量节点变量
返回值

实例

#include "Variational/var.h"
#include "Variational/expression.h"
#include "Variational/utils.h"

int main()
{
    using namespace QPanda;
    using namespace QPanda::Variational;

    var x(2);
    var y(3);

    var f = x*x + 3*y;
    expression exp(f);

    std::cout << "f: " << eval(f, true) << std::endl;

    std::unordered_map<var, MatrixXd> map;
    map.insert(std::make_pair(x, zeros_like(x.getValue())));
    map.insert(std::make_pair(y, zeros_like(y.getValue())));

    std::vector<var> leaves = { x, y };
    std::unordered_set<var> leaf_set = exp.findNonConsts(leaves);

    back(exp, map, leaf_set);
    //back(f, map, leaf_set);

    std::cout << "df/dx: " << map[x] << std::endl;
    std::cout << "df/dy: " << map[y] << std::endl;

    return 0;
}
_images/Expression_Example.png