为什么在训练期间需要调用zero_grad() ?

|  zero_grad(self)
|      Sets gradients of all model parameters to zero.

我正在考虑如何在SQL Server数据库中表示一个复杂的结构。

考虑这样一个应用程序,它需要存储一系列对象的详细信息,这些对象共享一些属性,但有许多其他不常见的属性。例如,一个商业保险包可能在同一份保单记录中包括责任、汽车、财产和赔偿。

在c#等语言中实现这一点很简单,因为您可以创建一个带有Sections集合的Policy,其中Section根据需要继承各种类型的封面。然而,关系数据库似乎不容易做到这一点。

我可以看到有两个主要的选择:

创建一个Policy表,然后创建一个Sections表,其中包含所有可能的变量所需的所有字段,其中大多数字段将为空。 创建一个Policy表和许多Section表,每个表对应一种封面。

这两种选择似乎都不能令人满意,特别是需要跨所有section编写查询,这将涉及大量连接或大量空检查。

这个场景的最佳实践是什么?

我有许多使用CMake构建的项目,我希望能够轻松地在使用GCC或Clang/LLVM之间切换来编译它们。我相信(如果我弄错了请纠正我!)使用Clang我需要设置以下:

    SET (CMAKE_C_COMPILER             "/usr/bin/clang")
    SET (CMAKE_C_FLAGS                "-Wall -std=c99")
    SET (CMAKE_C_FLAGS_DEBUG          "-g")
    SET (CMAKE_C_FLAGS_MINSIZEREL     "-Os -DNDEBUG")
    SET (CMAKE_C_FLAGS_RELEASE        "-O4 -DNDEBUG")
    SET (CMAKE_C_FLAGS_RELWITHDEBINFO "-O2 -g")

    SET (CMAKE_CXX_COMPILER             "/usr/bin/clang++")
    SET (CMAKE_CXX_FLAGS                "-Wall")
    SET (CMAKE_CXX_FLAGS_DEBUG          "-g")
    SET (CMAKE_CXX_FLAGS_MINSIZEREL     "-Os -DNDEBUG")
    SET (CMAKE_CXX_FLAGS_RELEASE        "-O4 -DNDEBUG")
    SET (CMAKE_CXX_FLAGS_RELWITHDEBINFO "-O2 -g")

    SET (CMAKE_AR      "/usr/bin/llvm-ar")
    SET (CMAKE_LINKER  "/usr/bin/llvm-ld")
    SET (CMAKE_NM      "/usr/bin/llvm-nm")
    SET (CMAKE_OBJDUMP "/usr/bin/llvm-objdump")
    SET (CMAKE_RANLIB  "/usr/bin/llvm-ranlib")

是否有一种简单的方法在这些和默认的GCC变量之间切换,最好是作为一个系统范围的更改,而不是特定于项目(即不只是将它们添加到项目的CMakeLists.txt)?

另外,当使用clang而不是gcc编译时,是否有必要使用llvm-*程序而不是系统默认值?有什么不同?

我试图在Haskell中实现一个神经网络架构,并在MNIST上使用它。

我在线性代数中使用hmatrix包。 我的训练框架是使用pipes包构建的。

我的代码编译并没有崩溃。但问题是,某些层大小(比如1000)、小批大小和学习率的组合会在计算中产生NaN值。经过一些检查,我看到非常小的值(1e-100的顺序)最终出现在激活中。但是,即使这种情况没有发生,培训仍然不起作用。它的损失和准确性都没有改善。

我检查了又检查了我的代码,我不知道问题的根源可能是什么。

下面是反向传播训练,它计算每一层的增量:

