Weight Initialization in Neural Networks: A Journey From the Basics to Kaiming

本文探讨了神经网络权重初始化的重要性,以防止激活输出在正向传播中爆炸或消失。通过实验,展示了初始化过大或过小的权重对网络的影响。文章介绍了Xavier和Kaiming初始化方法,解释了这些方法如何适应不同类型的激活函数,特别是ReLU,以保持层间的梯度稳定。Kaiming初始化在现代深度学习网络中尤其适用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

我想邀请您加入我的探索,通过不同的方法初始化神经网络中的图层权重。 通过各种简短的实验和思想练习,我们将逐步发现为什么在训练深度神经网络时足够的重量初始化非常重要。 在此过程中,我们将介绍研究人员多年来提出的各种方法,并最终深入研究最适合您最有可能使用的当代网络架构的方法。

接下来的例子来自我自己重新实现的一套笔记本,Jeremy Howard在最新版本的fast.ai的深度学习第二部分课程中介绍了这一课程,该课程目前于2019年春天在USF的数据研究所举行。

Why Initialize Weights

权重初始化的目的是防止层激活输出在正向通过深度神经网络的过程中爆炸或消失。如果发生任何一种情况,损失梯度将太大或太小而无法有效地向后流动,并且如果网络甚至能够这样做,则网络将花费更长时间来收敛。

矩阵乘法是神经网络的基本数学运算。在具有多个层的深度神经网络中,一个前向通道仅需要在每个层,在该层的输入和权重矩阵之间执行连续的矩阵乘法。在一层的这种乘法的乘积成为后续层的输入,依此类推。

对于一个说明这一点的快速和肮脏的例子,让我们假设我们有一个包含一些网络输入的向量x。这是训练神经网络的标准做法,以确保我们的输入值被缩放,使得它们落入这样的正态分布,平均值为0,标准差为1。

在这里插入图片描述
让我们假设我们有一个没有激活的简单的100层网络,并且每个层都有一个包含图层权重的矩阵a。 为了完成单个前向传递,

这个错误信息表明,在 `switch` 语句中存在一些跳转逻辑问题,导致某些变量的初始化被绕过(bypassed)。这通常是由于在 `case` 标签之间遗漏了必要的 `break;` 或者尝试直接从一个未完成的部分跳转到另一个部分引起的。 ### 原因分析 在 C++ 中,如果一个局部变量是在某个特定分支内声明并初始化的,并且有路径可以直接跳过该变量的初始化而进入作用域,则会导致编译器报错。这是因为未经初始化的变量可能导致未定义的行为。 例如: ```cpp switch (value) { case 1: int x = 42; // 初始化了一个变量x break; case 2: // 这里试图跳过x的初始化却仍然进入了其作用域 std::cout << x; // 编译失败:无法跳过x的初始化就访问它 break; } ``` 在这个例子中,当程序执行 `case 2:` 跳过了 `case 1:` 内部的 `int x = 42;` 定义和初始化过程,但是后续代码又引用到了 `x` ,这是不允许的。 ### 解决方案 #### 方案一: 确保每个 case 分支都包含完整的初始化流程 你可以保证所有相关的变量都在每一个需要用到它们的地方单独地重新定义及初始化。例如: ```cpp switch (value) { case 1: int x = 42; process(x); break; case 2: int y = 99; // 对应y做同样的操作,而不是复用x another_process(y); break; } ``` #### 方案二: 将变量移到 switch 外面进行统一管理 把那些跨越多个分支使用的变量提前放到 `switch` 结构外部预先声明好,避免重复定义的问题: ```cpp int data; switch (value) { case 1: data = initializeForCaseOne(); break; case 2: data = initializeForCaseTwo(); break; default: data = defaultValue(); } // 同样可以在这里安全使用data变量 process(data); ``` #### 方案三: 添加适当默认值设定或者检查条件 通过增加额外的判断机制确保不会发生非法状态下的越界访问。 ```cpp if(conditionMet){ int localData = specificInitialization(); }else{ int fallbackData = generalInitialization(); } // 针对每种情况分别独立处理... ``` --- ### 总结 解决此类问题是需要仔细考虑各条控制流下数据的有效性和完整性。可以通过调整代码结构、合理安排变量位置以及添加足够的保护措施来消除这种隐患。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Adam婷

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值