在博伊德教授homework solution投影到单位单纯形,他结束了以下方程:
g_of_nu = (1/2)*torch.norm(-relu(-(x-nu)))**2 + nu*(torch.sum(x) -1) - x.size()[0]*nu**2
如果计算nu*
,则到单位单形的投影将是y*=relu(x-nu*1)
。
他的建议是找到g_of_nu
,由于g_of_nu
是严格凹的,我将它乘以一个负号(f_of_nu
),然后使用梯度下降法找到它的全局最小值。
- 问题**
最后一个向量y*
,加起来不等于1,我做错了什么?
- 复制代码**
x一个一个一个一个x一个一个二个x
- 功能**
torch.manual_seed(1)
x = torch.randn(10)
nu = torch.linspace(-1, 1, steps=10000)
f = lambda x, nu: -( (1/2)*torch.norm(-relu(-(x-nu)))**2 + nu*(torch.sum(x) -1) - x.size()[0]*nu**2 )
f_value_list = np.asarray( [f(x, i) for i in nu.tolist()] )
i_min = np.argmin(f_value_list)
print(nu[i_min])
fig, ax = plt.subplots()
ax.plot(nu.cpu().detach().numpy(), f_value_list);
这是图中的最小值,它与梯度下降一致。
tensor(0.0665)
1条答案
按热度按时间35g0bw711#
误差来自公式的推导:
发件人:
如果你发展出这个表达式
你就会意识到
代替
简而言之,这个错误来自于在制定规范时忘记了1/2因素,一旦你做出了改变,一切都按预期进行:
输出为: