机器学习/深度学习上下文中的优化是更改模型参数以提高其性能的过程。换句话说,它是在预定的假设空间中找到最佳参数以获得最佳性能的过程。共有三种优化算法:
在这篇文章中,我们将研究三种不同的参数初始化场景神经网络 参数初始化,看看它如何影响错误率:
将所有参数初始化为零。
将参数初始化为标准正态或均匀分布的随机值,并将其乘以标量(例如 10)。
初始化参数基于:
我们将使用我们在“编码神经网络:前向和后向”一文中编写的函数来初始化参数,计算前向和反向传播,以及交叉熵成本。
为了说明上述情况,我们将使用猫与狗数据集,其中包含 50 张猫的图像和 50 张狗的图像。每个图像在 RGB 级别上为 150 像素 x 150 像素。因此,我们将有 67,500 个特征,其中输入矩阵中的每一列都是一张图像,这意味着我们的输入数据将有 67,500×100 维度。
我们首先加载数据,然后在启动辅助函数之前显示两个图像的样本。
#加载包
导入系统
将 matplotlib.pyplot 导入为 plt
将 numpy 导入为 np
将 seaborn 导入为 sns
sys.path.append(“../scripts/”)
从 coding_neural_network_from_scratch 导入(L_model_forward、compute_cost、L_model_backward、update_parameters、accuracy)
从 load_dataset 导入 load_dataset_catvsdog
%matplotlib 内联
sns.set_context(“笔记本”)
plt.style.use(“fivethirtyeight”)
#加载数据
X, Y = load_dataset_catvsdog(“../data”)
# 显示猫和狗图像的样本
index_cat = np.argmax(Y)
index_dog = np.argmin(Y)
plt.subplot(1, 2, 1)
plt.imshow(X[:, index_cat].reshape(150, 150, 3))
plt.axis(“off”)
plt.subplot(1, 2, 2)
plt.imshow(X[:, index_dog].reshape(150, 150, 3))
plt.axis(“off”);
#标准化数据
X = X / 255
图 1:示例图片
我们现在编写所有帮助我们根据不同方法初始化参数的辅助函数,并编写我们将用于训练神经网络的 L 层模型。
def initialize_parameters_zeros(layers_dims):
np.random.seed(1)
参数 = {}
L = len(layers_dims)
对于范围内的 l(1, L):
参数[“W” + str(l)] = np.zeros((layers_dims[l], layers_dims[l – 1]))
参数[“b” + str(l)] = np.zeros((layers_dims[l], 1))
返回参数
def initialize_parameters_random(layers_dims):
np.random.seed(1)
参数 = {}
L = len(layers_dims)
对于范围内的 l(1, L):
参数[“W” + str(l)] = np.random.randn(layers_dims[l], layers_dims[l – 1]) * 10
参数[“b” + str(l)] = np.zeros((layers_dims[l], 1))
返回参数
def initialize_parameters_he_xavier(layers_dims, initialize_method=”he”):
np.random.seed(1)
参数 = {}
L = len(layers_dims)
如果initialization_method == “he”:
对于范围内的 l(1, L):
参数[“W” + str(l)] = np.random.randn( layers_dims[l], layers_dims[l – 1]) * np.sqrt(2 / layers_dims[l – 1])
参数[“b” + str(l)] = np.zeros((layers_dims[l], 1))
elif 初始化方法 == “xavier”:
对于范围内的 l(1, L):
参数[“W” + str(l)] = np.random.randn( layers_dims[l], layers_dims[l – 1]) * np.sqrt(1 / layers_dims[l – 1])
参数[“b” + str(l)] = np.zeros((layers_dims[l], 1))
返回参数
def model(X, Y, layers_dims, learning_rate=0.01, num_iterations=1000, print_cost=True, hidden_layers_activation_fn=”relu”, initialization_method=”he”):
np.random.seed(1)
#初始化成本列表
cost_list = []
#初始化参数
如果initialization_method == “zeros”:
参数 = initialize_parameters_zeros(layers_dims)
elif 初始化方法 == “随机”:
参数 = initialize_parameters_random(layers_dims)
其他:
parameters = initialize_parameters_he_xavier(layers_dims, initialize_method)
# 迭代 num_iterations
for i in range(num_iterations):
# 遍历 L 层以获得最终输出和缓存
AL, caches = L_model_forward(X, parameters, hidden_layers_activation_fn)
# 计算成本以绘制它
成本 = 计算成本(AL, Y)
# 向后迭代 L 层以获得渐变
grads = L_model_backward(AL, Y, caches, hidden_layers_activation_fn) # 更新参数parameters = update_parameters(parameters, grads, learning_rate)
# 将每 100 个成本附加到成本列表中
如果 (i + 1) % 100 == 0 和 print_cost:
print(“{} 次迭代后的代价为:{}”.format(i + 1, cost))
如果我 % 100 == 0:
cost_list.append(cost)
#绘制成本曲线
plt.figure(figsize=(12, 8))
plt.plot(cost_list)
plt.xlabel(“迭代次数(每百)”, fontsize=14) plt.ylabel(“成本”, fontsize=14)
plt.title(“成本曲线:学习率={}和{}初始化方法”.format(learning_rate,initialization_method),y=1.05,fontsize=16)
返回参数
将所有参数初始化为零
在这里,我们将所有权矩阵和偏差初始化为零,看看这如何影响错误率以及学习参数。
# 用零初始化参数训练 NN
layers_dims = [X.shape[0], 5, 5, 1]
parameters = model(X, Y, layers_dims, hidden_layers_activation_fn=”tanh”, initialization_method=”zeros”) 准确度(X, parameters, Y,”tanh”)
100次迭代后的代价为:0.6931471805599453
200次迭代后的代价为:0.6931471805599453
300次迭代后的代价为:0.6931471805599453
400次迭代后的代价为:0.6931471805599453
500次迭代后的代价为:0.6931471805599453
600次迭代后的代价为:0.6931471805599453
700次迭代后的代价为:0.6931471805599453
800次迭代后的代价为:0.6931471805599453
900次迭代后的代价为:0.6931471805599453
1000次迭代后的代价为:0.6931471805599453
准确率为:50.00%。
图 2:使用零初始化方法的成本曲线
正如成本曲线所示,神经网络没有学到任何东西!这是因为所有神经元之间的对称性导致所有神经元在每次迭代中都有相同的更新。因此,无论我们运行优化算法多少次迭代,所有神经元仍将获得相同的更新,并且不会发生学习。因此,在初始化参数时,我们必须打破对称性,以便模型在每次更新梯度下降时开始学习。
用大的随机值初始化参数
如果随机值是从标准正态分布或均匀分布初始化的,那么我们将在示例中使用标准正态分布。此外,我们将随机值乘以一个大数(如 10) 以表明将参数初始化为一个大值可能会导致我们的优化具有高错误率(甚至在某些情况下)发散)。现在让我们训练我们的神经网络,其中所有权重矩阵都使用以下公式进行了初始化:np.random.randn() * 10
#用随机初始化参数训练神经网络
layers_dims = [X.shape[0], 5, 5, 1]
parameters = model(X, Y, layers_dims, hidden_layers_activation_fn=”tanh”, initialization_method=”random”) 准确度(X, parameters, Y,”tanh”)
100次迭代后的代价为:1.2413142077549013
200次迭代后的代价为:1.1258751902393416
300次迭代后的代价为:1.0989052435267657
400次迭代后的代价为:1.0840966471282327
500次迭代后的代价为:1.0706953292105978
600次迭代后的代价为:1.0574847320236294
700次迭代后的代价为:1.0443168708889223
800次迭代后的代价为:1.031157857251139
900次迭代后的代价为:1.0179838815204902
1000次迭代后的代价为:1.004767088515343
准确率为:55.00%。
图 3:使用随机初始化方法的成本曲线
随机初始化在这里很有帮助,但损失函数仍然具有较高的值,并且可能需要很长时间才能收敛并达到显着较低的值。
按照 He 和 Xavier 的建议初始化参数
我们将讨论两种初始化方法:
当隐藏层上的激活函数是一个整流线性单元(ReLU)时,最好应用Kaiming He方法。这样每个隐藏层上的权重将具有以下变量:var(W^l) = 2/n^(l – 1)。我们可以通过将标准正态分布中的随机值相乘来做到这一点
当隐藏层上的激活函数为双曲正切时,Xavier方法最好,这样每个隐藏层的权重都会有如下变量:var(W^l) = 1/n^(l -< @1)。我们可以通过将标准正态分布中的随机值相乘来做到这一点
我们将使用这两种方法来训练网络并查看结果。
# 训练神经网络,其中所有参数均基于 He 推荐进行初始化
layers_dims = [X.shape[0], 5, 5, 1]
参数 = 模型(X,Y,layers_dims,hidden_layers_activation_fn=”tanh”,initialization_method=”he”)
准确度(X,参数,Y,“tanh”)
100次迭代后的代价为:0.6300611704834093
200次迭代后的代价为:0.49092836452522753
300次迭代后的代价为:0.46579423512433943
400次迭代后的代价为:0.6516254192289226
500次迭代后的代价为:0.32487779301799485
600次迭代后的代价为:0.4631461605716059
700次迭代后的代价为:0.8050310690163623
800次迭代后的代价为:0.31739195517372376
900次迭代后的代价为:0.3094592175030812
1000次迭代后的代价为:0.19934509244449203
准确率为:99.00%。
图 4:使用 He 初始化方法的成本曲线
# 训练神经网络,其中所有参数均基于 Xavier 推荐进行初始化
layers_dims = [X.shape[0], 5, 5, 1]
parameters = model(X, Y, layers_dims, hidden_layers_activation_fn=”tanh”, initialization_method=”xavier”) 准确度(X, parameters, Y,”tanh”)
准确度(X,参数,Y,“tanh”)
100次迭代后的代价为:0.6351961521800779
200次迭代后的代价为:0.548973489787121
300次迭代后的代价为:0.47982386652748565
400次迭代后的代价为:0.32811768889968684
500次迭代后的代价为:0.2793453045790634
600次迭代后的代价为:0.3258507563809604
700次迭代后的代价为:0.2873032724176074
800次迭代后的代价为:0.0924974839405706
900次迭代后的代价为:0.07418011931058155
1000次迭代后的代价为:0.06204402572328295
准确率为:99.00%。
图 5:使用 Xavier 初始化方法的成本曲线
从应用这四种方法可以看出,参数的初始值在实现低成本值以及收敛和低训练错误率方面发挥着巨大的作用。如果我们有测试数据,测试错误率是一样的。
结论
深度学习框架可以更轻松地在不同的初始化方法之间进行选择神经网络 参数初始化,而不必担心自己实现它。尽管如此,了解参数在网络整体性能中的关键作用也很重要。以下是一些关键要点:
加快梯度下降的收敛速度。
增加梯度下降的概率以找到更低的训练和泛化错误率。
常见问题FAQ
- 免费下载或者VIP会员专享资源能否直接商用?
- 本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
- 提示下载完但解压或打开不了?
- 找不到素材资源介绍文章里的示例图片?
- 欧资源网