精华内容
下载资源
问答
  • 摘要:本文对H.264 解码芯片中的滤波部分所需的数据、数据的存取及芯片中所用到的存储器了深入的分析,同时涉及到DRAM 及SRAM 的设计,并...与H.263或MPEG-4 相比,同等图像质量下,码率能降低一半左右,但是算法
  • 转自 |人工智能前沿讲习No.1总结一下在旷视实习两年来的炼丹经验,我主要了一些 RL,图像质量,图像分类,GAN 相关的任务,日常大概占用 5 - 10 张卡。可...
        

    转自 | 人工智能前沿讲习

    No.1

    总结一下在旷视实习两年来的炼丹经验,我主要做了一些 RL,图像质量,图像分类,GAN 相关的任务,日常大概占用 5 - 10 张卡。
    可复现性和一致性
    有的同学在打比赛的时候,从头到尾只维护若干份丹方(代码),每次载入前一次的训练参数,调一下丹方再炼,俗称老丹。这样会有几个问题:某次引入一个 bug,过了很久才发现,然后不知道影响范围;炼出一个金丹,但是不知道它是怎么来的;忘了自己的 baseline,不知道改动是正面还是负面。
    要尽可能确保每一个丹有可复现性,实践上建议丹方不应该在炼丹后改动,炼新的丹时,把旧的丹方复制一遍。得到的实验结果要开个文档记下来以便日后总结,避免遗忘。我经常通过阅读自己和别人的记录来得到灵感。
    实验一致性上也要多做努力,理想状态是有合理的基准来测丹的性能,同一个丹方不应该由于超参的微小改动而有显著结果差异。出现这种情况可能是数据太少或基准设置不当。
    资源利用
    对于新入行的同学,不要试图在玩具级别的数据集或任务上做靠谱的研究,比如 MNIST。
    不是每一个实验都要出一个金丹,实验是为了验证结论的。如果每个实验都要 8 张卡跑两个星期,人力物力都耗不起。尽力把实验控制在单卡一天以内,理想状态是半天得一次结论。理论上来说,水多加面面多加水(加数据加计算量)的做法无限涨点。建议先设一个目标,比如说就是在一天的训练时间下做对比实验。
    我的实践经验是,首先用小图小模型,比如 128 x 128 输入的 ResNet18;用 cProfile 来找性能瓶颈,比如我发现某个丹,炼的时候有一大半时间耗费在等数据,数据处理中一大半时间在调用 numpy 的 round 函数,前期把精力集中在提高做实验的效率上。
    模型不 work
    先把锦上添花的东西去掉,比如数据增广,玄学学习率和超参,魔幻损失函数,异形模型。如果世界上有一个非要加旋转增广和 1.96e-4 学习率 42 batchsize,配上四种混合损失函数才能炼好的丹,它应该存在于灵能文明。可以先造一些尽量玩具的模型,验证代码正确性。
    需要进一步改进
    先确认影响模型性能的组件。感性认识就是,数据是否需要增加或增广。模型是大了还是小了,再根据速度和精度期望开始寻找合适的模型。能用全卷积的任务,少用全连接层,参数量小。基本模型上 ResNet, Unet 结构还是主流。
    当你的模型有 Batch Normalization,初始化通常不需要操心,激活函数默认 Relu 即可(某引用数万的大佬说的)。一般顺序是 Conv - BN - Relu。如果没有 BN(很多任务上,BN降低训练难度,但是可能影响最终性能 ),试着要做一些数据归一化。
    虽然有至少十种激活函数,但在 Relu 外只推荐试一下 Swish。炼丹术只推荐 Momentum 和 Adam。在这些方面做尝试意义不大,如果性能提升反倒可能说明模型不成熟。不推荐做人肉模型设计,比如把某层卷积改大一点,或者微调一下通道数。除非有特别 insight,不要自己乱设计新组件。
    超参上,learning rate 最重要,推荐了解 cosine learning rate 和 cyclic learning rate,其次是 batchsize 和 weight decay。当你的丹还不错的时候,可以试着做数据增广和改损失函数锦上添花了。
    祝读到这里的各位模型涨点!
    参考文献
    • Bag of Tricks for Image Classification with Convolutional Neural Networks,trick 合集 1。
    • Must Know Tips/Tricks in Deep Neural Networks,trick 合集 2。
    • 33条神经网络训练秘技,trick 合集 3。
    • 26秒单GPU训练CIFAR10,工程实践。
    • Batch Normalization,虽然玄学,但是养活了很多炼丹师。
    • Searching for Activation Functions,swish 激活函数。
    作者:hzwer
    https://www.zhihu.com/question/41631631/answer/859040970

    No.2

    训练技巧对深度学习来说是非常重要的,作为一门实验性质很强的科学,同样的网络结构使用不同的训练方法训练,结果可能会有很大的差异。这里我总结了近一年来的炼丹心得,分享给大家,也欢迎大家补充指正。
    参数初始化
    下面几种方式,随便选一个,结果基本都差不多。但是一定要做。否则可能会减慢收敛速度,影响收敛结果,甚至造成Nan等一系列问题。
    下面的n_in为网络的输入大小,n_out为网络的输出大小,n为n_in或(n_in+n_out)*0.5
    Xavier初始法论文:
    http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf
    He初始化论文:https://arxiv.org/abs/1502.01852
    • uniform均匀分布初始化:
      w = np.random.uniform(low=-scale, high=scale, size=[n_in,n_out])
      • Xavier初始法,适用于普通激活函数(tanh,sigmoid):scale = np.sqrt(3/n)
      • He初始化,适用于ReLU:scale = np.sqrt(6/n)
    • normal高斯分布初始化:
      w = np.random.randn(n_in,n_out) * stdev # stdev为高斯分布的标准差,均值设为0
      • Xavier初始法,适用于普通激活函数 (tanh,sigmoid):stdev = np.sqrt(n)
      • He初始化,适用于ReLU:stdev = np.sqrt(2/n)
    • svd初始化:对RNN有比较好的效果。参考论文:https://arxiv.org/abs/1312.6120
    数据预处理方式
    • zero-center ,这个挺常用的.
      X -= np.mean(X, axis = 0) # zero-center
      X /= np.std(X, axis = 0) # normalize
    • PCA whitening,这个用的比较少.
    训练技巧
    • 要做梯度归一化,即算出来的梯度除以minibatch size
    • clip c(梯度裁剪): 限制最大梯度,其实是value = sqrt(w1^2+w2^2….),如果value超过了阈值,就算一个衰减系系数,让value的值等于阈值: 5,10,15
    • dropout对小数据防止过拟合有很好的效果,值一般设为0.5,小数据上dropout+sgd在我的大部分实验中,效果提升都非常明显.因此可能的话,建议一定要尝试一下。dropout的位置比较有讲究, 对于RNN,建议放到输入->RNN与RNN->输出的位置.关于RNN如何用dropout,可以参考这篇论文:http://arxiv.org/abs/1409.2329
    • adam,adadelta等,在小数据上,我这里实验的效果不如sgd, sgd收敛速度会慢一些,但是最终收敛后的结果,一般都比较好。如果使用sgd的话,可以选择从1.0或者0.1的学习率开始,隔一段时间,在验证集上检查一下,如果cost没有下降,就对学习率减半. 我看过很多论文都这么搞,我自己实验的结果也很好. 当然,也可以先用ada系列先跑,最后快收敛的时候,更换成sgd继续训练.同样也会有提升.据说adadelta一般在分类问题上效果比较好,adam在生成问题上效果比较好。
    • 除了gate之类的地方,需要把输出限制成0-1之外,尽量不要用sigmoid,可以用tanh或者relu之类的激活函数.1. sigmoid函数在-4到4的区间里,才有较大的梯度。之外的区间,梯度接近0,很容易造成梯度消失问题。2. 输入0均值,sigmoid函数的输出不是0均值的。
    • rnn的dim和embdding size,一般从128上下开始调整. batch size,一般从128左右开始调整.batch size合适最重要,并不是越大越好.
    • word2vec初始化,在小数据上,不仅可以有效提高收敛速度,也可以可以提高结果.
    • 尽量对数据做shuffle
    • LSTM 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的结果,来自这篇论文:http://jmlr.org/proceedings/papers/v37/jozefowicz15.pdf, 我这里实验设成1.0,可以提高收敛速度.实际使用中,不同的任务,可能需要尝试不同的值.
    • Batch Normalization据说可以提升效果,不过我没有尝试过,建议作为最后提升模型的手段,参考论文:Accelerating Deep Network Training by Reducing Internal Covariate Shift
    • 如果你的模型包含全连接层(MLP),并且输入和输出大小一样,可以考虑将MLP替换成Highway Network,我尝试对结果有一点提升,建议作为最后提升模型的手段,原理很简单,就是给输出加了一个gate来控制信息的流动,详细介绍请参考论文: http://arxiv.org/abs/1505.00387
    • 来自@张馨宇的技巧:一轮加正则,一轮不加正则,反复进行。
    Ensemble
    Ensemble是论文刷结果的终极核武器,深度学习中一般有以下几种方式
    • 同样的参数,不同的初始化方式
    • 不同的参数,通过cross-validation,选取最好的几组
    • 同样的参数,模型训练的不同阶段,即不同迭代次数的模型。
    • 不同的模型,进行线性融合. 例如RNN和传统模型.
    作者:萧瑟
    https://www.zhihu.com/question/41631631/answer/94816420

    No.3

    总结一下我遇到的小朋友常犯的错:
    1、一上来就自己动手写模型。建议首先用成熟的开源项目及其默认配置(例如 Gluon 对经典模型的各种复现、各个著名模型作者自己放出来的代码仓库)在自己的数据集上跑一遍,在等程序运行结束的时间里仔细研究一下代码里的各种细节,最后再自己写或者改代码。
    2、训 RNN 不加 gradient clipping,导致训练一段时间以后 loss 突然变成 Nan。
    3、tying input & output embedding(就是词向量层和输出 softmax 前的矩阵共享参数,在语言模型或机器翻译中常用)时学习率需要设置得非常小,不然容易 Nan。
    4、在数据集很大的情况下,一上来就跑全量数据。建议先用 1/100、1/10 的数据跑一跑,对模型性能和训练时间有个底,外推一下全量数据到底需要跑多久。在没有足够的信心前不做大规模实验。
    5、只喜欢漂亮的模型结构,瞧不起调参数的论文/实验报告,看论文时经常不看超参数设置等细节。举个例子,现在还有相当多的人不知道 BERT 的激活函数是 GELU 而不是 transformer 原论文中的 ReLU。在自己没有太多资源实验的情况下,实验报告类文章简直是业界良心好不好!
    NLP 领域主要推荐以下几篇:
    Regularizing and Optimizing LSTM Language Models(LSTM 的训练技巧)
    Massive Exploration of Neural Machine Translation Architectures(NMT 里各个超参的影响)
    Training Tips for the Transformer Model(训练 Transformer 时会发生的各种现象)
    RoBERTa: A Robustly Optimized BERT Pretraining Approach(BERT 预训练技巧,虽然跟大部分人没啥关系)
    CV 我不算太熟,不过也可以勉强推荐几篇:
    Training ImageNet in 1 Hour(大批量训练技巧)
    Bag of Tricks for Image Classification with Convolutional Neural Networks(各种训练技巧集大成)
    EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks(当前对参数利用最有效的 CNN)
    6、初始学习率:
    有时受 batch size、sequence length 各种因素的影响,loss 很大(比如说好几万),对于这种数字人是没有数感的,建议首先计算一下 per token loss(如果是多任务,可以每个任务单独算;类似地,某些 CV 任务可以计算 per pixel loss),心里有点感觉。脱离损失函数的形式谈学习率没有意义(例如单是对 batch size 求和或者取平均这个差异就会使梯度差成百上千倍)。
    在确定初始学习率的时候,从一个很小的值(例如 1e-7)开始,然后每一步指数增大学习率(例如扩大1.05 倍)进行训练。训练几百步应该能观察到损失函数随训练步数呈对勾形,选择损失下降最快那一段的学习率即可。
    7、Adam 可以解决一堆奇奇怪怪的问题(有时 loss 降不下去,换 Adam 瞬间就好了),也可以带来一堆奇奇怪怪的问题(比如单词词频差异很大,当前 batch 没有的单词的词向量也被更新;再比如Adam和L2正则结合产生的复杂效果)。用的时候要胆大心细,万一遇到问题找各种魔改 Adam(比如 MaskedAdam, AdamW 啥的)抢救。
    8、subword 总是会很稳定地涨点,只管用就对了。
    9、要有耐心!
    这一条放在最后,是因为很多人不把它当一回事儿。可能是觉得这一条不需要写代码所以不重要?我见过太多人因为这条浪费时间了,所以专门强调一下。
    有些指标是有滞后性的,需要等训练一段时间才开始动。很多人训练几步看没什么效果就把程序停掉开始 debug 了,但其实代码毫无问题。如此反复好几天甚至一两周都在原地踏步,其实需要做的仅仅是让程序自个儿安安静静地跑上几个小时或者一天……
    作者:Towser
    https://www.zhihu.com/question/41631631/answer/862075836

    - END -
    如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「perfect_iscas」,关注后回复「进群」或者扫描下方二维码即可进入无广告技术交流群。
    扫描二维码进群↓

    640?wx_fmt=jpeg

    640

    640?wx_fmt=gif

    在看 640?wx_fmt=jpeg

    展开全文
  • 转自 |人工智能前沿讲习No.1总结一下在旷视实习两年来的炼丹经验,我主要了一些 RL,图像质量,图像分类,GAN 相关的任务,日常大概占用 5 - 10 张卡。可...
        

    640?wx_fmt=jpeg

    转自 | 人工智能前沿讲习

    No.1

    总结一下在旷视实习两年来的炼丹经验,我主要做了一些 RL,图像质量,图像分类,GAN 相关的任务,日常大概占用 5 - 10 张卡。
    可复现性和一致性
    有的同学在打比赛的时候,从头到尾只维护若干份丹方(代码),每次载入前一次的训练参数,调一下丹方再炼,俗称老丹。这样会有几个问题:某次引入一个 bug,过了很久才发现,然后不知道影响范围;炼出一个金丹,但是不知道它是怎么来的;忘了自己的 baseline,不知道改动是正面还是负面。
    要尽可能确保每一个丹有可复现性,实践上建议丹方不应该在炼丹后改动,炼新的丹时,把旧的丹方复制一遍。得到的实验结果要开个文档记下来以便日后总结,避免遗忘。我经常通过阅读自己和别人的记录来得到灵感。
    实验一致性上也要多做努力,理想状态是有合理的基准来测丹的性能,同一个丹方不应该由于超参的微小改动而有显著结果差异。出现这种情况可能是数据太少或基准设置不当。
    资源利用
    对于新入行的同学,不要试图在玩具级别的数据集或任务上做靠谱的研究,比如 MNIST。
    不是每一个实验都要出一个金丹,实验是为了验证结论的。如果每个实验都要 8 张卡跑两个星期,人力物力都耗不起。尽力把实验控制在单卡一天以内,理想状态是半天得一次结论。理论上来说,水多加面面多加水(加数据加计算量)的做法无限涨点。建议先设一个目标,比如说就是在一天的训练时间下做对比实验。
    我的实践经验是,首先用小图小模型,比如 128 x 128 输入的 ResNet18;用 cProfile 来找性能瓶颈,比如我发现某个丹,炼的时候有一大半时间耗费在等数据,数据处理中一大半时间在调用 numpy 的 round 函数,前期把精力集中在提高做实验的效率上。
    模型不 work
    先把锦上添花的东西去掉,比如数据增广,玄学学习率和超参,魔幻损失函数,异形模型。如果世界上有一个非要加旋转增广和 1.96e-4 学习率 42 batchsize,配上四种混合损失函数才能炼好的丹,它应该存在于灵能文明。可以先造一些尽量玩具的模型,验证代码正确性。
    需要进一步改进
    先确认影响模型性能的组件。感性认识就是,数据是否需要增加或增广。模型是大了还是小了,再根据速度和精度期望开始寻找合适的模型。能用全卷积的任务,少用全连接层,参数量小。基本模型上 ResNet, Unet 结构还是主流。
    当你的模型有 Batch Normalization,初始化通常不需要操心,激活函数默认 Relu 即可(某引用数万的大佬说的)。一般顺序是 Conv - BN - Relu。如果没有 BN(很多任务上,BN降低训练难度,但是可能影响最终性能 ),试着要做一些数据归一化。
    虽然有至少十种激活函数,但在 Relu 外只推荐试一下 Swish。炼丹术只推荐 Momentum 和 Adam。在这些方面做尝试意义不大,如果性能提升反倒可能说明模型不成熟。不推荐做人肉模型设计,比如把某层卷积改大一点,或者微调一下通道数。除非有特别 insight,不要自己乱设计新组件。
    超参上,learning rate 最重要,推荐了解 cosine learning rate 和 cyclic learning rate,其次是 batchsize 和 weight decay。当你的丹还不错的时候,可以试着做数据增广和改损失函数锦上添花了。
    祝读到这里的各位模型涨点!
    参考文献

    • Bag of Tricks for Image Classification with Convolutional Neural Networks,trick 合集 1。
    • Must Know Tips/Tricks in Deep Neural Networks,trick 合集 2。
    • 33条神经网络训练秘技,trick 合集 3。
    • 26秒单GPU训练CIFAR10,工程实践。
    • Batch Normalization,虽然玄学,但是养活了很多炼丹师。
    • Searching for Activation Functions,swish 激活函数。

    作者:hzwer
    https://www.zhihu.com/question/41631631/answer/859040970

    No.2

    训练技巧对深度学习来说是非常重要的,作为一门实验性质很强的科学,同样的网络结构使用不同的训练方法训练,结果可能会有很大的差异。这里我总结了近一年来的炼丹心得,分享给大家,也欢迎大家补充指正。
    参数初始化
    下面几种方式,随便选一个,结果基本都差不多。但是一定要做。否则可能会减慢收敛速度,影响收敛结果,甚至造成Nan等一系列问题。
    下面的n_in为网络的输入大小,n_out为网络的输出大小,n为n_in或(n_in+n_out)*0.5
    Xavier初始法论文:
    http://jmlr.org/proceedings/papers/v9/glorot10a/glorot10a.pdf
    He初始化论文:https://arxiv.org/abs/1502.01852

    • uniform均匀分布初始化:
      w = np.random.uniform(low=-scale, high=scale, size=[n_in,n_out])
      • Xavier初始法,适用于普通激活函数(tanh,sigmoid):scale = np.sqrt(3/n)
      • He初始化,适用于ReLU:scale = np.sqrt(6/n)
    • normal高斯分布初始化:
      w = np.random.randn(n_in,n_out) * stdev # stdev为高斯分布的标准差,均值设为0
      • Xavier初始法,适用于普通激活函数 (tanh,sigmoid):stdev = np.sqrt(n)
      • He初始化,适用于ReLU:stdev = np.sqrt(2/n)
    • svd初始化:对RNN有比较好的效果。参考论文:https://arxiv.org/abs/1312.6120

    数据预处理方式

    • zero-center ,这个挺常用的.
      X -= np.mean(X, axis = 0) # zero-center
      X /= np.std(X, axis = 0) # normalize
    • PCA whitening,这个用的比较少.

    训练技巧

    • 要做梯度归一化,即算出来的梯度除以minibatch size
    • clip c(梯度裁剪): 限制最大梯度,其实是value = sqrt(w1^2+w2^2….),如果value超过了阈值,就算一个衰减系系数,让value的值等于阈值: 5,10,15
    • dropout对小数据防止过拟合有很好的效果,值一般设为0.5,小数据上dropout+sgd在我的大部分实验中,效果提升都非常明显.因此可能的话,建议一定要尝试一下。dropout的位置比较有讲究, 对于RNN,建议放到输入->RNN与RNN->输出的位置.关于RNN如何用dropout,可以参考这篇论文:http://arxiv.org/abs/1409.2329
    • adam,adadelta等,在小数据上,我这里实验的效果不如sgd, sgd收敛速度会慢一些,但是最终收敛后的结果,一般都比较好。如果使用sgd的话,可以选择从1.0或者0.1的学习率开始,隔一段时间,在验证集上检查一下,如果cost没有下降,就对学习率减半. 我看过很多论文都这么搞,我自己实验的结果也很好. 当然,也可以先用ada系列先跑,最后快收敛的时候,更换成sgd继续训练.同样也会有提升.据说adadelta一般在分类问题上效果比较好,adam在生成问题上效果比较好。
    • 除了gate之类的地方,需要把输出限制成0-1之外,尽量不要用sigmoid,可以用tanh或者relu之类的激活函数.1. sigmoid函数在-4到4的区间里,才有较大的梯度。之外的区间,梯度接近0,很容易造成梯度消失问题。2. 输入0均值,sigmoid函数的输出不是0均值的。
    • rnn的dim和embdding size,一般从128上下开始调整. batch size,一般从128左右开始调整.batch size合适最重要,并不是越大越好.
    • word2vec初始化,在小数据上,不仅可以有效提高收敛速度,也可以可以提高结果.
    • 尽量对数据做shuffle
    • LSTM 的forget gate的bias,用1.0或者更大的值做初始化,可以取得更好的结果,来自这篇论文:http://jmlr.org/proceedings/papers/v37/jozefowicz15.pdf, 我这里实验设成1.0,可以提高收敛速度.实际使用中,不同的任务,可能需要尝试不同的值.
    • Batch Normalization据说可以提升效果,不过我没有尝试过,建议作为最后提升模型的手段,参考论文:Accelerating Deep Network Training by Reducing Internal Covariate Shift
    • 如果你的模型包含全连接层(MLP),并且输入和输出大小一样,可以考虑将MLP替换成Highway Network,我尝试对结果有一点提升,建议作为最后提升模型的手段,原理很简单,就是给输出加了一个gate来控制信息的流动,详细介绍请参考论文: http://arxiv.org/abs/1505.00387
    • 来自@张馨宇的技巧:一轮加正则,一轮不加正则,反复进行。

    Ensemble
    Ensemble是论文刷结果的终极核武器,深度学习中一般有以下几种方式

    • 同样的参数,不同的初始化方式
    • 不同的参数,通过cross-validation,选取最好的几组
    • 同样的参数,模型训练的不同阶段,即不同迭代次数的模型。
    • 不同的模型,进行线性融合. 例如RNN和传统模型.

    作者:萧瑟
    https://www.zhihu.com/question/41631631/answer/94816420

    No.3

    总结一下我遇到的小朋友常犯的错:
    1、一上来就自己动手写模型。建议首先用成熟的开源项目及其默认配置(例如 Gluon 对经典模型的各种复现、各个著名模型作者自己放出来的代码仓库)在自己的数据集上跑一遍,在等程序运行结束的时间里仔细研究一下代码里的各种细节,最后再自己写或者改代码。
    2、训 RNN 不加 gradient clipping,导致训练一段时间以后 loss 突然变成 Nan。
    3、tying input & output embedding(就是词向量层和输出 softmax 前的矩阵共享参数,在语言模型或机器翻译中常用)时学习率需要设置得非常小,不然容易 Nan。
    4、在数据集很大的情况下,一上来就跑全量数据。建议先用 1/100、1/10 的数据跑一跑,对模型性能和训练时间有个底,外推一下全量数据到底需要跑多久。在没有足够的信心前不做大规模实验。
    5、只喜欢漂亮的模型结构,瞧不起调参数的论文/实验报告,看论文时经常不看超参数设置等细节。举个例子,现在还有相当多的人不知道 BERT 的激活函数是 GELU 而不是 transformer 原论文中的 ReLU。在自己没有太多资源实验的情况下,实验报告类文章简直是业界良心好不好!
    NLP 领域主要推荐以下几篇:
    Regularizing and Optimizing LSTM Language Models(LSTM 的训练技巧)
    Massive Exploration of Neural Machine Translation Architectures(NMT 里各个超参的影响)
    Training Tips for the Transformer Model(训练 Transformer 时会发生的各种现象)
    RoBERTa: A Robustly Optimized BERT Pretraining Approach(BERT 预训练技巧,虽然跟大部分人没啥关系)
    CV 我不算太熟,不过也可以勉强推荐几篇:
    Training ImageNet in 1 Hour(大批量训练技巧)
    Bag of Tricks for Image Classification with Convolutional Neural Networks(各种训练技巧集大成)
    EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks(当前对参数利用最有效的 CNN)
    6、初始学习率:
    有时受 batch size、sequence length 各种因素的影响,loss 很大(比如说好几万),对于这种数字人是没有数感的,建议首先计算一下 per token loss(如果是多任务,可以每个任务单独算;类似地,某些 CV 任务可以计算 per pixel loss),心里有点感觉。脱离损失函数的形式谈学习率没有意义(例如单是对 batch size 求和或者取平均这个差异就会使梯度差成百上千倍)。
    在确定初始学习率的时候,从一个很小的值(例如 1e-7)开始,然后每一步指数增大学习率(例如扩大1.05 倍)进行训练。训练几百步应该能观察到损失函数随训练步数呈对勾形,选择损失下降最快那一段的学习率即可。
    7、Adam 可以解决一堆奇奇怪怪的问题(有时 loss 降不下去,换 Adam 瞬间就好了),也可以带来一堆奇奇怪怪的问题(比如单词词频差异很大,当前 batch 没有的单词的词向量也被更新;再比如Adam和L2正则结合产生的复杂效果)。用的时候要胆大心细,万一遇到问题找各种魔改 Adam(比如 MaskedAdam, AdamW 啥的)抢救。
    8、subword 总是会很稳定地涨点,只管用就对了。
    9、要有耐心!
    这一条放在最后,是因为很多人不把它当一回事儿。可能是觉得这一条不需要写代码所以不重要?我见过太多人因为这条浪费时间了,所以专门强调一下。
    有些指标是有滞后性的,需要等训练一段时间才开始动。很多人训练几步看没什么效果就把程序停掉开始 debug 了,但其实代码毫无问题。如此反复好几天甚至一两周都在原地踏步,其实需要做的仅仅是让程序自个儿安安静静地跑上几个小时或者一天……

    作者:Twoser
    https://www.zhihu.com/question/41631631/answer/862075836

    - end -

    640?wx_fmt=png

    展开全文
  • 大学本科时学过变函数,不过现在已经忘的差不多了,然后毕业后也经常会用到这个东西,无论是一维的信号还是二维的图像,所以就打算对此一个理论推导。另外,在下文推导中全部假设所有函数都满足可进行傅里叶变换...


    最近在做音频处理相关的内容,所以打算对傅里叶的相关内容做一个小结。大学本科时学过复变函数,不过现在已经忘的差不多了,然后毕业后也经常会用到这个东西,无论是一维的信号还是二维的图像,所以就打算对此做一个理论推导。另外,在下文推导中全部假设所有函数都满足可进行傅里叶变换的条件假设,对于其他一些特殊函数,不在本文讨论范围之内。

    基本定理

    三角函数的正交性

    对于三角函数组合 1,sinx,cosx,sin2x,cos2x,...,sinnx,cosnx,...1, sinx , cosx, sin2x, cos2x,...,sinnx,cosnx,...中任意两个函数的乘积在[π,π][-\pi,\pi]上的积分都为0,即ππsin(x)dx=0\int\limits_{-\pi}^{\pi} {sin(x)}dx=0 ππcos(x)dx=0 \int\limits_{-\pi}^{\pi} {cos(x)}dx=0 ππsin(mx)cos(nx)dx=0 \int\limits_{-\pi}^{\pi} {sin(mx)cos(nx)}dx=0ππsin(mx)sin(nx)dx=0 \int\limits_{-\pi}^{\pi} {sin(mx)sin(nx)}dx=0 ππcos(mx)cos(nx)dx=0 \int\limits_{-\pi}^{\pi} {cos(mx)cos(nx)}dx=0

    欧拉公式

    eix=cos(x)+isin(x)e^{ix}=cos(x) +isin(x)

    傅里叶级数

    三角形式

    对于一个周期为 TT 的函数,可以用一系列三角函数的叠加组成,令ω=2πT\omega={2\pi \over T},则
    f(t)=b02+n=1+[ansin(nωt)+bncos(nωt)]f(t) = {b_0 \over 2} + \sum \limits_{n=1}^{+\infty}{[a_n sin(n\omega t)+b_ncos(n\omega t)]}
    对上式在某个周期上进行积分可得t0t0+Tf(t)dt=t0t0+Tb02dt+t0t0+Tn=1+[ansin(nωt)+bncos(nωt)]dt\int\limits_{{t_0}}^{{t_0} + T} {f(t)dt = } \int\limits_{{t_0}}^{{t_0} + T} { {b_0 \over 2}} dt + \int\limits_{{t_0}}^{{t_0} + T} \sum \limits_{n=1}^{+\infty} {[{a_n}\sin (n\omega t) + {b_n}\cos (n\omega t)]} dt=b02T+2πTx0x0+2πn=1+[ansin(nx)+bncos(nx)]dx=b0T = {b_0 \over 2}T + {{2\pi } \over T}\int\limits_{{x_0}}^{{x_0} + 2\pi } \sum \limits_{n=1}^{+\infty} {[{a_n}\sin (nx) + {b_n}\cos (nx)]} dx=b_0T得到,b0=2Tt0t0+Tf(t)dtb_0={2 \over T} \int\limits_{{t_0}}^{{t_0} + T} {f(t)dt}

    对上式两边同时乘以sin(mωt)sin(m\omega t),再在某个周期上进行积分可得t0t0+Tf(t)sin(mωt)dt=a0t0t0+Tsin(mωt)dt+t0t0+Tn=1+[ansin(nωt)sin(mωt)+bncos(nωt)sin(mωt)]dt\int\limits_{{t_0}}^{{t_0} + T} {f(t)\sin (m\omega t)dt = } {a_0}\int\limits_{{t_0}}^{{t_0} + T} {\sin (m\omega t)} dt + \int\limits_{{t_0}}^{{t_0} + T} {\sum\limits_{n = 1}^{+\infty} {[{a_n}\sin (n\omega t)\sin (m\omega t ) + {b_n}\cos (n\omega t)\sin (m\omega t )]} } dt=amt0t0+Tsin2(mωt)dt=am2t0t0+T[1cos(2mωt)]dt=am2T = {a_m}\int\limits_{{t_0}}^{{t_0} + T} {{{\sin }^2}(m\omega t)} dt = {{{a_m}} \over 2}\int\limits_{{t_0}}^{{t_0} + T} {[1-\cos (2m\omega t)} ]dt = {{{a_m}} \over 2}T
    得到am=2Tt0t0+Tf(t)sin(mωt)dta_m ={2 \over T} \int\limits_{{t_0}}^{{t_0} + T} {f(t)\sin (m\omega t)dt}

    对上式两边同时乘以cos(mωt)cos(m\omega t),再在某个周期上进行积分可得t0t0+Tf(t)cos(mωt)dt=a0t0t0+Tcos(mωt)dt+t0t0+Tn=1+[ansin(nωt)cos(mωt)+bncos(nωt)cos(mωt)]dt\int\limits_{{t_0}}^{{t_0} + T} {f(t)\cos (m\omega t)dt = } {a_0}\int\limits_{{t_0}}^{{t_0} + T} {\cos (m\omega t)} dt + \int\limits_{{t_0}}^{{t_0} + T} {\sum\limits_{n = 1}^{+\infty} {[{a_n}\sin (n\omega t)\cos (m\omega t ) + {b_n}\cos (n\omega t)\cos (m\omega t )]} } dt=bmt0t0+Tcos2(mωt)dt=bm2t0t0+T[cos(2mωt)+1]dt=bm2T = {b_m}\int\limits_{{t_0}}^{{t_0} + T} {{{\cos }^2}(m\omega t)} dt = {{{b_m}} \over 2}\int\limits_{{t_0}}^{{t_0} + T} {[\cos (2m\omega t)} + 1]dt = {{{b_m}} \over 2}T
    得到bm=2Tt0t0+Tf(t)cos(mωt)dtb_m ={2 \over T} \int\limits_{{t_0}}^{{t_0} + T} {f(t)\cos (m\omega t)dt}

    综上,可以得到傅里叶级数及其系数的形式,如下
    f(t)=b02+n=1+[ansin(nωt)+bncos(nωt)]f(t) = {b_0 \over 2} + \sum \limits_{n=1}^{+\infty}{[a_n sin(n\omega t)+b_ncos(n\omega t)]}an=2Tt0t0+Tf(t)sin(nωt)dta_n ={2 \over T} \int\limits_{{t_0}}^{{t_0} + T} {f(t)\sin (n\omega t)dt} bn=2Tt0t0+Tf(t)cos(nωt)dtb_n ={2 \over T} \int\limits_{{t_0}}^{{t_0} + T} {f(t)\cos (n\omega t)dt}

    指数形式

    根据欧拉公式可以得到
    cos(x)=eix+eix2cos(x) = {{e^{ix} + e^{-ix}} \over 2} sin(x)=eixeix2isin(x) = {{e^{ix} - e^{-ix}} \over 2i} 代入傅里叶级数-三角形式中可以得到
    f(t)=b02+n=1+[aneinωteinωt2i+bneinωt+einωt2]f(t) = {b_0 \over 2} + \sum \limits_{n=1}^{+\infty}{[a_n {{e^{in\omega t} - e^{-in\omega t}} \over 2i} +b_n{{e^{in\omega t} + e^{-in\omega t}} \over 2}]}=b02+n=1+[aneinωteinωt2i+bneinωt+einωt2]= {b_0 \over 2} + \sum \limits_{n=1}^{+\infty}{[a_n {{e^{in\omega t} - e^{-in\omega t}} \over 2i} +b_n{{e^{in\omega t} + e^{-in\omega t}} \over 2}]}=b02+n=1+[bnian2einωt+bn+ian2einωt]={b_0 \over 2} + \sum \limits_{n=1}^{+\infty }{[{{b_n-ia_n} \over{2} }e^{in\omega t} + {{b_n+ia_n} \over{2} }e^{-in\omega t}]}
    ωn=nω\omega_n = n\omega
    f(t)=n=+cneiωntf(t) = \sum \limits_{n=-\infty}^{+\infty}c_n e^{i\omega_n t}n=0n=0c0=b02=1Tt0t0+Tf(t)dtc_0={b_0 \over 2}={1 \over T} \int\limits_{{t_0}}^{{t_0} + T} {f(t)dt}n>0n> 0, cn=bnian2=1Tt0t0+Tf(t)[cos(ωnt)isin(ωnt)]dt=1Tt0t0+Tf(t)eiωntdtc_n={{b_n-ia_n} \over{2}}={1\over T} \int\limits_{{t_0}}^{{t_0} + T} f(t)[cos(\omega_n t) -i sin(\omega_n t)]dt= {1\over T} \int\limits_{{t_0}}^{{t_0} + T}f(t)e^{-i\omega_n t}dtn<0n < 0, cn=bn+ian2=1Tt0t0+Tf(t)[cos(ωnt)isin(ωnt)]dt=1Tt0t0+Tf(t)eiωntdtc_{-n}={{b_{-n}+ia_{-n}} \over{2}}={1\over T} \int\limits_{{t_0}}^{{t_0} + T} f(t)[cos(\omega_n t) -i sin(\omega_n t)]dt= {1\over T} \int\limits_{{t_0}}^{{t_0} + T}f(t)e^{-i\omega_n t}dt
    总上所述,可以得到傅里叶级数的指数形式f(t)=1Tn=+t0t0+Tf(t)eiωntdteiωntf(t) ={1\over T} \sum \limits_{n=-\infty}^{+\infty}\int\limits_{{t_0}}^{{t_0} + T}f(t)e^{-i\omega_n t}dt e^{i\omega_n t}

    傅里叶变换

    傅里叶积分定理

    对于周期函数有上述的傅里叶级数形式,但对于非周期函数,则无法使用傅里叶级数。但非周期函数可以认为是周期趋于无穷大的周期函数,满足傅里叶积分定理。所谓傅里叶积分定理,是指满足一定条件的函数f(x)f(x) 满足
    f(t)=12πF(ω)eiωxdωf(t) = {1 \over 2\pi} \int\limits_{-\infty}^{\infty} F(\omega)e^{i\omega x}d\omega F(ω)=f(t)eiωtdtF(\omega)= \int\limits_{-\infty}^{\infty} f(t)e^{-i\omega t}dtF(ω)f(t)f(t)F(ω)F(\omega)为f(t)的傅里叶变换函数,f(t)为F(\omega)的原函数,那么接下来,我们来证明这个傅里叶积分定理。首先,我们回顾一下黎曼积分的具体形式,设f(t)f(t)[a,b][a,b]上的可积函数,则abf(t)dt=limN+i=1Nf(a+i(ba)N)baN\int\limits_{a}^{b} f(t)dt= \mathop {\lim }\limits_{N \to +\infty } \sum \limits_{i=1}^{N}f(a + {i(b-a)\over N}){b-a\over N}那么,对于非周期函数,可以用周期区域无穷大的周期函数进行近似得到,则f(t)=limT1Tn=+t0t0+Tf(t)eiωntdteiωntf(t) = \mathop {\lim }\limits_{T \to \infty }{1\over T} \sum \limits_{n=-\infty}^{+\infty}\int\limits_{{t_0}}^{{t_0} + T}f(t)e^{-i\omega_n t}dt e^{i\omega_n t} =limN+1Tn=+F(ωn)eiωnt= \mathop {\lim }\limits_{N \to +\infty }{1\over T} \sum \limits_{n=-\infty}^{+\infty} F(\omega_n) e^{i\omega_n t} =limN+12πn=+F(ωn)eiωnt2πT= \mathop {\lim }\limits_{N \to +\infty }{1\over 2\pi} \sum \limits_{n=-\infty}^{+\infty} F(\omega_n) e^{i\omega_n t} {{2\pi\over T}}=12π+F(ω)eiωtdω={1\over 2\pi}\int\limits_{{-\infty}}^{{+\infty} }F(\omega) e^{i\omega t}d\omegaF(ω)=f(t)eiωtdtF(\omega)= \int\limits_{-\infty}^{\infty} f(t)e^{-i\omega t}dt以上就是傅里叶级数和傅里叶变换推导的全过程。

    展开全文
  • HTML与CSS入门经典(第7版

    热门讨论 2012-09-03 21:50:17
    15.2应用与介质相关的样式表 15.3设计用于打印网页的样式表 15.4预览网页的打印结果 15.5总结 15.6问与答 15.7作业 15.7.1测验 15.7.2答案 15.8练习 第16章 使用框架创建多页面布局 16.1什么是框架 16.2...
  • X-plore File Manager.apk

    2014-05-09 17:47:16
    ●缩略图的图像和视频,以及对各种文件类型(取决于相关的应用程序) ●多选 - 始终可用,但勿扰 ●查看APK文件为ZIP ●共享 - 通过蓝牙,电子邮件或发送任何文件的设备支持,从任何位置 ●可配置的按钮和快捷键 ●...
  • 程序开发范例宝典>>

    2012-10-24 10:41:28
    全书包括窗体与界面设计、控件应用、组件应用、图形技术、多媒体技术、文件系统、操作系统与Windows相关程序、注册表、数据库技术、SQL查询相关技术、LINQ查询技术、报表与打印技术、图 表技术、硬件相关开发技术、...
  • 实例085 为DataGridView控件实现选功能 120 实例086 禁用DataGridView控件列表头自动排序 122 2.9 其他控件典型应用 123 实例087 TrackBar控件的简单应用 123 实例088 自制平滑进度条控件 125 实例089 ...
  • 全书包括窗体与界面设计、控件应用、组件应用、图形技术、多媒体技术、文件系统、操作系统与Windows相关程序、注册表、数据库技术、SQL查询相关技术、LINQ查询技术、报表与打印技术、图 表技术、硬件相关开发技术、...
  • 全书包括窗体与界面设计、控件应用、组件应用、图形技术、多媒体技术、文件系统、操作系统与Windows相关程序、注册表、数据库技术、SQL查询相关技术、LINQ查询技术、报表与打印技术、图 表技术、硬件相关开发技术、...
  • C#程序开发范例宝典(第2版).part02

    热门讨论 2012-11-12 07:55:11
    实例085 为DataGridView控件实现选功能 120 实例086 禁用DataGridView控件列表头自动排序 122 2.9 其他控件典型应用 123 实例087 TrackBar控件的简单应用 123 实例088 自制平滑进度条控件 125 实例089 ...
  • C#程序开发范例宝典(第2版).part13

    热门讨论 2012-11-12 20:17:14
    实例085 为DataGridView控件实现选功能 120 实例086 禁用DataGridView控件列表头自动排序 122 2.9 其他控件典型应用 123 实例087 TrackBar控件的简单应用 123 实例088 自制平滑进度条控件 125 实例089 ...
  • 实例085 为DataGridView控件实现选功能 120 实例086 禁用DataGridView控件列表头自动排序 122 2.9 其他控件典型应用 123 实例087 TrackBar控件的简单应用 123 实例088 自制平滑进度条控件 125 实例089 ...
  • 实例085 为DataGridView控件实现选功能 120 实例086 禁用DataGridView控件列表头自动排序 122 2.9 其他控件典型应用 123 实例087 TrackBar控件的简单应用 123 实例088 自制平滑进度条控件 125 实例089 ...
  • 实例193 成一个有时间限制的测试版 实例194 判断经历多少个工作日 实例195 实现系统分段报时 实例196 利用timeGetTime函数更精准地计算时间差 实例197 使用DateAdd函数向日期型数据加值 第7章 数据处理技术 ...
  •  9.3.4 选框——checkbox 189  9.3.5 普通按钮——button 190  9.3.6 提交按钮——submit 191  9.3.7 重置按钮——reset 192  9.3.8 图像域——image 193  9.3.9 隐藏域——hidden 195  9.3.10 文件...
  • C#.net_经典编程例子400个

    热门讨论 2013-05-17 09:25:30
    96 实例077 带选框的树状菜单 98 2.9 其他控件典型应用 100 实例078 TrackBar的简单应用 100 实例079 SplitContainer的应用 102 实例080 MaskedTextBox控件的简单应用 103 实例081 ...
  • 实例077 带选框的树状菜单 98 2.9 其他控件典型应用 100 实例078 TrackBar的简单应用 100 实例079 SplitContainer的应用 102 实例080 MaskedTextBox控件的简单应用 103 实例081 制作日历计划任务 105 ...
  • wxPython学习手册

    热门讨论 2014-04-19 08:01:58
    15.4 控制与每项相关图像 486 15.5 使用编程的方式访问树。 488 15.6 管理树中的选择 490 15.7 控制项目的可见性 490 虚树 491 控制可见性 494 15.8 使树控件可编辑 495 15.9 响应树控件的其它的用户事件 496 ...
  • AutoLISP学习导引.pdf

    2015-07-18 22:45:17
    本书以单元方式逐步引导你使用AutoLISP解决日常工作上的问题,并提供相关的设计概念和技巧,让你可以触类旁通,举一反三。书中涉及的程序源代码在http://www.tqbooks.net/download.asp网上可免费下载。如有疑问可...
  • HTML开发王

    2013-01-03 11:33:09
    14.5 网页国际化和区域化的相关名词 14.6 巩固与自测 第15章 应用样式表呈现和布局 15.1 为什么要使用样式表 15.1.1 过去的不足和样式表的优点 15.1.2 了解css(层迭样式表) 15.1.3 html 4对样式表技术的支持 15.2 ...
  • [HTML开发王].张亚飞.扫描版

    热门讨论 2011-09-13 12:45:04
    14.5 网页国际化和区域化的相关名词 14.6 巩固与自测 第15章 应用样式表呈现和布局 15.1 为什么要使用样式表 15.1.1 过去的不足和样式表的优点 15.1.2 了解css(层迭样式表) 15.1.3 html 4对样式表技术的支持 15.2 ...
  • C#程序开发范例宝典

    2010-12-15 20:05:16
    实例077 带选框的树状菜单...... 98 2.9 其他控件典型应用...... 100 实例078 TrackBar的简单应用...... 100 实例079 SplitContainer的应用...... 102 实例080 MaskedTextBox控件的简单应用...... 103 ...
  •   Canvas可操作的层面是像素级别的,你觉得还有什么它不到吗? 介绍(Introduce)   本教程是一套详细介绍Canvas的系列学习教程同时也是查阅工具,以实例为主,采用由泛到精的学习结构,所有的小节都有单独的...
  • 本版在第2版的基础上,主要了如下改进: ① 修正了所有已知的错误。 ② 新增了“正则表达式”专题,详细讲解了如何通过正则表达式查找、匹配字符串。 ③ 新增了“数据库编程”章节,详细论述了在MATLAB GUI中如何...
  • C#编程经验技巧宝典

    热门讨论 2008-06-01 08:59:33
    C#编程经验技巧宝典源代码,目录如下: 第1章 开发环境 1 <br>1.1 Visual Studio开发环境安装与配置 2 <br>0001 安装Visual Studio 2005开发环境须知 2 <br>0002 配置合适的Visual Studio 2005...
  • vc++ 应用源码包_1

    热门讨论 2012-09-15 14:22:12
    系统硬件信息、存储设备管理、鼠标及键盘、声音和视频、图形和图像、网络、数据库) 《远程控制编程技术》源代码 内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例源码) 多个VC++...
  • vc++ 应用源码包_2

    热门讨论 2012-09-15 14:27:40
    系统硬件信息、存储设备管理、鼠标及键盘、声音和视频、图形和图像、网络、数据库) 《远程控制编程技术》源代码 内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例源码) 多个VC++...
  • vc++ 应用源码包_6

    热门讨论 2012-09-15 14:59:46
    系统硬件信息、存储设备管理、鼠标及键盘、声音和视频、图形和图像、网络、数据库) IOCP 完成端口编程 《远程控制编程技术》源代码 内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例...
  • vc++ 应用源码包_5

    热门讨论 2012-09-15 14:45:16
    系统硬件信息、存储设备管理、鼠标及键盘、声音和视频、图形和图像、网络、数据库) IOCP 完成端口编程 《远程控制编程技术》源代码 内含(重启、图片操作、ip操作、键盘与鼠标、客户端以及服务端、文件传输等实例...

空空如也

空空如也

1 2 3
收藏数 43
精华内容 17
关键字:

复图像做相关