backward lf n (out,tar) das = do
    let δout = tr (derivate lf (tar, out)) -- dE/dy
        deltas = scanr (\(l, a') δ ->
                         let w = weights l
                         in (tr a') * (w <> δ)) δout (zip (tail $ toList n) das)
    return (deltas)

Lf是损失函数,n是网络(每一层的权重矩阵和偏置向量),out和tar是网络的实际输出和目标(期望)输出,das是每一层的激活导数。

在批处理模式下,out、tar是矩阵(行是输出向量),das是矩阵列表。

下面是实际的梯度计算:

  grad lf (n, (i,t)) = do
    -- Forward propagation: compute layers outputs and activation derivatives
    let (as, as') = unzip $ runLayers n i
        (out) = last as
    (ds) <- backward lf n (out, t) (init as') -- Compute deltas with backpropagation
    let r  = fromIntegral $ rows i -- Size of minibatch
    let gs = zipWith (\δ a -> tr (δ <> a)) ds (i:init as) -- Gradients for weights
    return $ GradBatch ((recip r .*) <$> gs, (recip r .*) <$> squeeze <$> ds)

这里,lf和n和上面一样,i是输入,t是目标输出(都是以批处理的形式,作为矩阵)。

通过对每一行求和,Squeeze将一个矩阵转换为一个向量。也就是说,ds是一个增量矩阵的列表,其中每一列都对应于小批中一行的增量。偏差的梯度是所有小批量中增量的平均值。g也是一样的,它对应于权重的梯度。

下面是实际的更新代码:

move lr (n, (i,t)) (GradBatch (gs, ds)) = do
    -- Update function
    let update = (\(FC w b af) g δ -> FC (w + (lr).*g) (b + (lr).*δ) af)
        n' = Network.fromList $ zipWith3 update (Network.toList n) gs ds
    return (n', (i,t))

Lr是学习率。FC是该层的构造函数,af是该层的激活函数。

梯度下降算法确保为学习率传递一个负值。梯度下降的实际代码只是一个围绕grad和move组合的循环,并带有参数化的停止条件。

最后,这是一个均方误差损失函数的代码:

mse :: (Floating a) => LossFunction a a
mse = let f (y,y') = let gamma = y'-y in gamma**2 / 2
          f' (y,y') = (y'-y)
      in  Evaluator f f'

Evaluator只是捆绑了一个损失函数及其导数(用于计算输出层的delta)。

其余的代码在GitHub: NeuralNetwork上。

所以,如果有人对这个问题有见解,或者只是检查一下我是否正确地实现了算法,我会很感激。

我使用CMake和GNU Make,想要确切地看到所有命令(例如编译器是如何执行的,所有的标志等)。

GNU make有——debug,但它似乎没有那么有用还有其他选项吗?CMake是否为调试目的在生成的Makefile中提供额外的标志?

我们如何改变模拟器屏幕方向为横向或纵向?

大约一年前,我问过CMake中的头依赖关系。

我最近意识到,问题似乎是CMake认为这些头文件是项目的外部文件。至少,在生成Code::Blocks项目时,头文件不会出现在项目中(源文件会出现)。因此,在我看来,CMake认为这些头文件是项目的外部,并没有在依赖项中跟踪它们。

在CMake教程中快速搜索只指向include_directories,这似乎不是我想要的…

向CMake发出特定目录包含要包含的头文件,以及生成的Makefile应该跟踪这些头文件的正确方法是什么?

我如何通过CMake定义一个预处理器变量?

等效的代码是#define foo。

ANN(人工神经网络)和SVM(支持向量机)是监督机器学习和分类的两种流行策略。对于一个特定的项目,通常不清楚哪种方法更好,我确定答案总是“视情况而定”。通常,两者结合使用贝叶斯分类。

这些关于Stackoverflow的问题已经被问到关于ANN和SVM的问题:

神经网络与支持向量机分类

在我的分类问题中,ANN, SVM和KNN有什么区别

支持向量机或人工神经网络的文本处理?

在这个问题中,我想具体知道人工神经网络(特别是多层感知器)的哪些方面可能比支持向量机更可取?我问这个问题的原因是很容易回答相反的问题:支持向量机通常优于ann,因为它们避免了ann的两个主要弱点:

(1)人工神经网络通常收敛于局部极小值,而不是全局极小值,这意味着它们有时本质上“看不到大局”(或只见树不见林)。

(2)如果训练时间过长,人工神经网络通常会过拟合,这意味着对于任何给定的模式,人工神经网络可能会开始考虑噪声作为模式的一部分。

支持向量机不会遭受这两个问题中的任何一个。然而,目前还不清楚svm是否可以完全取代ann。那么,与支持向量机相比,人工神经网络有哪些特定的优势,可能使其适用于某些情况?我已经列出了支持向量机相对于人工神经网络的特定优势,现在我想看看人工神经网络的优势(如果有的话)。

对于任何Keras层(层类),有人能解释一下如何理解input_shape,单位,暗淡等之间的区别吗?

例如,文档说单位指定一个层的输出形状。

在神经网络的图像中,隐藏层1有4个单元。这是否直接转换为图层对象的单位属性?或者Keras中的单位是否等于隐藏层中每个权重的形状乘以单位的数量?

简而言之,如何理解/可视化模型的属性-特别是层-与下面的图像?