Python 是否有某种方法可以实现随机梯度下降而不是从头开始
对于一个标准的机器学习问题,例如MNIST上的图像分类,损失函数是固定的,因此可以通过调用函数并将输入反馈到函数中来完成优化过程。无需手动推导梯度和编码下降程序 但现在当我遇到一些复杂的公式时,我感到困惑。假设我们正在解决一个半监督问题,损失函数有两部分:Python 是否有某种方法可以实现随机梯度下降而不是从头开始,python,optimization,machine-learning,tensorflow,deep-learning,Python,Optimization,Machine Learning,Tensorflow,Deep Learning,对于一个标准的机器学习问题,例如MNIST上的图像分类,损失函数是固定的,因此可以通过调用函数并将输入反馈到函数中来完成优化过程。无需手动推导梯度和编码下降程序 但现在当我遇到一些复杂的公式时,我感到困惑。假设我们正在解决一个半监督问题,损失函数有两部分:Ls+lambda*Lu。第一部分是标准分类公式,例如交叉熵损失。第二部分有所不同。在我的情况下,Lu是矩阵分解损失,具体来说是:Lu=MF(D,C*W)。总损失函数可以写成: L=\sum log p(yi | xi)+MF(D,C*W) =
Ls+lambda*Lu
。第一部分是标准分类公式,例如交叉熵损失。第二部分有所不同。在我的情况下,Lu
是矩阵分解损失,具体来说是:Lu=MF(D,C*W)
。总损失函数可以写成:
L=\sum log p(yi | xi)+MF(D,C*W)
=\sum log p(yi | Wi)+MF(D,C*W)
=\sum log p(yi | T*Wi+b)+MF(D,C*W)
其中参数为W、C、T
和b
。第一部分是分类损失,输入的xi
是W
的原始值,即Wi
,一个大小为(d,1)
的向量。标签yi
可以是大小为(c,1)
的一个热向量,因此参数T
和b
将输入映射到标签大小。第二部分是矩阵分解损失
现在,当我打算使用sgd优化这个函数时,我感到困惑。它可以通过写下公式,导出梯度,然后从头开始完成一个训练过程来解决。但我想知道有没有更简单的方法?因为使用Tensorflow或Keras这样的深度学习工具来训练分类模型很容易,所以你所需要做的就是建立一个网络并提供数据
同样,在我定义了损失函数之后,有没有一个工具可以自动计算梯度?因为推导梯度并从头开始实现它们真的很烦人。分类损失和矩阵分解损失都非常常见,因此我认为可以完全实现组合。如果您能在其框架/语言中制定优化问题,Theano和Tensorflow将为您做到这一点。这些框架也足够通用,可以实现非基于NN的算法,比如像您这样简单的基于一阶的优化 如果这是不可能的,你可以尝试,这可以在numpy的子集上实现。只需将您的损失表述为numpy函数(同时坚持支持的函数;阅读文档),然后让autograd构建渐变
请记住,Theano&Tensorflow使用的“按结构”方法将更有效(因为输入更明确,而且这两个库更先进)。Theano和Tensorflow都有内置的差异。因此,您只需填写损失。非常感谢。我在读Tensorflow的手册,因为我以前没用过。我会问我是否遇到其他问题。谢谢你的建议。还有一个问题,我需要导出梯度吗?或者我只需要建立损失函数?