【问题标题】:Smooth approximation to the floor function for use with backpropagation平滑逼近用于反向传播的底函数
【发布时间】:2019-01-31 16:50:45
【问题描述】:

我一直在尝试实现np.floor 函数的平滑近似。我需要一个顺利的实现,因为np.floor 不能在我的程序中反向传播。

我想出了一个涉及许多逻辑函数之和的解决方案,但是当数字很大时性能很糟糕。

import numpy as np
from scipy.special import expit

def multiexpit(x, slope=50):
    y = np.asarray([ expit(slope*(x-i)) for i in range(int(np.max(x))) ])
    return np.sum(y,axis=0)

if __name__=='__main__':
    import matplotlib.pyplot as plt
    x = np.linspace(0,10,1000)
    plt.plot(x,np.floor(x),label='floor')
    plt.plot(x,multiexpit(x-1),label='smooth floor')

但是结果很好。这里的近似值显示在 floor 函数上,温度参数为slope=50

我的问题是,是否可以使用不依赖于输入值的运行时来实现此功能?张量流有类似的东西吗?我正在使用 numpy,但问题与 TF 相同。

【问题讨论】:

  • 你能给我一个大数字的样本输入吗?我已经准备了一个解决方案,但想比较它的性能。因此,如果您告诉我一些大样本输入的执行时间并给我该输入以便我知道我得到了什么,那将会很有帮助
  • 您可能已经在 Google 上找到了这个,但无论如何,与 Mathematical.SE 相关:Smooth floor function
  • 我认为@jdehesa 的链接可能是个好主意。我非常怀疑图像中的“平滑”版本是否会为反向传播提供有用的梯度——它们几乎总是接近 0(意味着学习将非常缓慢/不可能)或非常大(可能导致不稳定)。虽然我猜这可能只是不同地设置“温度”参数的问题。
  • 梯度不明确依赖于底函数的结果,因为它们是我需要计算特征值的随机矩阵的离散样本。像重新参数化这样的伯努利实验给了我非常精确的结果,我想用这种特定的重新参数化对几何随机变量进行采样,而 floor 函数会停止梯度。

标签: python numpy tensorflow math


【解决方案1】:

如果你想使用重复的expit,我想没有办法绕过总和,所以你唯一能做的就是让numpy处理for循环。一种方法是使用meshgrid 将您的 x 值和步骤的位置转换为二维数组:

def multiexpit2(x, slope=50):
    i = np.arange(int(min(x)//1),int(max(x)//1)+1)
    X, I = np.meshgrid(x,i)
    return np.sum(expit(slope*(X-I)),axis=0)+min(x)//1-1

添加min(x)//1-1 可以纠正您的 x 值不是从零开始的任何情况。

【讨论】:

    猜你喜欢
    • 2017-11-11
    • 2021-01-24
    • 2021-01-19
    • 2010-12-25
    • 1970-01-01
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多