思考: 改进 现有的 网络参数初始化 方法

时间:2018-01-05 08:12:04

现有的 网络参数 初始化 方法

全零初始化

网络参数初始化方法 最粗暴的 莫过于 全零初始化 。顾名思义,所有参数全部初始化为0。想法很好,简便省事儿,嘿嘿,还可使得初始化全零时参数的期望与网络稳定时参数的期望一致为0。But,参数全为0,那么同层网络中,所有神经元的输出必然相同。而相同的输出,意味着。。梯度更新完全一样。。。那模型还训练个卵。。。。

随机初始化

于是最常用的就是 随机初始化 。在 tensorflow 中具体体现在指定 initializertf.contrib.layers.xavier_initializer_conv2d() ,例如:

weights = tf.get_variable(name="weights", shape=[2, 2, in_channel, out_channel],
                          initializer=tf.contrib.layers.xavier_initializer_conv2d())

数据敏感初始化

当然,还有一些偏门左道的初始化方法,比如 数据敏感的 参数初始化 方式 ,即根据自身任务数据集个性化定制的参数初始化方式。

症结

就拿最流行的 随机初始化 来开炮。

随机初始化,很好很强大。但是每次跑网络的时候我都会在想,随机 这个词儿,听起来就觉得很不科学。难道就没有 “ 不 ” 随机 的初始化方法么?

理论依据

不好意思,我只能给出 启发式 推断:

感觉初始化后的深度学习模型的训练就像一个婴孩。在训练过程中,各网络层 总数不变,但在梯度下降的 引导 下,不断 分化 成各种 功能层 。各功能层 协作 ,使得模型成熟而强大。纵观生物界,同一物种的分化基本都遵循一定规律。那么神经网络这种 “生物”,相信也 必然 有它的 分化规律,正亟待各位大佬们去发现和总结。

解决方法

在 思考: 神经网络层 的 功能识别 一文中,我提出了 对 神经网络层 进行 功能识别 这么一个idea。那么这个idea自然也可以延伸到 改进 现有的 网络参数初始化 方法 上来。

对现有的经典网络结构进行 各 神经网络层 功能识别

将得到的识别结果进行 数据对比和分析 ,总结出规律。(例如得到下表这种效果)

对应层的深度范围 颜色 边缘 纹理 肢干 整体
约前20%
20%~40%
40%~60%
60%~80%
80%~100%


总结出各深度部分对应的大概功能(但是实际情况肯定不是这样子的。各自的网络结构部件千变万化,我这边只是简单举个例子),然后将不同深度范围的网络层,分别初始化为该部分对应的 模板滤波器集 。从而在初始化的时候就将优秀网络模型的基因植入了要训练的模型。

有点像是抽象化的迁移学习,不手把手教,但在一开始给你上个导论课,让模型从一开始就有大局观,后面的自学过程自然可以少走弯路。

作者:JNingWei 发表于2018/1/5 10:12:04 原文链接
阅读:0 评论:0 查看评论