精华内容
下载资源
问答
  • 人工智能的需求在过去十年中显著增长,很大程度是深度学习的进步。这种增长是由深度(机器)学习技术的进步和利用硬件加速的能力推动的。然而,为了提高预测的质量和使机器学习解决方案在更复杂的应用中可行,需要大量...
  • 麻省理工2018深度学习公开课:人类感知的深度学习 MIT2019公开课-深度学习最新技术ppt
  • 2020 最新 深度学习 图像分割技术 串烧具体技术包罗:神经网络分类模型**主流公开数据集****主流评价指标****模型得分汇总** 由于这两年深度学习图像分割技术出现大量有趣和前瞻的分割技术,现在这里做一篇回顾性的...


    由于这两年深度学习图像分割技术出现大量有趣和前瞻的分割技术,现在这里做一篇回顾性的总结,以提升学习效率。涉及语义分割、实例分割等。

    具体技术包罗:

    1.卷积网络家族
    2.编解码器家族
    3.多尺度金字塔结构
    4.R-CNN模型做实例分割
    5.膨胀卷积和Deeplab系列
    6.RNN
    7.注意力机制
    8.对抗网络GAN

    神经网络分类

    CNNs、
    在这里插入图片描述
    RNN (LSTM)
    在这里插入图片描述
    编解码器
    Encoder-Decoder 和 Auto-Encoder模型
    在这里插入图片描述
    对抗网络
    在这里插入图片描述
    迁移学习

    模型

    FCN
    在这里插入图片描述
    在这里插入图片描述

    Skip-connection

    ParseNet
    在这里插入图片描述
    在这里插入图片描述

    Encoder Decoder
    在这里插入图片描述
    SegNet
    在这里插入图片描述
    在这里插入图片描述
    HRNet
    在这里插入图片描述
    在这里插入图片描述
    U-Net
    在这里插入图片描述
    在这里插入图片描述
    V-Net
    在这里插入图片描述

    Multi-layer perceptron (MLPs)
    在这里插入图片描述
    在这里插入图片描述
    PSPN
    在这里插入图片描述
    在这里插入图片描述
    R-CNN based models for Instance Segmentation
    在这里插入图片描述
    Mask R-CNN
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    PAN
    在这里插入图片描述
    在这里插入图片描述

    MaskLab
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    Dilated Convolutional Models and Deeplab Family
    在这里插入图片描述

    在这里插入图片描述
    DeepLab
    在这里插入图片描述
    DeepLab v3+
    在这里插入图片描述
    在这里插入图片描述

    Attention-Based Models
    Attention-based semantic segmentation model
    在这里插入图片描述
    在这里插入图片描述
    The reverse attention network for segmentation
    在这里插入图片描述
    在这里插入图片描述
    The dual attention netowrk for semantic segmentation
    在这里插入图片描述
    在这里插入图片描述
    Generative Models and Adversarial Training
    在这里插入图片描述
    在这里插入图片描述
    A semi-supervised segmentation framework
    在这里插入图片描述
    在这里插入图片描述
    Adversarial network with Multi-scale L1 loss
    在这里插入图片描述
    在这里插入图片描述
    EncNet
    RefineNet
    Seednet
    Feedforward-Net
    BoxSup
    Graph-convolutional net
    Wide ResNet
    Exfuse
    DIS dual image segmentation
    FoveaNet
    Ladder DenseNet
    BiSeNet
    SPGNet
    Gated shape CNNs
    AC-Net
    DSSPN
    SGR
    SAC
    UperNet

    主流公开数据集

    2D

    1. PASCAL Visual Object Classed (VOC)
    2. PASCAL context
    3. Microsoft Common Objects in Context (MS COCO)
    4. Cityscapes
    5. ADE20K / MIT Scene Parsing (SceneParse150)
    6. SiftFlow
    7. Stanford background
    8. Berkeley Segmentation Dataset (BSD)
    9. Youtube-Ojects
    10. KITTI

    2.5D
    11. NYU-D
    12. SUN-3D
    13. SUN RGB-D
    14. UW RGB-D Object Dataset
    15. ScanNet

    3D
    16. Stanford 2D-3D
    17. ShapeNet Core
    18. Sydney Urban Objects Dataset

    主流评价指标

    Pixel accuracy
    在这里插入图片描述
    Mean Pixel Accuracy (MPA)
    在这里插入图片描述
    IOU / Jaccard Index /Mean-IOU
    在这里插入图片描述
    Precision / Recall / F1
    在这里插入图片描述
    Dice
    在这里插入图片描述

    模型得分汇总

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 本文翻译自Adam King的《Optimizing deep learning trading bots using state-of-the-art techniques》,英语好的建议读原文,本译本只是学习记录,翻译水平有限,如果专业术语错误还望指正。 教会我们的机器人用...

    本文翻译自Adam King的《Optimizing deep learning trading bots using state-of-the-art techniques》,英语好的建议读原文,本译本只是学习记录,翻译水平有限,如果专业术语错误还望指正。

    教会我们的机器人用特征工程和Bayes优化赚更多的钱。

    在上篇文章中,我们创建了不会亏钱的BTC交易机器人。尽管agents是赚钱的,但收益率一般,所以这次更上一层楼,大幅提升模型性能。

    再次强调,本系列文章只是为了考察最新深度学习技术是否能够创建正收益BTC交易机器人。关闭任何创建强化学习算法的企图似乎是现状,因为创建一个交易算法是行不通的。然而,相关领域最新进展表明面对相同问题RL程序常常变现优于监督学习。基于此,我写了本系列文章,来考察这些交易程序收益率如何或者考察下现状是否合理。

    我们首先优化提升政策网络,平稳输入数据集,这样才能从小数据集中学出更多信息。

    然后,我们用前沿特征工程提升agent的观察空间,微调奖励函数产生更优策略。

    最后,我们在训练、测试最终程序收益率前,用Bayes优化技术来确定最优超参数。各位看官拿好瓜,尽情欣赏疯狂之旅。

    • 修改

      首先改善上文中代码,提升模型盈利水平。代码见我的Github

    • RNN递归神经网络

      首先调整策略,用递归的LSTM(Long Short-Term Memory)网络替换先前的多层感知机(MLP,MultiLayer Perceptron)。因为RNN能够不受时间影响保持内部结构,我们不再需要哟弄个华东回测窗口捕捉价格波动。相反,采用神经网络的内部递归来捕捉。每个时间步,输入数据以及最新输出数据一同传给算法。

    在这里插入图片描述

    这让LSTM再每个时间步保持内部状态,就像程序能够“记住”或“忘记”特殊的数据关系。

    在这里插入图片描述

    from stable_baselines.common.policies import MlpLstmPolicy
    model = PPO2(MlpLstmPolicy, train_env, tensorboard_log="./tensorboard")
    
    • 平稳数据

      上篇文章有人指出我们的时间序列数据是不平稳的。因此任何机器学习模型都很难预测未来价值。

      平稳时间序列指均值、方差、自相关系数均为常数。

      最主要的是我们的时间序列包含明显的趋势性和季节性,这两点都会影响算法预测准确性。我们可以通过差分和变换技术产生一个更正态分布的时间序列。

      差分是将每个时间步减去其导数(收益率)。这样可以去除趋势性,不过依然保留季节性。季节性可以通过再每次差分前先取导数来去除。这样就产生最终的平稳时间序列。下面右图。

      在这里插入图片描述

      df['diffed'] = df['Close'] - df['Close'].shift(1)
      df['logged_and_diffed'] = np.log(df['Close']) - np.log(df['Close']).shift(1)
      

      可以用 Augmented Dickey-Fuller Test测试时间序列的平稳性。测试给出p值为0.00,使我们拒绝测试的空假设,确认时间序列是平稳的。

      from statsmodels.tsa.stattools import adfuller
      df['logged_and_diffed'] = np.log(df['Close']) - np.log(df['Close']).shift(1)
      result = adfuller(df['logged_and_diffed'].values[1:], autolag="AIC")
      print('p-value: %f' % logged_and_diffed_result[1])
      

      这个问题就解决了,下面我们采用特征工程来进一步优化观测空间。

    • 特征工程

      为进一步优化模型,我们做一些特征工程。

      特征工程是用领域特定只是创造额外输入数据来提升机器学习模型。

      本例中,我们会为数据集添加一些常见但有效的技术因子,以及从StatsModels SARIMAX预测模型得到的输出。技术因子会给数据集带来一些尽管滞后却相关的信息。我们的预测模型预测的信息会对其提供很好的支持。此多特征综合会为模型提供一个有用的观测平衡。

    • 技术分析

      为选取技术因子集,我们会比较ta库中的32个因子(58个特征)。采用pandas分析同类(动量、成交量、趋势、波动性)因子两两间的相关性,然后只选取每种类型中相关性最低的因子作为特征。此法,我们可以从这些技术因子中获得尽可能多的好处,而不对观测空间增加过多噪音。

    在这里插入图片描述

    结果表明波动性指标都高度相关,几个动量指标也是。当我们删除所有重复特征(在集群中相关性绝对值>0.5)。最终剩38个技术特征加入到观测空间中。完美,我们创建一个add_indicators实用方法将上述特征加到我们的数据集中,并在环境初始化中调用它以免再每个时间步计算这些值。

    def __init__(self, df, initial_balance=10000, commission=0.0003, reward_func='profit', **kwargs):
        super(BitcoinTradingEnv, self).__init__()
            
        self.df = df.fillna(method='bfill')
        self.df = add_indicators(self.df.reset_index())
        self.stationary_df = log_and_difference(
            self.df, ['Open', 'High', 'Low', 'Close', 'Volume BTC', 'Volume USD'])
    
    • 统计分析

      下一步是添加预测模型,我们选用Seasonal Auto Regressive Integrated Moving Average (SARIMA)模型提供价格预测,因为其每步计算很快,SARIMA在我们的平稳数据集上准确性好。还有个额外好处,他的实现非常简单,并允许我们为预测结果创建一个置信区间,这通常比一个单值更好。举例说明,agent会学出对置信区间小的预测谨慎信任,当置信区间大时承担更多风险。

      def _next_observation(self):
        ...
        
        obs = scaled_features[-1]
        
        past_df = self.stationary_df['Close'][:self.current_step + self.n_forecasts + 1]
        forecast_model = SARIMAX(past_df.values)
        model_fit = forecast_model.fit(method='bfgs', disp=False)
        forecast = model_fit.get_forecast(steps=self.n_forecasts, alpha=(1 - self.confidence_interval))
      
        obs = np.insert(obs, len(obs), forecast.predicted_mean, axis=0)
        obs = np.insert(obs, len(obs), forecast.conf_int().flatten(), axis=0)
      

      现在我们已经用一个更合适的递归神经网络更新策略,并用上下文特征工程优化观测空间,是时候做整体优化了。

    • 奖励优化

    在这里插入图片描述

    可能会有人认为上文提到的奖励函数已经是最优选,其实进一步检查就会发现这是不对的。尽管上次的简单奖励函数已经可以盈利,但它经常产出会造成资本损失的不稳定策略。为改善,我们除了未计利润还要考虑其他奖励度量。

    上文评论中有人给出了一个简单优化方法:不仅奖励持BTC币待涨,也奖励空仓BTC价跌。例如,我们可以为anget持有BTC/USD仓位时净值增长给与奖励,也可以在其不持有任何仓位时BTC/USD下跌而给出奖励。

    虽然这个策略在奖励回报增长方面表现良好,但是并未考虑产生高额收益的风险。投资者长期内会通过简单的收益指标发现这些问题,并习惯上转向经风险调整的回报度量来给与解释。

    • 基于波动率的度量

      最常见的风险调整收益度量是夏普率。这是投资组合在一段特殊时期内超额收益对波动率的简单比率。为保持高夏普率,一项投资需同时保持高收益和低波动。对应的数学公式是:
      Sharpe=RPRBσP=Portifolio  returnsBenchmark  returnsStandard  deviation  of  portfolio Sharpe=\frac{R_P-R_B}{\sigma_P}=\frac{Portifolio\; returns - Benchmark \;returns}{Standard\;deviation \; of\;portfolio}
      这个度量久经考验,不过对我们的目的而言略有缺陷,因为它惩罚了上行波动。对于BTC,这很成问题,因为上行波动(价格猛涨)经常是有利可图的。这就把我们引向agents测试的第一项奖励度量。

      Sortino率与Sharpe率类似,只是它只把下行波动视为风险,而非全波动。作为结果,Sortino率不惩罚上行波动。数学公式如下:
      Sortino=RPRBσD=Portfolio  returnsBenchmark  returnsStandard  deviation  of  downside Sortino=\frac{R_P-R_B}{\sigma_D}=\frac{Portfolio\;returns-Benchmark\;returns}{Standard\;deviation\;of\;downside}

    • 额外指标

      在此数据集上测试的第二个奖励度量是Calmar率。至此我们所有的度量都没有考虑回撤。

      回撤是资产组合一种特殊损失的度量,从高到低

      大的回撤对成功的交易策略不利,因为长期的高额收益会被一次突然的大额回撤折损殆尽。

    在这里插入图片描述

    为鼓励策略积极主动组织大额回撤,我们可以用一个奖励指标来解释那些资本损失,比如Calmar率。这个比率与Sharpe率相同,只是用最大回撤代替资产组合值的标准差。
    Calmar=RPRBμD=Protfolio  returnsBenchmark  returnsMaximum  drawdown  of  portfolio Calmar=\frac{R_P-R_B}{\mu_D}=\frac{Protfolio\;returns-Benchmark\;returns}{Maximum\;drawdown\;of\;portfolio}
    我们的最后一个指标,也是在对冲基金业普遍应用的,Omega率。理论上,就度量risk vs. return来说,Omega率比Sortino率和Calmar率都好。因为它可以在单个指标中解释收益分布的全部。为计算它,我们需要先计算资产组合基于特定基准上下波动的概率分布,然后取两者比率。比率越高,上升空间高于下降空间的概率就越高。
    Omega=RBb1F(RP)dxaRBF(RP)dx=Upside  PotentialDownside  Potential Omega=\frac{\int_{R_B}^b1-F(R_P)dx}{\int_a^{R_B}F(R_P)dx}=\frac{Upside\;Potential}{Downside\;Potential}

    • 代码

      虽然编写上述奖励度量听起来挺有趣,不过我还是倾向于用empyrical库来直接计算它们。幸运的是这个库中恰好包含我们上述定义的3个度量。在每个时间步获取比率就像给相关Empyrical函数提供一系列阶段收益和基准收益一样简单。

      import numpy as np
      from empyrical import sortino_ratio, calmar_ratio, omega_ratio
        
      def _reward(self):
            length = min(self.current_step, self.reward_len)
            returns = np.diff(self.net_worths)[-length:]
      
            if self.reward_func == 'sortino':
                reward = sortino_ratio(returns)
            elif self.reward_func == 'calmar':
                reward = calmar_ratio(returns)
            elif self.reward_func == 'omega':
                reward = omega_ratio(returns)
            else
                reward = np.mean(returns)
      
            return reward if abs(reward) != inf and not np.isnan(reward) else 0
      

      现在我们已经知道如何去衡量一个成功的交易策略,是时候找出是哪些指标最能衡量优质结果。将上述度量函数逐一放入Optuna并用Bsyes优化方法来找出数据集的最优策略。

    • 工具集

      宝刀配英雄。充分利用前辈呕心沥血的工作,不要重复早轮子。对今天的工作,最重要的工具之一就是optuna库,这是一个用 Tree-structured Parzen Estimators (TPEs)实现Bayes优化的库。TPEs可并行,大大减少搜索时长,充分利用GPU。简言之,

      Bayes优化是一项高效搜索超空间,寻找最大化目标函数参数集的技术。

      简言之,Bayes优化是一种提升任何黑盒模型的高效方法。它的工作方式是通过代理函数或代理函数分布对目标函数建模。分布会随着时间提升,因为算法会探索产生最大值的超空间和区域。

      如何将其用于我们的BTC交易机器人?本质上我们可以用此技术找到让模型最优的超参数集。我们正在大海捞针,Bayes优化就是我们的磁铁。让我们开始吧!

    • 部署Optuna

    在这里插入图片描述
    用Optuna优化超参数相当简单。首先,创建一个optuna研究,它是所有超参数探索的母容器。一项试验包含特定的超参数配置和由目标函数造成 的成本。然后可调用study.optimize()并传给目标函数,Optuna会采用Bayes优化来找到产生最低成本的超参数配置。

    import optuna
    
    def optimize(n_trials = 5000, n_jobs = 4):
        study = optuna.create_study(study_name='optimize_profit', storage='sqlite:///params.db', load_if_exists=True)
        study.optimize(objective_fn, n_trials=n_trials, n_jobs=n_jobs)
    

    此例中,目标函数由在我们的BTC交易环境中训练和测试PPO2模型构成。目标函数返回的成本是测试期的平均奖励,是负数。我们需要取平均奖励的负数,因为Optuna把低回报当为更优尝试。optimize函数为我们的目标函数提供一个实验对象,我们用该对象制定需要优化的变量。

    def objective_fn(trial):
        env_params = optimize_envs(trial)
        agent_params = optimize_ppo2(trial)
        
        train_env, validation_env = initialize_envs(**env_params)
        model = PPO2(MlpLstmPolicy, train_env, **agent_params)
        
        model.learn(len(train_env.df))
        
        rewards, done = [], False
    
        obs = validation_env.reset()
        for i in range(len(validation_env.df)):
            action, _ = model.predict(obs)
            obs, reward, done, _ = validation_env.step(action)
            rewards += reward
        
        return -np.mean(rewards)
    

    optimize_ppo2()和optimize_envs()方法接受一个实验对象并返回一个测试词典。每个变量的搜索空间由对试验调用的特殊suggest函数和传给函数的参数确定。

    例如,trial.suggest_loguniform('n_steps', 16, 2048)以对方方式提示一个新的介于16-2048之间的对数(16, 32, 64, …, 1024, 2048)。更进一步,trial.suggest_uniform('cliprange', 0.1, 0.4)会建议一个简单、累计形式的会当属(0.1, 0.2, 0.3, 0.4).此处用不到,不过Optuna也会为建议分类变量提供方法:suggest_categorical('categorical', ['option_one', 'option_two']).

    def optimize_ppo2(trial):
        return {
            'n_steps': int(trial.suggest_loguniform('n_steps', 16, 2048)),
            'gamma': trial.suggest_loguniform('gamma', 0.9, 0.9999),
            'learning_rate': trial.suggest_loguniform('learning_rate', 1e-5, 1.),
            'ent_coef': trial.suggest_loguniform('ent_coef', 1e-8, 1e-1),
            'cliprange': trial.suggest_uniform('cliprange', 0.1, 0.4),
            'noptepochs': int(trial.suggest_loguniform('noptepochs', 1, 48)),
            'lam': trial.suggest_uniform('lam', 0.8, 1.)
        }
    
    def optimize_envs(trial):
        return {
            'reward_len': int(trial.suggest_loguniform('reward_len', 1, 200)),
            'forecast_len': int(trial.suggest_loguniform('forecast_len', 1, 200)),
            'confidence_interval': trial.suggest_uniform('confidence_interval', 0.7, 0.99),
        }
    

    稍后,在用一个不错的CPU/GPU组合运行我们的优化函数一夜之后,我们可以用Optuna创建的sqlite数据库中载入研究。该研究从测试中跟踪最佳试验,我们可以用这些测试为环境抓取最佳超参数集。

    study = optuna.load_study(study_name='optimize_profit', storage='sqlite:///params.db')
    params = study.best_trial.params
    
    env_params = {
        'reward_len': int(params['reward_len']),
        'forecast_len': int(params['forecast_len']),
        'confidence_interval': params['confidence_interval']
    }
    
    train_env = DummyVecEnv([lambda: BitcoinTradingEnv(train_df, **env_params)])
    
    model_params = {
        'n_steps': int(params['n_steps']),
        'gamma': params['gamma'],
        'learning_rate': params['learning_rate'],
        'ent_coef': params['ent_coef'],
        'cliprange': params['cliprange'],
        'noptepochs': int(params['noptepochs']),
        'lam': params['lam']
    }
    
    model = PPO2(MlpLstmPolicy, train_env, **model_params)
    

    我们已经修改模型、提升特征集、优化所有超参数。现在是时候见证我们的agent如何应对新的奖励机制。我已经训练了一个agent适应前述4中收益度量:简单收益、Sortino率、Calmar率、Omega率。让我们在一个用他们从未训练过的价格数据初始化的测试环境中运行每一个优化后的agent,看看收益率怎么样。

    • 基准

      在查看结果之前,我们需要知道一个成功的策略应该是什么样的。基于此,我们将用几个常见但有效的BTC盈利交易策略作为基准。信不信由你,过去十年来最有效的BTC策略之一就是简单的买入然后持有。我们将测试的两外另个策略是用非常简单但有效的技术分析来创建买卖信号。

      1. 买入并持币

        尽可能多的买入并持币到天荒地老。虽然这个策略不复杂,但是在过去它取得了成功的收益率。

      2. RSI

        当RSI持续下跌而连续的收盘价持续上涨时,是一个负的反转趋势(卖)信号。当RSI连续上涨而收盘价连续下跌时,一个争相反转信号(买)就出现了。

      3. SMA(Simple Moving Average)交叉

        当长期移动平均线穿越短期移动平均线,是一个负趋势反转信号(卖)。

        当短期移动平均线穿越长期移动平均线,是一个正的趋势反转信号(买)。

        测试这些简单基准的目的是证明我们的深度学习agent正在市场上创建alpha。如果我们不能那白那些简单基准,那么我们就是在浪费开发时间浪费GPU,而只是做了一个看起来炫酷的科学项目。让我们它的价值。

    • 结果

      我必须提前说明,下面部分的正向收益是错误代码的直接结果。因为数据时间的存储方式防止agent总可以提前12小时看到价格信息,这是明显的前视偏差。问题已经得到修正,但还需要时间替换下面的结果集。请理解这些结果是完全无效且无法复制的。

      话虽如此,本文依然有大量研究且本系列文章的目的本就不是为了赚大钱,而是探讨在最新强化学习和优化技术下可以达到什么研究深度。因此为了让本文原汁原味,我还是把旧有(不正确)结果留下了,等后续实践充分我会用新的正确的结果再行更替。

      用从CryptoDataDownload下载的小时级数据集(OHCLV)的钱80%训练agent,并用后20%测试观察策略在新数据上的效果。这种简单的交叉验证足以满足需要,因为当我们最终发布算法时,可以在整个数据集上训练并用新输入的数据集作为新的测试集。

      让我们快速浏览失败者以便找到成功者。首先我们来看Omega策略,在数据集上相当无用。

    在这里插入图片描述

    看看这个agent,明显这种奖励机制产生了过度交易策略,无法捕捉市场机会。

    基于Calmar的策略略优于Omega策略,但最终结果类似。看起来我们投入大量时间和精力只是让事情变得更糟糕。

    在这里插入图片描述

    还记得我们的老朋友简单增量利润么?最然在上文这种奖励机制并未证明很成功,我们所作的修改和优化似乎大幅提升了agent的成功。

    在四个月的测试期,平均收益350%。如果你不了解什么是平均市场收益,只要知道是一个疯狂的结果就可以了。当然,这是我们用强化学习的到的最好结果,对吧?

    在这里插入图片描述

    错。Sortino奖励的agent平均收益可达850%。当我看到这些策略的成功,我吓得赶紧检查下有没有错。(温馨提醒:接受下面这句话的讽刺吧)。己经排查,没有bug,此agent在交易BTC上就是这么牛逼。

    在这里插入图片描述

    ​ 不是过度交易和资本降低,这些agents似乎能理解低买高卖同时降低持币风险的重要性。不考虑agent具体学出了什么策略,我们的交易机器人明确学会了交易BTC赚钱。如果你不信,自己回测看看。

    在这里插入图片描述

    我不傻,我知道这样成功的回测应该不会再实际交易中发生。话虽如此,但这结果是我迄今见过最好的(这可能也是表明哪里有点不对劲的第一条线索)。想想蛮震惊的,这些程序没有任何金融市场如何工作或者如何做交易的先验知识,仅仅凭着尝试、犯错(也伴随这一些前视偏差)就能获的如此大的成功。当然是大量、大量、大量的尝试和犯错。

    • 结论

      本文中,优化了我们的强化学习agents使其在BTC交易中表现的更好,赚更多钱。工作量不小,不过我们根据如下步骤终是完成了:

      • 用迭代的,LSTM网络及平稳数据更新现存的模型
      • 用特定领域技术和统计分析为agent学习筛选出40+特征
      • 提升agent原来的简单收益奖励系统以解释风险
      • 用Bayes优化技术微调模型的超参数
      • 以基础交易策略为基准,确保机器人总能打败市场

      理论上,一个高收益的机器人是伟大的。然而,我收到了不少反馈说这些agents知识简单的学习拟合曲线,并不会在实盘中真正盈利。我们关于数据集切分成训练集/测试集的方式应该可以解释这个问题,的确我们的模型可能在这个数据集上过度拟合,不能在新数据集上表象良好。话虽如此,我的第六感告诉我,这些agent并非仅仅在拟合曲线,因此会在实盘中获利的。

      为了实验这个假设,下篇文章会专注于将这些RLagents部署到真实环境。我们首先会更新环境以支持更多加密货币对如ETH/USD和LTC/USD。然后将其部署到Coinbase Pro交易所实盘交易。不管最终是否赚钱,这都是件令人兴奋的事儿,你一并不想错过。

      顺便一提,要想改进agent表现还有很多工作要做,但我时间有限,而且已经为其投入甚多,如果你有兴趣可以在我工作的基础上继续改进,如果结果比我做的还好,可以底下留言,我们共同探讨。

      再次声明,本系列文章用于教育,不作为实盘交易建议。你不应该基于本文的任何策略实盘交易,除非你想拿自己的真金白银打水漂。

      感谢阅读,一如既往,本文所有代码都在以在我的Github上看到。如有问题及反馈,欢迎地下留言,期待你的声音。

    展开全文
  • MIT 2019公开课-深度学习基础知识PPT很实用的东东,MIT 2019公开课-深度学习基础知识PPT很实用的东东
  • 在计算机视觉领域,有一个方向是语义分割,一般是针对图像进行像素级分类。具体而言,语义图像分割就是将每个像素都标注上其对应的类别。...基于深度学习的语义分割方法: 用卷积神经网络分类(全卷...

    在计算机视觉领域,有一个方向是语义分割,一般是针对图像进行像素级分类。具体而言,语义图像分割就是将每个像素都标注上其对应的类别。由于所有的像素都要考虑到,因此语义图像分割任务也被视为是稠密预测的一种。

    在此,要区别一下实例分割(具体可参考著名的MaskRCNN模型),实例分割常常与目标检测系统相互结合,用于检测和分割场景中同一对象的多个实例。

    基于深度学习的语义分割方法:

    用卷积神经网络分类(全卷积网络),与普通网络不同的是,分类层是卷积层,普通网络为全连接层。

    最近的语义分割架构一般都用卷积神经网络(CNN)为每个像素分配一个初始类别标签。卷积层可以有效地捕捉图像中的局部特征,并以层级的方式将许多这样的模块嵌套在一起,这样 CNN 就可以试着提取更大的结构了。通过一系列卷积捕捉图像的复杂特征,CNN 可以将一张图的内容编码为紧凑表征。

    但为了将单独的像素映射给标签,我们需要将标准 CNN 编码器扩展为编码器-解码器架构。在这个架构中,编码器使用卷积层和池化层将特征图尺寸缩小,使其成为更低维的表征。解码器接收到这一表征,用通过转置卷积执行上采样而「恢复」空间维度,这样每一个转置卷积都能扩展特征图尺寸。在某些情况下,编码器的中间步骤可用于调优解码器。最终,解码器生成一个表示原始图像标签的数组。

    常见模型:

    1.FCN系列

    三种模型FCN-32S, FCN-16S, FCN-8S

    主要贡献:

    不含全连接层(fc)的全卷积(fully conv)网络。可适应任意尺寸输入。
    增大数据尺寸的反卷积(deconv)层。能够输出精细的结果。
    结合不同深度层结果的跳级(skip)结构。同时确保鲁棒性和精确性。

    2.SegNet

    SegNet和FCN思路十分相似,只是Encoder,Decoder(Upsampling)使用的技术不一致。此外SegNet的编码器部分使用的是VGG16的前13层卷积网络,每个编码器层都对应一个解码器层,最终解码器的输出被送入soft-max分类器以独立的为每个像素产生类概率。

    image

    3.Unet及各种变体

    在生物医学图像处理中,得到图像中的每一个细胞的类别标签是非常关键的。生物医学中最大的挑战就是用于训练的图像是不容易获取的,数据量也不会很大。U-Net 是非常著名的解决方案,它在全连接卷积层上构建模型,对其做了修改使得它能够在少量的训练图像数据上运行,得到了更加精确的分割。

    image

    4.Deeplab系列

    主要有模型Deeplabv1,Deeplabv2,Deeplabv3,Deeplabv3+。

    将 CNN 编码器-解码器和 CRF 精炼过程相结合以产生目标标签(作者强调了解码器的上采样)。空洞卷积(也称扩张卷积)在每一层都使用大小不同的卷积核,使每一层都能捕获各种比例的特征。

    V3+使用深度分离卷积替代了pooling,并且使用了Xception,Xception的核心是使用了Depthwise separable convolution。Depthwise separable convolution的思想来自inception结构,是inception结构的一种极限情况。Inception 首先给出了一种假设:卷积层通道间的相关性和空间相关性是可以退耦合的,将它们分开映射,能达到更好的效果。在inception结构中,先对输入进行11的卷积,之后将通道分组,分别使用不同的33卷积提取特征,最后将各组结果串联在一起作为输出。

    image

    主要贡献:

    • 为密集预测任务使用具有上采样的卷积
    • 在多尺度上为分割对象进行带洞空间金字塔池化(ASPP)
    • 通过使用 DCNNs 提升了目标边界的定位

    解决了语义分割的主要挑战,包括:

    • 由重复的最大池化和下采样导致的特征分辨率降低
    • 检测多尺度目标
    • 因为以目标为中心的分类器需要对空间变换具有不变性,因而降低了由 DCNN 的不变性导致的定位准确率。

    5.Unet++

    UNet ++(嵌套U-Net架构)用于更精确的分割。我们引入中间层来跳过U-Net的连接,这自然形成了来自不同深度的多个新的上采样路径,集合了各种感受域的U-Nets。

    image

    6.PSPNet

    金字塔场景解析网络是建立在FCN之上的基于像素级分类网络。特性映射来自网络被转换成不同分辨率的激活,并经过多尺度处理池层,稍后向上采样并与原始层连接进行分割的feature map(见图)。学习的过程利用辅助分类器进一步优化了像ResNet这样的深度网络。不同类型的池模块侧重于激活的不同区域地图。将大小不同的内核集中在一起激活地图的不同区域创建空间池金字塔。

    image

    7.RefineNet

    使用CNN最后一层的特性可以生成soft对象段的边界。在DeepLab算法中避免了这个问题深黑色的卷曲。RefineNet采用了另一种方法通过细化中间激活映射并分层地将其连接到结合多尺度激活,同时防止锐度损失。网络由独立的RefineNet模块组成,每个模块对应于ResNet。每个RefineNet模块由三个主要模块组成,即:剩余卷积单元(RCU),多分辨率融合(MRF)和链剩余池(CRP)。RCU块由一个自适应块组成卷积集,微调预训练的ResNet权重对于分割问题。MRF层融合不同的激活物使用卷积和上采样层来创建更高的分辨率地图。最后,在CRP层池中使用多种大小的内核用于从较大的图像区域捕获背景上下文。RefineNet在Person-Part数据集上进行了测试68.6,与DeepLab-v2的64.9相比,两者都使用了ResNet-101作为特征提取器。

    image

    8.FastFCN

    此模型提出了一种被称作联合金字塔上采样(Joint Pyramid Upsampling/JPU)的联合上采样模块来代替消耗大量时间和内存的带洞卷积。它通过把抽取高分辨率图的方法形式化,并构建成一个上采样问题来取得很好的效果。

    此模型在 Pascal Context 数据集上实现了 53.13% 的 mIoU,并且具有三倍的运行速度。

    该模型以全卷积网络(FCN)作为主体架构,同时应用 JPU 对低分辨率的最终特征图进行上采样,得到了高分辨率的特征图。使用 JPU 代替带洞卷积并不会造成任何性能损失。

    image

    image

    9.CNN+RNN方案及其他一系列模型

    语义分割常见指标:

    FN:False Negative,被判定为负样本,但事实上是正样本。
    FP:False Positive,被判定为正样本,但事实上是负样本。
    TN:True Negative,被判定为负样本,事实上也是负样本。
    TP:True Positive,被判定为正样本,事实上也是正样本。

    像素准确率(pixel-accuracy),有的时候还有平均准确率(mean-accuracy)以及加权准确率

    查准率(precision),指的是预测值为1且真实值也为1的样本在预测值为1的所有样本中所占的比例。以黄瓜问题为例,算法挑出来的黄瓜中有多少比例是好黄瓜。

    image

    召回率(recall),也叫查全率,指的是预测值为1真实值也为1的样本在真实值为1的所有样本中所占的比例。所有的好西瓜中有多少比例被算法挑了出来。

    image

    F1分数(F1-Score),又称为平衡F分数(BalancedScore),它被定义为精确率和召回率的调和平均数。

    image

    IOU(Intersection over Union)交并比。计算真实值和预测值集合的交集与并集之比。

    image

    常用MeanIOU,即每类上求IOU再平均,以及FWIOU,根据每类的频率或数量来加权。

    语义分割的传统方法:

    1. 直方图阈值化方法
    2. 混合化特征空间聚类方法
    3. 基于区域的方法
    4. SVM等算法
    5. 等等

    基于深度学习方法与传统方法的一个重要区别:

    传统算法依赖于领域专家提取的特征的质量,而CNN通常解决自动特性学习问题。

    语义分割的应用:

    1. 医学图形处理,定位各种异常,如肿瘤或特定的器官。
    2. 行人检测,交通监控。
    3. 卫星图像,指纹识别等取证技术。(我主要也是做遥感影像的语义分割)
    4. 自动驾驶等等。

    如果自己在做科研或解决一些问题,可以采用以下语义分割技术来提升分割效果、改善效率:

    1.Astrous Convolutions(扩张卷积)

    空洞卷积(dilated convolution)是针对图像语义分割问题中下采样会降低图像分辨率、丢失信息而提出的一种卷积思路。利用添加空洞扩大感受野,让原本3x3的卷积核,在相同参数量和计算量下拥有5x5(dilated rate =2)或者更大的感受野,从而无需下采样。扩张卷积又名空洞卷积(atrous convolutions),向卷积层引入了一个称为 “扩张率(dilation rate)”的新参数,该参数定义了卷积核处理数据时各值的间距。换句话说,相比原来的标准卷积,扩张卷积多了一个hyper-parameter(超参数)称之为dilation rate(扩张率),指的是kernel各点之前的间隔数量,【正常的convolution 的 dilatation rate为 1】。

    2.空间金字塔池化等下采样技术。

    如上述模型中的ASPP模块及JPU模块,并且可以以此技术来相互组合达到更好的效果。

    3.CRF(条件随机场)

    在基于深度学习的语义图像分割体系结构,CRF是一个有用的后处理模块,但是主要缺点是不能将其用作端到端体系结构的一部分。在标准CRF模型中,可以表示成对电位用加权高斯函数的和。但是由于精确的极小化是否考虑了CRF分布的平均场近似用一个简单的产品版本来表示发行版独立的边际分布。它的平均场近似原生形式不适合反向传播。

    4.Loss函数的更改

    (1)二分类

    大名鼎鼎的focal loss,focal loss的提出是在目标检测领域,为了解决正负样本比例严重失衡的问题。是由log loss改进而来的,公式如下:

    image

    其中gamma>0

    在Focal Loss中,它更关心难分类样本,不太关心易分类样本,比如:

    若 gamma = 2,

    对于正类样本来说,如果预测结果为0.97那么肯定是易分类的样本,所以就会很小;

    对于正类样本来说,如果预测结果为0.3的肯定是难分类的样本,所以就会很大;

    对于负类样本来说,如果预测结果为0.8那么肯定是难分类的样本,就会很大;

    对于负类样本来说,如果预测结果为0.1那么肯定是易分类的样本,就会很小。

    另外,Focal Loss还引入了平衡因子alpha,用来平衡正负样本本身的比例不均。

    alpha取值范围0~1,当alpha>0.5时,可以相对增加y=1所占的比例。实现正负样本的平衡。

    虽然何凯明的试验中,lambda为2是最优的,但是不代表这个参数适合其他样本,在应用中还需要根据实际情况调整这两个参数。

    (2)多分类

    多分类常见的是交叉熵,其他的损失函数也比较多,也可以对交叉熵加权。

    如Dice:

    ##Keras
    def dice_coef(y_true, y_pred, smooth=1):
        mean_loss = 0;
        for i in range(y_pred.shape(-1)):
            intersection = K.sum(y_true[:,:,:,i] * y_pred[:,:,:,i], axis=[1,2,3])
            union = K.sum(y_true[:,:,:,i], axis=[1,2,3]) + K.sum(y_pred[:,:,:,i], axis=[1,2,3])
        mean_loss += (2. * intersection + smooth) / (union + smooth)
        return K.mean(mean_loss, axis=0)
    

    5.标签平滑

    简单理解就是对预测结果进行惩罚。

    def label_smoothing(inputs, epsilon=0.1):
        K = inputs.get_shape().as_list()[-1]    # number of channels
        return ((1-epsilon) * inputs) + (epsilon / K)
    

    6.可利用的训练策略,主要是学习率策略

    每隔一段时间warm restart学习率,这样在单位时间内能得到多个而不是一个converged local minina,做融合的话手上的模型会多很多。

    image

    7.更高级的优化器

    LookAhead等优化器。

    Lookahead 算法与已有的方法完全不同,它迭代地更新两组权重。直观来说,Lookahead 算法通过提前观察另一个优化器生成的fast weights序列,来选择搜索方向。该研究发现,Lookahead 算法能够提升学习稳定性,不仅降低了调参需要的功夫,同时还能提升收敛速度与效果。

    image

    8.数据增强技术

    无论对于什么样的数据集,规模多大的数据集,在语义分割任务中,数据随机缩放给模型带来的收益永远是最大的。我们在训练网络时,如果将padding给的过大,而卷积核大小不变你会发现我们的卷积核能力被弱化,过大的padding增加了数据集的单一性,假设你对一张大小为16x16的图像增加了64x64的padding,甚至更大,大到我们本来的图像在在增加padding之后显的很渺小,那这新的图像对于卷积核来看,基本上就是一张呼呼的图像,如果整个数据集都是这种图像,那对于卷积核来讲,太单一了,当然也没有人会这样做。数据集的多样性,包括尺度多样性,光照多样性,目标姿态多样性。尺度多样性不仅在深度学习中使用,在传统计算机视觉中也是很重要的方法。

    对于随机翻转,镜像翻转,色彩偏移等数据增强技术手段为模型所带来的收益加一起也不一定有尺度的随机缩放所带来的效果好。

    9.更高明的数据预处理

    最常见的就是标准化与归一化

    数据的标准化(normalization)是将数据按比例缩放使之落入一个小的特定区间。在某些比较和评价的指标处理中经常会用到,去除数据的单位限制,将其转化为无量纲的纯数值,便于不同单位或量级的指标能够进行比较和加权。目前数据标准化方法有多种,归结起来可以分为直线型方法(如极值法、标准差法)、折线型方法(如三折线法)、曲线型方法(如半正态性分布)。不同的标准化方法,对系统的评价结果会产生不同的影响,然而不幸的是,在数据标准化方法的选择上,还没有通用的法则可以遵循。

    数据的归一化处理,即将数据统一映射到[0,1]区间上。

    1. 把数变为(0,1)之间的小数
    主要是为了数据处理方便提出来的,把数据映射到0~1范围之内处理,更加便捷快速,应该归到数字信号处理范畴之内。
    2. 把有量纲表达式变为无量纲表达式
    归一化是一种简化计算的方式,即将有量纲的表达式,经过变换,化为无量纲的表达式,成为纯量。

    10.模型的集成

    已知神经网络的集合比单个网络更健壮和准确。然而,为模型平均训练多个深度网络在计算上是昂贵的。前面有讲,通过循环调整网络的学习率可使网络依次收敛到不同的局部最优解也可达到模型集成的作用,此处所讲的主要是多模型集成

    (1)直接平均法

    直接平均法是最简单有效的多模型集成方法,通过直接平均不同模型产生的类别置信度得到最后额预测结果

    (2)加权平均法

    加权平均法是直接平均的基础上加入权重来调节不同模型输出间的重要程度。

    (3)投票法(voting)

    投票法中最常用的是多数表决法。表决前需先将各自模型返回的预测置信度sisi转化为预测类别,即最高置信度对应的类别标记 cici ∈ {1, 2, … , C} 作为该模型的预测结果。多数表决法中在得到样本 x 的最终预测时,若某预测类别获得一半以上模型投票,则该样本预测结果为该类别; 若对该样本无任何类别获得一半以上投票,则拒绝作出预测。投票法中另一种常用方法是相对多数表决法 , 与多数表决法会输出“拒绝预测”不同的是,相对多数表决法一定会返回某个类别作为预测结果, 因为相对多数表决是选取投票数最高的类别作为最后预测结果。

    (4)堆叠法

    堆叠法又称“二次集成法”是一种高阶的集成学习算法。在刚才的例子中,样本 x 作为学习算法或网络模型的输入, sisi 作为第 i 个模型的类别置信度输出,整个学习过程可记作一阶学习过程。堆叠法则是以一阶学习过程的输出作为输入开展二阶学习过程, 有时也称作“元学习”。拿刚才的例子来说,对于样本 x, 堆叠法的输入是 N 个模型的预测置信度,这些置信度可以级联作为新的特征表示。之后基于这样的”特征表示”训练学习器将其映射到样本原本的标记空间。此时学习器可为任何学习算法习得的模型,如支持向量机,随机森林 ,当然也可以是神经网络模型。不过在此需要指出的是,堆叠法有较大过拟合风险。

    11.Dropout等技术。

    在神经网络中DropOut层的主要作用是防止权值过度拟合,增强学习能力。DropOut层的原理是,输入经过DropOut层之后,随机使部分神经元不工作(权值为0),即只激活部分神经元,结果是这次迭代的向前和向后传播只有部分权值得到学习,即改变权值。

    因此,DropOut层服从二项分布,结果不是0,就是1,在CNN中可以设定其为0或1的概率来到达每次只让百分之几的神经元参与训练或者测试。在Bayesian SegNet中,SegNet作者把概率设置为0.5,即每次只有一半的神经元在工作。因为每次只训练部分权值,可以很清楚地知道,DropOut层会导致学习速度减慢。

    提示:在做的过程中,过拟合现象是非常常见的。

    过拟合的根本原因是特征维度过多,模型假设过于复杂,参数过多,训练数据过少,噪声过多,导致拟合的函数完美的预测训练集,但对新数据的测试集预测结果差。 过度的拟合了训练数据,而没有考虑到泛化能力。

    展开全文
  • 来源:腾讯开发者关注数据分析挖掘与算法,一起用技术改变世界深度学习模型的广泛应用,让臃肿的深度学习模型训练慢,落地难的问题愈发凸显。有哪些先进的加速技术,让深度学习模型跑得又快又好?本文...

    来源:腾讯开发者

    关注数据分析挖掘与算法,一起用技术改变世界

    深度学习模型的广泛应用,让臃肿的深度学习模型训练慢,落地难的问题愈发凸显。有哪些先进的加速技术,让深度学习模型跑得又快又好?本文主要从计算优化和系统优化层面入手,为大家带来业界在深度学习模型加速技术上的研究及最新进展,为读者提供深度学习模型加速相关的知识参考。


    为什么需要加速?


    近几年深度学习发展迅猛,在图像、文本、语音、推荐等多个领域都取得了显著成果。腾讯有不少团队将深度学习模型应用于实际业务中,取得了不错的效果。但是或多或少都会面临一个问题:业务数据量大,但计算资源紧缺,导致模型训练慢、延时高、上线难。

    因此在实际应用中,模型除了效果好,还需用得起,跑得快,才能在更多的场景下得到推广应用。深度学习模型加速技术就是以“多快好省”为目标,试图从计算优化、系统优化以及硬件优化等多方面提升深度学习模型在训练和推理阶段的速度。

    表1:模型加速主流研究方向


    如何减少计算量?

    计算优化技术主要是寻求模型效果和效率之间的平衡,在保证模型效果的同时,尽可能减少模型的计算量。目前业界主流的研究方向聚焦于复杂模型的“瘦身”方法,主要涉及以下几种技术方案:模型结构优化、模型剪枝、模型量化、知识蒸馏。

     

    1. 模型结构优化

    神经网络模型在往更宽更深方向发展的同时,需要对模型结构做优化,以适应当前的数据和算力条件。模型结构优化的方法大部分还是基于人工经验去设计一些具有相似功效的“轻型”计算组件来替换原模型中“重型”计算组件。

    这一点在CNN神经网络的进化历史上显得尤为突出。比如CNN神经网络基于图像的局部感知原理设计滤波器计算组件来替代全连接神经网络,以局部计算和权值共享的方式实现了模型瘦身。

    而随后的NIN、VGG、GoogleNet、SqueezeNet、MobileNets、ShuffleNets等则是在滤波器上动刀,用小组件替换大组件做进一步优化,具体优化方法如下:

    表2:不同CNN模型的优化方法对比


    CNN模型结构的优化得益于对卷积模块的拆分、替换和重组,类似的思想在文本、语音等序列数据应用领域也有不少应用。QRNN将RNN Ceil Unit展开后分解为卷积操作和pooling操作,其中卷积操作不仅可以实现序列特征提取,还可以并行化,从而解决了RNN的训练过程中的序列依赖问题。SRNN则是对序列数据进行切片,在多个子序列上做并行计算。最近热门的BERT模型主要是基于Transformer和Attention堆叠起来的,除了优化堆叠的层数,Reformer另辟蹊径,利用LSH替换attention操作,降低了计算复杂度。

    小结

    总览各种深度学习模型,可以发现它们都是由一个个小组件组装而成,只是初期先把模型做大做强,后期落地遇到问题时,再瘦身优化。具体的优化方法依赖于具体的模型和业务,需要研究员因地制宜。上述这些优化操作都依赖于人工经验,费时费力,组合优化这种事情更适合让机器来做,于是神经网络结构搜索(NAS)技术就应运而生。NAS技术也是当前的研究热点,碍于文章篇幅限制,这里就不再展开讨论了。

     

    2. 模型剪枝

    模型剪枝的初衷就是深度学习模型的过度参数化,说白了就是你的模型太胖了,跑不动,需要减肥。根据模型剪枝的方法可以分为两大类:一类是结构化剪枝,另一类是非结构化剪枝。

    所谓结构化剪枝是对参数矩阵做有规律的裁剪,比如按行或列裁剪,使得裁剪后的参数矩阵仍然是一个规则的的矩阵。结构化裁剪主流的方法有Channel-level、Vector-level、Group-level、Filter-level级别的裁剪。

    非结构化剪枝是将原本稠密的参数矩阵裁剪为稀疏的参数矩阵,一般矩阵大小不变,其效果类似于参数正则化。因为目前大部分计算平台不支持稀疏矩阵的计算,只有结构化剪枝才能真正减少计算量。

    模型剪枝的难点在于对“不重要”参数的定义和最优剪枝结构的搜索方法。目前主流的做法是训练一个大模型,然后根据参数权重的大小对大模型进行剪枝,去除不重要的参数,最后再对剪枝后的模型fine-tune一下。但是这种方法收敛比较慢,而且最终得到的模型不一定是最优的。

    为了解决这个问题,同时避免每次剪枝后重新训练模型带来的大量计算开销,Metapruning方法设计了一个权重学习模型来学习不同网络结构对应的权重矩阵,用于评估模型搜索过程中产生的模型的好坏,从而解决了模型评估过程中模型参数训练的问题。Metapruning算法最大的创新点在于告诉我们模型参数可以直接“生成”,而不需要训练。不过比较遗憾的时,“生成”的模型参数不能直接应用于模型推理,仅供对比评估。

    小结

    根据业界的实践经验,非结构化模型剪枝的模型精度损失较小,但受限于底层计算框架,计算加速效果有限。而结构化模型剪枝可以较大幅度地减少模型参数,实现可观的计算加速,但容易造成明显的性能损失。

    图1:模型剪枝原理示意图

     

    3. 模型量化

    模型量化是通过减少表示每个权重参数所需的比特数来压缩原始网络,从而实现计算加速。

    半浮点精度(FP16)和混合精度是一种常见的做法,不过需要底层计算框架支持,否则无法实现计算加速。另一种是INT8量化,即将模型的权重参数从 FP32 转换为 INT8,以及使用 INT8 进行推理。量化的加速主要得益于定点运算比浮点运算快,但从FP32量化为INT8会损失模型精度。

    在我们的直观印象中,神经网络模型的权重参数一般都是位于0附近的很小的数值,权重参数的分布大概如下图所示。而量化不会改变权重参数的分布,只是将权重参数从一个值域映射到另一个值域,过程类似于数值的归一化。整个量化的思想很简单,后续的研究都是围绕如何提高量化后的模型的准确度。

    图2:深度神经网络权重参数分布示例图

    采用普通量化方法时,靠近零的浮点值在量化时没有精确地用定点值表示。因此,量化后的模型预测准确度会显著下降,如均一量化,会将具有动态值密度的浮点映射成具有恒定值密度的定点。其中一种的做法是在量化过程中做值域调整。

    值域调整的目标是学习能在量化后更准确地运行网络的超参数 min/max,即归一化参数。根据调整的时机,可以进一步划分为训练后量化和训练时量化,代表分别为 Nvidia Calibration 和 TensorFlow Quantization-aware Training。

    除了上述常规量化操作,还有一些比较特殊的量化网络,如二进制神经网络、三元权重网络、XNOR网络。这些神经网络以更少的位数来表示权重参数,比如二进制神经网络是具有二进制权重和激活的神经网络,即网络权重只有1和-1,和量化不一样的地方在于这二值权重参数是通过训练时候的梯度优化得到,而不是从FP32量化得到。

    小结

    量化技术适用场景较广,加速效果明显。此外,对于精度敏感的模型,还可以通过精度补偿的操作来进一步优化量化模型的效果。

     

    4. 模型蒸馏

    模型蒸馏本质上和迁移学习类似,只是它还多了一个模型压缩的目的,即通过模型蒸馏,将大模型压缩为小模型,使小模型可以跑得又快又好。所以,最基本的想法就是将大模型学习得到的知识作为先验,将先验知识传递到小规模的神经网络中,并在实际应用中部署小规模的神经网络。在实际研究中,我们将大模型称为Teacher,小模型称为Student,模型蒸馏的过程就是让Student去学习Teacher的知识。目前大部分模型蒸馏框架都是基于Teacher-Student的模式,只是有些方法会请多几个Teacher或者配个Assistant。模型蒸馏的依据主要有三点:

    • Teacher可以从大量数据中学习数据结构间的相似性

    • Student可以利用Teacher学习到的知识作为先验,加速模型的收敛

    • Softmax函数随着温度变量(temperature)的升高分布更均匀

    数据结构的结构间相似是指相似样本之间的预测值接近,所以大部分模型蒸馏方法都会让Student去学习Teacher的logit输出,而不是实际的预测值(实际预测值不能度量样本间的相似性)。Teacher的先验知识直观上理解就是模型中间层的输出,即Teacher处理数据的方式。这一点跟迁移学习很像,差异点在于模型蒸馏是要让Student模型也学会处理类似的数据,并得到类似的输出,而迁移学习一般是直接利用Teacher模型提供的参数或中间输出。正所谓授人以鱼不如授人以渔。

    图3:Teacher-Student模型蒸馏基础框架

    基于Teacher-Student蒸馏框架,不同蒸馏方法的差异主要体现在让Student模型学什么,如何学。

    对比表征蒸馏让Student模型学习一个表征(representation),这个表征在某些度量空间下正样本对紧密靠近,同时负样本对尽量分离,解决跨模态蒸馏的问题。

    多步蒸馏则认为Teacher模型和Student模型差异比较大时,Student模型学不好,因此需要引入一个助教传递知识。

    多任务蒸馏利用多个BERT模型担任Teacher,教Student模型处理多任务问题。这时,Student模型的目标函数就变为多个任务的loss求和,每个训练batch数据也会从多个任务中随机采样得到。

    TinyBERT利用Two-stage方法,分别对预训练阶段和精调阶段的BERT进行蒸馏,并且不同层都设计了损失函数,是目前为止效果最好的模型。

    小结

    模型蒸馏技术是通过用小模型替代大模型来实现推理阶段的加速,适用于推理阶段的加速。而在训练阶段,由于需要预训练大模型,还需要付出额外的计算开销。


    如何算得更快?

    加速深度学习模型训练速度最有效的方法便是增加计算资源,将单机训练的模型扩展为多机训练。目前各大主流框架的多GPU分布式训练一般存在两种模式:模型并行和数据并行

    模型并行是将模型切分为多个子模块,每个计算设备负责其中一个子模块的计算。数据并行则是对训练数据进行切分,将数据分片分配到不同设备上进行并行计算。随着内存和显存容量的扩大,大部分深度学习模型可以直接存放在单个节点上,以数据并行的方式运行。

    分布式机器学习系统的核心是参数的同步和更新,而Parameter Server(PS)是目前主流的深度学习系统默认参数同步方案。该方案中包含两类节点,一类是Server,负责存储模型参数;一类是Worker,负责模型计算。Worker在每次训练迭代开始前,从Server拉取最新的模型参数,并在本地完成模型的计算;Worker在每次训练迭代结束后,发送梯度给Server,由Server来更新参数。

    整个模型训练过程涉及了大量的数据交换,由于深度学习模型具有大量的参数,即便使用10GbE网络,参数的传输也会成为瓶颈。实验证明,在8个节点进行Tensorflow分布式训练,对于VGG19网络,90%的时间花在等待网络传输上面。因此,大量的研究工作集中在消除网络通信瓶颈。


    目前主要有两大类方向,一类是研发新的通信机制,实现最优的参数交换,如RingAllReduce。RingAllReduce将计算节点组织成环状结构,每个节点只和邻居节点进行通信,每次交换一部分数据,通过2*(N-1) 次通信就可以完成数据的同步。

    图4:RingAllReduce通信示意图

    另一类是试图减少节点之间的数据交换量,从而消除网络通信瓶颈,如梯度压缩,其核心思想是每次只选择“重要”的梯度进行更新,从而减少通信开销。

    DGC算法的实验分析表明模型训练3~4epoches之后,梯度的稀疏度就能达到99.9%,可以将梯度压缩270x到600x而不损失精度。梯度压缩虽然可以大幅度减少网络通信开销,但是会因为大部分参数得不到更新而影响模型的收敛和精度。

    梯度累计和补偿是目前最常见的一种做法,目前大部分研究都是围绕这一点在展开。从单机单卡扩展为多机多卡是实现模型加速最有效的途径,消除网络通信瓶颈的研究只是为了追求更高的计算性价比。

    图5:DGC算法示意图

    总结&展望

    本文从计算优化和系统优化两个层面对深度学习模型加速技术做了调研,总结了一些业界在模型加速这一块所做的工作及研究进展。通过业界的研究和实践可以发现,深度学习模型加速是一项系统性工程,需要算法和工程相结合,根据具体的模型及应用场景做定制优化。

    猜你喜欢

    展开全文
  • 深度学习领域最新技术(CV、NLP)

    万次阅读 2019-02-27 23:50:36
    深度学习(DL)是目前最活跃的分支。最近几年,DL取得了许多重要进展。其中一些因为事件跟大众关系密切而引人瞩目,而有的虽然低调但意义重大。深度学习从业人员应该保持足够的嗅觉,这个领域正在发生很多事情,你...
  • 一、深度学习框架概述与深度学习技术的四大阵营 人工智能从学术理论研究到生产应用的产品化开发过程中通常会涉及到多个不同的步骤和工具,这使得人工智能开发依赖的环境安装、部署、测试以及不断迭代改进准确性和...
  • 2019年7月26日,斯坦福大学发布最新《DAWNBench深度学习推理榜单》,海帆数据跻身全球五强! 斯坦福大学DAWNBench是人工智能领域最权威的竞赛之一,也是用来衡量端到端的深度学习模型训练和推理性能的国际权威...
  • 机器学习正在彻底改变时尚行业的趋势。从大到小,每个品牌都在使用机器学习技术,以提高收入,增加客户,并保持领先的趋势。人们喜欢时尚,他们想知道什么看起来最好,他们如何改善自己的风格,提升自己的个性。
  • 这本书涵盖了深度学习的传统和现代的所有技术。主要关注的是深度学习的理论和算法。神经网络的理论和算法对于理解重要的概念特别重要,因此人们可以理解神经架构在不同应用中的重要设计概念。神经网络为什么工作?...
  • 深度学习核心技术

    千次阅读 2016-04-03 19:20:47
    核心技术 Core Tech 人脸检测 Face Detection ...Linkface 开发了基于深度学习的人脸检测创新算法 。无论场景中是单人或多人,还是侧脸、半遮挡、模糊等情景中,均能进行...Linkface 开发了基于深度学习的人脸检测
  • NLP Architect是一个开源Python库,用于探索最新深度学习拓扑和技术,以优化自然语言处理和自然语言理解神经网络。 总览 NLP Architect是一个NLP库,旨在灵活,易于扩展,允许在应用程序中轻松快速地集成NLP模型并...
  • 在计算机视觉领域,有一个方向是语义分割,一般是针对图像进行像素级分类。具体而言,语义图像分割就是将每个像素都标注上其对应的类别。由于所有的像素都要...基于深度学习的语义分割方法: 用卷积神经网络分类...
  • 很不错的最新介绍深度学习的文献,仅供大家参考,希望更多的深学爱好者上传分享,谢谢!

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,314
精华内容 525
关键字:

最新技术深度学习