【机器学习】15-17 神经网络训练 & 激活函数 & 多类问题
15 Neural Network Training
15.1 TensorFlow Implementation

范式三个步骤:
- 构建神经网络的各层
- 确定损失函数,compile。这里的BinaryCrossentropy后续会介绍
- 拟合,即训练,给训练数据集和epochs
15.2 Training Details
回顾逻辑回归训练的三个步骤:
- 确定函数f,即给定x, w, b,给出预测值
- 定义成本函数/Loss
- 梯度下降,训练,最小化Loss
对应到神经网络中也是一样:
- 首先定义的神经网络层中已经完成了第一步的函数f计算,指定非线性激活函数即可
- 指定损失函数,即 “model.compile”,例如二元交叉熵损失函数BinaryCrossentropy
实际上BinaryCrossentropy和逻辑回归我们所说的损失函数是一致的,TensorFlow里这样导入:
TensorFlow会知道我们要最小化的是m个样本的损失平均值。from tensorflow.keras.losses import BinaryCrossentropy
如果不是二分类问题,是回归问题,可以采用均方误差损失函数 MeanSquaredError,导入方式与前者类似。注:这个函数计算的是均方误差的一半,与前面线性回归推导的公式一致。 - 训练,即model.fit,类似梯度下降,要计算其中的偏导数项,但实际上是反向传播(Back Propagation)
注:这种神经网络结构,被称作多层感知机(MLP,Multi-Layer Perceptron):一种常见的前向人工神经网络。它由多个神经元层组成,其中至少有一个隐藏层,以及一个输出层。每个神经元通常都与接下来一层的所有神经元相连 。
16 Activation Functions
16.1 Alternatives to the Sigmoid Activation
之前我们用到的Sigmoid函数取值在0-1之间,但是如果激活值范围更大,神经网络的效果可能会更好。
ReLU函数:Rectified Linear Unit,校正线性单元,线性整流函数
ReLU:g(z)=max(0,z)={zif z≥00if z<0ReLU: g(z)=max(0, z)=\left\{
\begin{array}{ll}
z & \text{if } z \geq 0 \\
0 & \text{if } z < 0
\end{array}
\right.ReLU:g(z)=max(0,z)={z0if z≥0if z<0
另一种常用激活函数:Linear Activation Function,即g(z)=zg(z)=zg(z)=z。
除此之外,常用的还有Softmax函数,之后再进行介绍。
16.2 Choosing Activation Function
注:可以为不同的神经元选择不同的激活函数
- 对于输出层,激活函数的选取原则是期望的输出值的取值范围:
- 如果期望输出二分类,选择Sigmoid函数
- 如果期望输出可正可负,例如股票相较于前日的变化值,选取线性激活函数
- 如果期望输出只能是非负值,例如房价,选取ReLU函数
- 对于隐藏层:常用ReLU函数,而不是我们之前构建例子的Sigmoid函数,原因:
- ReLU计算更快,Sigmoid需要计算指数和倒数
- ReLU只在z小于0时表现出flat,梯度下降在flat处很缓慢,不利于训练

总体来说,选取原则就是:输出层根据期望输出选,隐藏层默认使用ReLU函数
16.3 Why do We Need Activation Functions?
试想不采用激活函数,即都用线性激活函数,效果将等同于线性回归。
特殊地,隐藏层都用线性激活函数,输出层用Sigmoid函数激活,效果等同于逻辑回归。
引入激活函数,即引入非线性,可以让神经网络拟合出更复杂的函数,表现更好。
17 Multiclass Classification
17.1 Multiclass
多类指的是输出类别有多种的分类问题,前面所提到的二分类只有两种。
解决这类问题的基本方法是Softmax回归,是逻辑回归的推广
17.2 Softmax
先看逻辑回归的Sigmoid函数,其激活值可以看作是 a1=g(z)=11+e−z=P(y=1∣x⃗)a_1=g(z)=\frac {1} {1+e^{-z}}=P(y=1|\vec x)a1=g(z)=1+e−z1=P(y=1∣x),其实还有个隐含的输出,即 a2=1−a1=P(y=0∣x⃗)a_2=1-a_1=P(y=0|\vec x)a2=1−a1=P(y=0∣x)。
而多类采用Softmax函数,若有N种分类,输出也是N个,分别对应给定x⃗\vec xx下N种输出的概率,相加为1,用j表示第j中分类,Softmax函数的表达式:
ai=g(z1,z2,...,zN)=ezj∑k=1Nezk=P(y=j∣x⃗)a_i = g(z_1, z2, ..., z_N) = \frac {e^{z_j}} {\sum_{k=1}^N e^{z_k}} = P(y=j|\vec x)ai=g(z1,z2,...,zN)=∑k=1Nezkezj=P(y=j∣x)
其中:
zj=w⃗j⋅x⃗+bj ,j=1,2,...,Nz_j = \vec w_j \cdot \vec x + b_j\space,\hspace{1em} j=1, 2, ..., Nzj=wj⋅x+bj ,j=1,2,...,N
可以看出最大的差别是,Softmax有N个输出,且每个输出都与N个节点的权重w⃗j,bj\vec w_j, b_jwj,bj有关。
注:相加一定为1。
接下来看Softmax的Loss和成本函数,类比逻辑回归中的推理:
loss(a1,...,aN,y)={−log(a1)if y=1−log(a2)if y=2...−log(aN)if y=Nloss(a_1, ..., a_N, y) =
\left \{
\begin{aligned}
&-log(a_1) \hspace{1em}\text{if }y=1\\
&-log(a_2) \hspace{1em}\text{if }y=2\\
&\hspace{4em}\text{...}\\
&-log(a_N) \hspace{1em}\text{if }y=N
\end{aligned}
\right.loss(a1,...,aN,y)=⎩⎨⎧−log(a1)if y=1−log(a2)if y=2...−log(aN)if y=N
而成本函数是loss的平均值:
J=1m∑i=1mlossJ = \frac {1} {m} \sum_{i=1}^{m}lossJ=m1i=1∑mloss
17.3 Neural Network with Softmax Output
注意原来二分类时,神经网络输出层是一个神经元,若为Softmax输出层,则为N个神经元,对应N种分类。
并且注意,每个神经元的输出值与所有输出层的节点的权重w⃗j,bj\vec w_j, b_jwj,bj有关。

TensorFlow中的实现:

注:
- 输出层有N个神经元,且激活函数改为Softmax函数
- Loss函数选择SparseCategoricalCrossentropy,稀疏类别交叉熵
- 特别注意,这并不是Softmax输出层的最佳的实现方式,后续会介绍
17.4 Improved Implementation of Softmax
先来看一个问题,Numerical Roundoff Errors,数值舍入误差:

计算机在计算浮点数时,会产生舍入误差,所以要尽量避免这种误差,例如化简公式等
TensorFlow可以帮我们做这些事,但是前提是我们要把完整的公式给它,而不是将公式中的一部分已经计算并产生舍入误差
考虑之前的Sigmoid函数,指数+倒数计算,会产生舍入误差,而Softmax函数的计算更复杂,舍入误差更大
考虑我们最终要的是成本函数/Loss,而不是中间计算过程中的aja_jaj,即不是11+e−z\frac 1 {1+e^{-z}}1+e−z1或者ezj∑k=1Nezk\frac {e^{z_j}} {\sum_{k=1}^N e^{z_k}}∑k=1Nezkezj
所以,我们可以把输出层改为线性输出层,即输出z,而不是计算aja_jaj产生舍入误差,之后在计算损失函数时,让TensorFlow帮我们代入计算aja_jaj并计算损失误差,TensorFlow提供这样的操作,并能使精度更准:

即在损失函数里传入参数"from_logits=True"即可,Softmax输出层也是类似实现:
![[图片]](https://i-blog.csdnimg.cn/direct/7d111c63afea468ab7fc03fbc2cdbcea.png)
17.5 Classification with Multiple Outputs
多标签分类问题,区别于多类问题。多类是结果只能选择一个类,而多标签分类,结果可以同时是0-N类,即有多种标签。
可以看作是N个独立的二分类问题,但是我们通常一起做,而不是分开用N个神经网络。
这个神经网络的输出层也是N个节点,但是激活函数为Sigmoid函数。
更多推荐
所有评论(0)