1 前言
初始值的选取非常重要,不恰当的初始值可能最后导致模型不能收敛。深度学习的参数训练也不例外,通常它们会被 "随机" 初始化。可是,为什么要这么做呢?为了弄清它,先从相关背景出发,理解背后的原因和相关更丰富的知识。
2 确定性算法
顾名思义,同一个程序的运行结果一定是一致的,比如冒泡排序,归并排序,每一次运行程序,都会得到相同的结果。
确定性算法都会有一个最好的、最坏的、平均的时间复杂度。乍看起来,这种确定性很好,但是这种确定算法可以解决一切问题吗?
3 非确定性算法
确定性算法在面对含有复杂的解空间问题时,显得束手无策。举个例子,配送员今天计划要送出1000个订单,如果给出一个最短路算法,想一想这个问题的解空间。解空间的大小为:1000!(1000的阶乘),足够丰富,这个数字足够大,感兴趣的可以留言写出它的大小。单机拿这个数字没办法;如果换成集群,有可能获得精确解,但如果要求秒级给出最短路,集群也很可能满足不了。
另一种方法就是使用非确定性算法。它们加入了随机性成分,有可能很快就能得到一个解,或许它不是最好的(best),但是近似好(approximate good),这相对于问题的复杂程度而言,能得到一个这种解已经令人满意了(satisfactory).
非确定性算法的特点是每次跑代码可能得到的结果不太一致,并且也不能保证解的质量和运行的时长。
随机搜索算法不是胡乱搜索,相反会精心设计随机性。
搜索往往是具有挑战性的任务,它指从一个初始状态或位置,不断经过优化后,到达一个最终状态或位置。一些经典的算法包括,遗传算法,模拟退火,随机梯度下降。
那么,在寻找更好解的过程中,这些算法的本质都是:
对上面两步做一些解释。因为我们队搜索空间的结构一无所知,所以,为了消除搜索过程的偏好性,我们从一个随机的位置开始。
随着搜索空间的逐渐打开,我们可能面临一个风险:陷于不想要到达的搜索区域(局部最优)。但是,搜索过程中,启用随机就有可能避免这种情况,进而发现更好的候选解(达到全局最优)。
这是一块很有趣的领域,其中包括运筹优化领域(Operation Research:简称为 OR)。
深度学习中训练网络是通过随机梯度下降,它启用随机性是为了发现足够好的权重值。对于特定的训练数据,精心设计的网络将会适用一个不同的带有模型技术的网络。它也会像上面几节说的那样,随机化一个初始值,然后搜索过程也会启用随机。
特别地,随机梯度下降要求权重参数被初始化为一个很小的随机值,如[0.01,0.32,...]等。训练时,在每一个epoch都会重新对训练数据洗牌,这样确保在不同的batch梯度计算会不同。
这个搜索过程,有一个新鲜的称谓叫做学习(深度学习),最近与同事聊天,有人说玩的是概念,换一个新名词,大家就觉得这是最近几年出现的一项新技术,真的是这样吗?
我们是否可以将所有的权重都置为0?这样,学习算法的公式将不能对权重参数做出任何调整,模型将会陷于困局。但是值得注意的是每一个神经元上的bias默认置为0.
特别地,隐含层上的节点需要有不同的权重,这样才能训练时会得到更新。这被称为训练期间打破对称性。
如果每次都将权重置为随机值,它可能不利于我们做网络模型的配置评估。相反,对于一个训练集上得到的模型用于生产环境时,每次最终状态如果权重参数都相同将会给模型配置评估带来帮助。
传统的,权重参数被设置为一个很小的随机值。神经网络的权重参数初始化时一项重要的研究领域,精心设计的初始化参数会加速学习过程。
深度学习框架,Keras,提供了一些网络初始化方法,它们都是用小的随机值初始化权重:Zeros, Ones, Constant, RandomNormal(随机正态分布的tensor), RandomUniform(随机均匀分布的tensor)。