- 金融科技
- 科学计算
【免费下载链接】tf-quant-finance
High-performance TensorFlow library for quantitative finance.
在 tf-quant-finance 的拟蒙特卡洛(QMC)模块中,数字网络(Digital Net)与 Sobol 序列的生成高度依赖高效的位级运算。filter_tensor正是这样一个轻量级但关键的位级过滤工具:它根据掩码张量(bit_mask)中指定位置的比特位是否为 1,来决定保留还是清零输入张量(value)中的元素。本文将以 filter_tensor.md 为主线,结合仓库源码与测试用例,完整讲解该函数的语义、参数约束、位运算原理及其在 Sobol 生成矩阵、数字网络采样和矩阵置乱中的真实调用场景。读完本文,你将能够熟练使用该函数处理位掩码过滤任务,并理解 QMC 生成器内部核心循环的工作原理。
一、函数签名与核心语义
filter_tensor定义于模块tf_quant_finance.math.qmc.utils(源码位于 tf_quant_finance/math/qmc/utils.py),其调用形式为:
tf_quant_finance.math.qmc.utils.filter_tensor( value, bit_mask, bit_index )函数的核心行为可以浓缩为一条公式(与文档中 Return 描述完全一致):
value * (1 & (bit_mask >>> bit_index))即:对bit_mask按bit_index执行无符号右移后,与1做按位与,得到 0 或 1;再与value相乘。直观地说:
- 若
bit_mask中从低位起第bit_index位(LSB 0 顺序)为1,则返回value原值; - 否则返回
0(即把该元素“过滤掉”)。
因此,它并非简单地做布尔掩码,而是在整数张量上按位筛选,天然适合与位运算(位移、异或)组合使用,是 QMC 数字网络算法中不可或缺的积木函数。
二、参数详解与约束条件
根据文档 Args 部分,三个参数均为标量元素组成的整数Tensor:
| 参数 | 类型要求 | 说明 |
|---|---|---|
value | 整数Tensor | 待过滤的输入张量 |
bit_mask | 正整数Tensor | 掩码张量,要求与value具有相同的shape和dtype |
bit_index | 正整数Tensor | 位索引张量,要求与value具有相同的shape和dtype,表示在 LSB 0 顺序下检查bit_mask中的第几位 |
需要注意的约束:
- 形状一致:三个参数必须逐元素对应(shape 相同),因此支持任意维度的批量过滤——标量、向量、矩阵甚至更高阶张量都可以。
- dtype 一致:
bit_mask、bit_index与value必须使用相同的整数dtype。从测试代码 utils_test.py 可以看到,tf.uint8、tf.int8、tf.uint16、tf.int16、tf.uint32、tf.int32、tf.uint64、tf.int64等有符号与无符号整数类型均被覆盖测试。 - 元素级广播语义:由于是逐元素操作,
bit_index的每个元素只作用于同位置的bit_mask与value元素,这与逐元素算术运算(如tf.math.multiply)一致。
三、源码实现:三步位运算拆解
文档给出的语义对应到源码实现(tf_quant_finance/math/qmc/utils.py)只有短短三行核心逻辑:
# 判断 bit_mask 中第 bit_index 位(LSB 0 顺序)是否为 1 is_bit_set = tf.equal( tf.cast(1, value.dtype), tf.bitwise.bitwise_and( tf.bitwise.right_shift(bit_mask, bit_index), tf.cast(1, value.dtype))) return tf.where(is_bit_set, value, 0)实现分三步完成:
- 右移取位:
tf.bitwise.right_shift(bit_mask, bit_index)将bit_mask的每一位元素右移bit_index个二进制位,从而把目标比特位移到最低位(第 0 位)。由于使用的是算术右移,为保证无符号语义,测试覆盖了有符号与无符号整数类型,配合下一步的& 1只取最低位,结果与无符号右移>>>等价。 - 按位与提取:
tf.bitwise.bitwise_and(..., tf.cast(1, value.dtype))与常量1做按位与,将结果归约为0或1,即“该位是否被置位”的布尔化标志。 - 条件筛选:
tf.equal(1, ...)生成布尔掩码,最后tf.where(is_bit_set, value, 0)按位保留或清零value。
从代码结构可以推断:该函数刻意不使用tf.cond或 Python 循环,而是全部采用张量化位运算,因此可在 GPU 上向量化执行,这正符合 QMC 生成器“以显式 while 循环 + 批量位运算换取 GPU 向量化”的设计取向。
四、运行示例:从文档示例到批量矩阵
4.1 文档原始示例(向量形式)
文档 filter_tensor.md 中给出的最小可运行示例:
import tensorflow as tf import tf_quant_finance as tff # Example: Filtering a given vector based on a mask. tff.math.qmc.utils.filter_tensor( tf.constant([5, 6, 7, 8]), tf.constant([1, 2, 3, 4]), tf.constant([1, 1, 2, 2])) # ==> tf.Tensor([0, 6, 0, 8], shape=(4,), dtype=int32)逐元素验证如下(LSB 0 顺序,最低位为第 0 位):
| 位置 | value | bit_mask(二进制) | bit_index | 目标位值 | 结果 |
|---|---|---|---|---|---|
| 0 | 5 | 1 =0b001 | 1 | 第 1 位为 0 | 0 |
| 1 | 6 | 2 =0b010 | 1 | 第 1 位为 1 | 6 |
| 2 | 7 | 3 =0b011 | 2 | 第 2 位为 0 | 0 |
| 3 | 8 | 4 =0b100 | 2 | 第 2 位为 1 | 8 |
4.2 二维批量示例(来自测试用例)
测试文件 utils_test.py 中展示了 2×3 矩阵的批量过滤,且覆盖全部 8 种整数 dtype:
# Should only retain values for which given bits in the bit mask are set. expected = tf.constant([[6, 5, 0], [3, 0, 1]], dtype=dtype) actual = utils.filter_tensor( # Tensor to filter tf.constant([[6, 5, 4], [3, 2, 1]], dtype=dtype), # Bit mask tf.constant([[1, 2, 11], [3, 5, 4]], dtype=dtype), # Indices (in LSB 0 order) of bits in the mask used for filtering tf.constant([[0, 1, 2], [0, 1, 2]], dtype=dtype))其中关键的一处验证是元素(0, 2):bit_mask = 11 = 0b1011,bit_index = 2,第 2 位为0(二进制从低位起为 1、1、0、1),故value = 4被清零为0;而元素(1, 0):bit_mask = 3 = 0b011,bit_index = 0,第 0 位为1,故value = 3被保留。测试通过subTest同时断言了数值与 dtype 的一致性。
4.3 自行构造示例:确认位索引语义
可以用更直观的输入验证“保留条件”:
# 当 bit_index 为 0 时,等价于判断 bit_mask 是否为奇数 tff.math.qmc.utils.filter_tensor( tf.constant([10, 20, 30]), tf.constant([1, 2, 3]), tf.constant([0, 0, 0])) # ==> tf.Tensor([10, 0, 30], shape=(3,), dtype=int32) # 1=0b01, 2=0b10, 3=0b11,第 0 位分别为 1, 0, 1五、在 QMC 模块中的真实调用场景
filter_tensor不是孤立工具,而是 QMC 数字网络生成链路的核心运算。从源码中可找到三处典型调用(该模块总览见 qmc/README.md)。
5.1 Sobol 生成矩阵的递推计算
在 sobol.py 的_sobol_generating_matrices中,Sobol 生成矩阵的列由本原多项式递推得到:
updated_matrices = tf.bitwise.bitwise_xor( tf.where( tf.equal(indices, column + degree), tf.bitwise.right_shift(column_values, degree), matrices), utils.filter_tensor(column_values, polynomial, column + degree - indices))这里polynomial即本原多项式的系数掩码,filter_tensor的作用是从当前列值column_values中挑出那些系数位为 1 的列参与异或递推,从而实现多项式系数驱动的列更新。借助该函数,源码注释所述的三重嵌套循环(矩阵索引 × 列索引 × 递推)被压扁为单层while_loop(sobol.py),使 GPU 向量化成为可能。
5.2 数字网络采样的逐位异或
在 digital_net.py 的digital_net_sample主循环中,每个样本点的二进制表示通过逐位异或生成矩阵列得到:
updated_binary_points = tf.bitwise.bitwise_xor( binary_points, utils.filter_tensor( # shape: (1, dim) tf.gather(generating_matrices, log_index, axis=2), # shape: (num_samples, 1) tf.cast(tf.expand_dims(sequence_indices, axis=1), int_dtype), # shape: () log_index))此处sequence_indices作为掩码,log_index作为位索引,filter_tensor负责判断“第log_index位是否出现在该样本点的序列索引中”,从而决定该生成矩阵列是否参与该点的异或。值得注意的是,这里三个参数形状不同((1, dim)、(num_samples, 1)、标量),依靠 TensorFlow 的隐式广播完成批量判定,说明该函数在形状上具备广播兼容性(只要逐元素语义成立)。
5.3 置乱矩阵的构造
在 digital_net.py 的scramble_generating_matrices中,置乱矩阵同样通过filter_tensor控制位级贡献:
updated_matrix = tf.bitwise.bitwise_xor( matrix, utils.filter_tensor(shifted_scrambling_matrices, generating_matrices, num_digits - 1 - shift))即以生成矩阵为掩码、以num_digits - 1 - shift为位索引,筛选右移后的置乱矩阵行,再异或累积。这再次印证了filter_tensor在 QMC 模块中被反复用作“按位条件选择”的通用原语。
六、使用建议与注意事项
- 适用场景:任何需要“按掩码某一位决定保留/清零”的整数张量运算,尤其是在位运算驱动的数字网络、格规则等 RQMC 算法中作为向量化原语。
- 形状与 dtype:务必保证三个参数 shape 与整数 dtype 一致;如需跨类型使用,先用
tf.cast统一(参考digital_net_sample中tf.cast(..., int_dtype)的用法)。 - 位索引越界:若
bit_index大于等于bit_mask的位宽(如对int32使用bit_index = 40),按位与结果自然为 0,函数返回 0,不会报错,但语义上应确保索引在[0, 位宽)内。 - 与布尔掩码的区别:
filter_tensor针对的是“整数位掩码”,而非常见的True/False布尔掩码;需要布尔掩码场景请直接使用tf.where。 - 性能:函数整体由
right_shift、bitwise_and、equal、where四个张量算子组成,无标量分支,适合在tf.while_loop与 XLA 编译下运行。
七、总结
tff.math.qmc.utils.filter_tensor是一个语义简洁、实现精悍的位级过滤原语:一行公式value * (1 & (bit_mask >>> bit_index))道尽其全部行为,而源码只用三个位运算算子完成了从“取位、判位、筛选”的完整链路。它既可作为独立工具用于按位筛选整数张量,也是 Sobol 生成矩阵递推、数字网络采样、矩阵置乱三大 QMC 核心算法共用的关键拼图。理解了它,也就理解了 tf-quant-finance QMC 模块中“以位运算向量化取代多层循环”的设计哲学。若要进一步探索,可阅读 utils.md(模块内还有exp2、log2、get_shape、tent_transform等配套工具)、sobol.py 与 digital_net.py 的完整实现,或运行 utils_test.py 观察其对全部整数 dtype 的验证逻辑。
- 金融科技
- 科学计算
【免费下载链接】tf-quant-finance
High-performance TensorFlow library for quantitative finance.
相关推荐
tf-quant-finance QMC 工具函数 tent_transform 详解:帐篷变换的数学原理与源码实现
tf quant finance QMC 工具函数 tent_transform 详解:帐篷变换的数学原理与源码实现 导读 tf_quant_finance.m
金融科技科学计算tf-quant-finance 远期利率分析:`rates.analytics.forwards` 模块函数全解析与源码实现
tf quant finance 远期利率分析: rates.analytics.forwards 模块函数全解析与源码实现 导读 本文深入解析 tf quan
金融科技科学计算tf-quant-finance 中 QMC 采样的形状解析基石:tf_quant_finance.math.qmc.utils.get_shape 深度解析
tf quant finance 中 QMC 采样的形状解析基石:tf_quant_finance.math.qmc.utils.get_shape 深度解析
金融科技科学计算
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考