speechbrain.nnet.quaternion_networks.q_linear module

实现四元数线性变换的库。

作者
  • Titouan Parcollet 2020

  • Drew Wagner 2024

摘要

QLinear

此函数实现了全连接的四元数线性层:y = Wx + b。

参考

class speechbrain.nnet.quaternion_networks.q_linear.QLinear(n_neurons, input_shape, bias=True, init_criterion='glorot', weight_init='quaternion', autograd=True, spinor=False, vector_scale=False, max_norm=None)[source]

基类: Module

此函数实现了全连接的四元数线性层:y = Wx + b。y, W, x 和 b 都是四元数。一个四元数可以写成:r + xi + yj + zk。一个四元数张量 x = [batch, 32] 可以理解为 [batch, 0:7] = R, [batch, 8:15] = Xi, [batch, 16:23] = Yi, 和 [batch, 24:31] = Xi。因此,特征维度被切成四份 (必须能被 4 整除)。

参数:
  • n_neurons (int) – 输出神经元的数量 (即输出的维度)。请注意,这些是四元数值神经元。如果指定 256 个神经元,输出维度将是 1024。

  • input_shape (tuple) – 预期的输入尺寸。

  • bias (bool) – 如果为 True,则采用加性偏差 b。

  • init_criterion (str , optional) – (glorot, he)。此参数控制权重的初始化标准。它与 weights_init 结合使用,以构建四元数值权重的初始化方法 (默认值为 “glorot”)。

  • weight_init (str, optional) – (quaternion, unitary)。此参数定义四元数值权重的初始化过程。“quaternion” 将根据 init_criterion 和四元数极坐标形式生成四元数值权重。“unitary” 将权重归一化到单位圆上 (默认值为 “quaternion”)。更多详情请参阅:“Quaternion recurrent neural networks”, Parcollet T。

  • autograd (bool, optional) – 为 True 时,将使用默认的 PyTorch autograd。为 False 时,将使用自定义反向传播,将内存消耗减少 3 到 4 倍。速度也会慢 2 倍。这仅在 spinor = False 时有效 (默认值为 True)。

  • spinor (bool, optional) – 为 True 时,该层将转换为 spinor 层。更准确地说,W*x 将转换为 W*x*W-1。输入 x 将由 W 旋转,就像在 spinor 神经网络中一样。但是,x 必须是一个实部为零的四元数 (0 + xi + yj + zk)。实际上,旋转操作只作用于向量部分。请注意,W 在旋转之前总是会被归一化,以确保四元数代数 (默认值为 False)。更多详情请参阅:“Quaternion neural networks”, Parcollet T。

  • vector_scale (bool, optional) – vector_scale 仅在 spinor = True 时使用。在 spinor 神经网络中,对输入向量 x 进行多次旋转并求和。因此,输出向量的范数总是随着层数的增加而增加,使得深度配置下的神经网络不稳定。vector_scale 参数是可学习的参数,通过将输出向量乘以一个小的可训练参数来充当门控 (默认值为 False)。

  • max_norm (float) – 权重最大范数。

示例

>>> inputs = torch.rand(10, 50, 40)
>>> lin = QLinear(n_neurons=100, input_shape=inputs.shape, weight_init='unitary')
>>> output = lin(inputs)
>>> output.shape
torch.Size([10, 50, 400])
forward(x)[source]

返回输入张量的线性变换。

参数:

x (torch.Tensor) – 需要进行线性变换的输入。

返回类型:

线性变换后的输入。