JAX - 功能区分问题

问题描述

我正在尝试对调用执行蒙特卡洛模拟,然后在 Python 中计算其相对于基础资产的一阶导数,但它仍然不起作用

import { spawn } from 'child_process'

// Chunkdata
let chunkData = null

// Spawn command
const command = 'top'
const args = ['-b']
const child = spawn(command,args)

// Data output
child.stdout.setEncoding('utf8')
child.stdout.on('data',(data) => {
    const convertedData = data.toString()
    if (!chunkData) {
        // If no chunkdata exists,we will save stream output
        chunkData = convertedData
    } else if (/top - /.test(convertedData)) {
        // New data contains a new output/interval
        // Old chunkdata was completed
        
        // Emit completed chunkdata with socket.io or do other stuff...
        io.to('room').emit('event',chunkData)
        
        // New output will be saved as a new interval of data
        // We clean old chunks and overwrite it with new output
        chunkData = convertedData
    } else {
        // Adds output to chunkdata
        chunkData += convertedData
    }
})

我不知道该算法的实现方式是否是使用“AD 方法”计算导数的最佳方式;这个算法是这样工作的:

  • S = 模拟一个包含所有底层的矩阵;对于每一行,我都使用“xi = jnp.linspace”生成了每个底层,并且在矩阵的每一行内,我都有相同的值,次数等于“number_sim”

  • product = 生成 BM(包含正常数的向量)后,我需要将 BM 的每个元素(带 exp)与每行的每个元素相乘S

所以这是对算法的简短解释,我非常感谢任何解决此问题的建议或技巧,并使用 AD 方法计算导数! 提前致谢

解决方法

看起来你的函数映射了一个向量Rᴺ→Rᴺ。在这种情况下,有两个导数概念是有意义的:逐元素导数(在 JAX 中,您可以通过组合 <T: ?Sized>jax.vmap 来计算)。这将返回一个长度为 N 的导数向量,其中元素 i 包含第 i 个输出相对于 i 的导数 次输入。

或者,您可以计算雅可比矩阵(使用 jax.grad),它将返回一个形状 jax.jacobian 矩阵,其中元素 i,j 包含 的导数>ith 输出相对于 jth 输入。

您遇到的问题是您的函数是假设向量输入编写的(您要求 [N,N] 的长度),这意味着您对 jacobian 感兴趣,但您要求的是 elementwise导数,这需要标量值函数。

所以你有两种可能的方法来解决这个问题,这取决于你感兴趣的导数。如果你对雅可比感兴趣,你可以使用写的函数并使用 xi 变换:

jax.jacobian

或者,如果您对元素梯度感兴趣,您可以重写您的函数以与标量输入兼容,并像您在示例中所做的那样使用 grad 的 vmap。只需要修改两行:

from jax import jacobian
print(jacobian(Simulation)(xi))
# [[0.6528027 0.        0.        0.        0.       ]
#  [0.        0.6819291 0.        0.        0.       ]
#  [0.        0.        0.7003516 0.        0.       ]
#  [0.        0.        0.        0.7181915 0.       ]
#  [0.        0.        0.        0.        0.7608434]]

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...