neural-network 中,我们介绍了神经网络的训练与预测:在明确了神经网络的模型后,我们就可以通过定义合理的损失函数,模型根据反向传播算法和随机梯度下降算法,自动地修正网络模型的参数($W$ 和 $b$ ),并对训练数据的特征进行学习。

但是,这里似乎还有很多问题没有解决:

  • 神经网络应该有多少层
  • 每一层应该有多少隐藏单元
  • 学习速率应该是多少
  • 各层应该采用哪些激活函数
  • 应该选用哪种损失函数
  • 梯度下降算法的参数应该如何选择
  • ……

所有的这些超参数不可能在一开始就预测出来,实际上通常的情况是,首先有个初步想法,比如构建一个含有特定层数、隐藏单元等等的神经网络,然后在运行和测试中得到该神经网络的运行结果,并不断迭代更新自己的方案。

激活函数

线性函数

线性函数是最基本的激活函数,其因变量与自变量有直接的比例关系,因此线性变换类似于线性回归。

$$ f(x) = ax + b $$

1
2
def linear(x, a, b):
  return a * x + b

Sigmoid 函数

Sigmoid 函数是一种在不删除数据的情况下,减少数据的极值或异常值的函数。

$$ s(x) = \frac{1}{1 + e^{-ax}} $$

1
2
def sigmoid(x, w = 1):
  return 1 / (1 + np.sum(np.exp(-wx))

双曲正切函数

双曲正切函数 tanhsigmoid 函数蕾丝,不同的是,tanh 的归一范围是 -1 到 1,而不是 0 到 1,因此 tanh 的优点是可以更容易地处理附属。

$$ tanh(x) = \frac{sinh(x)}{cosh(x)} = \frac{e^x - e^{-x}}{e^x + e^{-x}} $$

1
2
def tanh(x):
  return np.tanh(h)

ReLU 函数

ReLU 函数满足仿生学中的稀疏性,只有当输入值高于一定数目时才激活该神经元节点。当输入值低于0时进行限制,当输入值上升到某一阈值以上时,函数中的自变量与因变量成线性关系。

1
2
def relu(x):
  return x if x > 0 else 0

Softmax 函数

Softmax 函数的本质是将一个 K 维的任意实数向量,映射成另一个 K 维的实数向量,其中向量中的每一个元素取值都介于(0,1)范围内。

$$ softmax(x_j) = \frac{e^{x_j}}{\sum_{k=1}^K e^{x_k}} j \in [1, K] $$

1
2
def softmax(x):
  return np.exp(x) / np.sum(np.exp(x))

激活函数的选择

损失函数

在神经网络中,损失函数用来评价网络模型输出的预测值 $\hat{\vec{Y}} = f(\vec{X})$ 与真实值 $\vec{Y}$ 之间的差异。这里使用 $L(\vec{Y}, \hat{\vec{Y}})$ 来表示损失函数,它是一个非负值函数。损失值越小,网络模型的性能就越好,所以优化算法目的就是让损失函数尽可能的小。

损失函数的定义

假设网络模型中有 N 个样本,样本的输入和输出向量为 $(\vec{X}, \vec{Y}) = (x_i, y_i), i \in [1, N]$ ,那么总损失函数 $L(\vec{Y}, \hat{\vec{Y}})$ 为每一个输出预测值与真实值的误差之和。

$$ L(\vec{Y}, \hat{\vec{Y}}) = \sum_{i=0}^N l(y, \hat{y_i}) $$

值得注意的是,机器学习问题主要分为回归和分类问题,对分类模型和回归模型进行评估时会使用不同的损失函数,下面将分别对回归模型和分类模型的损失函数进行介绍。

回归损失函数

均方误差损失函数,MSE
平均绝对误差损失函数,MAE
均方误差对数损失函数,MSLE

分类损失函数

Logistic 损失函数
负对数似然损失函数
交叉熵损失函数
Hinge损失函数
指数损失函数

常用的损失函数

超参数

学习率

动量

数据集准备

数据集扩展

数据预处理

Zero Centralization

Normalization

Principal Component Analysis, PCA

Whitening

网络初始化

网络过度拟合

正则化方法

正则化的最大作用是防止过度拟合,提高网络模型的泛化能力,具体实现方法是在损失函数中增加惩罚因子。

L2正则化

L1正则化

最大约束范式

Dropout 层