在上一篇文章一个数学博士的深度学习方法(第 2 部分)https://mp.weixin.qq.com/s/xloa-73fcA7XfawMVzQCaQ我们看到了神经元的数学模型和一种神经网络:多层感知器 (MLP)。我提到了激活函数这个术语,但我没有展示激活函数的类型,也没有解释网络如何在每一层找到最佳权重,所以让我们开始吧!
激活函数
激活函数负责将非线性行为引入神经网络,因此它们非常重要。
sigmoid
sigmoid 以一个实数值作为输入,输出一个介于 0 和 1 之间的值,因此 sigmoid 常用于在输出层生成概率。数学上,sigmoid函数写成如下
绘制 sigmoid 图的 Python 代码
Sigmoid 图
sigmoid 的导数可以通过商规则计算并写为
Sigmoid 导数
请注意,如果 S(x) 接近 0 或 1,则 S'(x) 接近于零。出于这个原因,sigmoid 不应该用于隐藏层,因为如果 S'(x) 接近于零,神经网络会非常缓慢地更新您的权重,因此网络无法正确“学习”。这个问题被称为梯度消失问题。
双曲正切
sigmoid 将一个实数值作为输入,并输出一个介于 -1 和 1 之间的值。
绘制正切双曲线图的 Python 代码
双曲正切图
双曲正切与 sigmoid 函数有关。注意
归一化指数函数
softmax函数,又称归一化指数函数。它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。做过多分类任务的同学一定都知道这个函数
softmax 函数将包含 n 个元素的向量归一化为 n 个元素的概率分布。Softmax 用于输出层来预测输出是一类的概率。
整流线性单元 (ReLU)
被广泛使用是因为计算效率更高,这意味着网络可以更快地训练并在更短的时间内收敛。
绘制 ReLU 图的 Python 代码
ReLU 图
如果图层中的所有值都接收到负值,则此函数可能会出现问题,在这种情况下,会出现梯度消失问题。
还有其他激活函数,例如 Leaky ReLU、Parametric ReLU 和 Exponential Linear Unit。研究这些功能仍然是家庭作业。
损失函数
到目前为止,我们已经讨论了输入数据如何乘以权重并从层到层传递,直到网络产生一些结果,但是网络如何“学习”正确的权重?这些权重从何而来?他们住在哪里?他们吃什么?让我们来了解一下!
损失函数(也称为成本函数)只是一个衡量神经网络误差的函数。成本函数名称出现是因为我们总是希望降低成本和误差。
让我们考虑一个分类问题。
在分类问题中,我们将数据分为两部分:训练数据和测试数据。我们将使用训练数据来训练神经网络,并使用测试数据来衡量我们的网络在网络从未遇到过的数据上的性能。
在这种情况下,训练数据将具有一些用于预测类别(目标)的特征。例如,假设我们有关于温度和湿度的数据,并且我们有兴趣预测这是晴天还是雨天。在这种情况下,温度和湿度是特征(列或表格数据),0 级(晴天)或 1 级(下雨)将是目标。
所以我们将给出许多对 (temp_1, humid_1), (temp_2, humid_2), ..., (temp_k, humid_k),对于每一对,我们的网络将计算我们已经知道的表达式并输出 0 或 1。我们必须将网络预测与我们拥有的实际值 0 和 1 进行比较,以便我们可以计算网络的误差。
正是这个错误用于更新权重。也就是说,损失函数允许网络“学习”权重。有两种类型的误差:局部误差是一次预测的误差,全局误差是局部误差的总和。
有几个损失函数,每一个都更适合每个问题,并且可能使用多个损失函数来评估性能。对于优化过程,将只使用一个损失函数。让我们了解一些损失函数。
平均绝对误差 (MAE)
这只是绝对误差的平均值。
其中 N 是我们的训练数据中的观察次数。
均方误差 (MSE)
这是误差平方的平均值。MSE 广泛用于回归问题。
正方形放大了较大的错误,这可以让网络专注于纠正这些较大的错误,从而有助于减少全局错误。
均方根误差 (RMSE)
RMSE 只是 MSE 的根源。RMSE 优于 MSE 的优势在于误差的测量单位与问题的单位相同,因此更易于解释。
交叉熵
它主要用于二分类问题。
将二元分类问题视为晴天/雨天分类,设 y_i 为第 i 天的实际值,而 y_i 为第 i 天的预测值。在这种情况下,预测正确的概率可以通过伯努利分布来计算,即
假设它们是独立的,所有预测的概率是
使用总和比使用产品更好,所以让我们减去双方的对数,得到
交叉熵表达式
这是交叉熵,即所有预测正确的概率的负对数似然。
交叉熵可以适应两个以上的类。
还有其他损失函数,例如 Huber 损失、Kullback-Leibler 散度、Jensen-Shannon 散度等。
反向传播
好的,现在我们知道神经网络使用数据对初始权重(它们来自哪里?)进行一些计算,最后我们可以计算网络的误差。但是这个错误究竟是如何让网络“学习”正确的权重的呢?
这是通过反向传播完成的!顾名思义,我们在输出层(我们得到我们的预测)中获取错误,然后我们将此信息向后传播(现在您看到名称的来源)到输入层以更新所有权重,以便当网络训练时再次,误差会更小。
假设我们的 MLP 有三个隐藏层,损失函数用 J 表示。我们想找到 J 的最小值,我们可以用导数来做到!计算误差对权重的导数
J关于输出层权重的导数
并记住(第 2 部分)
为简单起见,让我们表示
这样,我们可以看到每一层中的所有权重都对 J 的导数有贡献。我们可以使用链式法则写出导数。假设我们确实想找到关于 W² 的部分,所以
好的,现在我们有了帮助我们找到最小值的导数,但是权重是如何更新的呢?答案是
权重更新
Alpha 是一个名为学习率的参数。这个表达式的灵感来自于已知的“经典”优化,如下所示。
参数初始化
好的,现在我们知道了如何使用损失函数来更新权重,但是这些权重是从哪里来的呢?
参数(权重)的初始化对于我们的网络很重要,可以更快地找到损失函数的最小值。例如,我们可以通过从均匀分布 U[-1,1] 或正态分布 N(0,1) 中采样值来随机初始化权重。但最好的方法之一是 Glorot 初始化!这是通过从特殊的均匀分布中采样值来完成的
n_k 是第 k 层的神经元数量。
这样,具有大量神经元的层的初始化彼此接近,这也更好,因为我们在数据通过每一层传播时保持方差。
文档资料源码请私信或移步官W上获取
OK……
这就是(第3部分)本节的全部内容!到下一回的第4部分就很快再见了,让我们了解更多数学和深度学习。