常用Optimizer的python实现

使用python实现常用的Optimizer帮助理解

import numpy as np
class Optimizer:
    def __init__(self, lr: float):
        '''
        @parms:
            - lr : learning rate
        '''
        self.lr = lr

    def update(self, params, grads):
        '''
        @para
            - params : [dict] the weight of network
            - grads : [dict] gradient fo weights
        '''
        pass

SGD

class SGD(Optimizer):
    '''
        stochastic gradient descent
        W <- W - lr * (dL/dW)
    '''

    def update(self, params, grads) -> dict:
        '''
        upadte the params;
        '''
        for k, v in grads.items():
            params[k] -= self.lr * v

Momentum

class Momentum(Optimizer):
    '''
    v <- av - lr * (dL / dW)
    W <- W + v

    - a: momentum; usually choos value like 0.9
    - lr: learning rate
    - dL / dW: gradient
    - W: parameters
    '''
    def __init__(self, lr, momentum=0.9):
        super().__init__(lr)
        self.momentum = momentum
        self.v = None

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

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

AddGrad

class AdaGrad(Optimizer):
    '''
    AdaGrad optimizer
    h <- h + (dL/dW) ** 2  
    W <- W - lr * (dL/dW) / sqrt(h)
    '''
    def __init__(self, lr):
        super().__init__(lr)
        self.h = None

    def update(self, params, grads):
        if self.h is None:
            self.h = {}
            for k, v in params.items():
                self.h[k] = np.zeros_like(v)
        
        for k in params.keys():
            self.h[k] += grads[k] * grads[k]
            # add a extreme value 1e-7 to avoid divid zero error
            params[k] -= self.lr * grads[k] / (np.sqrt(self.h[k]) + 1e-7)

Adam

class Adam(Optimizer):
    '''
    Adam Optimizer
    t <- t + 1
    m <- beta1 * m + (1 - beta1) * (dL/dW)
    v <- beta2 * v + (1 - beta2) * ((dL/dW)**2)
    unbias_m <- m / (1 - beta1 ** t)
    unbias_v <- v / (1 - beta2 ** t)
    W <- W - lr * unbias_m / sqrt(unbias_v)
    '''
    def __init__(self, lr, beta_1=0.9, beta_2=0.999):
        super().__init__(lr)
        self.beta_1 = beta_1
        self.beta_2 = beta_2
        self.iter = 0
        self.m = None # first-order moment estimate
        self.v = None # first-order moment estimate

    def update(self, params, grads):
        self.iter += 1
        if self.m is None:
            self.m, self.v = {}, {}
            for k in params.keys():
                self.m[k] = np.zeros_like(params[k])
                self.v[k] = np.zeros_like(params[k])
        
        lr_t = self.lr * np.sqrt(1 - self.beta_2 ** self.iter) / (1 - self.beta_1 ** self.iter)
        
        for k in params.keys():
            self.m[k] = self.beta_1 * self.m[k] + (1 - self.beta_1) * grads[k]
            self.v[k] = self.beta_2 * self.v[k] + (1 - self.beta_2) * grads[k] * grads[k]
            # correct bias
            # unbias_m = self.m[k] / (1.0 - (self.beta_1 ** self.iter)) 
            # unbias_v = self.v[k] / (1.0 - (self.beta_2 ** self.iter))
            # params[k] -= self.lr * unbias_m / (np.sqrt(unbias_v) + 1e-7)
            params[k] -= lr_t * self.m[k] / (np.sqrt(self.v[k]) + 1e-7)
            
  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
vmdssalstm是基于Python编程语言实现的一种算法模型。该模型主要用于时间序列数据的分析和预测,尤其适用于处理具有多变量的时间序列。 在Python中,可以使用一些常用的机器学习框架或库来实现vmdssalstm,如TensorFlow、Keras或PyTorch。以下是一个简单的示例代码,展示了如何使用Keras库来构建和训练vmdssalstm模型。 ```python import keras from keras.models import Sequential from keras.layers import Dense from keras.layers import LSTM from keras.layers import Dropout from keras.layers import TimeDistributed # 构建vmdssalstm模型 model = Sequential() # 添加第一层lstm model.add(LSTM(units=50, return_sequences=True, input_shape=(n_steps, n_features))) model.add(Dropout(0.2)) # 添加第二层lstm model.add(LSTM(units=50, return_sequences=True)) model.add(Dropout(0.2)) # 添加第三层lstm model.add(LSTM(units=50, return_sequences=True)) model.add(Dropout(0.2)) # 添加第四层lstm model.add(LSTM(units=50)) model.add(Dropout(0.2)) # 添加全连接层 model.add(Dense(units=1)) # 编译模型 model.compile(optimizer='adam', loss='mean_squared_error') # 训练模型 model.fit(X_train, y_train, epochs=100, batch_size=32) # 使用模型进行预测 y_pred = model.predict(X_test) ``` 以上代码仅为示例,实际的实现可能会有所不同,具体实现取决于输入数据和问题的特点。实际应用中,还需要根据具体情况对模型进行调参、评估和优化。 总之,使用Python实现vmdssalstm主要涉及使用适当的机器学习库来构建和训练模型,以及使用模型进行预测。在实际应用中,还需要将模型与特定问题的数据集和目标进行适配,并进行适当的调参和优化。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值