首页 > 解决方案 > 我可以为两个向量的点积创建一个成本函数等于一吗

问题描述

我有两个向量 x 和 y,每个向量的大小为 256 x 1,这两个向量的点积结果是常数,等于 1。这意味着 x*y' = 1。

这些向量会受到任何噪声的影响,我需要创建一个 x*y'= 1 的成本函数,然后对其进行优化。那可能吗?如何优化该成本函数?

谢谢

标签: mathoptimizationdeep-learning

解决方案


您希望“成本”表示点积x.y与 的距离1。一个简单的可微成本函数将是点积 和 之间的平方差1

def dot_product(x, y):
  return sum(a * b for a,b in zip(x,y))
def cost(x, y):
  return (dot_product(x, y) - 1)**2

x,y如果你想实现梯度下降以从你的噪声开始获得低成本x,y,你需要为cost函数的梯度编写一个公式。如果您对这种计算感到满意,您可以手动完成;或者您可以依靠类似pytorch实现自动微分的工具。

def cost_gradient(x, y):
  k = 2 * (dot_product(x, y) - 1)
  dx = (k * yi for yi in y)
  dy = (k * xi for xi in x)
  return (dx, dy)

然后你可以写一个简单的循环;在每次迭代中,在损失函数的梯度的相反方向上轻推 xy非常小的量。新向量xy的成本将比以前的向量略低,这意味着它们的点积将稍微接近1.

def nudge(xy, gradient, learning_rate):
  x,y = xy
  dx,dy = gradient
  x = [xi - learning_rate * dxi for xi,dxi in zip(x,dx)]
  y = [yi - learning_rate * dyi for yi,dyi in zip(y,dy)]
  return (x,y)

最后我们可以在 python REPL 中进行测试。我生成了随机向量xy256 个坐标,然后将 的每个坐标除以和y的点积。xy

>>> dot_product(x,y)
1.0
>>> x = [xi + random.uniform(-0.01, 0.01) for xi in x]  # add noise
>>> y = [yi + random.uniform(-0.01, 0.01) for yi in y]  # add noise
>>> dot_product(x, y)
0.8757084508696101
>>> for n in range(100):
...   x,y = nudge((x,y), cost_gradient(x,y), 0.001)
... 
>>> dot_product(x,y)
0.9999999992383757

我建议阅读有关使用 pytorch 进行梯度下降的教程!


推荐阅读