简单神经网络中的奇怪收敛

2023-12-02

一段时间以来,我一直在努力用 Java 构建一个简单的神经网络。我已经断断续续地致力于这个项目几个月了,我想完成它。我的主要问题是我不知道如何正确实现反向传播(所有来源都使用 Python、数学术语,或者过于简单地解释这个想法)。今天我尝试自己推导意识形态,我使用的规则是:

权重更新 = error * sigmoidDerivative(error) * 权重本身;
错误=输出-实际; (最后一层)
error = sigmoidDerivative(来自前一层的错误) * 将此神经元附加到给出错误的神经元的权重(中间层)

我的主要问题是输出收敛于平均值,第二个问题是权重更新为一个极其奇怪的值。 (可能是权重问题导致收敛)

我正在尝试训练:对于输入 1-9 ,预期输出为:(x*1.2+1)/10。这只是我随机想到的一条规则。我使用结构为 1-1-1 的神经网络(3 层,1 个网络/层)。在下面的链接中,我附加了两次运行:一次运行中我使用遵循规则 (x*1.2+1)/10 的训练集,另一次运行中我使用 (x*1.2+1)/100。除以 10 后,第一个权重趋于无穷大;除以 100 后,第二个权重趋向于 0。我一直在尝试调试它,但我不知道我应该寻找什么或出了什么问题。非常感谢任何建议。预先感谢大家,祝大家有美好的一天!

https://wetransfer.com/downloads/55be9e3e10c56ab0d6b3f36ad990ebe120171210162746/1a7b6f

我按照上述规则将训练样本 1->9 及其各自的输出作为训练样本,并将它们运行 100_000 轮。我每 100 个时期记录一次错误,因为使用较少的数据点更容易绘制,同时仍然为 9. 反向传播和权重更新的每个预期输出保留 1000 个数据点:

    //for each layer in the Dweights array
    for(int k=deltaWeights.length-1; k >= 0; k--)
    {
        for(int i=0; i<deltaWeights[k][0].length; i++)     // for each neuron in the layer
        {
            if(k == network.length-2)      // if we're on the last layer, we calculate the errors directly
            {
                outputErrors[k][i] = outputs[i] - network[k+1][i].result;
                errors[i] = outputErrors[k][i];
            }
            else        // otherwise the error is actually the sum of errors feeding backwards into the neuron currently being processed * their respective weight
            {
                for(int j=0; j<outputErrors[k+1].length; j++)
                {                         // S'(error from previous layer) * weight attached to it
                    outputErrors[k][i] += sigmoidDerivative(outputErrors[k+1][j])[0] * network[k+1][i].emergingWeights[j];
                }
            }
        }

        for (int i=0; i<deltaWeights[k].length; i++)           // for each neuron
        {
            for(int j=0; j<deltaWeights[k][i].length; j++)     // for each weight attached to that respective neuron
            {                        // error                S'(error)                                  weight connected to respective neuron                
                deltaWeights[k][i][j] = outputErrors[k][j] * sigmoidDerivative(outputErrors[k][j])[0] * network[k][i].emergingWeights[j];
            }
        }
    }

    // we use the learning rate as an order of magnitude, to scale how drastic the changes in this iteration are
    for(int k=deltaWeights.length-1; k >= 0; k--)       // for each layer
    {
        for (int i=0; i<deltaWeights[k].length; i++)            // for each neuron
        {
            for(int j=0; j<deltaWeights[k][i].length; j++)     // for each weight attached to that respective neuron
            {
                deltaWeights[k][i][j] *=  1;       // previously was learningRate; MSEAvgSlope

                network[k][i].emergingWeights[j] += deltaWeights[k][i][j];
            }
        }
    }

    return errors;

编辑:我想到了一个简单的问题:由于我使用 sigmoid 作为我的激活函数,我的输入和输出神经元应该只在 0-1 之间吗?我的输出在 0-1 之间,但我的输入实际上是 1-9。

Edit2:将输入值标准化为 0.1-0.9 并更改:

    outputErrors[k][i] += sigmoidDerivative(outputErrors[k+1][j])[0] * network[k+1][i].emergingWeights[j];     

to:

    outputErrors[k][i] = sigmoidDerivative(outputErrors[k+1][j])[0] * network[k+1][i].emergingWeights[j]* outputErrors[k+1][j];       

