# 3.2 为超参数选择合适的范围（Using an appropriate scale to pick hyperparameters）

pick hyperparameters）

随机取值并不是在有效范围内的随机均匀取值，而是选择合适的标尺，用于探究这些超参数

对于超参数#layers和#hidden units，都是正整数，是可以进行均匀随机采样的，即超参数每次变化的尺度都是一致

对于某些超参数，可能需要非均匀随机采样（即非均匀刻度尺）。例如超参数$$\alpha$$，待调范围是\[0.0001, 1]。如果使用均匀随机采样，90%的采样点分布在\[0.1, 1]之间，只有10%分布在\[0.0001, 0.1]之间。而最佳的$$\alpha$$值可能主要分布在\[0.0001, 0.1]之间，因此更应在区间\[0.0001, 0.1]内细分更多刻度

通常的做法是将linear scale转换为log scale，将均匀尺度转化为非均匀尺度，然后再在log scale下进行均匀采样。这样，\[0.0001, 0.001]，\[0.001, 0.01]，\[0.01, 0.1]，\[0.1, 1]各个区间内随机采样的超参数个数基本一致，扩大了之前\[0.0001, 0.1]区间内采样值个数

![](https://2314428465-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-Le0cHhI0S0DK8pwlrmD%2F-Le0cKOp1vaxoORIi4ak%2F-Le0caOEj4o0lu0KaOTL%2F172import.png?generation=1556953092384524\&alt=media)

如果线性区间为\[a, b]，令m=log(a)，n=log(b)，则对应的log区间为\[m,n]。对log区间的\[m,n]进行随机均匀采样，得到的采样值r，最后反推到线性区间，即$$10^r$$.$$10^r$$是最终采样的超参数。代码为：

```python
m = np.log10(a)
n = np.log10(b)
r = np.random.rand()
r = m + (n-m)*r
r = np.power(10,r)
```

动量梯度因子$$\beta$$在超参数调试也需要进行非均匀采样。一般$$\beta$$的取值范围在\[0.9, 0.999]之间，1−$$\beta$$的取值范围在\[0.001, 0.1]。那么直接对1−$$\beta$$在\[0.001, 0.1]区间内进行log变换

为什么$$\beta$$也需要向$$\alpha$$那样做非均匀采样：

假设$$\beta$$从0.9000变化为0.9005，那么$$\frac{1}{1-\beta}$$基本没有变化。但假设β从0.9990变化为0.9995，那么$$\frac{1}{1-\beta}$$前后差别1000。$$\beta$$越接近1，指数加权平均的个数越多，变化越大。所以对$$\beta$$接近1的区间，应该采集得更密集一些
