神经网络参数初始化问题代码测试

原创 2018年04月15日 13:45:11

背景:

神经网络的参数初始化,一般是采用随机初始化的方式。如果是初始化为全0,会导致每层的多个神经元退化为一个,即在每层中的多个神经元是完全失效的。虽然层与层之间仍然是有效的,但是每层一个神经元的多层神经网络,你真的觉得有意思?有什么想法,欢迎留言。

代码测试:

2层神经网络的全0初始化

# -*- coding: utf-8 -*-
__author__ = 'jasonliu'
#探究神经网络初始化值的影响
#初始化为0
#初始化为相同值,但是不为0

import numpy as np

def nonlin(x,deriv=False):
    if(deriv==True):
        return x*(1-x)

    return 1/(1+np.exp(-x))

X = np.array([[0.5,0.9,1],
            [2,1,1],
            [0.3,0.6,1],
            [1.5,0.9,0.6]])

#此时X是在行方式叠其样本数

Y = np.array([[1],
            [3],
            [2],
            [0]])

#此时Y是在行方向叠其样本数
np.random.seed(1)

# randomly initialize our weights with mean 0
# syn0 = 2*np.random.random((3,4)) - 1
# syn1 = 2*np.random.random((4,1)) - 1
W1 = 2*np.zeros((3,4))# + 1
W2 = 2*np.zeros((4,1))# + 1

for j in range(60000):

    # Feed forward through layers 0, 1, and 2
    A0 = X
    Z1 = np.dot(A0, W1)
    A1 = nonlin(Z1)
    Z2 = np.dot(A1, W2)
    A2 = nonlin(Z2)

    # how much did we miss the target value?
    dZ_2 = Y - A2#Loss

    if (j% 10000) == 0:
        print("Error:" + str(np.mean(np.abs(dZ_2))))

    # in what direction is the target value?
    # were we really sure? if so, don't change too much.
    l2_delta = dZ_2*nonlin(A2, deriv=True)#dZ_1

    # how much did each l1 value contribute to the l2 error (according to the weights)?
    l1_error = l2_delta.dot(W2.T)

    # in what direction is the target l1?
    # were we really sure? if so, don't change too much.
    l1_delta = l1_error * nonlin(A1, deriv=True)

    W2 += A1.T.dot(l2_delta)
    W1 += A0.T.dot(l1_delta)

print("Output After Training:")
print("W1=", W1)
print("W2=", W2)
#从结果可以看出,W1在列方向是重复的。
#注意行和列方向的维度信息,也注意样本是在行方向的排列还是列方向

输出结果:

Error:1.25
Error:1.0000091298568936
Error:1.0000044798865095
Error:1.000002957418707
Error:1.0000022037278755
Error:1.0000017545861548
Output After Training:
W1= [[0.58078498 0.58078498 0.58078498 0.58078498]
 [0.72845083 0.72845083 0.72845083 0.72845083]
 [1.33742659 1.33742659 1.33742659 1.33742659]]
W2= [[3.52357914]
 [3.52357914]
 [3.52357914]
 [3.52357914]]

可以看出,出现了重复,W1在列方向是重复的,即该层的每个神经元的权重是相同的。

2层神经网络的全2初始化

输出结果如下:

Error:1.0001879134151608
Error:1.0000064142342748
Error:1.0000032676762678
Error:1.0000021930282932
Error:1.0000016505669969
Error:1.0000013233782656
Output After Training:
W1= [[2.0085157  2.0085157  2.0085157  2.0085157 ]
 [2.02205683 2.02205683 2.02205683 2.02205683]
 [2.03953857 2.03953857 2.03953857 2.03953857]]
W2= [[3.30069379]
 [3.30069379]
 [3.30069379]
 [3.30069379]]

结果是类似的,在列方向的神经元都是一样的。这种对称性依然存在。

随机初始化

W1 = 2*np.random.random((3,4)) - 1
W2 = 2*np.random.random((4,1)) - 1

输出结果:

W1= [[ 0.08581783  1.08039398 -1.16536044  0.27396062]
 [-0.48584844  0.29602972 -0.86136823  0.54469744]
 [ 0.24509319  2.23500284 -0.5412316   2.23673393]]
W2= [[1.23731123]
 [6.40888963]
 [0.09966753]
 [5.78541642]]
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ljp1919/article/details/79948742

表格排序技巧

表格排序的方法function Table (tBody, tHead) { this.tBody = tBody; this.tHead = tHead.constructor == A...
  • net_lover
  • net_lover
  • 2001-07-04 16:27:00
  • 2633

深度学习方法(六):神经网络weight参数怎么初始化

神经网络,或者深度学习算法的参数初始化是一个很重要的方面,传统的初始化方法从高斯分布中随机初始化参数。甚至直接全初始化为1或者0。这样的方法暴力直接,但是往往效果一般。本篇文章的叙述来源于一个国外的讨...
  • xbinworld
  • xbinworld
  • 2016-02-12 17:27:51
  • 15835

神经网络weight参数怎么初始化

转载自:http://blog.csdn.net/xbinworld/article/details/50603552 神经网络,或者深度学习算法的参数初始化是一个很重要的方...
  • qq_26898461
  • qq_26898461
  • 2016-03-28 11:02:00
  • 2399

为什么神经网络参数不能全部初始化为全0?

假设我们现在需要初始化的神经网络如下所示:我们初始化权值为其中W1代表输入层到隐藏层的权值矩阵,W2代表隐藏层到输出层的权值矩阵。假设网络的输入为[x1,x2,x3],然后通过网络的正向传播,可以得出...
  • qq_15505637
  • qq_15505637
  • 2018-02-24 16:17:28
  • 306

Deep learning系列(八)参数初始化

介绍了在实际应用中,神经网络参数如何进行初始化。
  • u012526120
  • u012526120
  • 2015-10-15 15:57:44
  • 3749

小波神经网络参数初始化函数

  • 2012年11月06日 20:22
  • 1KB
  • 下载

神经网络参数设置注意事项

翻译网上的哈,我觉得有很大一部分从没看到过,所以就翻译了下,如有不对的地方,欢迎指正: 1、准备数据:务必保证有大量、高质量并且带有干净标签的数据,没有如此的数据,学习是不可能的 2、预处...
  • prom1201
  • prom1201
  • 2016-07-05 12:51:49
  • 2560

神经网络优化(初始化权重)

因为传统的初始化权重问题是用标准正态分布(均值为0,方差为1)随机初始化的,这其实是存在不合理的部分。 标准正态分布: 可以看出真实数据的分布其实是在靠近坡峰的部分,符合正态分布的。...
  • qq_29133371
  • qq_29133371
  • 2016-07-09 19:41:07
  • 5549

神经网络之权重初始化(附代码)

摘要 神经网络/深度学习模型训练的过程本质是对权重进行更新,在对一个新的模型进行训练之前,需要每个参数有相应的初始值。对于多层神经网络/深度学习而言,如何选择参数初始值便成为一个值得探讨的问题。本...
  • chongtong
  • chongtong
  • 2017-12-04 21:16:23
  • 509

神经网络权重初始化问题

之前看Andrew大神的视频有介绍到神经网络权重需要随机初始化而不是全初始化为0的问题,其真正深层次的含义没有弄明白,所以结合一些资料(cs231n课程)希望能让自己之后再想到这个问题的时候能够快速地...
  • marsggbo
  • marsggbo
  • 2017-09-01 12:24:26
  • 3120
收藏助手
不良信息举报
您举报文章:神经网络参数初始化问题代码测试
举报原因:
原因补充:

(最多只允许输入30个字)