这样我就可以保留输出错误本身的符号。这修复了第一个重量中的无穷大趋势。现在,在 /10 运行中,第一个权重趋于 0,而在 /100 运行中,第二个权重趋于 0。仍然希望有人能够为我解决问题。 :(


我发现您的代码存在一些问题,例如您的体重更新不正确。我还强烈建议您通过引入方法来组织更清晰的代码。

反向传播通常很难有效地实现,但形式定义很容易翻译成任何语言。我不建议您查看用于研究神经网络的代码。查看数学并尝试理解这一点。这使您可以更灵活地从头开始实施。

我可以通过用伪代码描述前向和后向传递来给您一些提示。

作为符号问题,我使用i对于输入,j对于隐藏的和k对于输出层。输入层的偏置为bias_i。权重是w_mn用于将一个节点连接到另一个节点的权重。激活是a(x)它的导数a'(x).

前向传球:

for each n of j
       dot = 0
       for each m of i
              dot += m*w_mn
       n = a(dot + bias_i)

这同样适用于输出层k和隐藏层j。因此,只需更换j by k and i by j对于这一步。

向后传递:

计算输出节点的增量:

for each n of k
       d_n = a'(n)(n - target)

Here, target是预期输出,n当前输出节点的输出。d_n是该节点的增量。 这里需要注意的是,logistic 函数和 tanh 函数的导数包含原始函数的输出,并且不必重新评估该值。 逻辑函数是f(x) = 1/(1+e^(-x))它的导数f'(x) = f(x)(1-f(x))。由于每个输出节点的值n之前评估过f(x), 可以简单地申请n(1-n)作为导数。在上述情况下,将按如下方式计算增量:

d_n = n(1-n)(n - target)

以同样的方式,计算隐藏节点的增量。

for each n of j
      d_n = 0
      for each m of k
             d_n += d_m*w_jk
      d_n = a'(n)*d_n

下一步是使用梯度执行权重更新。这是通过称为梯度下降的算法来完成的。无需详细说明,这可以按如下方式完成:

for each n of j
      for each m of k
            w_nm -= learning_rate*n*d_m

这同样适用于上面的层。只需更换j by i and k by j.

要更新偏差,只需将连接节点的增量相加,将其乘以学习率,然后从特定偏差中减去该乘积即可。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

简单神经网络中的奇怪收敛 的相关文章

  • 如何以编程方式找出我的 PermGen 空间使用情况?

    我正在尝试诊断java lang OutOfMemoryError PermGen Space在 Sun 的 Hotspot JVM 上运行时出现错误 并且想知道我的程序在不同时刻使用了多少 PermGen 空间 有没有办法以编程方式找出这
  • Java Sqlite Gradle

    我对 gradle 和 java 还很陌生 我有一个使用 sqlite 的项目 它通过 intellij idea 运行良好 但我无法从终端运行它 它会抛出异常 java lang ClassNotFoundException org sq
  • 在 Tomcat 上部署 Java Web 项目,无需 WAR 或 EAR

    我有一个 Java Web 项目 Struts Spring 在我的本地主机上完美运行 我必须将其部署在我的网站上 但虚拟主机提供的 Tomcat Manager 界面显示 由于安全原因 它无法上传 WAR 文件 当联系技术支持时 我被告知
  • 以点作为分隔符分割字符串

    我想知道我是否要在一个字符串上分割字符串 正确的方式 我的代码是 String fn filename split return fn 0 我只需要字符串的第一部分 这就是我返回第一项的原因 我问这个是因为我在 API 中注意到 意味着任何
  • 如何在数据库中对 (Java) 枚举进行建模(使用 SQL92)

    您好 我正在使用名为 性别 的列对实体进行建模 在应用程序代码中 性别应该是一个 Java 枚举类型 有 2 个值 男性和女性 知道作为数据类型的枚举不是通用 SQL 语言 92 的一部分 您将如何建模它 数据模型必须是可移植的 以便由多个
  • 如何在Mac上使用eclipse安装jetty

    我是一个新手 jetty 和 RESTful API 我想使用 Jetty 创建 REST 服务 并希望将嵌入式 jetty 与 eclipse 一起使用 任何人都可以建议我在 Mac OS 中使用 Eclipse 安装 Jetty Jet
  • WebLogic 10 中的临时目录

    每当 WL 停止时 它都不会删除其临时目录 即 domains mydomain servers myserver tmp WL TEMP APP DOWNLOADS domains mydomain servers myserver tm
  • java中队列的实现

    在 Java 中实现队列是一个非常常见的面试问题 我在网上冲浪 看到了许多实现 他们做了一些奇特的事情 比如实现队列接口和编写自己的addLast and removeFirst 方法 我的问题是我不能使用LinkedList 类并使用其预
  • 动画图像视图

    目前我正在开发一款游戏 这是我的游戏的详细信息 用户应选择正确的图像对象 我希望图像从左到右加速 当他们到达终点时 他们应该再次出现在活动中 这是我正在处理的屏幕截图 我有 5 个图像视图 它们应该会加速 您有此类动画的示例代码吗 非常感谢
  • BigDecimal 的 JPA @Size 注释

    我该如何使用 SizeMySQL 的注释DECIMAL x y 列 我在用着BigDecimal 但是当我尝试包括 Size max它不起作用 这是我的代码 Size max 7 2 Column name weight private B
  • 如何使用 Spring MVC 和 Thymeleaf 添加静态文件

    我的问题是如何添加 CSS 和图像文件等静态文件 以便我可以使用它们 我正在使用 Spring MVC 和 Thymeleaf 我查看了有关此主题的各种帖子 但它们对我没有帮助 所以我才来问 根据这些帖子 我将 CSS 和图像文件放在res
  • 中间件 API 的最佳实践是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们正在开发一个中间件 SDK 采用 C 和 Java 语言 供游戏开发人员 动画软件开发人员 阿凡达开
  • Java 中 static 关键字如何工作?

    我正在阅读Java教程 http docs oracle com javase tutorial index html从一开始我就有一个问题static字段或变量上的关键字 作为Java said here http docs oracle
  • 在多模块项目中访问绑定适配器

    我有一个多模块项目 其中应用程序模块包含我的绑定适配器 而我的功能模块取决于我的应用程序模块 因为它是动态功能模块 应用程序 包含绑定适配器 gt 动态功能模块 存在布局的地方 我在所有模块中启用了数据绑定和 kapt 我无法成功构建应用程
  • 膨胀类片段 InflateException 二进制 XML 文件时出错

    我正在使用 Material Design 和 NavigationDrawer 布局等设计我的第一个应用程序 但我遇到了一个问题 该应用程序非常简单 它只显示文本 并且基于 Android Studio 中提供的模板 尝试启动我的应用程序
  • 在 netBeans 中运行程序时,字体看起来非常奇怪

    我在我的新 MacBook M1 上设置了 netBeans 和 SceneBuilder 除了运行程序时的字体外 一切正常 它看起来像这样 我不知道为什么 按钮应显示 Click me 标签应显示 Hello 我收到的错误消息是 M rz
  • 无法仅在控制台中启动 androidstudio

    你好 我的问题是下一个 我下载了Android Studio如果我去 路径 android studio bin 我执行studio sh 我收到以下错误 No JDK found Please validate either STUDIO
  • 如何使用 Hibernate Session.doWork(...) 进行保存点/嵌套事务?

    我正在使用 JavaEE JPA 托管事务与 Oracle DB 和 Hibernate 并且需要实现某种嵌套事务 据我所知 此类事情不受开箱即用的支持 但我应该能够为此目的使用保存点 正如建议的https stackoverflow co
  • 如何使用 SAX Java 解析器读取注释文本

    我只想使用 Java 中的 SAX 解析器读取 XML 文件中对象标记的注释 这是我的文件的摘要
  • C/C++ 通过 Android NDK 在 JNI 中看不到 Java 方法

    我正在尝试从使用 NDK 构建的 C 类文件调用 Java 方法 它不断抛出常见的 未找到非静态方法 错误并导致整个 Android 应用程序崩溃 下面的代码片段 有些东西可能不需要 但我按原样保留它们 因为焦点 问题在于refreshJN

随机推荐

  • 如何在 apache Camel Rest api 中进行自定义错误处理?

    我有一个 apache Camel Rest api 它从 S3 下载文件 我发送 json 输入 key bucketname accessKey secretKey region 以便写入 URI 代码如下所示 public stati
  • vba 循环中出现类型不匹配错误

    我正在 Outlook VBA 中工作 并构建了一个 For Next 循环来读取 MailItems 的正文 其格式类似于 Key Value 对 在某种程度上 它似乎有效 但在第二次迭代结束时 当它到达 下一个项目 时 我收到抛出 类型
  • 阻止传出短信

    如果短信包含根据数据库过滤的单词 如何阻止传出短信 我可以监控发送的消息是否包含已过滤的单词 但我无法阻止短信 您无法停止手机上默认消息发送应用程序发送短信 为此 您必须创建自己的短信盒应用程序 然后才能向其中添加自定义功能
  • 如何使用 Bundle 在 Activity 之间传递 Uri 数组

    我需要将 Uri 数组传递给另一个活动 传递一个我简单使用的字符串数组 String images getImagesPathString Bundle b new Bundle b putStringArray images images
  • 如何向 UIToolBar 添加图像?

    我想将图像添加到用户无法与之交互的 UIToolBar 它本质上只是一个非交互式指示器 就像徽章一样 这可能吗 如果是这样 怎么办 创建一个UIBarButtonItem使用图像并添加它 Example UIBarButtonItem it
  • 处理按钮外部的点击事件

    我正在尝试通过重现 Apple AppStore 中的应用程序来练习 C 在应用程序中 有一个带有文本的矩形 Touch me 当您触摸它时 矩形会自行重新定位 执行此操作几次后 文本将更改为 不要碰我 在这种情况下 您必须触摸矩形之外 一
  • Pyspark 向数据帧添加顺序和确定性索引

    我需要向数据帧添加一个索引列 并具有三个非常简单的约束 从0开始 是连续的 具有确定性 我确信我错过了一些明显的东西 因为我发现的例子对于这样一个简单的任务来说看起来非常复杂 或者使用非顺序 非确定性越来越单调的 id 我不想使用索引进行压
  • 在 Swift 2 中对字典数组进行排序

    我读过很多关于SO的文章 但我仍然感到困惑 我有一系列字典 见下文 var myArray String AnyObject myArray append caseNumber 12349 formType Advanced caseSta
  • python 将本地时间字符串转换为 UTC 纪元时间戳

    我有 YMD hms 格式的字符串 其中删除了时区 但我知道他们现在是东部时间 有夏令时 我正在尝试将它们转换为 UTC 时间的纪元时间戳 我写了以下函数 def ymdhms timezone dst to epoch input str
  • Java Apache POI 打开文件? [关闭]

    Closed 这个问题不符合堆栈溢出指南 目前不接受答案 我有一个 Java 程序 可以编辑现有的 Excel 文件并将其另存为新文件 但是 我还希望程序在结束时自动打开新创建的文件 是否有 apache poi 命令可以让我执行此操作 由
  • Rails ActionMailer 中的 Net::SMTPAuthenticationError 502 5.5.2

    我正在尝试向用户发送确认电子邮件 但我收到以下错误 Net SMTPAuthenticationError 502 5 5 2 错误 命令无法识别 Production rb中的配置如下 Disable delivery errors ba
  • 原型声明和前向声明之间的区别?

    所以我有这个代码 class xx int getnum Is this a forward declaration or a prototype declaration and why int xx getnum return 1 3 所
  • 在 Ubuntu 14.10 中安装 OpenCV

    我正在尝试根据以下方法在 Ubuntu 14 10 中安装 OpenCV操作说明 我安装了所有提到的依赖项 但是当我尝试运行时make我收到这样的错误 home ilia opencv 2 4 8 modules highgui src f
  • JSON 插入 MySQL 表或更新(如果存在)

    这是继续插入 MySQL 表或更新 如果存在 但是这次我想更新mysql中的json条目 下面是架构 CREATE TABLE TAG COUNTER account varchar 36 NOT NULL time id INT NOT
  • 如何正确使用 addCustomRequestHeader

    我正在尝试将标题添加到我的HTTP请求特定的测试用例 这非常重要 因为我正在尝试测试要在手机中使用的应用程序 我设法找到了方法addCustomRequestHeader String arg0 String arg1 不幸的是 我似乎不知
  • 如何在我的 ModelInput 类中使用 Joshua Bloch 版本所描述的 Builder 模式?

    我正在尝试对下面的类使用 Builder 模式 最初 我使用类的构造函数来设置所有参数 但意外地我遇到了 Builder 模式 它看起来很适合我的用例 下面是我的课程 大多数人都会通过userId clientId and paramete
  • 从 fill_ Between 的 PolyCollection 中提取 x/y 数据

    如何从生成的 PolyCollection 中提取 x y 数据fill between plot polyCollection ax fill between x ylo yhi 现在我如何从polyCollection 对于他人Coll
  • @DynamoDBAttribute 注释不起作用

    我有一个名为 opx user profiles 的 dynamodb 表 该实体如下所示 但属性 user profile id 在表中保存为 userProfileID 即使在属性上指定了 DynamoDBAttribute attri
  • 未定义的复杂类型“java.lang.Object”用作复杂类型扩展的基础

    我在 Android 应用程序的 xml 源文件中有非常简单的布局 我使用此布局来添加动态 TextView 和按钮 应用程序工作正常 尽管我收到警告 第 6 行 第 8 列 未定义的complexType java lang Object
  • 简单神经网络中的奇怪收敛

    一段时间以来 我一直在努力用 Java 构建一个简单的神经网络 我已经断断续续地致力于这个项目几个月了 我想完成它 我的主要问题是我不知道如何正确实现反向传播 所有来源都使用 Python 数学术语 或者过于简单地解释这个想法 今天我尝试自