Machine Learning Algorithm 人工神经网络
并不是所有的模型拟合都能够使用线性回归或者逻辑回归进行拟合的。或者说,线性回归和逻辑回归在模型上具有一定的局限性。
在不出现过拟合的前提下,模型越复杂,预测精度就越好。
神经网络结构
最左侧为输入层,最右侧为输出层。中间称为隐藏层。
在回归问题上,往往输出只有一个节点。对于分类问题,往往有两个或多个节点。
X1与X2代表自变量,b0代表偏置项。w1和w2代表自变量上的权值。a的计算如下:
可以看到,括号里的计算是线性的,外围的f函数就是类似于sigmoid函数,用于转换成非线性的。
神经网络训练细节
神经网络训练的关键就是通过重复两个关键的步骤校准权重:前向传播与反向传播。
前向传播很简单,将一组权值应用于输入,计算输出即可。对于第一次前向传播,这个权重可以随机初始化。
反向传播就是将预测值与真实值之间的误差计算出来,反馈给神经网络,达到减小误差的效果。
前向传播和反向传播是重复进行的,什么时候停止?能够达到你想要的预测精度即可。
前向传播
我们来训练一个异或计算器来说明前向传播的过程。
异或计算器达到的效果就是,呈现上述的输入的时候,给出对应的输出。以输入(1,1)输出0为例:
第一次传播的时候,我们随机初始化权值(0-1之间):
计算第一个隐藏层的各个节点非线性映射前的值:
将计算出的值进行非线性映射,常用的**函数:
这里使用sigmoid函数:
计算第三层节点的值(因为是输出层,不做非线性映射):
这里虽然是分类问题,为了简单地呈现前向传播的过程,我们使用MSE代价简化:
(1.235-0)^2
反向传播
从最后一层开始,适当调整权重,使得达到最小的误差。只要权重改变,那么误差是增加还是减少就是确定的,以此来确定权重调整的方向。
由此,我们可以做到:
1. 确定权重更新的方向(增大还是减小)
2. 确定权重需要更新的大小。
较小的学习率使得权重更新较为缓慢,模型更加稳定。
由前面的前向传播我们知道,MSE误差达到了1.235^2= 1.52,我们改变权重,看看权重对误差的影响方向。
将最后一层与前一隐藏层之间的0.3权值改为0.29,我们得到了1.50的误差:
这样,我们知道,0.3这个权值,需要降低。
那么,降低多少?
这里0.3是初始值,0.05就是学习率。
同样的过程,计算本层其他权值:
我们发现从隐藏层到输出层的权值调节,误差降低了很多,从1.52~1.06
接着,我们需要对输入层到隐藏层的权值进行调节:
我们将重复进行上述操作,直到达到我们想要的误差。
随机梯度下降
梯度代表着差异,下降代表着降低。随机意味着并非每次更新全部的数据,而是训练数据的子集,并更新权重。
我们以一个例子来讲解梯度下降法:
假设我们需要拟合y= 6+5x
我们随机初始化a和b为2和3
操作如下:
1. 使用初始化的a和b计算输出,5
2. 计算基于a和b的均方误差。
3. 稍微变动a的值,计算均方误差,作为error_changed_a
4. 计算均方误差变化delta_error_a
5. 更新a的值,new_a = a_estimate+(delta_error_a)*learning_rate
6. 同样的步骤用于更新b
7. 重复整个过程,将所有的训练数据覆盖。
8. 重复上述步骤,所有的训练数据再来一次。
梯度下降法完成了数据的取优,也有其他的优化器实现了同样的功能:
为什么要有学习率?
上述的训练过程中,我们设置的学习率为0.01,如果变成0.05会怎么样?
我们发现,学习率变成0.05以后,数据的变化有些异常,一般倾向于较小的学习率,但是会导致收敛速度变慢。
批量训练
上述的训练过程中,数据的训练都是一条一条进行的,也就是每条训练数据都会有a和b的更新,然而,批量更新可能更有效,更迅速。
这里使用两条数据一次更新权重。
第二次批量操作仍然是两条数据一起更新。
这就是所谓的批量更新。
实际上,批量更新的大小一般是2的指数次,最小一般取32
Softmax
上文中演示的神经网络训练的过程是一种回归,而不是分类,实际上,分类和回归类似,只不过输出层的节点数不一样。假设二分类问题,我们就会有两个输出节点。
由隐藏层到输出层的权重由原来的3*1变成了3*2矩阵。
这是因为原来输出层节点为1,现在输出层节点为2
输出层的输出变为2维的:
但是这里的输出不在0-1之间,超出了范围,这个时候使用softmax更科学。
1. 将输出值转换到e^output
2. 将输出值归一化 3.43/ (3.43+1.81)
3. 使用交叉熵误差代替MSE
4. 使用梯度下降法优化交叉熵误差。
目标函数
回归中常常使用均方误差 ,分类中常常使用交叉熵。还有一些其他的优化函数: