V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
zxCoder
V2EX  ›  问与答

请教一个神经网络求函数最大值的问题

  •  
  •   zxCoder · 2021-11-09 22:54:17 +08:00 · 1576 次点击
    这是一个创建于 1110 天前的主题,其中的信息可能已经有所发展或是发生改变。

    最近在学神经网络,对于监督学习来说,步骤就是输入 x ,模型输出一个 y_pred ,然后和标签 y 计算一下 loss ,然后就反向传播更新参数。

    那我如果想用神经网络求一个函数的最大值,是不是可以当模型输出 y_pred 时,我用 MAX_VALUE ,一个很大很大的值来跟 y_pred 计算 loss ,然后反向传播更新参数,让 loss 尽量小。

    我不知道这个想法对不对,因为我找不到相关的介绍。


    重新想了一下,是不是可以把这个函数直接加个负号,直接当成 loss 就行了?

    36 条回复    2021-11-10 21:27:46 +08:00
    Joshua999
        1
    Joshua999  
       2021-11-09 23:07:55 +08:00 via Android
    求最大值应该不需要神经网络吧,记得好像有什么牛顿法,退火法。用神经网络的话,是最大值了就 1 ,不是最大值了就 0 呗
    Xs0ul
        2
    Xs0ul  
       2021-11-09 23:31:23 +08:00
    按你的想法,模型学到的预测值就是 MAX_VALUE ,并不能实现预测某个函数最值的效果
    ipwx
        3
    ipwx  
       2021-11-09 23:36:14 +08:00
    你能不能把你的原始问题说一说。

    这估计也是个 XY problem
    rpman
        4
    rpman  
       2021-11-09 23:51:17 +08:00   ❤️ 1
    你这样 y_pred 逼近的就是 MAX_VALUE
    你想逼近的其实就是 max(x)
    GuuJiang
        5
    GuuJiang  
       2021-11-10 04:51:33 +08:00
    并不能,神经网络解决的问题是
    求**一个函数**,使其对于测试集的输入得到的输出值(即 loss)最小
    而你想要解决的问题是
    对于一个**已知的函数**,求其在定义域上的最大值

    看出区别了吧?问题的关键不在于最小和最大的区别,假如仅仅是最小和最大的区别的话确实可以通过一些手段把最大值问题变为最小值问题,而你这里压根就是两个完全不一样的问题

    BTW ,你这个想法让我想到了一些刚开始学编程的初学者试图通过赋值语句来达到解方程的目的,这两种场景非常相似,都是有两个问题 A 和 B ,乍一看描述非常相似,实际上是完全不同的问题
    Xs0ul
        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()就行了
    zxCoder
        7
    zxCoder  
    OP
       2021-11-10 09:42:30 +08:00
    就是有个作业 给一个函数比如 y=f(x),x 的取值是有限的,确定的,比如[x1=1 x2=5 x3=4 ...],然后 f(x)是一个神经网络,网络结构也给好了,就是一个两个线性层和一个激活函数。
    然后要训练这个网络,最大化 y 的值。

    @Joshua999
    @Xs0ul
    @ipwx
    @rpman
    @GuuJiang
    @Xs0ul
    ipwx
        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 、没有目标去训练,它可以变成任何值啊。


    楼主能不能用数学语言形式化一下你的问题,我无法理解。
    ipwx
        9
    ipwx  
       2021-11-10 10:08:36 +08:00
    还有,两个线性层和一个激活层它顺序到底是啥?

    y = A2*(u(A1*x+b1)) + b2 ?

    如果是 y = u(A2*(A1*x+b1)+b2) 那是没有用的。两个线性层和一个线性层没有区别(参数可以训练的情况下)
    ipwx
        10
    ipwx  
       2021-11-10 10:08:59 +08:00
    这种东西不能靠叙述,它根本不精确。上公式啊喂
    zxCoder
        11
    zxCoder  
    OP
       2021-11-10 10:21:21 +08:00
    @ipwx 就是有一个式子 y=xxxxx 我打不出来,里面有一部分是一个神经网络,然后现在要训练这个神经网络的参数使得这个式子的值最大。
    这个式子是不是就相当于有标签的学习里面 loss function 的概念
    ipwx
        12
    ipwx  
       2021-11-10 10:22:09 +08:00
    @zxCoder 不是,那你的目标到底是什么。。。

    你一直在说值最大,但是不可能没有目标啊?没目标你根本不是有监督(你说的有标签)学习。
    ipwx
        13
    ipwx  
       2021-11-10 10:22:47 +08:00
    so 你是不是想要 max L=sum_x f(x)
    ipwx
        14
    ipwx  
       2021-11-10 10:23:09 +08:00
    对于单独的 for any x, max f(x) 这个问题似乎就没有意义了
    ipwx
        15
    ipwx  
       2021-11-10 10:24:03 +08:00
    @zxCoder 你看,这不是 y=xxxxxx 我需要看你数学公式的形式化,而是问你,你的“最大化一个函数”到底形式化是什么意思。我给了两个形式:

    max sum_x f(x)
    for any x, max f(x)

    所以你是哪个?
    zxCoder
        16
    zxCoder  
    OP
       2021-11-10 10:25:10 +08:00
    @ipwx 我从来没说过是有标签学习的啊。。。。
    ipwx
        17
    ipwx  
       2021-11-10 10:25:56 +08:00
    @zxCoder 那行,所以你的问题是哪个

    max sum_x f(x)
    for any x, max f(x)
    zxCoder
        18
    zxCoder  
    OP
       2021-11-10 10:27:14 +08:00
    @ipwx 我看不太懂你下面的意思。不知道怎么描述了。。。
    zxCoder
        19
    zxCoder  
    OP
       2021-11-10 10:27:49 +08:00
    @ipwx 应该是第二种
    ipwx
        20
    ipwx  
       2021-11-10 11:15:53 +08:00
    @zxCoder 那这个问题的定义很奇怪,因为对于一个足够宽的、一个非线性层的神经网络,可以拟合任何实数域上的可测函数。也就是说,

    对于任何 C ,f(x) 恒等于 C

    是你这个神经网络可以拟合的函数。

    最终你会得到一个 meaningless 的函数,C 在训练过程中不断被推向负无穷(或者正无穷)
    ipwx
        21
    ipwx  
       2021-11-10 11:18:07 +08:00
    除非你的 f(x) 有值域,那么这个函数会被推向下界(或者上界)。

    为了避免 f(x) 退化成常值函数,你的训练目标或者网络结构必须把数据之间的关联性发掘出来。。。所以你这个问题是不是真的不对头,不好说,得看你的问题数据本身是什么样子,以及神经网络是什么样子。

    但是在我的经验中,for any x, max f(x) 很少见。至少也是 max E[f(x)]
    zxCoder
        22
    zxCoder  
    OP
       2021-11-10 14:22:53 +08:00 via Android
    @ipwx max E[f(x)] 大佬可以讲一下这个吗,或者给我点参考资料。我不知道如何下手
    ipwx
        23
    ipwx  
       2021-11-10 15:26:01 +08:00
    @zxCoder 每个 mini-batch

    随机采样,计算 f(x[i]) 然后求平均。接着梯度下降 -(sum f(x[i]))/N
    zxCoder
        24
    zxCoder  
    OP
       2021-11-10 15:39:59 +08:00 via Android
    @ipwx 看不懂有什么区别啊。这里是算有监督学习吗?那哪个是 loss
    Xs0ul
        25
    Xs0ul  
       2021-11-10 15:49:07 +08:00 via Android
    楼主不如直接作业截图或者拍个照发上来,感觉越说越糊涂了
    zxCoder
        26
    zxCoder  
    OP
       2021-11-10 16:07:20 +08:00 via Android
    问了一下同学,题目是这样

    f(x)=g(a)的期望 a 属于 q
    q 是一个神经网络满足一个分布

    目标是最大化 f(x)的值


    @ipwx
    @Xs0ul

    大佬们帮忙看看
    ipwx
        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
    ipwx
        28
    ipwx  
       2021-11-10 16:39:06 +08:00
    顺便 L = E_x[f(x)] 是神经网络很普适的写法,表示的是 x 从全部训练集上采样(也就是 mini-batch ),E_x 就是 mini-batch 上所有 f(x) 的平均,这个在代码里面也很常见才对。
    zxCoder
        29
    zxCoder  
    OP
       2021-11-10 16:44:21 +08:00 via Android
    @ipwx 平均值为什么能做 loss 啊 loss 不是预测值和真实值的差距吗
    ipwx
        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 就行了。
    ipwx
        31
    ipwx  
       2021-11-10 16:49:11 +08:00
    更正:在回归任务中,l(x) = (f(x) - t[x])^2
    ipwx
        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) 上采到的样本。
    Joshua999
        33
    Joshua999  
       2021-11-10 16:51:06 +08:00 via Android
    @zxCoder fx 是两个线性层加一个激活函数,最大化输出。那就直接把线性层系数 w 设为 0 ,偏置 b 设最大(或者激活函数的最大点)。不管输入什么,都是最大值
    zxCoder
        34
    zxCoder  
    OP
       2021-11-10 16:56:22 +08:00
    @ipwx 大佬 按你说的现在有 f(x) = E_a[g(x,a)],然后 a 满足一个分布,然后要最大化 f(x),我还是没懂为什么 L = E_x[E_a[g(x,a)]]
    ipwx
        35
    ipwx  
       2021-11-10 21:10:51 +08:00
    @zxCoder 你去把 deep learning 这本(英文书)学一遍吧求你了
    zxCoder
        36
    zxCoder  
    OP
       2021-11-10 21:27:46 +08:00
    @ipwx 。。。我不问了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2895 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 12:23 · PVG 20:23 · LAX 04:23 · JFK 07:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.