最新公告
  • 欢迎您光临欧资源网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入我们
  • 【】:三种不同的参数初始化情况

    机器学习/深度学习上下文中的优化是更改模型参数以提高其性能的过程。换句话说,它是在预定的假设空间中找到最佳参数以获得最佳性能的过程。共有三种优化算法:

    在这篇文章中,我们将研究三种不同的参数初始化场景神经网络 参数初始化,看看它如何影响错误率:

    将所有参数初始化为零。

    将参数初始化为标准正态或均匀分布的随机值,并将其乘以标量(例如 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介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    欧资源网
    一个高级程序员模板开发平台

    发表评论