超参数 调优、批量归一化、编程框架
Hyperparameter tuning
-
Tuning process
image.png
对于大多数学习算法应用 学习速率α 是需要调优的超参数中最重要的一个 没有之一 除了α 我接下来会调整的一些超参数 也许是动量项 0.9是一个不错的默认值 还会调整Mini-Batch的大小 来保证最优化算法的运行效率 我还经常调试隐藏单元数量 就是那些用橙色圈起来的参数 这三个是我认为重要性仅次于 学习速率α的超参数 在调整好这些超参数后 接下来是重要性排在第三的超参数 网络层数有时候对结果起到重要作用 学习率衰减有时也一样 当使用Adam优化算法时 几乎不调节β1 β2和epsilon 我几乎都是用0.9 0.999和10^(-8)
-
Using an appropriate scale to pick hyperparameters
超参数值域的随机抽样 能让你更有效地搜索超参数空间 但实际上,随机抽样并不意味着在有效值范围内的 均匀随机抽样(sampleing uniformly at random) 相反,更重要的是选取适当的尺度(scale) 用以研究这些超参数
image.png
那么你要做的就是在a~b的范围内均匀随机取样 这个例子中的范围为-4~0 然后为alpha赋值为 10^r,r为随机取样的基于10的对数 整理一下,要基于对数尺度取样,首先取得下限值 取其对数得到a 再取上限值,取其对数得到b 然后在对数尺度上在10a~10b范围内取样 即在a~b的范围内均匀随机的取r值 最后得到超参数值为10^r 这就是对数尺度上取样方法的实现
- Hyperparameters tuning in practice: Pandas vs. Caviar
将它们分别称之为熊猫模式和鱼子酱模式 那么如何挑选适合你的模式呢? 这取决于有足够de计算资源来并行训练很多模型
Batch Normalization
在深度学习不断兴起的过程中 最重要的创新之一是一种 叫批量归一化 (Batch Normalization) 的算法 它由Sergey Ioffe 和 Christian Szegedy提出 可以让你的超参搜索变得很简单 让你的神经网络变得更加具有鲁棒性 可以让你的神经网络对于超参数的选择上不再那么敏感 而且可以让你更容易地训练非常深的网络 让我们来看看批量归一化是如何工作的
-
Normalizing activations in a network
image.png
-
在逻辑回归的例子里 我们看到了对x1 x2 x3做归一化可以对对w和b的训练更有效 所以这里的问题就是 对于任何一个隐藏层我们是否也可以对a的值做归一化呢 比如拿a2举例 其实可以是任何一个隐藏层 是否可以让w3 b3的训练更快呢 因为a2是下一层的输入 它影响着你对w[3] b[3]的训练 这就是batch norm 简单的解释 虽然在实际中我们归一化时针对的 并不是a[2]而是z[2] 对于在激活函数之前做归一化,也就是指z[2] 还是在激活函数之后做归一化,也就是指a[2] 这一点上学术界还是有一些争议的 实际中 对z[2]做归一化要普遍的多 也就是这里所呈现的方法 我也推荐你把它作为默认的方法
image.png
这里加上ε 这样我们就把z归一化为 一组均值0方差1的值了 每一组z都是均值0方差1 但是我们并不希望所有的隐藏单元都是这样的 也许本身它们的分布就有不同 所以我们可以这么做 z tilde = γ * zi * norm + β 这里的γ和β值可以从你的模型中学习
image.png
-
Fitting Batch Norm into a neural network
image.png
注意z是由下面的步骤计算得出的 也就是zL=wL * a(L-1)+bL但是BN算法所做的 就是使用mini-batch并且归一化zL 来满足均值为0以及标准方差 然后通过参数Beta和Gamma来重新调整 这意味着 不管bL的值为多少 实际上都要被减去 因为经过BN这一步 我们将计算zL的均值并将其减去 所以在mini-batch中对所有例子加上一个常量 并不会改变什么 因为无论我们加上什么常量 它都会被 减均值 这一步给去除 所以如果你使用BN算法 你可以忽略该参数b 或者可以认为它永远等于0 所以参数就变为了 zL=wL * a(L-1) 然后我们计算归一化zL 并且计算(带波浪号的)z等于Gamma乘以zL加上Beta 我们最终使用该参数Beta L来决定 (带波浪号的)zL的均值 它将在下一层中得到转发
image.png image.png- Why does Batch Norm work?
- Batch Norm at test tiem
如果你只有一个实例 那么计算这一个实例的平均值和标准差显然是不合理的 所以实际上该如何做呢? 以便于我们在测试时使用我们的神经网络 我们需要一种单独的方式来估算mu和sigma平方 在批标准化的通常实现中 我们是通过 指数加权平均数来估算的
但是在测试时 我们可能会需要处理单个测试实例 那么 处理的方式就是通过训练集来估算mu和sigma平方 我们有很多方式来做估算 理论上 我们可以用我们最后的网络运行整个训练集 来得到mu和sigma平方 但是实际上 人们通常会实现某种指数加权平均 来记住在训练时见到的mu和sigma平方的值 然后用这个指数加权平均数 有时也被称作移动均值 来得到mu和sigma平方的粗略的估算 然后我们用这些mu和sigma平方的估算值 在测试时进行比例缩放来获取隐藏神经元的Z值
Multi-class classification
-
Softmax Regression
image.png
- Training a software classifier
intrduction to programming frameworks
-
Deep learning frameworks
image.png -
Tensorflow
-
最小化下面这个表达式
image.png -
tensorflow代码
image.png