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层再对数据进行仿射变换(缩放和平移):
网友评论