首页 > 代码库 > 『cs231n』作业2选讲_通过代码理解优化器
『cs231n』作业2选讲_通过代码理解优化器
1)、Adagrad
一种自适应学习率算法,实现代码如下:
cache += dx**2 x += - learning_rate * dx / (np.sqrt(cache) + eps)
这种方法的好处是,对于高梯度的权重,它们的有效学习率被降低了;而小梯度的权重迭代过程中学习率提升了。要注意的是,这里开根号很重要。平滑参数eps是为了避免除以0的情况,eps一般取值1e-4 到1e-8。
2)、RMSprop
RMSProp方法对Adagrad算法做了一个简单的优化,以减缓它的迭代强度:
cache = decay_rate * cache + (1 - decay_rate) * dx**2 x += - learning_rate * dx / (np.sqrt(cache) + eps)
其中,decay_rate是一个超参数,其值可以在 [0.9, 0.99, 0.999]中选择。
3)、Adam
Adam有点像RMSProp+momentum,效果比RMSProp稍好,其简化版的代码如下:
m = beta1*m + (1-beta1)*dx v = beta2*v + (1-beta2)*(dx**2) x += - learning_rate * m / (np.sqrt(v) + eps)
论文中推荐eps = 1e-8,beta1 = 0.9,beta2 = 0.999。
import numpy as np """ 输入: - w: - dw: - config: 包含各种超参数 返回: - next_w: - config: """ def sgd(w, dw, config=None): if config is None: config = {} config.setdefault(‘learning_rate‘, 1e-2) w -= config[‘learning_rate‘] * dw return w, config def sgd_momentum(w, dw, config=None): """ 结合动量的SGD(最常用) - learning_rate: - momentum: 动量值 - velocity: A numpy array of the same shape as w and dw used to store a moving average of the gradients. """ if config is None: config = {} config.setdefault(‘learning_rate‘, 1e-2) config.setdefault(‘momentum‘, 0.9) v = config.get(‘velocity‘, np.zeros_like(w)) next_w = None next_w = w v = config[‘momentum‘]* v - config[‘learning_rate‘]*dw next_w +=v config[‘velocity‘] = v return next_w, config def rmsprop(x, dx, config=None): """ - learning_rate: - decay_rate: - epsilon: 小数值 避免分母为零 - cache: """ if config is None: config = {} config.setdefault(‘learning_rate‘, 1e-2) config.setdefault(‘decay_rate‘, 0.99) config.setdefault(‘epsilon‘, 1e-8) config.setdefault(‘cache‘, np.zeros_like(x)) next_x = None next_x = x config[‘cache‘] = config[‘decay_rate‘]*config[‘cache‘]+(1-config[‘decay_rate‘])*(dx*dx) x += -config[‘learning_rate‘]* dx / (np.sqrt(config[‘cache‘])+config[‘epsilon‘]) return next_x, config def adam(x, dx, config=None): """ - learning_rate - beta1: m的衰减率 - beta2: v的衰减率 - epsilon - m: Moving average of gradient. - v: Moving average of squared gradient. - t: Iteration number. """ if config is None: config = {} config.setdefault(‘learning_rate‘, 1e-3) config.setdefault(‘beta1‘, 0.9) config.setdefault(‘beta2‘, 0.999) config.setdefault(‘epsilon‘, 1e-8) config.setdefault(‘m‘, np.zeros_like(x)) config.setdefault(‘v‘, np.zeros_like(x)) config.setdefault(‘t‘, 0) next_x = None config[‘t‘]+=1 config[‘m‘] = config[‘beta1‘]*config[‘m‘] + (1- config[‘beta1‘])*dx config[‘v‘] = config[‘beta2‘]*config[‘v‘] + (1- config[‘beta2‘])*(dx**2) mb = config[‘m‘]/(1-config[‘beta1‘]**config[‘t‘]) vb = config[‘v‘]/(1-config[‘beta2‘]**config[‘t‘]) next_x = x -config[‘learning_rate‘]* mb / (np.sqrt(vb) + config[‘epsilon‘]) return next_x, config
『cs231n』作业2选讲_通过代码理解优化器
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。