参数更新策略算法

SGD

11640276-639c1c27c0ea96db.PNG

将原来的权重W 减去 学习率和偏导数的积

class SGD:

    """随机梯度下降法(Stochastic Gradient Descent)"""

    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] 

策略:朝着梯度的方向前进
优点:简单易于实现
缺点:效率低

Momentum

11640276-11ed96b95114f5d0.PNG
class Momentum:

    """Momentum SGD"""

    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)
"""
In  [1]: a = np.arange(24).reshape(4,6)
...      b = np.zeros_like(a)

Out [1]: (4, 6) #a.shape
Out [1]: (4, 6) #b.shape
Out [1]: array([[0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0],
                [0, 0, 0, 0, 0, 0]]) # a_0

生成一个和你所给数组a相同shape的全0数组
"""
                
        for key in params.keys():
            self.v[key] = self.momentum*self.v[key] - self.lr*grads[key] 
            params[key] += self.v[key]

策略:模拟物体物理运动 使变化稳定
优点:可以更快地朝x轴方向靠近
缺点:超参数学习率不好确定

AdaGrad

11640276-a0bdf4653bf8ac29.PNG

策略:AdaGrad会为参数的每个元素适当地调整学习率 参数的元素中变动较大(被大幅更新)的元素的学习率将变小
优点:函数的取值高效地向着最小值移动
缺点:如果无止境地学习,更新量就会变为0,完全不再更新(梯度消失)

Adam

11640276-d6dbd891a9ea1fa9.PNG
11640276-3927739a18c8ebb2.PNG

Adam算法跑得比SGD更快,却存在两大缺陷:结果可能不收敛、可能找不到全局最优解。也就是说它的泛化能力较差,在解决某些问题上,表现还不如SGD

猜你喜欢

转载自blog.csdn.net/weixin_34056162/article/details/90974494