最近在学神经网络,对于监督学习来说,步骤就是输入 x ,模型输出一个 y_pred ,然后和标签 y 计算一下 loss ,然后就反向传播更新参数。
那我如果想用神经网络求一个函数的最大值,是不是可以当模型输出 y_pred 时,我用 MAX_VALUE ,一个很大很大的值来跟 y_pred 计算 loss ,然后反向传播更新参数,让 loss 尽量小。
我不知道这个想法对不对,因为我找不到相关的介绍。
重新想了一下,是不是可以把这个函数直接加个负号,直接当成 loss 就行了?
1
Joshua999 2021-11-09 23:07:55 +08:00 via Android
求最大值应该不需要神经网络吧,记得好像有什么牛顿法,退火法。用神经网络的话,是最大值了就 1 ,不是最大值了就 0 呗
|
2
Xs0ul 2021-11-09 23:31:23 +08:00
按你的想法,模型学到的预测值就是 MAX_VALUE ,并不能实现预测某个函数最值的效果
|
3
ipwx 2021-11-09 23:36:14 +08:00
你能不能把你的原始问题说一说。
这估计也是个 XY problem |
4
rpman 2021-11-09 23:51:17 +08:00 1
你这样 y_pred 逼近的就是 MAX_VALUE
你想逼近的其实就是 max(x) |
5
GuuJiang 2021-11-10 04:51:33 +08:00
并不能,神经网络解决的问题是
求**一个函数**,使其对于测试集的输入得到的输出值(即 loss)最小 而你想要解决的问题是 对于一个**已知的函数**,求其在定义域上的最大值 看出区别了吧?问题的关键不在于最小和最大的区别,假如仅仅是最小和最大的区别的话确实可以通过一些手段把最大值问题变为最小值问题,而你这里压根就是两个完全不一样的问题 BTW ,你这个想法让我想到了一些刚开始学编程的初学者试图通过赋值语句来达到解方程的目的,这两种场景非常相似,都是有两个问题 A 和 B ,乍一看描述非常相似,实际上是完全不同的问题 |
6
Xs0ul 2021-11-10 05:06:59 +08:00
试图理解了一下楼主想问什么:
1. 一般的机器学习问题是,已有一组观测到的 xy 和由未知参数 w 定义的函数,求最优的 w 使函数预测的 y 与实际的 y 差距最小。 2. 让模型自动找某类函数的最大值也可以,比如一堆由 x=(a,b,c)定义的二次函数和对应的二次函数的最值 y ,神经网络够复杂或者恰好用到正确的层,可以拟合出求最值的公式(二次函数)。 3. 楼主想问的好像把 1 和 2 混在了一起,输入是 1. 但输出是 2.,这只要 max()就行了 |
7
zxCoder OP |
8
ipwx 2021-11-10 10:06:58 +08:00
1 、你要训练的是 f(x) 本身? f(x) 可变?
2 、那训练了之后 y=f(x) 就变了啊。。。它可以变成任何东西。你有训练目标吗?就是 t[x] = f(x) 的正确答案 t[x]。 3 、没有目标去训练,它可以变成任何值啊。 楼主能不能用数学语言形式化一下你的问题,我无法理解。 |
9
ipwx 2021-11-10 10:08:36 +08:00
还有,两个线性层和一个激活层它顺序到底是啥?
y = A2*(u(A1*x+b1)) + b2 ? 如果是 y = u(A2*(A1*x+b1)+b2) 那是没有用的。两个线性层和一个线性层没有区别(参数可以训练的情况下) |
10
ipwx 2021-11-10 10:08:59 +08:00
这种东西不能靠叙述,它根本不精确。上公式啊喂
|
11
zxCoder OP @ipwx 就是有一个式子 y=xxxxx 我打不出来,里面有一部分是一个神经网络,然后现在要训练这个神经网络的参数使得这个式子的值最大。
这个式子是不是就相当于有标签的学习里面 loss function 的概念 |
12
ipwx 2021-11-10 10:22:09 +08:00
|
13
ipwx 2021-11-10 10:22:47 +08:00
so 你是不是想要 max L=sum_x f(x)
|
14
ipwx 2021-11-10 10:23:09 +08:00
对于单独的 for any x, max f(x) 这个问题似乎就没有意义了
|
15
ipwx 2021-11-10 10:24:03 +08:00
@zxCoder 你看,这不是 y=xxxxxx 我需要看你数学公式的形式化,而是问你,你的“最大化一个函数”到底形式化是什么意思。我给了两个形式:
max sum_x f(x) for any x, max f(x) 所以你是哪个? |
20
ipwx 2021-11-10 11:15:53 +08:00
@zxCoder 那这个问题的定义很奇怪,因为对于一个足够宽的、一个非线性层的神经网络,可以拟合任何实数域上的可测函数。也就是说,
对于任何 C ,f(x) 恒等于 C 是你这个神经网络可以拟合的函数。 最终你会得到一个 meaningless 的函数,C 在训练过程中不断被推向负无穷(或者正无穷) |
21
ipwx 2021-11-10 11:18:07 +08:00
除非你的 f(x) 有值域,那么这个函数会被推向下界(或者上界)。
为了避免 f(x) 退化成常值函数,你的训练目标或者网络结构必须把数据之间的关联性发掘出来。。。所以你这个问题是不是真的不对头,不好说,得看你的问题数据本身是什么样子,以及神经网络是什么样子。 但是在我的经验中,for any x, max f(x) 很少见。至少也是 max E[f(x)] |
22
zxCoder OP @ipwx max E[f(x)] 大佬可以讲一下这个吗,或者给我点参考资料。我不知道如何下手
|
23
ipwx 2021-11-10 15:26:01 +08:00
|
25
Xs0ul 2021-11-10 15:49:07 +08:00 via Android
楼主不如直接作业截图或者拍个照发上来,感觉越说越糊涂了
|
26
zxCoder OP |
27
ipwx 2021-11-10 16:37:35 +08:00
你这形式化还是不太对劲。你能不能作业拍个照截个图。
f(x) = g(a) 这个肯定有问题。 f(x) = E_a[g(x,a)], a ~ q(a) 或者 a~q(a|x) 那我还能理解。 ---- 另外用 a 来表示分布变量,你这是在做 Reinforcement learning 的 action network 吗? 这样的话你需要用 REINFORCE 算法去蒙特卡洛采样 a 。当然具体请参照 RL 的最新文章,我不是专门做 RL 的。 不管怎么样如果你的目的是优化 f(x),那么你的 loss 应该是 L = E_x[E_a[g(x,a)]] 其中 x ~ p(x) 是数据分布,a ~ q(a) 或者 q(a|x) 是 action network 导出的分布。当然一般而言我觉得 q(a) 应该是有条件概率 q(a|x) 的。 max L 就梯度下降 min -L |
28
ipwx 2021-11-10 16:39:06 +08:00
顺便 L = E_x[f(x)] 是神经网络很普适的写法,表示的是 x 从全部训练集上采样(也就是 mini-batch ),E_x 就是 mini-batch 上所有 f(x) 的平均,这个在代码里面也很常见才对。
|
30
ipwx 2021-11-10 16:48:51 +08:00
@zxCoder 嗯,再引入一个新的记号,l(x)
在回归任务中,l(x) = f(x) - t[x] 其中 f(x) 是神经网络输出,t[x] 是 x 对应的标注( label )。 那么 L = E_x[l(x)] 就算是普普通通的回归任务还是有这个 E_x 。只是现在的人上手都是 pytorch 框架,直接写 loss='mse',没看见它源代码里面的求平均而已。。。而这个求平均的数学意义是蒙特卡洛采样 E_x[f(x)] 约等于 1/N f(x[i]), x[i] 是 第 i 个从 p(x) 上采到的样本。 如果 x 是训练集数据,那么采样只需要取一个 mini-batch 就行了。 |
31
ipwx 2021-11-10 16:49:11 +08:00
更正:在回归任务中,l(x) = (f(x) - t[x])^2
|
32
ipwx 2021-11-10 16:50:41 +08:00
更正:E_x[f(x)] 约等于 1/N sum_i f(x[i]), x[i] 是 第 i 个从 p(x) 上采到的样本。
|
33
Joshua999 2021-11-10 16:51:06 +08:00 via Android
@zxCoder fx 是两个线性层加一个激活函数,最大化输出。那就直接把线性层系数 w 设为 0 ,偏置 b 设最大(或者激活函数的最大点)。不管输入什么,都是最大值
|