math - 我可以为两个向量的点积创建一个成本函数等于一吗
问题描述
我有两个向量 x 和 y,每个向量的大小为 256 x 1,这两个向量的点积结果是常数,等于 1。这意味着 x*y' = 1。
这些向量会受到任何噪声的影响,我需要创建一个 x*y'= 1 的成本函数,然后对其进行优化。那可能吗?如何优化该成本函数?
谢谢
解决方案
您希望“成本”表示点积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)
然后你可以写一个简单的循环;在每次迭代中,在损失函数的梯度的相反方向上轻推 x
和y
非常小的量。新向量x
和y
的成本将比以前的向量略低,这意味着它们的点积将稍微接近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 中进行测试。我生成了随机向量x
和y
256 个坐标,然后将 的每个坐标除以和y
的点积。x
y
>>> 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 进行梯度下降的教程!
推荐阅读
- reactjs - useContext in React Native
- java - 列出所有可以由用户输入字符组成的单词(Java 数组)
- javascript - How to filter an array based on the grand child array's values?
- c# - 检查 PDF 文件是否正确创建
- javascript - Firestore分页以错误的顺序附加数组
- c - How get proper warnings using Cygwin C compiler on Eclipse IDE
- javascript - 如何使用 react-flip-move 为表格设置动画
- r - 来自 SFTP 连接的 R 文件信息
- sql - 如何将一个表中的数据插入到另一个表中?
- node.js - Twilio 视频连接时间