2019-04-30 Day9

Day 9

6.1 参数的更新

import numpy as np


class SGD(object):
    def __init__(self, lr=0.01):
        self.lr = lr

    def update(self, params, grads):
        for key in params.keys():
            params[key] -= self.lr * grads[key]


class Momentum(object):
    def __init__(self, lr=0.01, momentum=0.9):
        self.lr = lr
        self.momentum = momentum
        self.v = None

    def update(self, params, grads):
        if self.v is None:
            self.v = {}
            for key, val in params.items():
                self.v[key] = np.zeros_like(val)

        for key in params.keys():
            self.v[key] = self.momentum * self.v[key] - self.lr * grads[key]
            params[key] += self.v[key]


class AdaGrad(object):
    def __init__(self, lr=0.01):
        self.lr = lr
        self.h = None

    def update(self, params, grads):
        if self.h is None:
            self.h = {}
            for key, val in params.items():
                self.h[key] = np.zeros_like(val)

        for key in params.keys():
            self.h[key] += grads[key] ** 2
            params[key] -= self.lr * grads[key] / (np.sqrt(self.h[key]) + 1e-7)

6.2 权重初始值

6.2.1 权重初始化为0?

权值衰减是一种通过减小权重参数的值来抑制过拟合的方法。

不能将权重初始化为0,或者其他一样的值,因为这样会使权重具有对称结构,降低神经网络的表达能力。

6.2.2 隐藏层的激活值的分布

梯度消失:偏向0和1的数据分布会造成反向传播过程中梯度的值不断变小。

激活值的分布有所偏向,会降低神经网络的表达能力。

Xavier初始值:前一层的节点数为n,则初始值使用标准差为的分布。

6.2.3 ReLU的权重初始值

He初始值:两倍,即(何恺明牛逼!!!!!)

6.3 Batch Normalization

Batch Norm 将数据正规化,均值为0,方差为1



将Batch Norm层插入到激活函数的前面或后面,减小数据分布的偏向。

然后Batch Norm层再对数据进行仿射变换(缩放和平移):

你可能感兴趣的:(2019-04-30 Day9)