【发布时间】:2021-12-18 08:01:38
【问题描述】:
我一直在尝试将微分方程系统拟合到我拥有的一些数据中,并且有 18 个参数要拟合,但理想情况下,其中一些参数应该为零/归零。在谷歌搜索时,我遇到的一件事是将 DE 层构建到神经网络中,并且我发现了一些带有 Julia 代码示例的 Github 存储库,但是我对 Julia 和神经 ODE 都是新手。特别是,我一直在修改此示例中的代码:
https://computationalmindset.com/en/neural-networks/experiments-with-neural-odes-in-julia.html
差异:我有一个由 3 个 DE 组成的系统,而不是 2 个,我有 18 个参数,并且我导入了两个带有数据的 CSV 来适应它,而不是生成一个玩具数据集来适应。
我的困境:在搜索时,我遇到了 LASSO/L1 正则化,并希望通过向成本函数添加 L1 惩罚,我可以将一些参数“归零”。问题是我不明白如何修改成本函数来合并它。我现在的损失函数只是
function loss_func()
pred = net()
sum(abs2, truth[1] .- pred[1,:]) +
sum(abs2, truth[2] .- pred[2,:]) +
sum(abs2, truth[3] .- pred[3,:])
end
但我想将 L1 惩罚纳入其中。对于 L1 回归,我遇到了成本函数方程:J′(θ;X,y) = J(θ;X,y)+aΩ(θ),其中“θ 表示可训练参数,X 输入...y [the] 目标标签。a 是加权范数惩罚贡献的超参数”,对于 L1 正则化,惩罚为 Ω(θ) = ∣∣w∣∣ = ∑∣w∣(来源:https://theaisummer.com/regularization/)。我知道 RHS 的第一项是损失 J(θ;X,y) 并且是我已经拥有的,a 是我选择的超参数,可以是 0.001、0.1、1、100000000 等,而 L1惩罚是参数绝对值的总和。我不明白的是如何将 a∑∣w∣ 术语添加到我当前的函数中 - 我想将其编辑为如下所示:
function cost_func(lambda)
pred = net()
penalty(lambda) = lambda * (sum(abs(param[1])) +
sum(abs(param[2])) +
sum(abs(param[3]))
)
sum(abs2, truth[1] .- pred[1,:]) +
sum(abs2, truth[2] .- pred[2,:]) +
sum(abs2, truth[3] .- pred[3,:]) +
penalty(lambda)
end
param[1], param[2], param[3] 指的是我正在尝试学习的 DEs u[1], u[2], u[3] 的参数。我不知道这个逻辑是否正确或实现它的正确方法,而且我也不知道如何/在哪里访问学习的参数。我怀疑答案可能就在这段代码的某个地方
callback_func = function ()
loss_value = loss_func()
println("Loss: ", loss_value)
end
fparams = Flux.params(p)
Flux.train!(loss_func, fparams, data, optimizer, cb = callback_func);
但我不确定甚至不知道如何使用它,如果它是答案。
【问题讨论】:
-
万一有人来看这个,我尝试了
penalty() = lambda* sum(abs, p)并在成本函数上方定义了 lambda。 -
什么意思?它解决了你的问题吗?如果是,请将其发布为答案。
-
它可以运行,但我没有在生成的玩具数据集上测试它,其中一些参数真正为零,而不是在不确定的真实数据上测试它。我一直在更改调整参数的值并获得最差的模型,但不是最小的模型/没有将参数归零。我不想明确地说“这就是答案”,直到我确认它做了它应该做的事情。
标签: machine-learning julia regression loss-function lasso-regression