神经网络的权值,到底该怎么调整呢?

摘录自张玉宏的《深度学习之美》,这本书真的不错哦!

我们都知道,神经网络学习的本质,其实就是利用损失函数来调节网络中的权重。 而“减肥”的英文是“weight loss,,,所以你看,我用自身减肥的案例来讲损失函数,是不是很应景啊?

或许你又会说,就算应景,那神经网络的权值,到底该怎么调整呢?

总体来讲,有两大类方法比较好用。

第一类方法从后至前调整网络参数,第二类方法正好相反,从前至后调整参数。

第一类方法的典型代表就是“误差反向传播”,第二类方法的代表就是目前流行的“深度学习”。

对于第一类方法,简单来说就是首先随机设定初值,计算当前网络的输出,然后根据网络输出与预期输出之间的差值,采用迭代的算法,反方向地去改变前面各层的参数,直至网络收敛稳定。

这个例子说起来很抽象,我们还是用减肥的例子感性认识一下。 比如, 影响减肥的两个主要因素是“运动”和“饮食”, 但它们在减肥历程中的权值并不了然。 如果我的减肥目标是150 磅, 而体重秤上给出的实际值是180 磅,根据这个30 磅的落差,我反过来调整“运动”和“饮食”在减肥过程中的权值(是多运动呢,还是吃低热量的食物呢)。

话说最有名气的反向传播算法,莫过于大名鼎鼎的BP算法。 它是由杰弗里 · 辛顿 ( Geoffrey Hinton )和大卫 ·鲁姆哈特( David Rumelhart )等人在1986 年提出来的,其论文“借助反向传播算法的学习表征( Leaming Representations by Back-propagating errors )”发表在著名学术期刊Nature(自然)上。 该论文首次系统而简洁地阐述了反向传播算法在神经网络模型上的应用。

BP 算法非常经典,在很多领域都有着经典的应用。 在当年,它的火爆程度绝不输给现在的深度学习。 但后来,人们发现,实际应用起来, BP 算法还是有些问题的。 比如, 在一个层数较多的网络中,当它的残差反向传播到最前面的层(即输入层)时,其影响已经变得非常之小, 甚至出现梯度弥散,导致参数调整失去方向性。 最终导致 BP神经网络的层数非常有限,通常不会超过 7 层。

其实,这也是容易理解的。 因为在“信息论”中有一个信息逐层缺失的说法,就是说信息在被逐层处理时,信息量是不断减少的。 例如,处理A信息而得到B,那么B所带的信息量一 定是小于A 的。 这个说法再往深层次探寻,那就是信息熵的概念了。 推荐读者阅读一部影响我世界观的著作一一 《’熵: 一种新的世界观》。

根据热力学第二定律我们知道,能量虽然可以转化,但是无法100%利用。 在转化过程中, 必然会有一部分能量会被浪费掉。 这部分无效的能量就是“熵”。 把“熵”的概念迁移到信息理论中,它就表示信息的“无序程度”。

当一种形式的“有序化(即信息)”转化为另一种形式的“有序化”时,必然伴随产生某种 程度上的“无序化 ( 即熵)”。 依据这个理论,当神经网络层数较多时(比如大于 7 层),反向传播算法中的“误差信息”就会慢慢“消磨殆尽”,渐渐全部变成无序的“熵”,自然它也就无法指导神经网络的参数调整了。

再后来,第二类神经网络参数调整方法产生了,它就是当前主流的方法,也就是深度学习常用的“逐层初始化”训练机制,不同于反向传播算法中的“从后至前”的参数训练方法, 深度学习采取的是一种“从前至后”的逐层训练方法(后面的章节会详细讲解, 此处暂不展开)。

  • 11
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
BP神经网络权值调整是指通过训练来调整神经网络中各个神经元之间的连接权值,以达到网络输出结果与期望输出结果的误差最小化。具体步骤如下: 1. 前向传播:将输入样本送入神经网络,通过各层神经元的计算,得到网络的输出结果。 2. 反向传播:计算输出结果与期望输出结果之间的误差,并将误差从输出层向输入层反向传播,计算每个神经元的误差贡献。 3. 权值调整:根据误差贡献计算每个神经元的权值调整量,并将其累加到原有权值上,以更新神经元之间的连接权值。 4. 重复训练:重复以上步骤,直到网络输出结果与期望输出结果的误差达到预设的阈值或训练次数达到预设的上限。 下面是一个简单的Python实现,用于演示BP神经网络权值调整过程: ```python import numpy as np # 定义sigmoid函数 def sigmoid(x): return 1 / (1 + np.exp(-x)) # 定义BP神经网络类 class BPNeuralNetwork: def __init__(self, input_size, hidden_size, output_size): # 初始化权值和阈值 self.W1 = np.random.randn(input_size, hidden_size) self.b1 = np.random.randn(hidden_size) self.W2 = np.random.randn(hidden_size, output_size) self.b2 = np.random.randn(output_size) def forward(self, X): # 前向传播 self.z1 = np.dot(X, self.W1) + self.b1 self.a1 = sigmoid(self.z1) self.z2 = np.dot(self.a1, self.W2) + self.b2 self.a2 = sigmoid(self.z2) return self.a2 def backward(self, X, y, learning_rate): # 反向传播 delta2 = (self.a2 - y) * self.a2 * (1 - self.a2) delta1 = np.dot(delta2, self.W2.T) * self.a1 * (1 - self.a1) dW2 = np.dot(self.a1.T, delta2) db2 = np.sum(delta2, axis=0) dW1 = np.dot(X.T, delta1) db1 = np.sum(delta1, axis=0) # 权值调整 self.W2 -= learning_rate * dW2 self.b2 -= learning_rate * db2 self.W1 -= learning_rate * dW1 self.b1 -= learning_rate * db1 def train(self, X, y, learning_rate, epochs): # 训练神经网络 for i in range(epochs): self.forward(X) self.backward(X, y, learning_rate) # 测试 X = np.array([[0, 0], [0, 1], [1, 0], [1, 1]]) y = np.array([[0], [1], [1], [0]]) nn = BPNeuralNetwork(2, 4, 1) nn.train(X, y, 0.1, 10000) print(nn.forward(X)) ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值